diff --git a/apps/OpenSign/index.html b/apps/OpenSign/index.html index 67720ba6a2..c023d35d55 100644 --- a/apps/OpenSign/index.html +++ b/apps/OpenSign/index.html @@ -3,20 +3,20 @@ - - ...Loading +
- + + \ No newline at end of file diff --git a/apps/OpenSign/package-lock.json b/apps/OpenSign/package-lock.json deleted file mode 100644 index 7c375a0aae..0000000000 --- a/apps/OpenSign/package-lock.json +++ /dev/null @@ -1,17820 +0,0 @@ -{ - "name": "open_sign", - "version": "2.21.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "open_sign", - "version": "2.21.1", - "dependencies": { - "@formkit/auto-animate": "^0.8.2", - "@imgly/background-removal": "^1.6.0", - "@lottiefiles/dotlottie-react": "^0.14.2", - "@pdf-lib/fontkit": "^1.1.1", - "@radix-ui/themes": "^3.2.1", - "@reduxjs/toolkit": "^2.8.2", - "axios": "^1.10.0", - "date-fns-tz": "^3.2.0", - "file-saver": "^2.0.5", - "i18next": "^25.3.0", - "i18next-browser-languagedetector": "^8.2.0", - "i18next-http-backend": "^3.0.2", - "jszip": "^3.10.1", - "jwt-decode": "^4.0.0", - "moment": "^2.30.1", - "parse": "^6.1.1", - "pdf-lib": "^1.17.1", - "pkijs": "^3.0.8", - "print-js": "^1.6.0", - "prismjs": "^1.30.0", - "quill-html-edit-button": "^3.0.0", - "radix-ui": "^1.4.2", - "react": "^18.3.1", - "react-bootstrap": "^2.10.10", - "react-confetti": "^6.4.0", - "react-datepicker": "^8.4.0", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1", - "react-dnd-multi-backend": "^9.0.0", - "react-dnd-touch-backend": "^16.0.1", - "react-dom": "^18.3.1", - "react-gtm-module": "^2.0.11", - "react-helmet": "^6.1.0", - "react-i18next": "^15.5.3", - "react-konva": "^18.2.10", - "react-pdf": "^9.2.1", - "react-quill-new": "^3.4.6", - "react-redux": "^9.2.0", - "react-rnd": "^10.5.2", - "react-router": "^7.6.3", - "react-scrollbars-custom": "^4.1.1", - "react-select": "^5.10.1", - "react-signature-canvas": "^1.1.0-alpha.2", - "react-timezone-select": "^3.2.8", - "react-tooltip": "^5.29.1", - "reactour": "^1.19.4", - "redux": "^5.0.1", - "regex-parser": "^2.3.1", - "serve": "^14.2.4", - "styled-components": "^5.3.11", - "web-vitals": "^5.0.3", - "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz" - }, - "devDependencies": { - "@babel/core": "^7.27.7", - "@babel/preset-env": "^7.27.2", - "@babel/preset-react": "^7.27.1", - "@babel/runtime-corejs2": "^7.27.6", - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.3.0", - "@testing-library/user-event": "^14.6.1", - "@types/react": "^18.3.23", - "@vitejs/plugin-react": "^4.6.0", - "@vitejs/plugin-react-swc": "^3.10.2", - "@vitest/ui": "^3.2.4", - "autoprefixer": "^10.4.21", - "babel-loader": "^10.0.0", - "commitizen": "^4.3.1", - "concurrently": "^9.2.0", - "css-loader": "^7.1.2", - "daisyui": "^4.12.24", - "dotenv": "^16.6.1", - "eslint": "^9.30.0", - "eslint-plugin-prettier": "^5.5.1", - "eslint-plugin-react": "^7.37.5", - "jsdom": "^26.1.0", - "lint-staged": "^16.1.2", - "postcss": "^8.5.6", - "prettier": "^3.6.2", - "pretty-quick": "^4.2.2", - "rollup-plugin-node-polyfills": "^0.2.1", - "tailwindcss": "^3.4.17", - "vite": "^6.3.5", - "vite-plugin-svgr": "^4.3.0", - "vite-tsconfig-paths": "^5.1.4", - "vitest": "^3.2.4" - }, - "engines": { - "node": "18 || 20 || 22" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.3.tgz", - "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==", - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@asamuzakjp/css-color": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", - "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^2.1.3", - "@csstools/css-color-parser": "^3.0.9", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "lru-cache": "^10.4.3" - } - }, - "node_modules/@asamuzakjp/css-color/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/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", - "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz", - "integrity": "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.27.7", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.7", - "@babel/types": "^7.27.7", - "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.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", - "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@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-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", - "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "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==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", - "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz", - "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", - "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", - "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-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", - "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-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", - "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-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "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-async-generator-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", - "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-remap-async-to-generator": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", - "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-block-scoping": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz", - "integrity": "sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==", - "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-class-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", - "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", - "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/template": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz", - "integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==", - "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-dotall-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", - "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-duplicate-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "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-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", - "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-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "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-for-of": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", - "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-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "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-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", - "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-member-expression-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", - "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-modules-amd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "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-nullish-coalescing-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", - "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-numeric-separator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", - "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-object-rest-spread": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.2.tgz", - "integrity": "sha512-AIUHD7xJ1mCrj3uPozvtngY3s0xpv7Nu7DoUSnzNY6Xam1Cy4rUznR//pvMHOhQ4AvbCexhbqXCtpxGHOGOO6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", - "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-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", - "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", - "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-private-methods": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-create-class-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", - "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-display-name": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz", - "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==", - "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": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", - "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", - "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.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/plugin-transform-react-pure-annotations": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", - "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", - "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", - "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-regexp-modifiers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", - "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-shorthand-properties": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "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-spread": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "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-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "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-typeof-symbol": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", - "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-unicode-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", - "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-unicode-property-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.2.tgz", - "integrity": "sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.27.1", - "@babel/plugin-syntax-import-attributes": "^7.27.1", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.27.1", - "@babel/plugin-transform-async-to-generator": "^7.27.1", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.27.1", - "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.27.1", - "@babel/plugin-transform-computed-properties": "^7.27.1", - "@babel/plugin-transform-destructuring": "^7.27.1", - "@babel/plugin-transform-dotall-regex": "^7.27.1", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-exponentiation-operator": "^7.27.1", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.27.1", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.27.1", - "@babel/plugin-transform-modules-systemjs": "^7.27.1", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", - "@babel/plugin-transform-numeric-separator": "^7.27.1", - "@babel/plugin-transform-object-rest-spread": "^7.27.2", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1", - "@babel/plugin-transform-parameters": "^7.27.1", - "@babel/plugin-transform-private-methods": "^7.27.1", - "@babel/plugin-transform-private-property-in-object": "^7.27.1", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.27.1", - "@babel/plugin-transform-regexp-modifiers": "^7.27.1", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.27.1", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.27.1", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", - "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.27.1", - "@babel/plugin-transform-react-jsx": "^7.27.1", - "@babel/plugin-transform-react-jsx-development": "^7.27.1", - "@babel/plugin-transform-react-pure-annotations": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", - "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs2": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.27.6.tgz", - "integrity": "sha512-WgvlQpGnm1rmvgrm+H+cVcAckEPlwURUCvv1ZVSFr9J9yixgFbNlu7+CjVKKAd4xQtMijPwxwcSi5SFFHKlmDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-js": "^2.6.12" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.27.0.tgz", - "integrity": "sha512-UWjX6t+v+0ckwZ50Y5ShZLnlk95pP5MyW/pon9tiYzl3+18pkTHTFNTKr7rQbfRXPkowt2QAn30o1b6oswszew==", - "license": "MIT", - "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz", - "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.5", - "@babel/parser": "^7.27.7", - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.7", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.27.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz", - "integrity": "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@commitlint/config-validator": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.1.tgz", - "integrity": "sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@commitlint/types": "^19.8.1", - "ajv": "^8.11.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/execute-rule": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.1.tgz", - "integrity": "sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/load": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.1.tgz", - "integrity": "sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@commitlint/config-validator": "^19.8.1", - "@commitlint/execute-rule": "^19.8.1", - "@commitlint/resolve-extends": "^19.8.1", - "@commitlint/types": "^19.8.1", - "chalk": "^5.3.0", - "cosmiconfig": "^9.0.0", - "cosmiconfig-typescript-loader": "^6.1.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/load/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@commitlint/resolve-extends": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz", - "integrity": "sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@commitlint/config-validator": "^19.8.1", - "@commitlint/types": "^19.8.1", - "global-directory": "^4.0.1", - "import-meta-resolve": "^4.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/types": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.1.tgz", - "integrity": "sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/conventional-commits-parser": "^5.0.0", - "chalk": "^5.3.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/types/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", - "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", - "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^5.0.2", - "@csstools/css-calc": "^2.1.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", - "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.3.3", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, - "node_modules/@emotion/cache": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", - "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0", - "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", - "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", - "license": "MIT" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", - "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", - "license": "MIT" - }, - "node_modules/@emotion/react": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", - "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.13.5", - "@emotion/cache": "^11.14.0", - "@emotion/serialize": "^1.3.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", - "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", - "license": "MIT", - "dependencies": { - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.2", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", - "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", - "license": "MIT" - }, - "node_modules/@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", - "license": "MIT" - }, - "node_modules/@emotion/unitless": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", - "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", - "license": "MIT" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", - "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", - "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", - "license": "MIT" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", - "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", - "license": "MIT" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "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/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "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.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", - "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", - "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.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "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.0", - "minimatch": "^3.1.2", - "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/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/@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/eslintrc/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/@eslint/js": { - "version": "9.30.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.30.0.tgz", - "integrity": "sha512-Wzw3wQwPvc9sHM+NjakWTcPx11mbZyiYHuwWa/QfZ7cIRX7WK54PSk7bdyXDaoaopUcMatv1zaQvOAAO8hCdww==", - "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.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", - "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.14.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz", - "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz", - "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.0", - "@floating-ui/utils": "^0.2.9" - } - }, - "node_modules/@floating-ui/react": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.8.tgz", - "integrity": "sha512-EQJ4Th328y2wyHR3KzOUOoTW2UKjFk53fmyahfwExnFQ8vnsMYqKc+fFPOkeYtj5tcp1DUMiNJ7BFhed7e9ONw==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.1.2", - "@floating-ui/utils": "^0.2.9", - "tabbable": "^6.0.0" - }, - "peerDependencies": { - "react": ">=17.0.0", - "react-dom": ">=17.0.0" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", - "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", - "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", - "license": "MIT" - }, - "node_modules/@formkit/auto-animate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@formkit/auto-animate/-/auto-animate-0.8.2.tgz", - "integrity": "sha512-SwPWfeRa5veb1hOIBMdzI+73te5puUBHmqqaF1Bu7FjvxlYSz/kJcZKSa9Cg60zL0uRNeJL2SbRxV6Jp6Q1nFQ==", - "license": "MIT" - }, - "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.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "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/@imgly/background-removal": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@imgly/background-removal/-/background-removal-1.6.0.tgz", - "integrity": "sha512-nmqOBDE9dQpDEJg73XrKNUoWugyyDHEVh+U1akjYdUW85ILh9UilvKu/kdv1MI822rKExwgLNuVLVulzAzgZJg==", - "dependencies": { - "lodash-es": "^4.17.21", - "ndarray": "~1.0.0", - "zod": "^3.23.8" - }, - "peerDependencies": { - "onnxruntime-web": "1.21.0-dev.20250206-d981b153d3" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@lottiefiles/dotlottie-react": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.14.2.tgz", - "integrity": "sha512-RR4r0HrKQbOAw6iS6C3mRARS2iu+yI+G1vICoUsRMHzlUUk1/26l3WyAjhcG+KoaGoKmORx8FgHjTNr4Sr/2Ug==", - "license": "MIT", - "dependencies": { - "@lottiefiles/dotlottie-web": "0.47.0" - }, - "peerDependencies": { - "react": "^17 || ^18 || ^19" - } - }, - "node_modules/@lottiefiles/dotlottie-web": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.47.0.tgz", - "integrity": "sha512-YN6wSB4iYZBYEAFKEs/taufrPH3rfNlUA632Ib61WoR58TALAJ1ZX8yDIGUBT28byMJhZR4+xdpRX4v7X8OeBQ==", - "license": "MIT" - }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pdf-lib/fontkit": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@pdf-lib/fontkit/-/fontkit-1.1.1.tgz", - "integrity": "sha512-KjMd7grNapIWS/Dm0gvfHEilSyAmeLvrEGVcqLGi0VYebuqqzTbgF29efCx7tvx+IEbG3zQciRSWl3GkUSvjZg==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.6" - } - }, - "node_modules/@pdf-lib/standard-fonts": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", - "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.6" - } - }, - "node_modules/@pdf-lib/upng": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", - "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", - "license": "MIT", - "dependencies": { - "pako": "^1.0.10" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.7.tgz", - "integrity": "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "peer": true - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "peer": true - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "peer": true - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "peer": true - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "peer": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "peer": true - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "peer": true - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "peer": true - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "peer": true - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "peer": true - }, - "node_modules/@radix-ui/colors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-3.0.0.tgz", - "integrity": "sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==", - "license": "MIT" - }, - "node_modules/@radix-ui/number": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", - "integrity": "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==", - "license": "MIT" - }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.2.tgz", - "integrity": "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-direction": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz", - "integrity": "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.2.tgz", - "integrity": "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz", - "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-is-hydrated": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.0.tgz", - "integrity": "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.5.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-previous": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz", - "integrity": "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz", - "integrity": "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==", - "license": "MIT", - "dependencies": { - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz", - "integrity": "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/rect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz", - "integrity": "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==", - "license": "MIT" - }, - "node_modules/@radix-ui/themes": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@radix-ui/themes/-/themes-3.2.1.tgz", - "integrity": "sha512-WJL2YKAGItkunwm3O4cLTFKCGJTfAfF6Hmq7f5bCo1ggqC9qJQ/wfg/25AAN72aoEM1yqXZQ+pslsw48AFR0Xg==", - "license": "MIT", - "dependencies": { - "@radix-ui/colors": "^3.0.0", - "classnames": "^2.3.2", - "radix-ui": "^1.1.3", - "react-remove-scroll-bar": "^2.3.8" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@react-aria/ssr": { - "version": "3.9.8", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.8.tgz", - "integrity": "sha512-lQDE/c9uTfBSDOjaZUJS8xP2jCKVk4zjQeIlCH90xaLhHDgbpCdns3xvFpJJujfj3nI4Ll9K7A+ONUBDCASOuw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-dnd/asap": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz", - "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==", - "license": "MIT" - }, - "node_modules/@react-dnd/invariant": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz", - "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==", - "license": "MIT" - }, - "node_modules/@react-dnd/shallowequal": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz", - "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==", - "license": "MIT" - }, - "node_modules/@reduxjs/toolkit": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.8.2.tgz", - "integrity": "sha512-MYlOhQ0sLdw4ud48FoC5w0dH9VfWQjtCjreKwYTT3l+r427qYC5Y8PihNutepr8XrNaBUDQo9khWUwQxZaqt5A==", - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@standard-schema/utils": "^0.3.0", - "immer": "^10.0.3", - "redux": "^5.0.1", - "redux-thunk": "^3.1.0", - "reselect": "^5.1.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", - "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } - } - }, - "node_modules/@restart/hooks": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", - "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@restart/ui": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.9.4.tgz", - "integrity": "sha512-N4C7haUc3vn4LTwVUPlkJN8Ach/+yIMvRuTVIhjilNHqegY60SGLrzud6errOMNJwSnmYFnt1J0H/k8FE3A4KA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.26.0", - "@popperjs/core": "^2.11.8", - "@react-aria/ssr": "^3.5.0", - "@restart/hooks": "^0.5.0", - "@types/warning": "^3.0.3", - "dequal": "^2.0.3", - "dom-helpers": "^5.2.0", - "uncontrollable": "^8.0.4", - "warning": "^4.0.3" - }, - "peerDependencies": { - "react": ">=16.14.0", - "react-dom": ">=16.14.0" - } - }, - "node_modules/@restart/ui/node_modules/@restart/hooks": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.5.1.tgz", - "integrity": "sha512-EMoH04NHS1pbn07iLTjIjgttuqb7qu4+/EyhAx27MHpoENcB2ZdSsLTNxmKD+WEPnZigo62Qc8zjGnNxoSE/5Q==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@restart/ui/node_modules/uncontrollable": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", - "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.14.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.19", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", - "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz", - "integrity": "sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.0.tgz", - "integrity": "sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.0.tgz", - "integrity": "sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.0.tgz", - "integrity": "sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.0.tgz", - "integrity": "sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.0.tgz", - "integrity": "sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.0.tgz", - "integrity": "sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.0.tgz", - "integrity": "sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.0.tgz", - "integrity": "sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.0.tgz", - "integrity": "sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.0.tgz", - "integrity": "sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.0.tgz", - "integrity": "sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.0.tgz", - "integrity": "sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.0.tgz", - "integrity": "sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.0.tgz", - "integrity": "sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.0.tgz", - "integrity": "sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.0.tgz", - "integrity": "sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.0.tgz", - "integrity": "sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.0.tgz", - "integrity": "sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.0.tgz", - "integrity": "sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rooks/use-mutation-observer": { - "version": "4.11.2", - "resolved": "https://registry.npmjs.org/@rooks/use-mutation-observer/-/use-mutation-observer-4.11.2.tgz", - "integrity": "sha512-vpsdrZdr6TkB1zZJcHx+fR1YC/pHs2BaqcuYiEGjBVbwY5xcC49+h0hAUtQKHth3oJqXfIX/Ng8S7s5HFHdM/A==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", - "license": "MIT" - }, - "node_modules/@standard-schema/utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", - "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", - "license": "MIT" - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@svgr/core/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@swc/core": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.12.7.tgz", - "integrity": "sha512-bcpllEihyUSnqp0UtXTvXc19CT4wp3tGWLENhWnjr4B5iEOkzqMu+xHGz1FI5IBatjfqOQb29tgIfv6IL05QaA==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.23" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.12.7", - "@swc/core-darwin-x64": "1.12.7", - "@swc/core-linux-arm-gnueabihf": "1.12.7", - "@swc/core-linux-arm64-gnu": "1.12.7", - "@swc/core-linux-arm64-musl": "1.12.7", - "@swc/core-linux-x64-gnu": "1.12.7", - "@swc/core-linux-x64-musl": "1.12.7", - "@swc/core-win32-arm64-msvc": "1.12.7", - "@swc/core-win32-ia32-msvc": "1.12.7", - "@swc/core-win32-x64-msvc": "1.12.7" - }, - "peerDependencies": { - "@swc/helpers": ">=0.5.17" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.12.7.tgz", - "integrity": "sha512-w6BBT0hBRS56yS+LbReVym0h+iB7/PpCddqrn1ha94ra4rZ4R/A91A/rkv+LnQlPqU/+fhqdlXtCJU9mrhCBtA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.12.7.tgz", - "integrity": "sha512-jN6LhFfGOpm4DY2mXPgwH4aa9GLOwublwMVFFZ/bGnHYYCRitLZs9+JWBbyWs7MyGcA246Ew+EREx36KVEAxjA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.12.7.tgz", - "integrity": "sha512-rHn8XXi7G2StEtZRAeJ6c7nhJPDnqsHXmeNrAaYwk8Tvpa6ZYG2nT9E1OQNXj1/dfbSFTjdiA8M8ZvGYBlpBoA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.12.7.tgz", - "integrity": "sha512-N15hKizSSh+hkZ2x3TDVrxq0TDcbvDbkQJi2ZrLb9fK+NdFUV/x+XF16ZDPlbxtrGXl1CT7VD439SNaMN9F7qw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.12.7.tgz", - "integrity": "sha512-jxyINtBezpxd3eIUDiDXv7UQ87YWlPsM9KumOwJk09FkFSO4oYxV2RT+Wu+Nt5tVWue4N0MdXT/p7SQsDEk4YA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.12.7.tgz", - "integrity": "sha512-PR4tPVwU1BQBfFDk2XfzXxsEIjF3x/bOV1BzZpYvrlkU0TKUDbR4t2wzvsYwD/coW7/yoQmlL70/qnuPtTp1Zw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.12.7.tgz", - "integrity": "sha512-zy7JWfQtQItgMfUjSbbcS3DZqQUn2d9VuV0LSGpJxtTXwgzhRpF1S2Sj7cU9hGpbM27Y8RJ4DeFb3qbAufjbrw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.12.7.tgz", - "integrity": "sha512-52PeF0tyX04ZFD8nibNhy/GjMFOZWTEWPmIB3wpD1vIJ1po+smtBnEdRRll5WIXITKoiND8AeHlBNBPqcsdcwA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.12.7.tgz", - "integrity": "sha512-WzQwkNMuhB1qQShT9uUgz/mX2j7NIEPExEtzvGsBT7TlZ9j1kGZ8NJcZH/fwOFcSJL4W7DnkL7nAhx6DBlSPaA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.12.7.tgz", - "integrity": "sha512-R52ivBi2lgjl+Bd3XCPum0YfgbZq/W1AUExITysddP9ErsNSwnreYyNB3exEijiazWGcqHEas2ChiuMOP7NYrA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@swc/helpers/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/@swc/types": { - "version": "0.1.23", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.23.tgz", - "integrity": "sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz", - "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.21", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "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.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", - "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", - "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/@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "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", - "peer": true - }, - "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.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*" - } - }, - "node_modules/@types/conventional-commits-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz", - "integrity": "sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "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/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "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": "22.15.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.21.tgz", - "integrity": "sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.23", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", - "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-reconciler": { - "version": "0.28.9", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", - "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.12", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", - "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/signature_pad": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@types/signature_pad/-/signature_pad-2.3.6.tgz", - "integrity": "sha512-v3j92gCQJoxomHhd+yaG4Vsf8tRS/XbzWKqDv85UsqjMGy4zhokuwKe4b6vhbgncKkh+thF+gpz6+fypTtnFqQ==", - "license": "MIT" - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", - "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", - "license": "MIT" - }, - "node_modules/@types/warning": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", - "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", - "license": "MIT" - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz", - "integrity": "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.19", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" - } - }, - "node_modules/@vitejs/plugin-react-swc": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.10.2.tgz", - "integrity": "sha512-xD3Rdvrt5LgANug7WekBn1KhcvLn1H3jNBfJRL3reeOIua/WnZOEV5qi5qIBq5T8R0jUDmRtxuvk4bPhzGHDWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "1.0.0-beta.11", - "@swc/core": "^1.11.31" - }, - "peerDependencies": { - "vite": "^4 || ^5 || ^6 || ^7.0.0-beta.0" - } - }, - "node_modules/@vitejs/plugin-react-swc/node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.11", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.11.tgz", - "integrity": "sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.2.4", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/mocker/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/@vitest/mocker/node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot/node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/ui": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.2.4.tgz", - "integrity": "sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.2.4", - "fflate": "^0.8.2", - "flatted": "^3.3.3", - "pathe": "^2.0.3", - "sirv": "^3.0.1", - "tinyglobby": "^0.2.14", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "3.2.4" - } - }, - "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true - }, - "node_modules/@zeit/schemas": { - "version": "2.36.0", - "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz", - "integrity": "sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==", - "license": "MIT" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "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.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "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==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "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/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "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-hidden": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", - "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/aria-hidden/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "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-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asn1js": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.6.tgz", - "integrity": "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==", - "license": "BSD-3-Clause", - "dependencies": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/asn1js/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "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/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "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.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-loader": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", - "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": "^18.20.0 || ^20.10.0 || >=22.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5.61.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/babel-plugin-macros/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", - "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.4", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", - "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.4" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-styled-components": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", - "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "lodash": "^4.17.21", - "picomatch": "^2.3.1" - }, - "peerDependencies": { - "styled-components": ">= 2" - } - }, - "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==", - "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==", - "devOptional": true, - "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/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/boxen": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", - "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.0", - "chalk": "^5.0.1", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", - "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", - "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": { - "caniuse-lite": "^1.0.30001716", - "electron-to-chromium": "^1.5.149", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "devOptional": true, - "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.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bytestreamjs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", - "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "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==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001718", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", - "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", - "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/canvas": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.1.0.tgz", - "integrity": "sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-addon-api": "^7.0.0", - "prebuild-install": "^7.1.1" - }, - "engines": { - "node": "^18.12.0 || >= 20.9.0" - } - }, - "node_modules/chai": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", - "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/chalk-template": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC", - "optional": true - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "license": "MIT" - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 10" - } - }, - "node_modules/clipboardy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", - "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", - "license": "MIT", - "dependencies": { - "arch": "^2.2.0", - "execa": "^5.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/clipboardy/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/clipboardy/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/clipboardy/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clipboardy/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/clipboardy/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "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/cnbuilder": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cnbuilder/-/cnbuilder-3.1.0.tgz", - "integrity": "sha512-9sxWwwprkPNTVQnx92WYPEWCmyZRqbf9VWUYABU4rl0mLL17VAV2MvvOApkMA6bQVXRLJ8jN//8Yp6drElpLWA==", - "license": "MIT", - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/xobotyi" - } - }, - "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==", - "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==", - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", - "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/commitizen": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.1.tgz", - "integrity": "sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cachedir": "2.3.0", - "cz-conventional-changelog": "3.3.0", - "dedent": "0.7.0", - "detect-indent": "6.1.0", - "find-node-modules": "^2.1.2", - "find-root": "1.1.0", - "fs-extra": "9.1.0", - "glob": "7.2.3", - "inquirer": "8.2.5", - "is-utf8": "^0.2.1", - "lodash": "4.17.21", - "minimist": "1.2.7", - "strip-bom": "4.0.0", - "strip-json-comments": "3.1.1" - }, - "bin": { - "commitizen": "bin/commitizen", - "cz": "bin/git-cz", - "git-cz": "bin/git-cz" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/concurrently": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz", - "integrity": "sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/conventional-commit-types": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", - "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", - "dev": true, - "license": "ISC" - }, - "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==", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true, - "license": "MIT" - }, - "node_modules/core-js-compat": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", - "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.42.0.tgz", - "integrity": "sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cosmiconfig-typescript-loader": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz", - "integrity": "sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "jiti": "^2.4.1" - }, - "engines": { - "node": ">=v18" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=9", - "typescript": ">=5" - } - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", - "license": "MIT", - "optional": true - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", - "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.27.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-selector-tokenizer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", - "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "license": "MIT", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "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/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssstyle": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.1.tgz", - "integrity": "sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^3.1.2", - "rrweb-cssom": "^0.8.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/culori": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz", - "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/cz-conventional-changelog": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", - "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^2.4.1", - "commitizen": "^4.0.3", - "conventional-commit-types": "^3.0.0", - "lodash.map": "^4.5.1", - "longest": "^2.0.1", - "word-wrap": "^1.0.3" - }, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@commitlint/load": ">6.1.1" - } - }, - "node_modules/cz-conventional-changelog/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cz-conventional-changelog/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cz-conventional-changelog/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/cz-conventional-changelog/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cz-conventional-changelog/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/cz-conventional-changelog/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/cz-conventional-changelog/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/daisyui": { - "version": "4.12.24", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.12.24.tgz", - "integrity": "sha512-JYg9fhQHOfXyLadrBrEqCDM6D5dWCSSiM6eTNCRrBRzx/VlOCrLS8eDfIw9RVvs64v2mJdLooKXY8EwQzoszAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-selector-tokenizer": "^0.8", - "culori": "^3", - "picocolors": "^1", - "postcss-js": "^4" - }, - "engines": { - "node": ">=16.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/daisyui" - } - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls/node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/date-fns": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", - "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/date-fns-tz": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-3.2.0.tgz", - "integrity": "sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==", - "license": "MIT", - "peerDependencies": { - "date-fns": "^3.0.0 || ^4.0.0" - } - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", - "dev": true, - "license": "MIT" - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "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/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "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/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, - "license": "MIT" - }, - "node_modules/dnd-core": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz", - "integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==", - "license": "MIT", - "dependencies": { - "@react-dnd/asap": "^5.0.1", - "@react-dnd/invariant": "^4.0.1", - "redux": "^4.2.0" - } - }, - "node_modules/dnd-core/node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/dnd-multi-backend": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/dnd-multi-backend/-/dnd-multi-backend-9.0.0.tgz", - "integrity": "sha512-BCUFes4x0LA2bZyEZFHeQzZ1CBZo6PB40zMOG/gNgICxjAZfN2jHgISowqkR1isdx/msUNzscxEb17SP7yc4KQ==", - "license": "MIT", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/LouisBrunner" - }, - "peerDependencies": { - "dnd-core": "^16.0.1" - } - }, - "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", - "peer": true - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-case/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "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/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.155", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz", - "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==", - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" - }, - "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/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "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==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.30.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.30.0.tgz", - "integrity": "sha512-iN/SiPxmQu6EVkf+m1qpBxzUhE12YqFLOSySuOyVLJLEF9nzTf+h/1AJYc1JWzCnktggeNrjvQGLngDzXirU6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.14.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.30.0", - "@eslint/plugin-kit": "^0.3.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "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-prettier": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.1.tgz", - "integrity": "sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.7" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": "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/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/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/eslint/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/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/espree/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/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "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": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true, - "license": "MIT" - }, - "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/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz", - "integrity": "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "dev": true, - "license": "MIT" - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "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/file-saver": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", - "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-node-modules": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz", - "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "findup-sync": "^4.0.0", - "merge": "^2.1.1" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "license": "MIT" - }, - "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/findup-sync": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", - "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "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/flatbuffers": { - "version": "25.2.10", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.2.10.tgz", - "integrity": "sha512-7JlN9ZvLDG1McO3kbX0k4v+SUAg48L1rIwEvN6ZQl/eCtgJz9UylTMzE9wrmYrcorgxm3CX/3T/w5VAub99UUw==", - "peer": true - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/focus-lock": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.6.tgz", - "integrity": "sha512-Ik/6OCk9RQQ0T5Xw+hKNLWrjSMtv51dD4GRmJjbD5a58TIEpI5a5iXagKVl3Z5UuyslMCA8Xwnu76jQob62Yhg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/focus-lock/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/focus-outline-manager": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/focus-outline-manager/-/focus-outline-manager-1.0.2.tgz", - "integrity": "sha512-bHWEmjLsTjGP9gVs7P3Hyl+oY5NlMW8aTSPdTJ+X2GKt6glDctt9fUCLbRV+d/l8NDC40+FxMjp9WlTQXaQALw==", - "license": "BSD-3-Clause" - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT", - "optional": true - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "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/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT", - "optional": true - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true - }, - "node_modules/global-directory": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ini": "4.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "license": "ISC" - }, - "node_modules/guid-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", - "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", - "peer": true - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "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/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "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.3.0", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.3.0.tgz", - "integrity": "sha512-ZSQIiNGfqSG6yoLHaCvrkPp16UejHI8PCDxFYaNG/1qxtmqNmqEg4JlWKlxkrUmrin2sEjsy+Mjy1TRozBhOgw==", - "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.27.6" - }, - "peerDependencies": { - "typescript": "^5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/i18next-browser-languagedetector": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.0.tgz", - "integrity": "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.2" - } - }, - "node_modules/i18next-http-backend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-3.0.2.tgz", - "integrity": "sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g==", - "license": "MIT", - "dependencies": { - "cross-fetch": "4.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/idb-keyval": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", - "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==", - "license": "Apache-2.0" - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "devOptional": true, - "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/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" - }, - "node_modules/immer": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", - "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "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/import-fresh/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==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", - "dev": true, - "license": "MIT", - "optional": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "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/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "license": "ISC", - "optional": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/inquirer": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", - "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/iota-array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz", - "integrity": "sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA==" - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "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-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "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-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "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-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-port-reachable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", - "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "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-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/its-fine": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", - "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", - "license": "MIT", - "dependencies": { - "@types/react-reconciler": "^0.28.0" - }, - "peerDependencies": { - "react": ">=18.0" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "dev": true, - "license": "MIT", - "optional": true, - "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==", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "26.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", - "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssstyle": "^4.2.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.5.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.16", - "parse5": "^7.2.1", - "rrweb-cssom": "^0.8.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^5.1.1", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.1.1", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^3.0.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/jsdom/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/jsdom/node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "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-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "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==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "license": "(MIT OR GPL-3.0-or-later)", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jwt-decode": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", - "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "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/konva": { - "version": "9.3.20", - "resolved": "https://registry.npmjs.org/konva/-/konva-9.3.20.tgz", - "integrity": "sha512-7XPD/YtgfzC8b1c7z0hhY5TF1IO/pBYNa29zMTA2PeBaqI0n5YplUeo4JRuRcljeAF8lWtW65jePZZF7064c8w==", - "funding": [ - { - "type": "patreon", - "url": "https://www.patreon.com/lavrton" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/konva" - }, - { - "type": "github", - "url": "https://github.com/sponsors/lavrton" - } - ], - "license": "MIT", - "peer": true - }, - "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/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/lint-staged": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.2.tgz", - "integrity": "sha512-sQKw2Si2g9KUZNY3XNvRuDq4UJqpHwF0/FQzZR2M7I5MvtpWvibikCjUVJzZdGE0ByurEl3KQNvsGetd1ty1/Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0", - "debug": "^4.4.1", - "lilconfig": "^3.1.3", - "listr2": "^8.3.3", - "micromatch": "^4.0.8", - "nano-spawn": "^1.0.2", - "pidtree": "^0.6.0", - "string-argv": "^0.3.2", - "yaml": "^2.8.0" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": ">=20.17" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/listr2": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", - "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/listr2/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, - "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.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "license": "MIT" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/lodash.map": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", - "dev": true, - "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/lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "peer": true - }, - "node_modules/longest": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", - "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", - "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lower-case/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "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==", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "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", - "peer": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/make-cancellable-promise": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/make-cancellable-promise/-/make-cancellable-promise-1.3.2.tgz", - "integrity": "sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==", - "license": "MIT", - "funding": { - "url": "https://github.com/wojtekmaj/make-cancellable-promise?sponsor=1" - } - }, - "node_modules/make-event-props": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.6.2.tgz", - "integrity": "sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==", - "license": "MIT", - "funding": { - "url": "https://github.com/wojtekmaj/make-event-props?sponsor=1" - } - }, - "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/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "license": "MIT" - }, - "node_modules/merge": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", - "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge-refs": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge-refs/-/merge-refs-1.3.0.tgz", - "integrity": "sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==", - "license": "MIT", - "funding": { - "url": "https://github.com/wojtekmaj/merge-refs?sponsor=1" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "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.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT", - "optional": true - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true, - "license": "ISC" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nano-spawn": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-1.0.2.tgz", - "integrity": "sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "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/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT", - "optional": true - }, - "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/ndarray": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-1.0.19.tgz", - "integrity": "sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==", - "dependencies": { - "iota-array": "^1.0.0", - "is-buffer": "^1.0.2" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "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", - "peer": true - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/no-case/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/node-abi": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", - "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", - "license": "MIT", - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT", - "optional": true - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nwsapi": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", - "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", - "dev": true, - "license": "MIT" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onnxruntime-common": { - "version": "1.21.0-dev.20250206-d981b153d3", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0-dev.20250206-d981b153d3.tgz", - "integrity": "sha512-TwaE51xV9q2y8pM61q73rbywJnusw9ivTEHAJ39GVWNZqxCoDBpe/tQkh/w9S+o/g+zS7YeeL0I/2mEWd+dgyA==", - "peer": true - }, - "node_modules/onnxruntime-web": { - "version": "1.21.0-dev.20250206-d981b153d3", - "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.21.0-dev.20250206-d981b153d3.tgz", - "integrity": "sha512-esDVQdRic6J44VBMFLumYvcGfioMh80ceLmzF1yheJyuLKq/Th8VT2aj42XWQst+2bcWnAhw4IKmRQaqzU8ugg==", - "peer": true, - "dependencies": { - "flatbuffers": "^25.1.24", - "guid-typescript": "^1.0.9", - "long": "^5.2.3", - "onnxruntime-common": "1.21.0-dev.20250206-d981b153d3", - "platform": "^1.3.6", - "protobufjs": "^7.2.4" - } - }, - "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/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/parchment": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz", - "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A==", - "license": "BSD-3-Clause" - }, - "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==", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/parse/-/parse-6.1.1.tgz", - "integrity": "sha512-zf70XcHKesDcqpO2RVKyIc1l7pngxBsYQVl0Yl/A38pftOSP8BQeampqqLEqMknzUetNZy8B+wrR3k5uTQDXOw==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime-corejs3": "7.27.0", - "idb-keyval": "6.2.1", - "react-native-crypto-js": "1.0.0", - "uuid": "10.0.0", - "ws": "8.18.1", - "xmlhttprequest": "1.8.0" - }, - "engines": { - "node": "18 || 19 || 20 || 22" - }, - "optionalDependencies": { - "crypto-js": "4.2.0" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse/node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz", - "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?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-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "license": "(WTFPL OR MIT)" - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/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/path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path2d": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/path2d/-/path2d-0.2.2.tgz", - "integrity": "sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "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/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/pdf-lib": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", - "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", - "license": "MIT", - "dependencies": { - "@pdf-lib/standard-fonts": "^1.0.0", - "@pdf-lib/upng": "^1.0.1", - "pako": "^1.0.11", - "tslib": "^1.11.1" - } - }, - "node_modules/pdfjs-dist": { - "version": "4.8.69", - "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-4.8.69.tgz", - "integrity": "sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "canvas": "^3.0.0-rc2", - "path2d": "^0.2.1" - } - }, - "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": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkijs": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.2.5.tgz", - "integrity": "sha512-WX0la7n7CbnguuaIQoT4Fc0IJckPDOUldzOwlZ0nwpOcySS+Six/tXBdc0RX17J5o1To0SAr3xDJjDLsOfDFQA==", - "license": "BSD-3-Clause", - "dependencies": { - "@noble/hashes": "^1.4.0", - "asn1js": "^3.0.5", - "bytestreamjs": "^2.0.0", - "pvtsutils": "^1.3.2", - "pvutils": "^1.1.3", - "tslib": "^2.6.3" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/pkijs/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", - "peer": true - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "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-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "license": "MIT" - }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "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/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.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", - "peer": true, - "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", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-format/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", - "peer": true - }, - "node_modules/pretty-quick": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/pretty-quick/-/pretty-quick-4.2.2.tgz", - "integrity": "sha512-uAh96tBW1SsD34VhhDmWuEmqbpfYc/B3j++5MC/6b3Cb8Ow7NJsvKFhg0eoGu2xXX+o9RkahkTK6sUdd8E7g5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.7", - "ignore": "^7.0.5", - "mri": "^1.2.0", - "picocolors": "^1.1.1", - "picomatch": "^4.0.2", - "tinyexec": "^0.3.2", - "tslib": "^2.8.1" - }, - "bin": { - "pretty-quick": "lib/cli.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://opencollective.com/pretty-quick" - }, - "peerDependencies": { - "prettier": "^3.0.0" - } - }, - "node_modules/pretty-quick/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/pretty-quick/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pretty-quick/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/print-js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/print-js/-/print-js-1.6.0.tgz", - "integrity": "sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==", - "license": "MIT" - }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types-extra": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", - "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", - "license": "MIT", - "dependencies": { - "react-is": "^16.3.2", - "warning": "^4.0.0" - }, - "peerDependencies": { - "react": ">=0.14.0" - } - }, - "node_modules/prop-types-extra/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/protobufjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", - "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", - "hasInstallScript": true, - "peer": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "license": "MIT", - "optional": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pvtsutils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.8.1" - } - }, - "node_modules/pvtsutils/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/pvutils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", - "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "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/quill": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/quill/-/quill-2.0.3.tgz", - "integrity": "sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==", - "license": "BSD-3-Clause", - "dependencies": { - "eventemitter3": "^5.0.1", - "lodash-es": "^4.17.21", - "parchment": "^3.0.0", - "quill-delta": "^5.1.0" - }, - "engines": { - "npm": ">=8.2.3" - } - }, - "node_modules/quill-delta": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz", - "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==", - "license": "MIT", - "dependencies": { - "fast-diff": "^1.3.0", - "lodash.clonedeep": "^4.5.0", - "lodash.isequal": "^4.5.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/quill-html-edit-button": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/quill-html-edit-button/-/quill-html-edit-button-3.0.0.tgz", - "integrity": "sha512-ZUV3rYjEvXz+v/7f8N0Mkp2+0D8VGDj6yCYPfagSLmyshczeMawS7vZJzaJ18dJp35IfjiPnzqyVk3KCI8qN1w==", - "license": "MIT", - "peerDependencies": { - "quill": "^2.x" - } - }, - "node_modules/radix-ui": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.4.2.tgz", - "integrity": "sha512-fT/3YFPJzf2WUpqDoQi005GS8EpCi+53VhcLaHUj5fwkPYiZAjk1mSxFvbMA8Uq71L03n+WysuYC+mlKkXxt/Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-accessible-icon": "1.1.7", - "@radix-ui/react-accordion": "1.2.11", - "@radix-ui/react-alert-dialog": "1.1.14", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-aspect-ratio": "1.1.7", - "@radix-ui/react-avatar": "1.1.10", - "@radix-ui/react-checkbox": "1.3.2", - "@radix-ui/react-collapsible": "1.1.11", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-context-menu": "2.2.15", - "@radix-ui/react-dialog": "1.1.14", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-dropdown-menu": "2.1.15", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-form": "0.1.7", - "@radix-ui/react-hover-card": "1.1.14", - "@radix-ui/react-label": "2.1.7", - "@radix-ui/react-menu": "2.1.15", - "@radix-ui/react-menubar": "1.1.15", - "@radix-ui/react-navigation-menu": "1.2.13", - "@radix-ui/react-one-time-password-field": "0.1.7", - "@radix-ui/react-password-toggle-field": "0.1.2", - "@radix-ui/react-popover": "1.1.14", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-progress": "1.1.7", - "@radix-ui/react-radio-group": "1.3.7", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-scroll-area": "1.2.9", - "@radix-ui/react-select": "2.2.5", - "@radix-ui/react-separator": "1.1.7", - "@radix-ui/react-slider": "1.3.5", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-switch": "1.2.5", - "@radix-ui/react-tabs": "1.1.12", - "@radix-ui/react-toast": "1.2.14", - "@radix-ui/react-toggle": "1.1.9", - "@radix-ui/react-toggle-group": "1.1.10", - "@radix-ui/react-toolbar": "1.1.10", - "@radix-ui/react-tooltip": "1.2.7", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-escape-keydown": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-accessible-icon": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.7.tgz", - "integrity": "sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-accordion": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.11.tgz", - "integrity": "sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collapsible": "1.1.11", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.14.tgz", - "integrity": "sha512-IOZfZ3nPvN6lXpJTBCunFQPRSvK8MDgSc1FB85xnIpUKOw9en0dJj8JmCAxV7BiZdtYlUpmrQjoTFkVYtdoWzQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dialog": "1.1.14", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-arrow": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz", - "integrity": "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.7.tgz", - "integrity": "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-avatar": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.10.tgz", - "integrity": "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-checkbox": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.2.tgz", - "integrity": "sha512-yd+dI56KZqawxKZrJ31eENUwqc1QSqg4OZ15rybGjF2ZNwMO+wCyHzAVLRp9qoYJf7kYy0YpZ2b0JCzJ42HZpA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-collapsible": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.11.tgz", - "integrity": "sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-context-menu": { - "version": "2.2.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.15.tgz", - "integrity": "sha512-UsQUMjcYTsBjTSXw0P3GO0werEQvUY2plgRQuKoCTtkNr45q1DiL51j4m7gxhABzZ0BadoXNsIbg7F3KwiUBbw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-menu": "2.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-dialog": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz", - "integrity": "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.10.tgz", - "integrity": "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.15.tgz", - "integrity": "sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", - "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-form": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.7.tgz", - "integrity": "sha512-IXLKFnaYvFg/KkeV5QfOX7tRnwHXp127koOFUjLWMTrRv5Rny3DQcAtIFFeA/Cli4HHM8DuJCXAUsgnFVJndlw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-label": "2.1.7", - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-hover-card": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.14.tgz", - "integrity": "sha512-CPYZ24Mhirm+g6D8jArmLzjYu4Eyg3TTUHswR26QgzXBHBe64BO/RHOJKzmF/Dxb4y4f9PKyJdwm/O/AhNkb+Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-label": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.7.tgz", - "integrity": "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-menu": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.15.tgz", - "integrity": "sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-menubar": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.15.tgz", - "integrity": "sha512-Z71C7LGD+YDYo3TV81paUs8f3Zbmkvg6VLRQpKYfzioOE6n7fOhA3ApK/V/2Odolxjoc4ENk8AYCjohCNayd5A==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-menu": "2.1.15", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-navigation-menu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.13.tgz", - "integrity": "sha512-WG8wWfDiJlSF5hELjwfjSGOXcBR/ZMhBFCGYe8vERpC39CQYZeq1PQ2kaYHdye3V95d06H89KGMsVCIE4LWo3g==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-one-time-password-field": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.7.tgz", - "integrity": "sha512-w1vm7AGI8tNXVovOK7TYQHrAGpRF7qQL+ENpT1a743De5Zmay2RbWGKAiYDKIyIuqptns+znCKwNztE2xl1n0Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-is-hydrated": "0.1.0", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-password-toggle-field": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.2.tgz", - "integrity": "sha512-F90uYnlBsLPU1UbSLciLsWQmk8+hdWa6SFw4GXaIdNWxFxI5ITKVdAG64f+Twaa9ic6xE7pqxPyUmodrGjT4pQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-is-hydrated": "0.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-popover": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.14.tgz", - "integrity": "sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-popper": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.7.tgz", - "integrity": "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@radix-ui/react-arrow": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-rect": "1.1.1", - "@radix-ui/react-use-size": "1.1.1", - "@radix-ui/rect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-presence": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.4.tgz", - "integrity": "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-progress": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", - "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-radio-group": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.3.7.tgz", - "integrity": "sha512-9w5XhD0KPOrm92OTTE0SysH3sYzHsSTHNvZgUBo/VZ80VdYyB5RneDbc0dKpURS24IxkoFRu/hI0i4XyfFwY6g==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-roving-focus": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.10.tgz", - "integrity": "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-scroll-area": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.9.tgz", - "integrity": "sha512-YSjEfBXnhUELsO2VzjdtYYD4CfQjvao+lhhrX5XsHD7/cyUNzljF1FHEbgTPN7LH2MClfwRMIsYlqTYpKTTe2A==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-select": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.5.tgz", - "integrity": "sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-focus-guards": "1.1.2", - "@radix-ui/react-focus-scope": "1.1.7", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3", - "aria-hidden": "^1.2.4", - "react-remove-scroll": "^2.6.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-separator": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.7.tgz", - "integrity": "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-slider": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.3.5.tgz", - "integrity": "sha512-rkfe2pU2NBAYfGaxa3Mqosi7VZEWX5CxKaanRv0vZd4Zhl9fvQrg0VM93dv3xGLGfrHuoTRF3JXH8nb9g+B3fw==", - "license": "MIT", - "dependencies": { - "@radix-ui/number": "1.1.1", - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-switch": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.2.5.tgz", - "integrity": "sha512-5ijLkak6ZMylXsaImpZ8u4Rlf5grRmoc0p0QeX9VJtlrM4f5m3nCTX8tWga/zOA8PZYIR/t0p2Mnvd7InrJ6yQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-previous": "1.1.1", - "@radix-ui/react-use-size": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-tabs": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.12.tgz", - "integrity": "sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-toast": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.14.tgz", - "integrity": "sha512-nAP5FBxBJGQ/YfUB+r+O6USFVkWq3gAInkxyEnmvEV5jtSbfDhfa4hwX8CraCnbjMLsE7XSf/K75l9xXY7joWg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-toggle": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.9.tgz", - "integrity": "sha512-ZoFkBBz9zv9GWer7wIjvdRxmh2wyc2oKWw6C6CseWd6/yq1DK/l5lJ+wnsmFwJZbBYqr02mrf8A2q/CVCuM3ZA==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.10.tgz", - "integrity": "sha512-kiU694Km3WFLTC75DdqgM/3Jauf3rD9wxeS9XtyWFKsBUeZA337lC+6uUazT7I1DhanZ5gyD5Stf8uf2dbQxOQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-toggle": "1.1.9", - "@radix-ui/react-use-controllable-state": "1.2.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-toolbar": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.10.tgz", - "integrity": "sha512-jiwQsduEL++M4YBIurjSa+voD86OIytCod0/dbIxFZDLD8NfO1//keXYMfsW8BPcfqwoNjt+y06XcJqAb4KR7A==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-direction": "1.1.1", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-roving-focus": "1.1.10", - "@radix-ui/react-separator": "1.1.7", - "@radix-ui/react-toggle-group": "1.1.10" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-tooltip": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz", - "integrity": "sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.2", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.10", - "@radix-ui/react-id": "1.1.1", - "@radix-ui/react-popper": "1.2.7", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.4", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/radix-ui/node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/re-resizable": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.11.2.tgz", - "integrity": "sha512-2xI2P3OHs5qw7K0Ud1aLILK6MQxW50TcO+DetD9eIV58j84TqYeHoZcL9H4GXFXXIh7afhH8mv5iUCXII7OW7A==", - "license": "MIT", - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-bootstrap": { - "version": "2.10.10", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.10.tgz", - "integrity": "sha512-gMckKUqn8aK/vCnfwoBpBVFUGT9SVQxwsYrp9yDHt0arXMamxALerliKBxr1TPbntirK/HGrUAHYbAeQTa9GHQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.7", - "@restart/hooks": "^0.4.9", - "@restart/ui": "^1.9.4", - "@types/prop-types": "^15.7.12", - "@types/react-transition-group": "^4.4.6", - "classnames": "^2.3.2", - "dom-helpers": "^5.2.1", - "invariant": "^2.2.4", - "prop-types": "^15.8.1", - "prop-types-extra": "^1.1.0", - "react-transition-group": "^4.4.5", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - }, - "peerDependencies": { - "@types/react": ">=16.14.8", - "react": ">=16.14.0", - "react-dom": ">=16.14.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-clientside-effect": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.8.tgz", - "integrity": "sha512-ma2FePH0z3px2+WOu6h+YycZcEvFmmxIlAb62cF52bG86eMySciO/EQZeQMXd07kPCYB0a1dWDT5J+KE9mCDUw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.13" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - } - }, - "node_modules/react-confetti": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-6.4.0.tgz", - "integrity": "sha512-5MdGUcqxrTU26I2EU7ltkWPwxvucQTuqMm8dUz72z2YMqTD6s9vMcDUysk7n9jnC+lXuCPeJJ7Knf98VEYE9Rg==", - "license": "MIT", - "dependencies": { - "tween-functions": "^1.2.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "react": "^16.3.0 || ^17.0.1 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-datepicker": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-8.4.0.tgz", - "integrity": "sha512-6nPDnj8vektWCIOy9ArS3avus9Ndsyz5XgFCJ7nBxXASSpBdSL6lG9jzNNmViPOAOPh6T5oJyGaXuMirBLECag==", - "license": "MIT", - "dependencies": { - "@floating-ui/react": "^0.27.3", - "clsx": "^2.1.1", - "date-fns": "^4.1.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc", - "react-dom": "^16.9.0 || ^17 || ^18 || ^19 || ^19.0.0-rc" - } - }, - "node_modules/react-dnd": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz", - "integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==", - "license": "MIT", - "dependencies": { - "@react-dnd/invariant": "^4.0.1", - "@react-dnd/shallowequal": "^4.0.1", - "dnd-core": "^16.0.1", - "fast-deep-equal": "^3.1.3", - "hoist-non-react-statics": "^3.3.2" - }, - "peerDependencies": { - "@types/hoist-non-react-statics": ">= 3.3.1", - "@types/node": ">= 12", - "@types/react": ">= 16", - "react": ">= 16.14" - }, - "peerDependenciesMeta": { - "@types/hoist-non-react-statics": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-dnd-html5-backend": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz", - "integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==", - "license": "MIT", - "dependencies": { - "dnd-core": "^16.0.1" - } - }, - "node_modules/react-dnd-multi-backend": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/react-dnd-multi-backend/-/react-dnd-multi-backend-9.0.0.tgz", - "integrity": "sha512-LAKDdyj4oMvVA/k2RiJ8KLIPO9sBiYIjIYtoFCuAgml9qQwIq+oTav2IXGfG4DrP49fBnVO7jjf5ofJMNOlWTA==", - "license": "MIT", - "dependencies": { - "dnd-multi-backend": "^9.0.0", - "react-dnd-preview": "^9.0.0" - }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/LouisBrunner" - }, - "peerDependencies": { - "dnd-core": "^16.0.1", - "react": "^16.14.0 || ^17.0.2 || ^18.0.0 || ^19.0.0", - "react-dnd": "^16.0.1", - "react-dom": "^16.14.0 || ^17.0.2 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-dnd-preview": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/react-dnd-preview/-/react-dnd-preview-9.0.0.tgz", - "integrity": "sha512-WZTbrrNDlCGYJGrITHN/obI2kpdaKV3AY6Il2LLZcA9ApzG5bbDXBlWSFwuw8eTCMjmCXs5Wcv+p2QCMxX1Afw==", - "license": "MIT", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/LouisBrunner" - }, - "peerDependencies": { - "react": "^16.14.0 || ^17.0.2 || ^18.0.0 || ^19.0.0", - "react-dnd": "^16.0.1" - } - }, - "node_modules/react-dnd-touch-backend": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/react-dnd-touch-backend/-/react-dnd-touch-backend-16.0.1.tgz", - "integrity": "sha512-NonoCABzzjyWGZuDxSG77dbgMZ2Wad7eQiCd/ECtsR2/NBLTjGksPUx9UPezZ1nQ/L7iD130Tz3RUshL/ClKLA==", - "license": "MIT", - "dependencies": { - "@react-dnd/invariant": "^4.0.1", - "dnd-core": "^16.0.1" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-draggable": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.6.tgz", - "integrity": "sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==", - "license": "MIT", - "dependencies": { - "clsx": "^1.1.1", - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "react": ">= 16.3.0", - "react-dom": ">= 16.3.0" - } - }, - "node_modules/react-draggable/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", - "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", - "license": "MIT" - }, - "node_modules/react-focus-lock": { - "version": "2.13.6", - "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.13.6.tgz", - "integrity": "sha512-ehylFFWyYtBKXjAO9+3v8d0i+cnc1trGS0vlTGhzFW1vbFXVUTmR8s2tt/ZQG8x5hElg6rhENlLG1H3EZK0Llg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.0.0", - "focus-lock": "^1.3.6", - "prop-types": "^15.6.2", - "react-clientside-effect": "^1.2.7", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-gtm-module": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/react-gtm-module/-/react-gtm-module-2.0.11.tgz", - "integrity": "sha512-8gyj4TTxeP7eEyc2QKawEuQoAZdjKvMY4pgWfycGmqGByhs17fR+zEBs0JUDq4US/l+vbTl+6zvUIx27iDo/Vw==", - "license": "MIT" - }, - "node_modules/react-helmet": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", - "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.1", - "prop-types": "^15.7.2", - "react-fast-compare": "^3.1.1", - "react-side-effect": "^2.1.0" - }, - "peerDependencies": { - "react": ">=16.3.0" - } - }, - "node_modules/react-i18next": { - "version": "15.5.3", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.5.3.tgz", - "integrity": "sha512-ypYmOKOnjqPEJZO4m1BI0kS8kWqkBNsKYyhVUfij0gvjy9xJNoG/VcGkxq5dRlVwzmrmY1BQMAmpbbUBLwC4Kw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.27.6", - "html-parse-stringify": "^3.0.1" - }, - "peerDependencies": { - "i18next": ">= 23.2.3", - "react": ">= 16.8.0", - "typescript": "^5" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT", - "peer": true - }, - "node_modules/react-konva": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/react-konva/-/react-konva-18.2.10.tgz", - "integrity": "sha512-ohcX1BJINL43m4ynjZ24MxFI1syjBdrXhqVxYVDw2rKgr3yuS0x/6m1Y2Z4sl4T/gKhfreBx8KHisd0XC6OT1g==", - "funding": [ - { - "type": "patreon", - "url": "https://www.patreon.com/lavrton" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/konva" - }, - { - "type": "github", - "url": "https://github.com/sponsors/lavrton" - } - ], - "license": "MIT", - "dependencies": { - "@types/react-reconciler": "^0.28.2", - "its-fine": "^1.1.1", - "react-reconciler": "~0.29.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "konva": "^8.0.1 || ^7.2.5 || ^9.0.0", - "react": ">=18.0.0", - "react-dom": ">=18.0.0" - } - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "license": "MIT" - }, - "node_modules/react-native-crypto-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz", - "integrity": "sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA==", - "license": "MIT" - }, - "node_modules/react-pdf": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/react-pdf/-/react-pdf-9.2.1.tgz", - "integrity": "sha512-AJt0lAIkItWEZRA5d/mO+Om4nPCuTiQ0saA+qItO967DTjmGjnhmF+Bi2tL286mOTfBlF5CyLzJ35KTMaDoH+A==", - "license": "MIT", - "dependencies": { - "clsx": "^2.0.0", - "dequal": "^2.0.3", - "make-cancellable-promise": "^1.3.1", - "make-event-props": "^1.6.0", - "merge-refs": "^1.3.0", - "pdfjs-dist": "4.8.69", - "tiny-invariant": "^1.0.0", - "warning": "^4.0.0" - }, - "funding": { - "url": "https://github.com/wojtekmaj/react-pdf?sponsor=1" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "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" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-quill-new": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/react-quill-new/-/react-quill-new-3.4.6.tgz", - "integrity": "sha512-S2kEAwoKRo+xUIAEpb94fwiPe2QU3FmwIfQ+7Lkchf+izPa2nRu1mr4i4QxyVYg8TjHDryDUiOEYZuFEV45QFA==", - "license": "MIT", - "dependencies": { - "lodash-es": "^4.17.21", - "quill": "~2.0.2" - }, - "peerDependencies": { - "quill-delta": "^5.1.0", - "react": "^16 || ^17 || ^18 || ^19", - "react-dom": "^16 || ^17 || ^18 || ^19" - } - }, - "node_modules/react-reconciler": { - "version": "0.29.2", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz", - "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-redux": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", - "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", - "license": "MIT", - "dependencies": { - "@types/use-sync-external-store": "^0.0.6", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "@types/react": "^18.2.25 || ^19", - "react": "^18.0 || ^19", - "redux": "^5.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-remove-scroll": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.0.tgz", - "integrity": "sha512-sGsQtcjMqdQyijAHytfGEELB8FufGbfXIsvUTe+NLx1GDRJCXtCFLBLUI1eyZCKXXvbEU2C6gai0PZKoIE9Vbg==", - "license": "MIT", - "dependencies": { - "react-remove-scroll-bar": "^2.3.7", - "react-style-singleton": "^2.2.3", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.3", - "use-sidecar": "^1.1.3" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", - "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "license": "MIT", - "dependencies": { - "react-style-singleton": "^2.2.2", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/react-remove-scroll/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/react-rnd": { - "version": "10.5.2", - "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.5.2.tgz", - "integrity": "sha512-0Tm4x7k7pfHf2snewJA8x7Nwgt3LV+58MVEWOVsFjk51eYruFEa6Wy7BNdxt4/lH0wIRsu7Gm3KjSXY2w7YaNw==", - "license": "MIT", - "dependencies": { - "re-resizable": "6.11.2", - "react-draggable": "4.4.6", - "tslib": "2.6.2" - }, - "peerDependencies": { - "react": ">=16.3.0", - "react-dom": ">=16.3.0" - } - }, - "node_modules/react-rnd/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "license": "0BSD" - }, - "node_modules/react-router": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.3.tgz", - "integrity": "sha512-zf45LZp5skDC6I3jDLXQUu0u26jtuP4lEGbc7BbdyxenBN1vJSTA18czM2D+h5qyMBuMrD+9uB+mU37HIoKGRA==", - "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-scrollbars-custom": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/react-scrollbars-custom/-/react-scrollbars-custom-4.1.1.tgz", - "integrity": "sha512-FOI1EMrdN5qziwvFAuH4saOo0+ggxeTuKLPpy6nezNdLUnDW1vCHGq0VSSfTSRstDgfXgwff5TMP9NeJ8NiFOQ==", - "license": "MIT", - "dependencies": { - "cnbuilder": "^3.1.0", - "react-draggable": "^4.4.5", - "zoom-level": "^2.5.0" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/xobotyi" - }, - "peerDependencies": { - "react": ">=16.0.0" - } - }, - "node_modules/react-select": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.10.1.tgz", - "integrity": "sha512-roPEZUL4aRZDx6DcsD+ZNreVl+fM8VsKn0Wtex1v4IazH60ILp5xhdlp464IsEAlJdXeD+BhDAFsBVMfvLQueA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.8.1", - "@floating-ui/dom": "^1.0.1", - "@types/react-transition-group": "^4.4.0", - "memoize-one": "^6.0.0", - "prop-types": "^15.6.0", - "react-transition-group": "^4.3.0", - "use-isomorphic-layout-effect": "^1.2.0" - }, - "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/react-side-effect": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", - "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==", - "license": "MIT", - "peerDependencies": { - "react": "^16.3.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-signature-canvas": { - "version": "1.1.0-alpha.2", - "resolved": "https://registry.npmjs.org/react-signature-canvas/-/react-signature-canvas-1.1.0-alpha.2.tgz", - "integrity": "sha512-tKUNk3Gmh04Ug4K8p5g8Is08BFUKvbXxi0PyetQ/f8OgCBzcx4vqNf9+OArY/TdNdfHtswXQNRwZD6tyELjkjQ==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.17.9", - "@types/signature_pad": "^2.3.0", - "signature_pad": "^2.3.2", - "trim-canvas": "^0.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/agilgur5" - }, - "peerDependencies": { - "@types/prop-types": "^15.7.3", - "@types/react": "0.14 - 19", - "prop-types": "^15.5.8", - "react": "0.14 - 19", - "react-dom": "0.14 - 19" - }, - "peerDependenciesMeta": { - "@types/prop-types": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", - "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "license": "MIT", - "dependencies": { - "get-nonce": "^1.0.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-style-singleton/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/react-timezone-select": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/react-timezone-select/-/react-timezone-select-3.2.8.tgz", - "integrity": "sha512-efEIVmYAHtm+oS+YlE/9DbieMka1Lop0v1LsW1TdLq0yCBnnAzROKDUY09CICY8TCijZlo0fk+wHZZkV5NpVNw==", - "license": "MIT", - "dependencies": { - "spacetime": "^7.6.0", - "timezone-soft": "^1.5.2" - }, - "peerDependencies": { - "react": "^16 || ^17.0.1 || ^18 || ^19.0.0-0", - "react-dom": "^16 || ^17.0.1 || ^18 || ^19.0.0-0", - "react-select": "^5.8.0" - } - }, - "node_modules/react-tooltip": { - "version": "5.29.1", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.29.1.tgz", - "integrity": "sha512-rmJmEb/p99xWhwmVT7F7riLG08wwKykjHiMGbDPloNJk3tdI73oHsVOwzZ4SRjqMdd5/xwb/4nmz0RcoMfY7Bw==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.6.1", - "classnames": "^2.3.0" - }, - "peerDependencies": { - "react": ">=16.14.0", - "react-dom": ">=16.14.0" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/reactour": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/reactour/-/reactour-1.19.4.tgz", - "integrity": "sha512-cMIaUQazGkdXt03m7AXAYXrCdyQl+uvH4nQBGP/oEjIaeSTZqj92C3W3y6doPakIIu21WeoGh1b0hBRKOxIViA==", - "license": "MIT", - "dependencies": { - "@rooks/use-mutation-observer": "4.11.2", - "classnames": "2.3.1", - "focus-outline-manager": "^1.0.2", - "lodash.debounce": "4.0.8", - "prop-types": "15.7.2", - "react-focus-lock": "^2.12.1", - "scroll-smooth": "1.1.1", - "scrollparent": "2.0.1" - }, - "peerDependencies": { - "react": "^16.3.0 || ^17.0.0-0 || ^18.0.0-0", - "react-dom": "^16.3.0 || ^17.0.0-0 || ^18.0.0-0", - "react-is": "^16.8 || ^17.0.0-0 || ^18.0.0-0", - "styled-components": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/reactour/node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==", - "license": "MIT" - }, - "node_modules/reactour/node_modules/prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" - } - }, - "node_modules/reactour/node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "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/redux": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" - }, - "node_modules/redux-thunk": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", - "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", - "license": "MIT", - "peerDependencies": { - "redux": "^5.0.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "license": "MIT" - }, - "node_modules/regex-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", - "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", - "license": "MIT" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "license": "MIT", - "dependencies": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", - "license": "MIT", - "dependencies": { - "rc": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.0.2" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reselect": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", - "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rollup": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.0.tgz", - "integrity": "sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.7" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.41.0", - "@rollup/rollup-android-arm64": "4.41.0", - "@rollup/rollup-darwin-arm64": "4.41.0", - "@rollup/rollup-darwin-x64": "4.41.0", - "@rollup/rollup-freebsd-arm64": "4.41.0", - "@rollup/rollup-freebsd-x64": "4.41.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.41.0", - "@rollup/rollup-linux-arm-musleabihf": "4.41.0", - "@rollup/rollup-linux-arm64-gnu": "4.41.0", - "@rollup/rollup-linux-arm64-musl": "4.41.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.41.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.41.0", - "@rollup/rollup-linux-riscv64-gnu": "4.41.0", - "@rollup/rollup-linux-riscv64-musl": "4.41.0", - "@rollup/rollup-linux-s390x-gnu": "4.41.0", - "@rollup/rollup-linux-x64-gnu": "4.41.0", - "@rollup/rollup-linux-x64-musl": "4.41.0", - "@rollup/rollup-win32-arm64-msvc": "4.41.0", - "@rollup/rollup-win32-ia32-msvc": "4.41.0", - "@rollup/rollup-win32-x64-msvc": "4.41.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-inject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", - "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", - "dev": true, - "license": "MIT", - "dependencies": { - "estree-walker": "^0.6.1", - "magic-string": "^0.25.3", - "rollup-pluginutils": "^2.8.1" - } - }, - "node_modules/rollup-plugin-node-polyfills": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", - "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", - "dev": true, - "license": "MIT", - "dependencies": { - "rollup-plugin-inject": "^3.0.0" - } - }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "estree-walker": "^0.6.1" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "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": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-push-apply/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "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==", - "dev": true, - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "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.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/scroll-smooth": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/scroll-smooth/-/scroll-smooth-1.1.1.tgz", - "integrity": "sha512-i9e/hJf0ODPEsy+AubE0zES6xdOuIvtebe5MvdSI1lB4t91k+O+8kV15CYfPN0yPH4j4hZUoKM3rVaPVcmiOoQ==", - "license": "MIT" - }, - "node_modules/scrollparent": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/scrollparent/-/scrollparent-2.0.1.tgz", - "integrity": "sha512-HSdN78VMvFCSGCkh0oYX/tY4R3P1DW61f8+TeZZ4j2VLgfwvw0bpRSOv4PCVKisktIwbzHCfZsx+rLbbDBqIBA==", - "license": "ISC" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.4.tgz", - "integrity": "sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==", - "license": "MIT", - "dependencies": { - "@zeit/schemas": "2.36.0", - "ajv": "8.12.0", - "arg": "5.0.2", - "boxen": "7.0.0", - "chalk": "5.0.1", - "chalk-template": "0.4.0", - "clipboardy": "3.0.0", - "compression": "1.7.4", - "is-port-reachable": "4.0.0", - "serve-handler": "6.1.6", - "update-check": "1.5.4" - }, - "bin": { - "serve": "build/main.js" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/serve-handler": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", - "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", - "license": "MIT", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "3.3.0", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "license": "MIT", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/serve/node_modules/chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "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==", - "dev": true, - "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/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" - }, - "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==", - "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==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/signature_pad": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/signature_pad/-/signature_pad-2.3.2.tgz", - "integrity": "sha512-peYXLxOsIY6MES2TrRLDiNg2T++8gGbpP2yaC+6Ohtxr+a2dzoaqWosWDY9sWqTAAk6E/TyQO+LJw9zQwyu5kA==", - "license": "MIT" - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "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", - "optional": true - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "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", - "optional": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/snake-case/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "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==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/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", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true, - "license": "MIT" - }, - "node_modules/spacetime": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/spacetime/-/spacetime-7.10.0.tgz", - "integrity": "sha512-tanJSLq0/+Qvq1bmK0Nh2Ppk0lFOkGwpes29/64E6hyK4kn5d6LPt65Eidm2Xaf3gLvmG8KaXh8LmeymPlw0Aw==", - "license": "Apache-2.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/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", - "dev": true, - "license": "MIT" - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/styled-components": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz", - "integrity": "sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0", - "react-is": ">= 16.8.0" - } - }, - "node_modules/styled-components/node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", - "license": "MIT" - }, - "node_modules/styled-components/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/styled-components/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", - "license": "MIT" - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "dev": true, - "license": "MIT" - }, - "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/synckit": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.8.tgz", - "integrity": "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.4" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" - } - }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "license": "MIT" - }, - "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.6.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.6", - "lilconfig": "^3.1.3", - "micromatch": "^4.0.8", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.1.1", - "postcss": "^8.4.47", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", - "postcss-nested": "^6.2.0", - "postcss-selector-parser": "^6.1.2", - "resolve": "^1.22.8", - "sucrase": "^3.35.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", - "license": "MIT", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/terser": { - "version": "5.39.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.2.tgz", - "integrity": "sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/timezone-soft": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/timezone-soft/-/timezone-soft-1.5.2.tgz", - "integrity": "sha512-BUr+CfBfeWXJwFAuEzPO9uF+v6sy3pL5SKLkDg4vdEhsyXgbBnpFoBCW8oEKSNTqNq9YHbVOjNb31xE7WyGmrA==", - "license": "MIT" - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" - }, - "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": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tldts": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^6.1.86" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^6.1.32" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/trim-canvas": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/trim-canvas/-/trim-canvas-0.1.2.tgz", - "integrity": "sha512-nd4Ga3iLFV94mdhW9JFMLpQbHUyCQuhFOD71PEAt1NjtMD5wbZctzhX8c3agHNybMR5zXD1XTGoIEWk995E6pQ==", - "license": "Apache-2.0" - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/tsconfck": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", - "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", - "dev": true, - "license": "MIT", - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^18 || >=20" - }, - "peerDependencies": { - "typescript": "^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tween-functions": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", - "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==", - "license": "BSD" - }, - "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/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/uncontrollable": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", - "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.6.3", - "@types/react": ">=16.9.11", - "invariant": "^2.2.4", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": ">=15.0.0" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "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/update-check": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", - "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", - "license": "MIT", - "dependencies": { - "registry-auth-token": "3.3.2", - "registry-url": "3.1.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==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", - "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-callback-ref/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", - "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", - "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "license": "MIT", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/use-sync-external-store": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", - "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "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/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-svgr": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.3.0.tgz", - "integrity": "sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.1.3", - "@svgr/core": "^8.1.0", - "@svgr/plugin-jsx": "^8.1.0" - }, - "peerDependencies": { - "vite": ">=2.6.0" - } - }, - "node_modules/vite-tsconfig-paths": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", - "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^3.0.3" - }, - "peerDependencies": { - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.4", - "@vitest/ui": "3.2.4", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "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/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-vitals": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-5.0.3.tgz", - "integrity": "sha512-4KmOFYxj7qT6RAdCH0SWwq8eKeXNhAFXR4PmgF6nrWFmrJ41n7lq3UCA6UK0GebQ4uu+XP8e8zGjaDO3wZlqTg==", - "license": "Apache-2.0" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/webpack": { - "version": "5.99.9", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz", - "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.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==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, - "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/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/widest-line/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "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/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true, - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xlsx": { - "version": "0.20.3", - "resolved": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz", - "integrity": "sha512-oLDq3jw7AcLqKWH2AhCpVTZl8mf6X2YReP+Neh0SJUzV/BdZYjth94tG5toiMB1PPrYtxOCfaoUCkvtuH+3AJA==", - "license": "Apache-2.0", - "bin": { - "xlsx": "bin/xlsx.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "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/xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", - "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "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": "3.25.28", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.28.tgz", - "integrity": "sha512-/nt/67WYKnr5by3YS7LroZJbtcCBurDKKPBPWWzaxvVCGuG/NOsiKkrjoOhI8mJ+SQUXEbUzeB3S+6XDUEEj7Q==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zoom-level": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/zoom-level/-/zoom-level-2.5.0.tgz", - "integrity": "sha512-7UlRWU4Q3uCMCeDVMOm7eBrIu145OqsIJ3p6zq58l8UsSYwKWxc6zEapC5YA9tIeh0oheb4cT9Kk2Wq353loFg==", - "license": "MIT", - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/xobotyi" - } - } - } -} diff --git a/apps/OpenSign/package.json b/apps/OpenSign/package.json index a9a8943b12..f9e3cb0486 100644 --- a/apps/OpenSign/package.json +++ b/apps/OpenSign/package.json @@ -1,18 +1,18 @@ { "name": "open_sign", - "version": "2.21.1", + "version": "2.26.0", "private": true, "dependencies": { - "@formkit/auto-animate": "^0.8.2", - "@imgly/background-removal": "^1.6.0", - "@lottiefiles/dotlottie-react": "^0.14.2", + "@formkit/auto-animate": "^0.8.4", + "@imgly/background-removal": "^1.7.0", + "@lottiefiles/dotlottie-react": "^0.15.2", "@pdf-lib/fontkit": "^1.1.1", "@radix-ui/themes": "^3.2.1", "@reduxjs/toolkit": "^2.8.2", - "axios": "^1.10.0", + "axios": "^1.11.0", "date-fns-tz": "^3.2.0", "file-saver": "^2.0.5", - "i18next": "^25.3.0", + "i18next": "^25.4.0", "i18next-browser-languagedetector": "^8.2.0", "i18next-http-backend": "^3.0.2", "jszip": "^3.10.1", @@ -24,11 +24,11 @@ "print-js": "^1.6.0", "prismjs": "^1.30.0", "quill-html-edit-button": "^3.0.0", - "radix-ui": "^1.4.2", + "radix-ui": "^1.4.3", "react": "^18.3.1", "react-bootstrap": "^2.10.10", "react-confetti": "^6.4.0", - "react-datepicker": "^8.4.0", + "react-datepicker": "^8.7.0", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", "react-dnd-multi-backend": "^9.0.0", @@ -36,15 +36,15 @@ "react-dom": "^18.3.1", "react-gtm-module": "^2.0.11", "react-helmet": "^6.1.0", - "react-i18next": "^15.5.3", - "react-konva": "^18.2.10", + "react-i18next": "^15.7.3", + "react-konva": "^18.2.12", "react-pdf": "^9.2.1", - "react-quill-new": "^3.4.6", + "react-quill-new": "^3.6.0", "react-redux": "^9.2.0", "react-rnd": "^10.5.2", - "react-router": "^7.6.3", + "react-router": "^7.8.2", "react-scrollbars-custom": "^4.1.1", - "react-select": "^5.10.1", + "react-select": "^5.10.2", "react-signature-canvas": "^1.1.0-alpha.2", "react-timezone-select": "^3.2.8", "react-tooltip": "^5.29.1", @@ -53,7 +53,7 @@ "regex-parser": "^2.3.1", "serve": "^14.2.4", "styled-components": "^5.3.11", - "web-vitals": "^5.0.3", + "web-vitals": "^5.1.0", "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz" }, "scripts": { @@ -94,36 +94,34 @@ } }, "devDependencies": { - "@babel/core": "^7.27.7", - "@babel/preset-env": "^7.27.2", + "@babel/core": "^7.28.3", + "@babel/preset-env": "^7.28.3", "@babel/preset-react": "^7.27.1", - "@babel/runtime-corejs2": "^7.27.6", - "@testing-library/jest-dom": "^6.6.3", + "@babel/runtime-corejs2": "^7.28.3", + "@testing-library/jest-dom": "^6.8.0", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", - "@types/react": "^18.3.23", - "@vitejs/plugin-react": "^4.6.0", - "@vitejs/plugin-react-swc": "^3.10.2", + "@types/react": "^19.1.12", + "@vitejs/plugin-react": "^4.7.0", "@vitest/ui": "^3.2.4", "autoprefixer": "^10.4.21", "babel-loader": "^10.0.0", "commitizen": "^4.3.1", - "concurrently": "^9.2.0", + "concurrently": "^9.2.1", "css-loader": "^7.1.2", "daisyui": "^4.12.24", - "dotenv": "^16.6.1", - "eslint": "^9.30.0", - "eslint-plugin-prettier": "^5.5.1", + "eslint": "^9.34.0", + "eslint-plugin-prettier": "^5.5.4", "eslint-plugin-react": "^7.37.5", "jsdom": "^26.1.0", - "lint-staged": "^16.1.2", + "lint-staged": "^16.1.6", "postcss": "^8.5.6", "prettier": "^3.6.2", "pretty-quick": "^4.2.2", "rollup-plugin-node-polyfills": "^0.2.1", "tailwindcss": "^3.4.17", - "vite": "^6.3.5", - "vite-plugin-svgr": "^4.3.0", + "vite": "^7.1.4", + "vite-plugin-svgr": "^4.5.0", "vite-tsconfig-paths": "^5.1.4", "vitest": "^3.2.4" }, diff --git a/apps/OpenSign/public/favicon.ico b/apps/OpenSign/public/favicon.ico deleted file mode 100644 index d8a847fdc5..0000000000 Binary files a/apps/OpenSign/public/favicon.ico and /dev/null differ diff --git a/apps/OpenSign/public/locales/de/translation.json b/apps/OpenSign/public/locales/de/translation.json index 6752f2a1eb..5ee66a3c52 100644 --- a/apps/OpenSign/public/locales/de/translation.json +++ b/apps/OpenSign/public/locales/de/translation.json @@ -1,4 +1,4 @@ -{ +{ "header-news": "Neue Funktion: Benutzer des Teams-Plans können jetzt ihre eigenen AWS S3-Buckets für die Dateispeicherung integrieren", "header-news-btn": "Jetzt einrichten", "sandbox-news": "Dies ist eine Sandbox-Umgebung. Bitte nicht für produktive Zwecke verwenden.", @@ -26,6 +26,8 @@ "Name": "Name", "Date": "Datum" }, + "folder": "Ordner", + "pdf": "Pdf", "context-menu": { "Download": "Herunterladen", "Rename": "Umbenennen", @@ -44,6 +46,10 @@ "contact-now": "Jetzt kontaktieren", "upgrade-to": "Upgrade zu", "plan": "Plan", + "connect": "Verbinden", + "connect-to-g-drive": "Mit Google Drive verbinden", + "reconnect-to-g-drive": "Erneut mit Google Drive verbinden", + "gdrive-info-connect": "Wenn Google Drive verbunden ist, wird das abgeschlossene Dokument im Ordner {{appName}} auf Google Drive gespeichert.", "subscription-renew-warning": "Ihr Abonnement läuft in {{remainingDays}} Tagen ab. Bitte verlängern Sie Ihr Abonnement.", "subscribe-card-teamplan": "Entfesseln Sie die volle Kraft der Zusammenarbeit! Erstellen Sie unbegrenzt Organisationen, Teams und Hierarchien. Teilen Sie Vorlagen nahtlos zwischen Teams und weisen Sie benutzerdefinierte Benutzerrollen zu. Optimieren Sie Ihren Workflow noch heute!", "subscribe-card-plan": "Entsperren Sie Premium-Funktionen ab nur {{premiumPrice}}/Monat. Genießen Sie eine verbesserte Leistung und zahlen Sie nur {{addonPrice}} pro zusätzlichem Credit nach den enthaltenen Premium-Credits.", @@ -58,7 +64,7 @@ "welcome": "Willkommen zurück!", "Login-to-your-account": "Melden Sie sich bei Ihrem Konto an", "password": "Passwort", - "forgot-password": "Passwort vergessen?", + "forgot-password": "Passwort vergessen", "loading": "Wird geladen...", "of": "von", "sign-SSO": "Mit SSO anmelden", @@ -181,7 +187,20 @@ "created-date": "Erstellungsdatum", "Type": "Type", "Logs": "Protokolle", - "Expiry-date": "Ablaufdatum" + "Expiry-date": "Ablaufdatum", + "Company": "Unternehmen", + "JobTitle": "Berufsbezeichnung", + "Time to complete (Days)": "Zeit zur Fertigstellung (Tage)", + "Auto reminder": "Automatische Erinnerung", + "Remind once in every (Days)": "Erinnere einmal alle (Tage)", + "Enable OTP verification": "OTP-Verifizierung aktivieren", + "Enable Tour": "Tour aktivieren", + "Notify on signatures": "Bei Signaturen benachrichtigen", + "Allow modifications": "Änderungen zulassen", + "Redirect url": "Weiterleitungs-URL", + "Created Date": "Erstellungsdatum", + "Updated Date": "Aktualisierungsdatum", + "Expiry Date": "Ablaufdatum" }, "report-help": { "Draft Documents": "Dies sind Dokumente, die Sie begonnen, aber noch nicht zum Versenden fertiggestellt haben.", @@ -193,16 +212,15 @@ "Contactbook": "Dies ist eine Liste von Kontakten/Unterzeichnern, die Sie hinzugefügt haben. Diese erscheinen als Vorschläge, wenn Sie neue Unterzeichner hinzufügen möchten.", "Templates": "Dies ist eine Liste von Vorlagen, die Ihnen zur Verfügung stehen, um Dokumente zu erstellen. Sie können die Schaltfläche 'Verwenden' anklicken, um ein neues Dokument mit einer Vorlage zu erstellen, das Dokument zu ändern und Unterzeichner im nächsten Schritt hinzuzufügen." }, - "form-name": { - "Sign Yourself": "Selbst unterschreiben", - "Request Signatures": "Signaturen anfordern", - "New Template": "Neue Vorlage" - }, + "Sign Yourself": "Selbst unterschreiben", + "Request Signatures": "Signaturen anfordern", + "New Template": "Neue Vorlage", "file-type": "pdf, png, jpg, jpeg", "docx": "docx", "file-selected": "Datei ausgewählt", "template-title": "Vorlagentitel", "document-title": "Dokumenttitel", + "title": "Titel", "description": "Beschreibung", "time-to-complete": "Bearbeitungszeit (Tage)", "send-in-order": "In der Reihenfolge senden", @@ -280,7 +298,7 @@ "deactivate": "deaktivieren", "this-user": "diesen Benutzer", "delete-user": "Benutzer löschen", - "delete": "löschen", + "delete": "Löschen", "add-user": "Benutzer hinzufügen", "password-generateed": "Das Passwort wird nur einmal generiert; stellen Sie sicher, dass Sie es kopieren.", "Team status": "Teamstatus", @@ -379,6 +397,7 @@ "certificate": "Zertifikat", "decline": "Ablehnen", "finish": "Fertigstellen", + "done": "Fertig", "mail": "E-Mail", "sign-now": "Jetzt unterzeichnen", "successfully-signed": "Erfolgreich unterzeichnet!", @@ -388,6 +407,10 @@ "Email-verified-alert-1": "E-Mail wurde verifiziert.", "Email-verified-alert-2": "E-Mail wurde bereits verifiziert.", "upload-stamp-image": "Stempelbild hochladen", + "draw-signature": "Unterschrift zeichnen", + "draw-initials": "Initialen zeichnen", + "enter-text": "Text eingeben", + "enter-widgettype": "{{widgetType}} eingeben", "draw": "Zeichnen", "type": "Schreiben", "color-type": { @@ -400,7 +423,7 @@ "upload": "Hochladen", "initial-teb": "Initialen", "signature-tab": "Unterschrift", - "initial-alert": "Meine Initiale nicht gefunden", + "initial-alert": "Meine Initiale wurde nicht gefunden", "copy-title": "Widget kopieren zu", "contact-delete-alert": "Sind Sie sicher, dass Sie diesen Kontakt löschen möchten?", "reset-password-alert-1": "Ein Link zum Zurücksetzen des Passworts wurde an Ihre E-Mail-Adresse gesendet.", @@ -465,7 +488,7 @@ "add-recipients": "Empfänger hinzufügen", "loading-mssg": "Das könnte etwas Zeit in Anspruch nehmen", "send-mail": "E-Mail senden", - "signature-field-widget": "Für jeden Benutzer muss mindestens ein Signaturfeld hinzugefügt werden. Sie haben keine Signaturfelder für {{signersName}} hinzugefügt", + "signature-field-widget": "Jeder Benutzer muss mindestens ein Signatur-Widget haben. Sie haben kein Signatur-Widget für {{signersName}} hinzugefügt.", "placeholder-alert-1": "Bitte stellen Sie sicher, dass für alle Empfänger mindestens ein Signatur-Widget hinzugefügt wurde.", "placeholder-alert-2": "Bitte bestätigen Sie, dass Sie das Textfeld ausgefüllt haben.", "placeholder-alert-3": "Sind Sie sicher, dass Sie dieses Dokument zur Unterzeichnung senden möchten?", @@ -600,7 +623,8 @@ "tour-mssg": { "home-layout-1": "Sie haben sich erfolgreich angemeldet! Werfen wir einen Blick darauf.", "home-layout-2": "Um Dokumente zum Selbstunterzeichnen hochzuladen oder um Unterschriften anderer anzufordern, wählen Sie einfach die entsprechenden Schaltflächen.", - "home-layout-3": "Sie sind bereit, {{appName}} zu verwenden! Wenn Sie Unterstützung benötigen, kontaktieren Sie uns gerne.", + "home-layout-3": "Sie sind bereit, {{appName}} zu verwenden!", + "home-layout-4": "Markiere uns auf", "generate-token": "Jetzt upgraden, um ein Produktions-API-Token zu generieren.", "opensign-drive-1": "Klicken Sie auf die Breadcrumb-Links, um einfach durch die Ordnerhierarchie zu navigieren und die Dokumente in jedem Ordner anzuzeigen.", "opensign-drive-2": "Klicken Sie auf die Schaltfläche Hinzufügen, um einen neuen Ordner oder ein neues Dokument zu erstellen.", @@ -610,28 +634,26 @@ "opensign-drive-6": "Klicken Sie mit der rechten Maustaste auf ein Dokument, um Optionen wie Herunterladen, Umbenennen, Verschieben und Löschen anzuzeigen. Klicken Sie auf das Dokument, um es zu öffnen.", "opensign-drive-7": "Klicken Sie mit der rechten Maustaste auf einen Ordner, um Optionen anzuzeigen. Wählen Sie Umbenennen, um den Namen des Ordners zu ändern, oder klicken Sie auf den Ordner, um seinen Inhalt anzuzeigen.", "pdf-request-file-1": "Liste der Unterzeichner, die das Dokument noch unterschreiben müssen.", - "pdf-request-file-2": "Klicken Sie auf die Platzhalter im Dokument, um zu unterschreiben. Sie sehen dann Optionen, Ihre Unterschrift zu zeichnen, einzugeben oder ein Bild hochzuladen.", - "pdf-request-file-3": "Klicken Sie auf die Schaltflächen Ablehnen oder Fertig stellen, um durch Ihr Dokument zu navigieren. Verwenden Sie das Auslassungsmenü für weitere Optionen, einschließlich der Schaltfläche Herunterladen.", + "pdf-request-file-2": "Klicken Sie auf eines der Felder im Dokument, um zu beginnen. Danach können Sie die erforderlichen Informationen eingeben.", + "pdf-request-file-3": "Sobald Sie alle erforderlichen Felder ausgefüllt haben, klicken Sie auf „Fertigstellen“. Danach können Sie das unterschriebene Dokument herunterladen. Je nach den Einstellungen des Absenders erhalten Sie möglicherweise eine Kopie des abgeschlossenen Dokuments zusammen mit dem Abschlusszertifikat, sobald alle Empfänger unterschrieben haben.", "pdf-request-file-4": "Liste der Unterzeichner, die das Dokument bereits unterzeichnet haben.", "pdf-request-file-5": "Sie können auf Automatisch alles unterschreiben klicken, um automatisch an allen für Sie vorgesehenen Stellen zu unterschreiben. Überprüfen Sie das Dokument gründlich, bevor Sie diese Schaltfläche verwenden.", "pdf-request-file-6": "Bitte füllen Sie die Felder auf Seite {{pagenumbers}} aus, die alle zur einfachen Identifizierung in der gleichen Farbe hervorgehoben sind.", - "placeholder-sign-1": "Wählen Sie einen Empfänger aus dieser Liste aus, um einen Platzhalter hinzuzufügen, an dem er unterschreiben soll. Der Platzhalter wird in der gleichen Farbe wie der Empfängername angezeigt, sobald Sie ihn im Dokument ablegen.", + "placeholder-sign-1": "Wählen Sie einen Empfänger aus dieser Liste, um ein Widget hinzuzufügen. Das Widget wird in derselben Farbe wie der Empfängername angezeigt, sobald Sie es auf das Dokument ziehen.", "placeholder-sign-2": "Das Klicken auf die Schaltfläche 'Empfänger hinzufügen' ermöglicht es Ihnen, weitere Unterzeichner hinzuzufügen.", "placeholder-sign-3": "Klicken Sie auf diese Schaltfläche, um weitere Empfänger/Unterzeichner zum Dokument hinzuzufügen.", - "placeholder-sign-4": "Ziehen Sie ein Feld in das Dokument oder klicken Sie darauf, um es hinzuzufügen.", - "placeholder-sign-5": "Der PDF-Inhaltsbereich zeigt bereits die vorhandenen Platzhalter der Vorlage an. Diese Platzhalter entsprechen der Farbe des Empfängernamens, um sie leicht erkennbar zu machen.", + "placeholder-sign-4": "Ziehen oder klicken Sie auf ein Widget, um es dem Dokument hinzuzufügen.", + "placeholder-sign-5": "Der PDF-Inhaltsbereich zeigt bereits die vorhandenen Widgets der Vorlage an. Diese Widgets entsprechen der Farbe des Empfängernamens, um sie leicht erkennbar zu machen.", "placeholder-sign-6": "Mit einem Klick auf 'Weiter' wird das Dokument gespeichert. Im nächsten Schritt können Sie die E-Mails, die an die Empfänger versendet werden sollen, anpassen oder die Signaturlinks kopieren und diese selbst mit den Empfängern teilen.", - "report-1":"Klicken Sie auf die Schaltfläche „Hinzufügen“, um eine neue Vorlage zu erstellen. Vorlagen sind wiederverwendbare Dokumente, mit denen schnell neue Dokumente mit derselben Struktur und unterschiedlichen Unterzeichnern erstellt werden können. Eine HR-Vorlage für die Einarbeitung könnte beispielsweise vordefinierte Rollen wie „Personalleiter“ und „Neuer Mitarbeiter“ enthalten. Bei jeder Verwendung der Vorlage können Sie die Rolle „Neuer Mitarbeiter“ verschiedenen neuen Mitarbeitern zuweisen, während die Rolle „Personalleiter“ unverändert bleibt. So wird ein nahtloser Einarbeitungsprozess für jeden neuen Mitarbeiter ermöglicht.", + "report-1": "Klicken Sie auf die Schaltfläche „Hinzufügen“, um eine neue Vorlage zu erstellen. Vorlagen sind wiederverwendbare Dokumente, mit denen schnell neue Dokumente mit derselben Struktur und unterschiedlichen Unterzeichnern erstellt werden können. Eine HR-Vorlage für die Einarbeitung könnte beispielsweise vordefinierte Rollen wie „Personalleiter“ und „Neuer Mitarbeiter“ enthalten. Bei jeder Verwendung der Vorlage können Sie die Rolle „Neuer Mitarbeiter“ verschiedenen neuen Mitarbeitern zuweisen, während die Rolle „Personalleiter“ unverändert bleibt. So wird ein nahtloser Einarbeitungsprozess für jeden neuen Mitarbeiter ermöglicht.", "redirect": "Klicken Sie auf die Schaltfläche 'Verwenden', um ein neues Dokument aus einer bestehenden Vorlage zu erstellen.", - "bulksend": "Um schnell mehrere Dokumente mithilfe einer vorhandenen Vorlage zu versenden, indem Sie einfach die E-Mail-Adressen der Empfänger erstellen, klicken Sie auf die Schaltfläche ‚Massenversand‘", - "option": "Dieses Menü zeigt weitere Optionen wie Bearbeiten und Löschen. Verwenden Sie die Schaltfläche 'Bearbeiten', um Unterzeichnerrollen hinzuzufügen, Felder zu ändern und Ihre Vorlage zu aktualisieren. Änderungen gelten für alle zukünftigen Dokumente, die aus dieser Vorlage erstellt werden, wirken sich jedoch nicht auf vorhandene Dokumente aus. Verwenden Sie die Schaltfläche 'Löschen', um die Vorlage zu entfernen.", - "signyour-self-1": "Wählen und ziehen Sie Ihre bevorzugten Widgets auf das PDF, um Ihr Dokument vor dem Unterzeichnen anzupassen. Wählen Sie die perfekten Stellen für jede Anpassung aus, um das Dokument an Ihre Bedürfnisse anzupassen.", + "bulksend": "Um schnell mehrere Dokumente mit einer vorhandenen Vorlage zu versenden, geben Sie einfach die E-Mail-Adressen der Empfänger ein und klicken Sie auf die Schaltfläche 'Massenversand'. Sie können bis zu 50 Empfänger erreichen.", + "option": "Dieses Menü zeigt weitere Optionen wie Bearbeiten, Löschen, Umbenennen, Duplizieren, Teilen usw. <1>Klicken Sie hier, um mehr über alle verfügbaren Optionen zu erfahren. <3>Hinweis: Änderungen an einer vorhandenen Vorlage gelten für alle zukünftigen Dokumente, die aus dieser Vorlage erstellt werden, betreffen jedoch nicht bereits versandte Dokumente.", + "signyour-self-1": "Wählen oder ziehen Sie Ihre bevorzugten Widgets auf das PDF, um Ihr Dokument vor der Unterzeichnung anzupassen. Platzieren Sie die Widgets an den perfekten Stellen, um das Dokument an Ihre Bedürfnisse anzupassen.", "signyour-self-2": "Ziehen Sie ein Widget irgendwo in diesen Bereich. Sie können es später in der Größe ändern und verschieben.", "template-placeholder-1": "Das Klicken auf die Schaltfläche 'Rolle hinzufügen' ermöglicht es Ihnen, verschiedene Unterzeichnerrollen hinzuzufügen. Sie können Benutzern diese Rollen in den folgenden Schritten zuweisen.", - "template-placeholder-2": "Sobald Rollen hinzugefügt wurden, wählen Sie eine Rolle aus der Liste aus, um einen Platzhalter hinzuzufügen, an dem der Unterzeichner unterschreiben soll. Der Platzhalter wird in der gleichen Farbe wie der Rollenname angezeigt, sobald Sie ihn im Dokument ablegen.", - "template-placeholder-3": "Ziehen Sie ein Feld in das Dokument oder klicken Sie darauf, um es hinzuzufügen.", - "template-placeholder-4": "Ziehen Sie den Platzhalter für eine Rolle an eine beliebige Stelle im Dokument. Denken Sie daran, dass er in der gleichen Farbe wie der Name des Empfängers angezeigt wird, um die Zuordnung zu erleichtern.", - "template-placeholder-5": "Das Klicken auf 'Weiter' speichert die aktuelle Vorlage. Nach dem Speichern werden Sie gefragt, ob Sie ein neues Dokument aus dieser Vorlage erstellen möchten.", + "template-placeholder-2": "Nachdem Sie Rollen hinzugefügt haben, wählen Sie eine aus der Liste, um ein Widget für diesen Empfänger zu platzieren. Sie können entweder auf das Widget klicken oder es auf das Dokument ziehen. Sobald es platziert ist, wird das Widget in derselben Farbe wie die ausgewählte Rolle angezeigt.", + "template-placeholder-3": "Das Klicken auf 'Weiter' speichert die aktuelle Vorlage. Nach dem Speichern werden Sie gefragt, ob Sie ein neues Dokument aus dieser Vorlage erstellen möchten.", "webhook-1": "Jetzt upgraden, um einen Webhook einzurichten", "Need your Signature": "Das Klicken auf diese Karte führt Sie zu einer Liste der Dokumente, die auf Ihre Überprüfung warten.", "Out for signatures": "Das Klicken auf diese Karte führt Sie zu einer Liste der Dokumente, die auf eine Signatur warten.", @@ -728,7 +750,7 @@ "public-tour-message": "Die Vorlage muss öffentlich sein, bevor Sie einen teilbaren Link generieren können.", "add-user-template": "Sie müssen eine Rolle hinzufügen, bevor Sie Felder dafür hinzufügen können.", "pdf-uncompatible": "Diese PDF-Datei ist nicht kompatibel, bitte kontaktieren Sie {{appName}}", - "text-field-tour": "Felder vom Typ 'Text' müssen im Voraus ausgefüllt werden, bevor das Dokument versendet wird. Wenn Sie möchten, dass die Unterzeichner Eingaben machen, verwenden Sie das Feld 'Texteingabe'.", + "text-field-tour": "Felder zum Vorabfüllen müssen vor dem Senden des Dokuments ausgefüllt werden. Wenn Sie Eingaben von den Unterzeichnern benötigen, verwenden Sie stattdessen die Felder für Unterzeichner.", "attach-signer-tour": "Sie müssen einen Unterzeichner jeder Rolle zuweisen. Dies können Sie durch Klicken auf dieses Symbol tun. Sobald Sie einen Unterzeichner auswählen, wird er allen Feldern der zugehörigen Rolle zugewiesen, die in derselben Farbe erscheinen.", "allowed-signature-types": "Erlaubte Signaturtypen", "at-least-one-signature-type": "Mindestens ein Signaturtyp sollte aktiviert sein.", @@ -776,7 +798,7 @@ "agree-p1": "Ich bestätige, dass ich die ", "agree-p2": "Offenlegung elektronischer Aufzeichnungen und Signaturen", "agree-p3": "gelesen und verstanden habe und der Verwendung elektronischer Aufzeichnungen und Signaturen zustimme.", - "agrre-button": "Zustimmen & Fortfahren", + "agrre-button": "Ich bestätige und stimme zu, fortzufahren", "term-cond-title": "Allgemeine Geschäftsbedingungen", "term-cond-h": "OFFENLEGUNG ELEKTRONISCHER AUFZEICHNUNGEN UND SIGNATUREN", "term-cond-p1": "Diese Offenlegung elektronischer Aufzeichnungen und Signaturen ('Offenlegung') ist eine Vereinbarung zwischen dem Dokumentersteller ('Sender') und dem Unterzeichner ('Ihnen'), bereitgestellt über die {{appName}} Plattform ('Plattform'). Durch das Signieren von Dokumenten über {{appName}} stimmen Sie den in dieser Offenlegung beschriebenen Bedingungen zu. Bitte lesen Sie sie sorgfältig durch, bevor Sie fortfahren.", @@ -1032,14 +1054,161 @@ "not-calculated": "Nicht berechnet", "not-found-in-signature": "Nicht in Signatur gefunden", "readonly-error": "Das schreibgeschützte {{widgetName}}-Widget muss einen Standardwert haben oder kann optional gemacht werden.", - "choose-one":"Wählen Sie eine aus", + "choose-one": "Wählen Sie eine aus", "search-templates": "Vorlagen durchsuchen…", "search-documents": "Dokumente suchen…", "search-contacts": "Kontakte durchsuchen…", + "edit-draft": "Entwurf bearbeiten", + "add-role-alert": "Bitte fügen Sie mindestens eine Rolle hinzu", "invalid-email-found": "Ungültige E-Mail gefunden: {{email}}", "duplicate-email-found": "Doppelte E-Mail gefunden: {{email}}", "vertical": "Vertikal", "horizontal": "Horizontal", "billing": "Abrechnung", - "console": "Konsole" + "console": "Konsole", + "prefill-widget": "Vorausgefüllte Widgets", + "action-prohibited": "Diese Aktion ist für Ihre E-Mail-Domain nicht erlaubt. Bitte wenden Sie sich an Ihren Administrator, um Hilfe zu erhalten.", + "must-have-at-least-one-vacant-role": "Mindestens eine Rolle muss unzugewiesen sein, bevor Sie ein template auf 'public' setzen.", + "remove-duplicate": "Bitte doppelte Option entfernen", + "prefill-bulk-error": "Der Massenversand ist nicht erlaubt, wenn Prefill-Widgets hinzugefügt wurden. Bitte entfernen Sie die Prefill-Widgets, um fortzufahren.", + "session-expired-title": "Sitzung abgelaufen", + "access-denied": "Zugriff verweigert", + "upgrade": "Upgrade", + "do-not-access-app": "Sie haben keinen Zugriff auf diese Anwendung.", + "dont-have-access": "Sie haben keinen Zugriff.", + "valid-email-alert": "Bitte geben Sie eine gültige E-Mail-Adresse ein.", + "otp-not-validate": "OTP ist ungültig.", + "domain-not-allowed": "Diese Domain ist nicht erlaubt", + "atleast-one-recipient-alert": "Bitte fügen Sie mindestens einen Empfänger hinzu!", + "incorrect-password-or-decryption-failed": "Falsches Passwort oder Entschlüsselung fehlgeschlagen.", + "incorrect-password-for-file": "Falsches Passwort für Datei: {{file}}", + "error-uploading-pdf": "Fehler beim Hochladen der PDF.", + "provide-password": "Bitte geben Sie das Passwort an.", + "only-pdf-allowed": "Nur PDF-Dateien sind erlaubt.", + "invalid-username-password-region": "Ungültiger Benutzername/Passwort oder Region.", + "pfx-extension-alert": "Bitte laden Sie eine Datei mit der Endung .pfx hoch.", + "email-already-exist": "E-Mail existiert bereits", + "branding": "Markenbildung", + "branding-help": "Branding ermöglicht White-Labeling für Ihre App", + "custom-sub-domain": "Benutzerdefinierte Subdomain", + "app-name": "App Name", + "provide-domain-name": "Geben Sie Ihren Domainnamen an", + "provide-app-name": "Geben Sie Ihren App-Namen an", + "logo": "Logo", + "upload-app-logo": "Laden Sie Ihr App-Logo hoch", + "prefill-unfilled-widget": "Die folgenden Pflichtfelder dürfen nicht leer sein: {{emptyWidget}}. Bitte füllen Sie diese aus, um fortzufahren.", + "Dashboard": "Armaturenbrett", + "Analytics": "Analytik", + "Templates": "Vorlagen", + "Need your sign": "Benötigt Ihre Unterschrift", + "In Progress": "In Bearbeitung", + "Completed": "Abgeschlossen", + "Drafts": "Entwürfe", + "Declined": "Abgelehnt", + "Expired": "Abgelaufen", + "Contactbook": "Kontaktbuch", + "My Signature": "Meine Unterschrift", + "API Token": "API-Token", + "Webhook": "Webhook", + "Preferences": "Einstellungen", + "Teams": "Teams", + "Users": "Benutzer", + "Drive": "Drive", + "Branding": "Markenbildung", + "Mail": "Mail", + "Storage": "Speicher", + "Signing certificate": "Signierzertifikat", + "General": "Allgemein", + "Organizations": "Organisationen", + "OrgAdmins": "OrgAdmins", + "Debug Pdf": "PDF debuggen", + "New Document": "Neues Dokument", + "subscription": "Abonnement", + "Draft document": "Dokumententwurf", + "Draft template": "Vorlagenentwurf", + "Public sign": "Öffentliche Signatur", + "Signup": "Registrieren", + "delete-contact": "Kontakt löschen", + "total-records-found": "Gesamtanzahl gefundener Einträge: {{count}}", + "Invalid-records-found": "Ungültige Einträge gefunden: {{records}}", + "previous": "Zurück", + "page-n-of-n": "Seite {{currentPage}} von {{totalPages}}", + "import": "Importieren", + "search": "Suchen", + "viewed-on": "Angesehen am: {{ViewedOn}}", + "signed-on": "Unterschrieben am: {{SignedOn}}", + "hide": "Ausblenden", + "show-more": "Mehr anzeigen", + "browse-or-drag-to-replace-existing-file": "Durchsuchen oder per Drag & Drop eine neue Datei ziehen, um die vorhandene zu ersetzen", + "optional-details": "Optionale Angaben", + "hide-optional-details": "optionale Angaben ausblenden", + "mail-adapter-subscription-alert": "Bitte upgraden Sie auf den Professional- oder Team-Plan, um den Mail-Adapter einzurichten.", + "connect-to-mail": "Mit Gmail verbinden", + "custom-smtp": "Benutzerdefiniertes SMTP", + "default-smtp": "{{appName}} Standard-SMTP", + "host": "Host", + "port": "Port", + "sender-email": "Absender-E-Mail", + "username": "Benutzername", + "use-default-mail-adapter": "Möchten Sie wirklich die Standard-Mailserver von {{appName}} verwenden, um Ihre Signaturanfragen zu versenden? Wir empfehlen, Ihre eigenen Gmail- oder SMTP-Server zu verwenden, um die Zustellbarkeit zu verbessern.", + "verification-code-sent-registered-email": "Ein Bestätigungscode wurde an Ihre registrierte E-Mail-Adresse <1>{{useremail}} gesendet. Bitte geben Sie den Code unten ein, um Ihre Einstellungen zu bestätigen.", + "smpt-credentials": "SMTP-Zugangsdaten", + "delete-account": "Konto löschen", + "delete-account-que": "Sind Sie sicher, dass Sie Ihr Konto löschen möchten?", + "delete-account-que-user": "Sie sind dabei, diesen Benutzer und alle zugehörigen Daten dauerhaft zu löschen. Diese Aktion kann nicht rückgängig gemacht werden.", + "user-deleted-successfully": "Benutzer und alle zugehörigen Daten wurden erfolgreich gelöscht.", + "account-deletion-request-sent-via-mail": "Wir haben Ihnen einen Bestätigungslink per E-Mail gesendet. Genehmigen Sie die Anfrage, um die Löschung Ihres Kontos abzuschließen.", + "type-exact-email-delete": "Geben Sie die genaue E-Mail ein, um das Löschen zu aktivieren", + "email-does-not-match": "E-Mail stimmt nicht überein.", + "please-type-to-confirm": "Bitte geben Sie <1>{{userEmail}} ein, um zu bestätigen:", + "email-settings": "E-Mail-Einstellungen", + "email-settings-help": "Um eine bessere Zustellbarkeit Ihrer Signaturanfrage-E-Mails im Posteingang zu gewährleisten, können Sie Ihren eigenen E-Mail-Anbieter verbinden. Wählen Sie eine der folgenden Optionen:", + "connect-to-gmail": "Mit Gmail verbinden: ", + "connect-to-gmail-help": "Verwenden Sie Ihr Gmail-Konto, um Signaturanfrage-E-Mails direkt aus Ihrem eigenen Posteingang zu senden. Dies verbessert die Zustellraten und Zuverlässigkeit.", + "connect-to-smtp": "Benutzerdefiniertes SMTP: ", + "connect-to-smtp-help": "Verwenden Sie Ihren eigenen SMTP-Server, um E-Mails über Ihre Domain zu versenden. Diese Option gibt Ihnen die volle Kontrolle über Ihre E-Mail-Infrastruktur und verbessert die Zustellbarkeit sowie die Markenkonsistenz.", + "connect-to-default": "Wenn Sie möchten, können Sie auch die Standard-Mailserver von {{appName}} verwenden, wir empfehlen jedoch für optimale Ergebnisse die Nutzung Ihrer eigenen.", + "email-settings-redirect-message": "Diese Einstellung wurde von der Konsole zu den Haupteinstellungen → Präferenzen verschoben. Diese Seite wird in zukünftigen Versionen entfernt.", + "go-to-preferences-menu": "Zum Menü 'Einstellungen' gehen", + "document-download-filename-format": "Dateiname-Format für Dokument-Download", + "preview": "Vorschau: ", + "download-filename-format-help": "Wählen Sie, wie heruntergeladene PDFs benannt werden. Ihre Auswahl wird in Ihrem Profil gespeichert und in der gesamten App verwendet.", + "delete-action-prohibited": "Diese Aktion ist nicht erlaubt. Bitte wenden Sie sich an Ihren Administrator, um die Löschung des Kontos zu beantragen.", + "not-verified": "Nicht verifiziert", + "verified": "Verifiziert", + "expires": "Läuft ab", + "fix-resend-error": "Sie können dieses Dokument nicht korrigieren und erneut senden, da es vorab ausgefüllte Widgets enthält.", + "duplicate-template-error": "Sie können diese Vorlage nicht duplizieren, da sie vorab ausgefüllte Widgets enthält.", + "save-as-template-error": "Dieses Dokument kann nicht als Vorlage gespeichert werden, da es vorab ausgefüllte Widgets enthält.", + "redirecting-you-in": "Sie werden in {{redirectTimeLeft}} Sek. weitergeleitet...", + "pdf-tools-tour": "Klicken Sie auf diese Schaltflächen, um Seiten hinzuzufügen, zu löschen, neu anzuordnen, zu drehen und zu zoomen.", + "widgets": "Widgets", + "prefill-tour": "Verwenden Sie diese Option, um Informationen im Voraus einzugeben, bevor Sie das Dokument an Empfänger senden.", + "empty-prefill-error": "Die folgenden Pflichtfelder dürfen nicht leer bleiben:", + "please-fill-out": "Bitte füllen Sie diese aus, um fortzufahren.", + "custom-signing-certificate": "Benutzerdefiniertes Signaturzertifikat", + "signing-certificate-help": "Sie können Ihr eigenes Dokumentensignaturzertifikat hochladen, das zum Signieren aller Ihrer Dokumente sowie Abschlusszertifikate verwendet wird. Die Zertifikatsdatei sollte ein P12-Zertifikat im PFX-Format sein.", + "certificate-file-p12-in-PFX-format": "Zertifikatsdatei (p12-Zertifikat im PFX-Format)", + "password-of-pfx-file": "Passwort der PFX-Datei eingeben", + "update": "Aktualisieren", + "use-default-certificate": "Standardzertifikat von {{appName}} verwenden", + "upgrade-to-team-plan": "Auf Team-Plan upgraden", + "setup-file-storage": "Dateispeicher einrichten", + "save-and-activate": "Speichern & aktivieren", + "logging-out-to-apply-settings": "Sie werden abgemeldet, um neue Einstellungen anzuwenden", + "reconnect-to-default": "Erneut mit {{appName}} verbinden", + "active-file-adapter": "Aktiver Dateiadapter", + "file-adapter-unique-name": "Eindeutiger Name des Dateiadapters", + "unique-name-for-file-adapter": "Eindeutigen Namen für Dateiadapter eingeben", + "storage-provider": "Speicheranbieter", + "enter-bucket-name": "Bucket-Namen eingeben", + "enter-space-name": "Space-Namen eingeben", + "enter-region-of-bucket": "Region des Buckets eingeben", + "enter-region-of-space": "Region des Spaces eingeben", + "enter-access-key": "Access Key eingeben", + "enter-secret-access-key": "Secret Access Key eingeben", + "otp-email": "Wir haben einen Bestätigungscode gesendet", + "save-as-temp-warn": "Hinweis: Dieses Dokument enthält vorausgefüllte Widgets, die automatisch entfernt werden, da sie bereits im Basisdokument integriert sind.", + "edit-document": "Dokument bearbeiten", + "otp-email": "Wir haben einen Bestätigungscode gesendet" } diff --git a/apps/OpenSign/public/locales/en/translation.json b/apps/OpenSign/public/locales/en/translation.json index 631c208151..7c8795bab1 100644 --- a/apps/OpenSign/public/locales/en/translation.json +++ b/apps/OpenSign/public/locales/en/translation.json @@ -26,6 +26,8 @@ "Name": "Name", "Date": "Date" }, + "folder": "Folder", + "pdf": "Pdf", "context-menu": { "Download": "Download", "Rename": "Rename", @@ -44,6 +46,10 @@ "contact-now": "Contact now", "upgrade-to": "Upgrade to", "plan": "Plan", + "connect": "connect", + "connect-to-g-drive": "Connect to Google Drive", + "reconnect-to-g-drive": "Reconnect to Google Drive", + "gdrive-info-connect": "When Google Drive is connected, the completed document will be saved in the {{appName}} folder on Google Drive.", "subscription-renew-warning": "Your subscription will expire in {{remainingDays}} days. Please renew your subscription.", "subscribe-card-teamplan": "Unlock the full power of collaboration! Create unlimited organizations, teams, and hierarchies. Share templates seamlessly across teams and assign custom user roles. Elevate your workflow today!", "subscribe-card-plan": "Unlock premium features starting at just {{premiumPrice}}/month. Enjoy enhanced performance and only {{addonPrice}} per additional credit after your included premium credits.", @@ -58,7 +64,7 @@ "welcome": "Welcome back!", "Login-to-your-account": "Login to your account", "password": "Password", - "forgot-password": "Forgot password?", + "forgot-password": "Forgot password", "loading": "Loading...", "of": "of", "sign-SSO": "Sign in with SSO", @@ -181,7 +187,20 @@ "created-date": "Created date", "Type": "Type", "Logs": "Logs", - "Expiry-date": "Expiry date" + "Expiry-date": "Expiry date", + "Company": "Company", + "JobTitle": "Job title", + "Time to complete (Days)": "Time to complete (Days)", + "Auto reminder": "Auto reminder", + "Remind once in every (Days)": "Remind once in every (Days)", + "Enable OTP verification": "Enable OTP verification", + "Enable Tour": "Enable Tour", + "Notify on signatures": "Notify on signatures", + "Allow modifications": "Allow modifications", + "Redirect url": "Redirect url", + "Created Date": "Created Date", + "Updated Date": "Updated Date", + "Expiry Date": "Expiry Date" }, "report-help": { "Draft Documents": "These are documents you have started but have not finalized for sending.", @@ -193,16 +212,15 @@ "Contactbook": "This is a list of contacts/signers added by you. These will appear as suggestions when you try to add signers to a new document.", "Templates": "This is a list of templates that are available to you for creating documents. You can click the 'use' button to create a new document using a template, modify the document & add signers in the next step." }, - "form-name": { - "Sign Yourself": "Sign yourself", - "Request Signatures": "Request signatures", - "New Template": "New template" - }, + "Sign Yourself": "Sign yourself", + "Request Signatures": "Request signatures", + "New Template": "New template", "file-type": "pdf, png, jpg, jpeg", "docx": "docx", "file-selected": "file(s) selected", "template-title": "Template title", "document-title": "Document title", + "title": "Title", "description": "Description", "time-to-complete": "Time to complete (Days)", "send-in-order": "Send in order", @@ -280,7 +298,7 @@ "deactivate": "deactivate", "this-user": " this user", "delete-user": "Delete user", - "delete": "delete", + "delete": "Delete", "add-user": "Add user", "password-generateed": "Password will only be generated once; make sure to copy it.", "Team status": "Team status", @@ -379,6 +397,7 @@ "certificate": "Certificate", "decline": "Decline", "finish": "Finish", + "done": "Done", "mail": "Mail", "sign-now": "Sign now", "successfully-signed": "Successfully signed!", @@ -388,6 +407,10 @@ "Email-verified-alert-1": "Email is verified.", "Email-verified-alert-2": "Email is already verified.", "upload-stamp-image": "Upload stamp image", + "draw-signature": "Draw signature", + "draw-initials": "Draw initials", + "enter-text": "Enter text", + "enter-widgettype": "Enter {{widgetType}}", "draw": "Draw", "type": "Type", "color-type": { @@ -408,6 +431,7 @@ "reset-password-alert-3": "Reset Your Password", "faild-animation": "Failed to load animation", "apply": "Apply", + "select-columns": "Select columns", "copy-type": { "All pages": "All pages", "All pages but last": "All pages but last", @@ -465,13 +489,13 @@ "add-recipients": "Add recipients", "loading-mssg": "This might take some time", "send-mail": "Send Mail", - "signature-field-widget": "A minimum of one signature field must be added for each user. You have not added signature fields for {{signersName}}", + "signature-field-widget": "Each user must have at least one signature widget. You have not added a signature widget for {{signersName}}", "placeholder-alert-1": "Please ensure there's at least one signature widget added for all recipients.", "placeholder-alert-2": "Please confirm that you have filled the text field.", "placeholder-alert-3": " Are you sure you want to send out this document for signatures?", "placeholder-alert-4": "You have successfully sent mails to all recipients!", "placeholder-mail-alert": "You have successfully sent email to {{name}}. Subsequent signers will get email(s) once {{name}} signs the document", - "placeholder-mail-alert-you": "Subsequent signers will get email(s) once you signs the document.", + "placeholder-mail-alert-you": "Subsequent signers will get email(s) once you sign the document.", "placeholder-alert-5": "Do you want to sign the document right now?", "placeholder-alert-6": "Please setup mail adapter to send mail!", "placeholder-alert-7": "Please select signer for add placeholder!", @@ -600,7 +624,8 @@ "tour-mssg": { "home-layout-1": "You have logged in successfully! Let's take a look.", "home-layout-2": "To upload documents for self-signing or to request others' signatures, simply select the respective buttons.", - "home-layout-3": "You are ready to start using {{appName}}! If you need support feel free to contact us.", + "home-layout-3": "You are ready to start using {{appName}}!", + "home-layout-4": "Star us on", "generate-token": "Upgrade now to generate production API token.", "opensign-drive-1": "Click on the breadcrumb links to easily navigate through the folder hierarchy and view the documents within each folder.", "opensign-drive-2": "Click the add button to create a new folder or document.", @@ -609,35 +634,33 @@ "opensign-drive-5": "The document list is displayed according to the selected sorting option. Icons next to each document indicate its current status.", "opensign-drive-6": "Right-click on a document to see options such as Download, Rename, Move, and Delete. Click on the document to open it.", "opensign-drive-7": "Right-click on any folder to see options. Choose 'Rename' to change the folder's name or click on the folder to navigate through its contents.", - "pdf-request-file-1": "List of signers who still need to sign the document .", - "pdf-request-file-2": "Click any of the placeholders appearing on the document to sign. You will then see options to draw your signature, type it, or upload an image .", - "pdf-request-file-3": "Click Decline, or Finish buttons to navigate your document. Use the ellipsis menu for additional options, including the Download button .", + "pdf-request-file-1": "List of signers who still need to sign the document.", + "pdf-request-file-2": "Click any of the fields appearing on the document to begin. You will then be able to fill in the required information.", + "pdf-request-file-3": "Once you've filled in all the required fields, click “Finish.” You'll then be able to download the signed document. Depending on the sender's settings, you may receive a copy of the completed document along with the completion certificate once all recipients have finished signing.", "pdf-request-file-4": "List of signers who have already signed the document .", "pdf-request-file-5": "You can click 'Auto Sign All' to automatically sign at all the locations meant to be signed by you. Make sure that you review the document properly before you click this button .", "pdf-request-file-6": "Please complete the fields on page number {{pagenumbers}}, all highlighted in the same color for easy identification.", - "placeholder-sign-1": "Select a recipient from this list to add a place-holder where he is supposed to sign.The placeholder will appear in the same colour as the recipient name once you drop it on the document.", + "placeholder-sign-1": "Select a recipient from this list to add a widgets. The widget will appear in the same colour as the recipient name once you drop it on the document.", "placeholder-sign-2": "Clicking 'Add recipients' button will allow you to add more signers.", "placeholder-sign-3": "Click this button to add more recipients/signers to the document.", - "placeholder-sign-4": "Drag or click on a field to add it to the document.", - "placeholder-sign-5": "The PDF content area already displays the template's existing placeholders. For your convenience, these placeholders will match the color of the recipient's name, making them easily identifiable.", + "placeholder-sign-4": "Drag or click a widget to add it to the document.", + "placeholder-sign-5": "The PDF content area already displays the template's existing Widgets. For your convenience, these widgets will match the color of the recipient's name, making them easily identifiable.", "placeholder-sign-6": "Clicking 'Next' will save the document. In the next step you can customize the emails to be sent out to the recipients or copy the signing links and share those with the recipients yourself.", "report-1": "Click the 'Add' button to create a new template. Templates are reusable documents designed to quickly generate new documents with the same structure and varying signers. For example, an HR template for onboarding could have predefined roles like 'HR Manager' and 'New Employee'. Each time you use the template, you can assign the 'New Employee' role to different incoming staff members, while the 'HR Manager' role remains constant, facilitating a seamless onboarding process for each recruit. ", "redirect": "Click the 'Use' button to create a new document from an existing template.", - "bulksend": "To quickly send multiple documents using an existing template by just creating the recipient email addresses, click the 'Bulk Send' button.", - "option": "This menu reveals more options such as Edit & Delete. Use the 'Edit' button to add signer roles, modify fields, and update your template. Changes will apply to all future documents created from this template but won't affect existing documents.Use the Delete button you can delete template. ", - "signyour-self-1": "Select and drag your preferred widgets onto the PDF to customize your document before signing. Choose the perfect spots for each modification to tailor the document to your needs.", + "bulksend": "To quickly send multiple documents using an existing template by just entering the recipient email addresses, click the 'Bulk Send' button. You can send to up to 50 recipients.", + "option": "This menu reveals more options such as Edit, Delete, Rename, Duplicate, Share, etc. <1>Click here to read more about all available options. <3>Note: Changes to an existing template will apply to all future documents created from that template but won't affect documents that are already sent out.", + "signyour-self-1": "Select or drag your preferred widgets onto the PDF to customize your document before signing. Choose the perfect spots for each widget to tailor the document to your needs.", "signyour-self-2": "Drag and drop anywhere in this area. You can resize and move it later.", "template-placeholder-1": "Clicking 'Add role' button will allow you to add various signer roles. You can attach users to each role in subsequent steps.", - "template-placeholder-2": "Once roles are added, select a role from list to add a place-holder where he is supposed to sign. The placeholder will appear in the same colour as the role name once you drop it on the document.", - "template-placeholder-3": "Drag or click on a field to add it to the document.", - "template-placeholder-4": "Drag the placeholder for a role anywhere on the document.Remember, it will appear in the same colour as the name of the recipient for easy reference.", - "template-placeholder-5": "Clicking 'Next' will store the current template. After saving, you'll be prompted to create a new document from this template if you wish.", + "template-placeholder-2": "After adding roles, choose one from the list to place a widget for that recipient. You can either click the widget or drag it onto the document. Once placed, the widget will display in the same color as the selected role.", + "template-placeholder-3": "Clicking 'Next' will store the current template. After saving, you'll be prompted to create a new document from this template if you wish.", "webhook-1": "Upgrade now to set webhook", "Need your Signature": "Clicking on this card will take you to the list of documents awaiting your review.", "Out for signatures": "Clicking on this card will take you to a list of documents awaiting signature.", "Recent signature requests": "This is a list of documents that are waiting for your signature.", "Recently sent for signatures": "This is a list of documents you've sent to other parties for signature.", - "Drafts": "This are documents you have started but have not finalized for sending.", + "Drafts": "These are documents you have started but have not finalized for sending.", "public-template": "This video demonstrates how to set up your personalized public profile, such as 'https://opensign.me/your-username'. You'll also learn how to customize your tagline and make your templates available for public signing.", "allowModify-widgets": "You can drag and drop any of these fields onto the document, in addition to the fields already designated for you by the document creator." }, @@ -728,7 +751,7 @@ "public-tour-message": "The template needs to be public before you can generate a shareable link.", "add-user-template": "You need to add a role before you can add fields for it.", "pdf-uncompatible": "This pdf is not compatible, please contact {{appName}}", - "text-field-tour": "Fields of type 'Text' must be filled in advance before the document is sent. If you need the signers to provide input, use the 'Text Input' field instead.", + "text-field-tour": "'Prefill' fields must be filled in advance before the document is sent. If you need the signers to provide input, use signers fields instead.", "attach-signer-tour": "You need to attach a Signer to every role. You can do that by clicking this icon. Once you select a Signer it will be attached to all the fields associated with that role which appear in the same colour.", "allowed-signature-types": "Allowed signature types", "at-least-one-signature-type": "At least one signature type should be enabled.", @@ -776,7 +799,7 @@ "agree-p1": "I confirm that I have read and understood the ", "agree-p2": "Electronic Record and Signature Disclosure", "agree-p3": "and consent to use electronic records and signatures.", - "agrre-button": " Agree & Continue", + "agrre-button": "I confirm & agree to continue", "term-cond-title": "Terms and conditions", "term-cond-h": "ELECTRONIC RECORD AND SIGNATURE DISCLOSURE", "term-cond-p1": "This Electronic Record and Signature Disclosure ('Disclosure') is an agreement between the Document Creator ('Sender') and the Signer ('You'), facilitated through the {{appName}} platform ('Platform'). By signing documents via {{appName}}, you agree to the terms outlined in this Disclosure. Please read it carefully before proceeding.", @@ -976,20 +999,20 @@ "verify-identity": "Verify identity", "passkey-verification-failed": "Passkey verification failed. Please try again or use OTP.", "security-auth-help": { - "p1":"Manage your account's security settings to keep your data safe. OpenSign supports advanced authentication methods to enhance account protection.", - "2fa-auth-help":" Add an extra layer of security by enabling 2FA. This requires you to enter a verification code from an authenticator app after your password.", - "passkey-auth-help":"Use passkeys for passwordless sign-in with biometric or device-based verification, providing both strong security and convenience." + "p1": "Manage your account's security settings to keep your data safe. OpenSign supports advanced authentication methods to enhance account protection.", + "2fa-auth-help": " Add an extra layer of security by enabling 2FA. This requires you to enter a verification code from an authenticator app after your password.", + "passkey-auth-help": "Use passkeys for passwordless sign-in with biometric or device-based verification, providing both strong security and convenience." }, "signer-already-present": "Signer already present", "kiosk-sign": "Kiosk Sign", "dont-have-access-to-template": "The template has been deleted or you don't have access. Please contact the sender.", "kiosk-info": "Kiosk Mode lets you collect in-person signatures quickly and efficiently. Ideal for trade shows, events, or walk-in scenarios where all signers are physically present. ", "learn-more": "Learn more", - "finish-mssg":" Are you sure you want to finish the document ?", - "review":"Review", - "next-field":"Next Field", - "required-mssg":"{{leftRequiredWidget}} of {{totalWidget}} fields left", - "verify-document": "Verify document", + "finish-mssg": " Are you sure you want to finish the document ?", + "review": "Review", + "next-field": "Next Field", + "required-mssg": "{{leftRequiredWidget}} of {{totalWidget}} fields left", + "verify-document": "Verify document", "verify-document-signature": "Verify Document Signature", "select-pdf-document": "Select PDF Document", "selected-file": "Selected file", @@ -1032,14 +1055,161 @@ "not-calculated": "Not calculated", "not-found-in-signature": "Not found in signature", "readonly-error": "Read-only {{widgetName}} widget must have a default value or you can make it optional.", - "choose-one":"Choose One", + "choose-one": "Choose One", "search-templates": "Search templates…", "search-documents": "Search documents…", "search-contacts": "Search contacts…", + "add-role-alert": "Please add at least one role", + "edit-draft": "Edit draft", "invalid-email-found": "Invalid email found: {{email}}", "duplicate-email-found": "Duplicate email found: {{email}}", "vertical": "Vertical", "horizontal": "Horizontal", "billing": "Billing", - "console": "Console" -} \ No newline at end of file + "console": "Console", + "prefill-widget": "Prefill Widgets", + "action-prohibited": "This action isn't allowed for your email domain. Please contact your administrator for assistance.", + "must-have-at-least-one-vacant-role": "You must have at least one role unassigned before setting a template to 'public'.", + "remove-duplicate": "Please remove duplicate option", + "prefill-bulk-error": "Bulk send is not allowed when prefill widgets are added. Please remove the prefill widgets to proceed.", + "session-expired-title": "Session Expired", + "access-denied": "Access denied", + "upgrade": "Upgrade", + "do-not-access-app": "You don't have access to this application.", + "dont-have-access": "You don't have access.", + "valid-email-alert": "Please enter a valid email address.", + "otp-not-validate": "OTP is not valid.", + "domain-not-allowed": "This domain is not allowed", + "atleast-one-recipient-alert": "Please add at least one recipient!", + "incorrect-password-or-decryption-failed": "Incorrect password or decryption failed.", + "incorrect-password-for-file": "Incorrect password for file: {{file}}", + "error-uploading-pdf": "Error while uploading PDF.", + "provide-password": "Please provide password.", + "only-pdf-allowed": "Only PDF files are allowed.", + "invalid-username-password-region": "Invalid username/password or region.", + "pfx-extension-alert": "Please upload a file with a .pfx extension.", + "email-already-exist": "Email already exists", + "branding": "Branding", + "branding-help": "Branding provides white labelling to your app", + "custom-sub-domain": "Custom sub-domain", + "app-name": "App Name", + "provide-domain-name": "provide your domain name", + "provide-app-name": "provide your app name", + "logo": "Logo", + "upload-app-logo": "upload your app logo", + "prefill-unfilled-widget": "The following required field(s) cannot be left empty: {{emptyWidget}} Please fill them out to proceed.", + "Dashboard": "Dashboard", + "Analytics": "Analytics", + "Templates": "Templates", + "Need your sign": "Need your sign", + "In Progress": "In progress", + "Completed": "Completed", + "Drafts": "Drafts", + "Declined": "Declined", + "Expired": "Expired", + "Contactbook": "Contactbook", + "My Signature": "My signature", + "API Token": "API token", + "Webhook": "Webhook", + "Preferences": "Preferences", + "Teams": "Teams", + "Users": "Users", + "Drive": "Drive", + "Branding": "Branding", + "Mail": "Mail", + "Storage": "Storage", + "Signing certificate": "Signing certificate", + "General": "General", + "Organizations": "Organizations", + "OrgAdmins": "OrgAdmins", + "Debug Pdf": "Debug Pdf", + "New Document": "New Document", + "subscription": "subscription", + "Draft document": "Draft document", + "Draft template": "Draft template", + "Public sign": "Public sign", + "Signup": "Signup", + "delete-contact": "Delete Contact", + "total-records-found": "Total records found: {{count}}", + "Invalid-records-found": "Invalid records found: {{records}}", + "previous": "Previous", + "page-n-of-n": "Page {{currentPage}} of {{totalPages}}", + "import": "Import", + "search": "Search", + "viewed-on": "Viewed on: {{ViewedOn}}", + "signed-on": "Signed on: {{SignedOn}}", + "hide": "Hide", + "show-more": "Show More", + "browse-or-drag-to-replace-existing-file": "Browse or drag & drop a new file to replace the existing one", + "optional-details": "Optional details", + "hide-optional-details": "Hide optional details", + "mail-adapter-subscription-alert": "Please upgrade to Professional or Team plan to setup custom SMTP.", + "connect-to-mail": "Connect to Gmail", + "custom-smtp": "Custom SMTP", + "default-smtp": "{{appName}} default SMTP", + "host": "Host", + "port": "Port", + "sender-email": "Sender Email", + "username": "Username", + "use-default-mail-adapter": "Are you sure you want to use {{appName}}'s default mail servers to send your signature request emails? We recommend using your own Gmail or SMTP servers for improved inbox deliverability.", + "verification-code-sent-registered-email": "A verification code has been sent to your registered email <1>{{useremail}} confirm your settings. Please enter the code below.", + "smpt-credentials": "SMTP Credentials", + "delete-account": "Delete account", + "delete-account-que": "Are you sure you want to delete your account?", + "delete-account-que-user": "You are about to permanently delete this user and all associated data. This action cannot be undone.", + "user-deleted-successfully": "User and all associated data deleted successfully.", + "account-deletion-request-sent-via-mail": "We've emailed you a confirmation link. Approve the request to complete your account deletion.", + "type-exact-email-delete": "Type the exact email to enable delete", + "email-does-not-match": "Email does not match.", + "please-type-to-confirm": "Please type <1>{{userEmail}} to confirm:", + "email-settings": "Email settings", + "email-settings-help": " To ensure better inbox deliverability for your signature request emails, you can connect your own email provider. Choose one of the following options:", + "connect-to-gmail": "Connect to Gmail: ", + "connect-to-gmail-help": "Use your Gmail account to send signature request emails directly from your own inbox, improving delivery rates and reliability.", + "connect-to-smtp": "Custom SMTP: ", + "connect-to-smtp-help": "Use your custom SMTP server for sending emails through your domain. This option gives you full control over your email infrastructure, enhancing deliverability and brand consistency.", + "connect-to-default": "If you prefer, you can also Use {{appName}} default mail servers, though we recommend using your own for optimal results.", + "email-settings-redirect-message": "This setting has been moved from the console to Main Menu Settings → Preferences. This page will be removed in upcoming versions.", + "go-to-preferences-menu": "Go to Preferences menu", + "document-download-filename-format": "Document download filename format", + "preview": "Preview: ", + "download-filename-format-help": "Choose how downloaded PDFs are named. Your selection is saved to your profile and used across the app.", + "delete-action-prohibited": "This action is not permitted. Kindly contact your administrator to request account deletion.", + "not-verified": "Not verified", + "verified": "Verified", + "expires": "Expires", + "fix-resend-error": "You can't fix and resend this document because it contains prefill widgets.", + "duplicate-template-error": "You can't duplicate this template because it contains prefill widgets.", + "save-as-template-error": "This document cannot be saved as a template because it contains prefill widgets.", + "redirecting-you-in": "Redirecting you in {{redirectTimeLeft}} sec...", + "pdf-tools-tour": "Click these buttons to add, delete, rearrange, rotate and zoom pages.", + "widgets": "Widgets", + "prefill-tour": "Use this option to enter information in advance before sending the document to recipients.", + "empty-prefill-error": "The following required field(s) cannot be left empty:", + "please-fill-out": "Please fill them out to proceed.", + "custom-signing-certificate": "Custom signing certificate", + "signing-certificate-help": "You can upload your own document signing certificate which will be used to sign all your documents as well as completion certificates. The certificate file should be a P12 certificate in PFX format.", + "certificate-file-p12-in-PFX-format": "Certificate file (p12 certificate in PFX format)", + "password-of-pfx-file": "Enter password of pfx file", + "update": "Update", + "use-default-certificate": "Use default {{appName}} certificate", + "upgrade-to-team-plan": "Upgrade to Team Plan", + "setup-file-storage": "Setup file storage", + "save-and-activate": "Save & activate", + "logging-out-to-apply-settings": "You are being logged out to apply new settings", + "reconnect-to-default": "Reconnect to {{appName}}", + "active-file-adapter": "Active File Adapter", + "file-adapter-unique-name": "File Adapter unique name", + "unique-name-for-file-adapter": "Enter unique name for file adapter", + "storage-provider": "Storage Provider", + "enter-bucket-name": "Enter bucket name", + "enter-space-name": "Enter space name", + "enter-region-of-bucket": "Enter region of bucket", + "enter-region-of-space": "Enter region of space", + "enter-access-key": "Enter access key", + "enter-secret-access-key": "Enter secret access key", + "otp-email":"We’ve sent a verification code to", + "save-as-temp-warn":"Note: This document includes prefilled widgets, which will be automatically removed as they are already incorporated into the base document.", + "edit-document": "Edit document", + "otp-email":"We've sent a verification code to" +} diff --git a/apps/OpenSign/public/locales/es/translation.json b/apps/OpenSign/public/locales/es/translation.json index 4107b314ae..89c0e21127 100644 --- a/apps/OpenSign/public/locales/es/translation.json +++ b/apps/OpenSign/public/locales/es/translation.json @@ -26,6 +26,8 @@ "Name": "Nombre", "Date": "Fecha" }, + "folder": "Carpeta", + "pdf": "Pdf", "context-menu": { "Download": "Descargar", "Rename": "Renombrar", @@ -44,6 +46,10 @@ "contact-now": "Contactar ahora", "upgrade-to": "Mejorar a", "plan": "Plan", + "connect": "Conectar", + "connect-to-g-drive": "Conectar con Google Drive", + "reconnect-to-g-drive": "Volver a conectar con Google Drive", + "gdrive-info-connect": "Cuando Google Drive está conectado, el documento completado se guardará en la carpeta {{appName}} de Google Drive.", "subscription-renew-warning": "Su suscripción vencerá en {{remainingDays}} días. Por favor, renueve su suscripción.", "subscribe-card-teamplan": "¡Libera todo el poder de la colaboración! Crea organizaciones, equipos y jerarquías ilimitadas. Comparte plantillas sin problemas entre equipos y asigna funciones de usuario personalizadas. ¡Mejora tu flujo de trabajo hoy mismo!", "subscribe-card-plan": "Desbloquea funciones premium desde solo {{premiumPrice}}/mes. Disfruta de un rendimiento mejorado y solo {{addonPrice}} por crédito adicional después de tus créditos premium incluidos.", @@ -58,7 +64,7 @@ "welcome": "¡Bienvenido de nuevo!", "Login-to-your-account": "Ingresa a tu cuenta", "password": "Contraseña", - "forgot-password": "¿Olvidaste la contraseña?", + "forgot-password": "¿Olvidaste la contraseña", "loading": "Cargando...", "of": "de", "sign-SSO": "Ingresar con SSO", @@ -181,7 +187,20 @@ "created-date": "Fecha de creación", "Type": "Tipo", "Logs": "Registros", - "Expiry-date": "Date d'expiration" + "Expiry-date": "Date d'expiration", + "Company": "Compañía", + "JobTitle": "Título del puesto", + "Time to complete (Days)": "Tiempo para completar (días)", + "Auto reminder": "Recordatorio automático", + "Remind once in every (Days)": "Recordar una vez cada (días)", + "Enable OTP verification": "Habilitar verificación OTP", + "Enable Tour": "Habilitar recorrido", + "Notify on signatures": "Notificar en las firmas", + "Allow modifications": "Permitir modificaciones", + "Redirect url": "URL de redirección", + "Created Date": "Fecha de creación", + "Updated Date": "Fecha de actualización", + "Expiry Date": "Fecha de vencimiento" }, "report-help": { "Draft Documents": "Estos son documentos que has iniciado pero no has finalizado para su envío.", @@ -193,16 +212,15 @@ "Contactbook": "Esta es una lista de contactos/firmantes añadidos por ti. Aparecerán como sugerencias cuando intentes añadir firmantes a un nuevo documento.", "Templates": "Esta es una lista de plantillas que están a tu disposición para crear documentos. Puedes hacer clic en el botón «usar» para crear un nuevo documento utilizando una plantilla, modifica el documento y añade firmantes en el siguiente paso." }, - "form-name": { - "Sign Yourself": "Firmar", - "Request Signatures": "Solicitar firmas", - "New Template": "Nueva plantilla" - }, + "Sign Yourself": "Firmar", + "Request Signatures": "Solicitar firmas", + "New Template": "Nueva plantilla", "file-type": "pdf, png, jpg, jpeg", "docx": "docx", "file-selected": "archivo seleccionado", "template-title": "Título de la plantilla", "document-title": "Título del documento", + "title": "Título", "description": "Descripción", "time-to-complete": "Plazo de finalización (días)", "send-in-order": "Enviar en orden", @@ -242,7 +260,6 @@ "submit": "Enviar", "reset": "Volver a empezar", "my-signature": "Mi firma", - "initial-alert": "Mi inicial no encontrada", "signature": "Firma", "upload-image": " Subir imagen", "clear": "Limpiar", @@ -281,7 +298,7 @@ "deactivate": "desactivar", "this-user": " este usuario", "delete-user": "Eliminar usuario", - "delete": "eliminar", + "delete": "Eliminar", "add-user": "Agregar usuario", "password-generateed": "La contraseña solo será generada una vez; asegúrate de copiarla.", "Team status": "Estado del equipo", @@ -380,6 +397,7 @@ "certificate": "Certificado", "decline": "Rechazar", "finish": "Finalizar", + "done": "Hecho", "mail": "Correo", "sign-now": "Firmar ahora", "successfully-signed": "¡Firmado exitosamente!", @@ -389,6 +407,10 @@ "Email-verified-alert-1": "El correo está verificado.", "Email-verified-alert-2": "El correo ya ha sido verificado.", "upload-stamp-image": "Subir imagen del sello", + "draw-signature": "Dibujar firma", + "draw-initials": "Dibujar iniciales", + "enter-text": "Introducir texto", + "enter-widgettype": "Introduzca {{widgetType}}", "draw": "Dibujar", "type": "Escribir", "color-type": { @@ -401,7 +423,7 @@ "upload": "Subir", "initial-teb": "Iniciales", "signature-tab": "Firma", - "your-signature": "Tu firma", + "initial-alert": "Mi inicial no encontrada", "copy-title": "Copiar widget a", "contact-delete-alert": "¿En definitiva quieres eliminar este contacto?", "reset-password-alert-1": "El enlace para restablecer la contraseña ha sido enviado a tu correo electrónico", @@ -409,6 +431,7 @@ "reset-password-alert-3": "Restablece tu contraseña", "faild-animation": "Error al cargar la animación", "apply": "Aplicar", + "select-columns": "Seleccionar columnas", "copy-type": { "All pages": "Todas las páginas", "All pages but last": "Todas las páginas menos la última", @@ -466,12 +489,13 @@ "add-recipients": "Agregar destinatarios", "loading-mssg": "Esto podría llevar algún tiempo", "send-mail": "Enviar correo", + "signature-field-widget": "Cada usuario debe tener al menos un widget de firma. No ha añadido un widget de firma para {{signersName}}.", "placeholder-alert-1": "Por favor, asegúrate de que hay al menos un widget de firma para cada destinatario.", "placeholder-alert-2": "Por favor, confirma que hayas rellenado el campo de texto.", "placeholder-alert-3": " ¿En definitiva quieres enviar este documento para ser firmado?", "placeholder-alert-4": "¡Has enviado exitosamente correos a todos los destinatarios!", "placeholder-mail-alert": "Has enviado un correo electrónico con éxito a {{name}}. Los siguientes firmantes recibirán un correo electrónico una vez que {{name}} firme el documento.", - "placeholder-mail-alert-you": "Los firmantes posteriores recibirán correos electrónicos una vez que firme el documento.", + "placeholder-mail-alert-you": "Los firmantes siguientes recibirán un correo electrónico una vez que usted firme el documento.", "placeholder-alert-5": "¿Quieres firmar documentos ahora mismo?", "placeholder-alert-6": "¡Por favor, configura el adaptador de correo para enviar correos!", "placeholder-alert-7": "¡Por favor, selecciona un firmante para agregar un marcador de posición!", @@ -600,7 +624,8 @@ "tour-mssg": { "home-layout-1": "¡Has iniciado sesión exitosamente! Echemos un vistazo.", "home-layout-2": "Para subir documentos para firmar tú mismo o para solicitar la firma de otros, simplemente selecciona los botones correspondientes.", - "home-layout-3": "¡Ya puedes empezar a utilizar {{appName}}! Si necesitas soporte siéntete libre de contactarnos.", + "home-layout-3": "¡Ya puedes empezar a utilizar {{appName}}!", + "home-layout-4": "Danos una estrella en", "generate-token": "Mejora ahora para generar un token API de producción.", "opensign-drive-1": "Haz clic en los enlaces para navegar fácilmente por la estructura jerárquica de carpetas y ver los documentos de cada carpeta.", "opensign-drive-2": "Haz clic en el botón «Agregar» para crear una nueva carpeta o documento.", @@ -610,34 +635,32 @@ "opensign-drive-6": "Haz clic con el botón derecho en un documento para ver opciones como «Descargar», «Renombrar», «Mover» y «Eliminar». Haz clic en el documento para abrirlo.", "opensign-drive-7": "Haz clic con el botón derecho en cualquier carpeta para ver las opciones. Elige «Renombrar» para cambiar el nombre de la carpeta o haz clic en ella para navegar por su contenido.", "pdf-request-file-1": "Lista de firmantes que todavía tienen que firmar este documento.", - "pdf-request-file-2": "Haz clic en cualquiera de los marcadores de posición que aparecen en el documento para firmar. A continuación, verás opciones para dibujar tu firma, escribirla o subir una imagen .", - "pdf-request-file-3": "Haga clic en los botones Rechazar o Finalizar para navegar por el documento. Utilice el menú de puntos suspensivos para ver opciones adicionales, incluido el botón Descargar.", + "pdf-request-file-2": "Haga clic en cualquiera de los campos que aparecen en el documento para comenzar. Luego podrá completar la información requerida.", + "pdf-request-file-3": "Una vez que haya completado todos los campos obligatorios, haga clic en 'Finalizar'. Luego podrá descargar el documento firmado. Según la configuración del remitente, es posible que reciba una copia del documento completado junto con el certificado de finalización una vez que todos los destinatarios hayan firmado.", "pdf-request-file-4": "Lista de firmantes que ya han firmado el documento.", "pdf-request-file-5": "Puedes hacer clic en «Firmar todo automáticamente» para firmar de manera automática en todos los lugares que deban ser firmados por ti. Asegúrate de revisar correctamente el documento antes de hacer clic en ese botón.", "pdf-request-file-6": "Por favor, complete los campos en la página {{pagenumbers}}, todos resaltados con el mismo color para facilitar la identificación.", - "placeholder-sign-1": "Selecciona un destinatario de esta lista para agregar un marcador de posición dónde este destinatario tendrá que firmar. El marcador de posición aparecerá con el mismo color que el nombre del destinatario una vez lo sueltes en el documento.", + "placeholder-sign-1": "Seleccione un destinatario de esta lista para añadir un widget. El widget aparecerá con el mismo color que el nombre del destinatario una vez que lo coloque en el documento.", "placeholder-sign-2": "Hacer clic en el botón «Agregar destinatarios» te permitirá añadir más firmantes.", "placeholder-sign-3": "Haz clic en este botón para agregar más destinatarios/firmantes al documento.", - "placeholder-sign-4": "Arrastra o haz clic en un capo para agregarlo al documento.", - "placeholder-sign-5": "El área de contenido del PDF ya muestra los marcadores de posición existentes en la plantilla. Para tu comodidad, estos marcadores de posición coincidirán con el color del nombre del destinatario, haciéndolos fácilmente identificables.", + "placeholder-sign-4": "Arrastre o haga clic en un widget para añadirlo al documento.", + "placeholder-sign-5": "El área de contenido del PDF ya muestra los widgets existentes de la plantilla. Para su comodidad, estos widgets coincidirán con el color del nombre del destinatario, lo que los hace fácilmente identificables.", "placeholder-sign-6": "Al hacer clic en 'Siguiente' se guardará el documento. En el siguiente paso, puede personalizar los correos electrónicos que se enviarán a los destinatarios o copiar los enlaces de firma y compartirlos usted mismo con los destinatarios.", "report-1": "Haz clic en el botón «Agregar» para crear una nueva plantilla. Las plantillas son documentos reusables diseñados para generar rápidamente nuevos documentos con la misma estructura pero diferentes firmantes. Por ejemplo, una plantilla de RR.HH. para el proceso de incorporación podría tener roles predefinidos como «Director de RR.HH.» y «Nuevo empleado». Cada vez que utilices la plantilla, puedes asignar el rol de «Nuevo empleado» a los distintos miembros del personal que se incorporen, mientras que el rol de « Director de RR.HH.» permanece constante, lo que facilita un proceso de incorporación fluido para cada persona contratada.", "redirect": "Haz clic en el botón «Usar» para crear un nuevo documento desde una plantilla existente.", - "bulksend": "Para enviar rápidamente múltiples documentos utilizando una plantilla existente creando simplemente las direcciones de correo electrónico de los destinatarios, haz clic en el botón 'Envío Masivo'.", - "option": "Este menú revela más opciones como «Editar» y «Eliminar». Usa el botón «Editar» para agregar roles, modificar campos y actualizar tu plantilla. Los cambios aplicarán para todos los documentos futuros que sean creados usando esta plantilla pero no afectarán a los documentos ya existentes. Con el botón «Eliminar» puedes eliminar la plantilla.", - "signyour-self-1": "Para personalizar el documento antes de que sea firmado, selecciona y arrastra al documento los widgets que prefieras. Escoge el espacio perfecto para cada modificación para adaptar el documento a tus necesidades.", + "bulksend": "Para enviar rápidamente varios documentos utilizando una plantilla existente, simplemente introduzca las direcciones de correo electrónico de los destinatarios y haga clic en el botón 'Envío masivo'. Puede enviar hasta 50 destinatarios.", + "option": "Este menú muestra más opciones como Editar, Eliminar, Renombrar, Duplicar, Compartir, etc. <1>Haga clic aquí para leer más sobre todas las opciones disponibles. <3>Nota: Los cambios en una plantilla existente se aplicarán a todos los futuros documentos creados a partir de esa plantilla, pero no afectarán a los documentos que ya se hayan enviado.", + "signyour-self-1": "Seleccione o arrastre sus widgets preferidos al PDF para personalizar su documento antes de firmar. Elija los lugares perfectos para cada widget y adapte el documento a sus necesidades.", "signyour-self-2": "Arrastra y suelta en cualquier lugar de esta área. Después podrás cambiar el tamaño y moverlo.", "template-placeholder-1": "Hacer clic en el botón «Agregar rol» te permitirá agregar varios roles de firmantes. Puedes asociar usuarios a cada rol en los siguientes pasos.", - "template-placeholder-2": "Una vez que los roles hayan sido agregados, selecciona un rol de la lista para agregar un marcador de posición donde éste tendrá que firmar. El marcador de posición aparecerá con el mismo color que el nombre del rol una vez lo sueltes en el documento.", - "template-placeholder-3": "Arrastra o haz clic en un capo para agregarlo al documento.", - "template-placeholder-4": "Arrastra el marcador de posición para un rol a cualquier lugar del documento. Recuerda, aparecerá con el mismo color que el nombre del rol para poder referenciarlo fácilmente.", - "template-placeholder-5": "Hacer clic en «Siguiente» guardará la plantilla actual. Luego de guardar, se te consultará si deseas crear un nuevo documento usando esta plantilla.", + "template-placeholder-2": "Después de añadir roles, elija uno de la lista para colocar un widget para ese destinatario. Puede hacer clic en el widget o arrastrarlo al documento. Una vez colocado, el widget se mostrará en el mismo color que el rol seleccionado.", + "template-placeholder-3": "Hacer clic en «Siguiente» guardará la plantilla actual. Luego de guardar, se te consultará si deseas crear un nuevo documento usando esta plantilla.", "webhook-1": "Mejora ahora para configurar un webhook", "Need your Signature": "Hacer clic en esta tarjeta te llevará a la lista de documentos que esperan por tu revisión.", "Out for signatures": "Hacer clic en esta tarjeta te llevará a la lista de documentos que esperan tu firma.", "Recent signature requests": "Esta es una lista de documentos que esperan por tu firma.", "Recently sent for signatures": "Esta es una lista de documentos que has enviado a otras partes para que sea firmado.", - "Drafts": "Estos son documentos que has empezado pero que todavía no finalizas para su envío.", + "Drafts": "Estos son documentos que ha comenzado pero que aún no ha finalizado para enviar.", "public-template": "Este video muestra cómo puedes configurar tu perfil público personalizado, como «https://opensign.me/tu-nombre-de-usuario». También aprenderás cómo personalizar tu eslogan y cómo hacer tus plantillas disponibles para su firmado público.", "allowModify-widgets": "Puede arrastrar y soltar cualquiera de estos campos en el documento, además de los campos ya designados para usted por el creador del documento" }, @@ -728,7 +751,7 @@ }, "form-title-1": "Configuración del flujo de documentos", "form-title-2": "Configuración de seguridad", - "text-field-tour": "Los campos de tipo 'Texto' deben completarse con anticipación antes de enviar el documento. Si necesita que los firmantes proporcionen información, utilice el campo 'Entrada de texto'", + "text-field-tour": "Los campos de 'Rellenado previo' deben completarse antes de enviar el documento. Si necesita que los firmantes proporcionen información, utilice los campos de firmantes.", "attach-signer-tour": "Debe adjuntar un firmante a cada función. Puede hacerlo haciendo clic en este icono. Una vez que seleccione un Firmante, se adjuntará a todos los campos asociados con ese rol que aparecen en el mismo color.", "allowed-signature-types": "Tipos de firma permitidos", "at-least-one-signature-type": "Se debe habilitar al menos un tipo de firma.", @@ -776,7 +799,7 @@ "agree-p1": "Confirmo que he leído y comprendido el ", "agree-p2": "Registro Electrónico y Divulgación de Firma", "agree-p3": "y consentimiento para utilizar registros y firmas electrónicas.", - "agrre-button": "Aceptar y continuar", + "agrre-button": "Confirmo y acepto continuar", "term-cond-title": "Términos y condiciones", "term-cond-h": "DIVULGACIÓN DE REGISTRO ELECTRÓNICO Y FIRMA", "term-cond-p1": "Esta Divulgación de Firma y Registro Electrónico ('Divulgación') es un acuerdo entre el Creador del Documento ('Remitente') y el Firmante ('Usted'), facilitado a través de la plataforma {{appName}} ('Plataforma'). Al firmar documentos a través de {{appName}}, usted acepta los términos descritos en esta Divulgación. Léala detenidamente antes de continuar.", @@ -1032,14 +1055,161 @@ "not-calculated": "No calculado", "not-found-in-signature": "No encontrado en la firma", "readonly-error": "El widget de solo lectura {{widgetName}} debe tener un valor predeterminado o puede hacerlo opcional.", - "choose-one":"Elige uno", + "choose-one": "Elige uno", "search-templates": "Buscar plantillas…", "search-documents": "Buscar documentos…", "search-contacts": "Buscar contactos…", "invalid-email-found": "Correo electrónico no válido encontrado: {{email}}", "duplicate-email-found": "Correo electrónico duplicado encontrado: {{email}}", "vertical": "Vertical", + "add-role-alert": "Por favor, agregue al menos un rol", + "edit-draft": "Editar borrador", "horizontal": "Horizontal", "billing": "Facturación", - "console": "Consola" + "console": "Consola", + "prefill-widget": "Widgets de Relleno Previo", + "action-prohibited": "Esta acción no está permitida para su dominio de correo electrónico. Por favor, contacte con su administrador para obtener ayuda.", + "must-have-at-least-one-vacant-role": "Debe dejar al menos un rol sin asignar antes de establecer un template como 'public'.", + "remove-duplicate": "Por favor, elimina la opción duplicada", + "prefill-bulk-error": "El envío masivo no está permitido cuando se han agregado widgets de pre-rellenado. Por favor, elimine los widgets de pre-rellenado para continuar.", + "session-expired-title": "Sesión expirada", + "access-denied": "Acceso denegado", + "upgrade": "Actualizar", + "do-not-access-app": "No tienes acceso a esta aplicación.", + "dont-have-access": "No tienes acceso.", + "valid-email-alert": "Por favor ingresa una dirección de correo electrónico válida.", + "otp-not-validate": "OTP no es válido.", + "domain-not-allowed": "Este dominio no está permitido", + "atleast-one-recipient-alert": "¡Por favor agrega al menos un destinatario!", + "incorrect-password-or-decryption-failed": "Contraseña incorrecta o fallo de descifrado.", + "incorrect-password-for-file": "Contraseña incorrecta para el archivo: {{file}}", + "error-uploading-pdf": "Error al subir PDF.", + "provide-password": "Por favor proporciona la contraseña.", + "only-pdf-allowed": "Solo se permiten archivos PDF.", + "invalid-username-password-region": "Usuario/contraseña o región inválidos.", + "pfx-extension-alert": "Por favor sube un archivo con extensión .pfx.", + "email-already-exist": "El correo electrónico ya existe", + "branding": "Marca", + "branding-help": "El branding permite el white labelling de su aplicación", + "custom-sub-domain": "Subdominio personalizado", + "app-name": "Nombre de la aplicación", + "provide-domain-name": "Proporcione su nombre de dominio", + "provide-app-name": "Proporcione el nombre de su aplicación", + "logo": "Logo", + "upload-app-logo": "Suba el logotipo de su aplicación", + "prefill-unfilled-widget": "Los siguientes campos obligatorios no pueden quedar vacíos: {{emptyWidget}}. Por favor, complételos para continuar.", + "Dashboard": "Panel", + "Analytics": "Analítica", + "Templates": "Plantillas", + "Need your sign": "Necesitan tu firma", + "In Progress": "En progreso", + "Completed": "Completado", + "Drafts": "Borradores", + "Declined": "Rechazados", + "Expired": "Expirados", + "Contactbook": "Agenda de contactos", + "My Signature": "Mi firma", + "API Token": "Token API", + "Webhook": "Webhook", + "Preferences": "Preferencias", + "Teams": "Equipos", + "Users": "Usuarios", + "Drive": "Drive", + "Branding": "Marca", + "Mail": "Correo", + "Storage": "Almacenamiento", + "Signing certificate": "Certificado de firma", + "General": "General", + "Organizations": "Organizaciones", + "OrgAdmins": "OrgAdmins", + "Debug Pdf": "Depurar PDF", + "New Document": "Nuevo documento", + "subscription": "Suscripción", + "Draft document": "Borrador de documento", + "Draft template": "Borrador de plantilla", + "Public sign": "Firma pública", + "Signup": "Registrarse", + "delete-contact": "Eliminar contacto", + "total-records-found": "Total de registros encontrados: {{count}}", + "Invalid-records-found": "Registros inválidos encontrados: {{records}}", + "previous": "Anterior", + "page-n-of-n": "Página {{currentPage}} de {{totalPages}}", + "import": "Importar", + "search": "Buscar", + "viewed-on": "Visto el: {{ViewedOn}}", + "signed-on": "Firmado el: {{SignedOn}}", + "hide": "Ocultar", + "show-more": "Mostrar más", + "browse-or-drag-to-replace-existing-file": "Busque o arrastre y suelte un nuevo archivo para reemplazar el existente", + "optional-details": "Detalles opcionales", + "hide-optional-details": "ocultar detalles opcionales", + "mail-adapter-subscription-alert": "Bitte upgraden Sie auf den Professional- oder Team-Plan, um ein benutzerdefiniertes SMTP einzurichten.", + "connect-to-mail": "Conectar con Gmail", + "custom-smtp": "SMTP personalizado", + "default-smtp": "SMTP predeterminado de {{appName}}", + "host": "Host", + "port": "Puerto", + "sender-email": "Correo del remitente", + "username": "Nombre de usuario", + "use-default-mail-adapter": "¿Está seguro de que desea usar los servidores de correo predeterminados de {{appName}} para enviar solicitudes de firma? Recomendamos usar su propio servidor de Gmail o SMTP para una mejor entregabilidad.", + "verification-code-sent-registered-email": "Se ha enviado un código de verificación a su correo registrado <1>{{useremail}}. Ingrese el código a continuación para confirmar su configuración.", + "smpt-credentials": "Credenciales SMTP", + "delete-account": "Eliminar cuenta", + "delete-account-que": "¿Está seguro de que desea eliminar su cuenta?", + "delete-account-que-user": "Está a punto de eliminar permanentemente este usuario y todos los datos asociados. Esta acción no se puede deshacer.", + "user-deleted-successfully": "Usuario y todos los datos asociados eliminados correctamente.", + "account-deletion-request-sent-via-mail": "Le hemos enviado por correo electrónico un enlace de confirmación. Apruebe la solicitud para completar la eliminación de su cuenta.", + "type-exact-email-delete": "Escriba el correo electrónico exacto para habilitar la eliminación", + "email-does-not-match": "El correo electrónico no coincide.", + "please-type-to-confirm": "Por favor, escriba <1>{{userEmail}} para confirmar:", + "email-settings": "Configuración de correo electrónico", + "email-settings-help": "Para garantizar una mejor entregabilidad en la bandeja de entrada de sus correos electrónicos de solicitud de firma, puede conectar su propio proveedor de correo electrónico. Elija una de las siguientes opciones:", + "connect-to-gmail": "Conectar con Gmail: ", + "connect-to-gmail-help": "Utilice su cuenta de Gmail para enviar correos electrónicos de solicitud de firma directamente desde su propia bandeja de entrada, mejorando la tasa de entrega y la fiabilidad.", + "connect-to-smtp": "SMTP personalizado: ", + "connect-to-smtp-help": "Utilice su propio servidor SMTP para enviar correos electrónicos a través de su dominio. Esta opción le brinda control total sobre su infraestructura de correo electrónico, mejorando la entregabilidad y la coherencia de la marca.", + "connect-to-default": "Si lo prefiere, también puede usar los servidores de correo predeterminados de {{appName}}, aunque recomendamos usar los suyos para obtener mejores resultados.", + "email-settings-redirect-message": "Esta configuración se ha movido de la consola a Configuración del menú principal → Preferencias. Esta página se eliminará en próximas versiones.", + "go-to-preferences-menu": "Ir al menú de preferencias", + "document-download-filename-format": "Formato de nombre de archivo para la descarga del documento", + "preview": "Vista previa: ", + "download-filename-format-help": "Elija cómo se nombran los archivos PDF descargados. Su selección se guarda en su perfil y se usa en toda la aplicación.", + "delete-action-prohibited": "Esta acción no está permitida. Por favor, póngase en contacto con su administrador para solicitar la eliminación de la cuenta.", + "not-verified": "No verificado", + "verified": "Verificado", + "expires": "Expira", + "fix-resend-error": "No puede corregir y reenviar este documento porque contiene widgets predefinidos.", + "duplicate-template-error": "No puede duplicar esta plantilla porque contiene widgets predefinidos.", + "save-as-template-error": "Este documento no se puede guardar como plantilla porque contiene widgets predefinidos.", + "redirecting-you-in": "Redirigiéndolo en {{redirectTimeLeft}} seg...", + "pdf-tools-tour": "Haga clic en estos botones para agregar, eliminar, reorganizar, rotar y acercar/alejar páginas.", + "widgets": "Widgets", + "prefill-tour": "Use esta opción para ingresar información por adelantado antes de enviar el documento a los destinatarios.", + "empty-prefill-error": "Los siguientes campos obligatorios no pueden quedar vacíos:", + "please-fill-out": "Por favor, complételos para continuar.", + "custom-signing-certificate": "Certificado de firma personalizado", + "signing-certificate-help": "Puede cargar su propio certificado de firma de documentos, que se utilizará para firmar todos sus documentos así como los certificados de finalización. El archivo del certificado debe ser un certificado P12 en formato PFX.", + "certificate-file-p12-in-PFX-format": "Archivo de certificado (certificado p12 en formato PFX)", + "password-of-pfx-file": "Ingrese la contraseña del archivo pfx", + "update": "Actualizar", + "use-default-certificate": "Usar el certificado predeterminado de {{appName}}", + "upgrade-to-team-plan": "Actualizar al plan de equipo", + "setup-file-storage": "Configurar almacenamiento de archivos", + "save-and-activate": "Guardar y activar", + "logging-out-to-apply-settings": "Se está cerrando la sesión para aplicar la nueva configuración", + "reconnect-to-default": "Volver a conectar con {{appName}}", + "active-file-adapter": "Adaptador de archivos activo", + "file-adapter-unique-name": "Nombre único del adaptador de archivos", + "unique-name-for-file-adapter": "Ingrese un nombre único para el adaptador de archivos", + "storage-provider": "Proveedor de almacenamiento", + "enter-bucket-name": "Ingrese el nombre del bucket", + "enter-space-name": "Ingrese el nombre del espacio", + "enter-region-of-bucket": "Ingrese la región del bucket", + "enter-region-of-space": "Ingrese la región del espacio", + "enter-access-key": "Ingrese la clave de acceso", + "enter-secret-access-key": "Ingrese la clave secreta de acceso", + "otp-email": "Hemos enviado un código de verificación", + "save-as-temp-warn": "Nota: Este documento incluye widgets prellenados, que se eliminarán automáticamente ya que ya están incorporados en el documento base.", + "edit-document": "Editar documento", + "otp-email": "Hemos enviado un código de verificación" } diff --git a/apps/OpenSign/public/locales/fr/translation.json b/apps/OpenSign/public/locales/fr/translation.json index 47880ca684..3e9ffc9090 100644 --- a/apps/OpenSign/public/locales/fr/translation.json +++ b/apps/OpenSign/public/locales/fr/translation.json @@ -26,6 +26,8 @@ "Name": "Nom et Prénom", "Date": "Date" }, + "folder": "Dossier", + "pdf": "Pdf", "context-menu": { "Download": "Télécharger", "Rename": "Renommer", @@ -43,13 +45,17 @@ "upgrade-now": "Mettre à jour maintenant", "contact-now": "Contacter maintenant", "upgrade-to": "Mettre à niveau vers", - "pro": "PRO", "plan": "Offre", + "connect": "Connecter", + "connect-to-g-drive": "Se connecter à Google Drive", + "reconnect-to-g-drive": "Se reconnecter à Google Drive", + "gdrive-info-connect": "Lorsque Google Drive est connecté, le document complété sera enregistré dans le dossier {{appName}} sur Google Drive.", "subscription-renew-warning": "Votre abonnement expirera dans {{remainingDays}} jours. Veuillez renouveler votre abonnement.", "subscribe-card-teamplan": "Libérez toute la puissance de la collaboration ! Créez un nombre illimité d'organisations, d'équipes et de hiérarchies. Partagez des modèles de manière transparente entre les équipes et attribuez des rôles d'utilisateur personnalisés. Améliorez votre flux de travail dès aujourd'hui !", "subscribe-card-plan": "Débloquez des fonctionnalités premium à partir de seulement {{premiumPrice}}/mois. Bénéficiez de performances améliorées et de seulement {{addonPrice}} par crédit supplémentaire après vos crédits premium inclus.", "user-name-limit-char": "Pour avoir un nom d'utilisateur de moins de 8 caractères s'il vous plaît s'abonner", "tour-content": "Ne plus afficher", + "pro": "PRO", "team": "Équipe", "docs": "Documents", "session-expired": "Votre session a expiré.", @@ -58,7 +64,7 @@ "welcome": "Content de te revoir!", "Login-to-your-account": "Se connecter à son compte", "password": "Mot de passe", - "forgot-password": "Mot de passe oublié?", + "forgot-password": "Mot de passe oublié", "loading": "Chargement...", "of": "de", "sign-SSO": "Connectez-vous avec SSO", @@ -155,10 +161,24 @@ "created-date": "Date de création", "Type": "Saisir", "Logs": "Journaux", - "Expiry-date": "Fecha de caducidad" + "Expiry-date": "Fecha de caducidad", + "Company": "Organisation", + "JobTitle": "Votre Fonction", + "Time to complete (Days)": "Temps pour terminer (jours)", + "Auto reminder": "Rappel automatique", + "Remind once in every (Days)": "Rappeler une fois tous les (jours)", + "Enable OTP verification": "Activer la vérification OTP", + "Enable Tour": "Activer la visite", + "Notify on signatures": "Notifier lors des signatures", + "Allow modifications": "Autoriser les modifications", + "Redirect url": "URL de redirection", + "Created Date": "Date de création", + "Updated Date": "Date de mise à jour", + "Expiry Date": "Date d'expiration" }, "btnLabel": { "sign": "Signer", + "Sign": "SIGNER", "Resend": "Relancer", "Rename": "Renommer", "Revoke": "Révoquer", @@ -192,16 +212,15 @@ "Contactbook": "Il s'agit d'une liste de contacts/signataires que vous avez ajoutés. Ceux-ci apparaîtront sous forme de suggestions lorsque vous tenterez d'ajouter des signataires à un nouveau document.", "Templates": "Il s'agit d'une liste de modèles à votre disposition pour créer des documents. Vous pouvez cliquer sur le bouton 'Utiliser' pour créer un nouveau document à l'aide d'un modèle, modifier le document et ajouter des signataires à l'étape suivante." }, - "form-name": { - "Sign Yourself": "signez vous-même", - "Request Signatures": "Demander des signatures", - "New Template": "Nouveau modèle" - }, + "Sign Yourself": "signez vous-même", + "Request Signatures": "Demander des signatures", + "New Template": "Nouveau modèle", "file-type": "pdf, png, jpg, jpeg", "docx": "docx", "file-selected": "fichier sélectionné", "template-title": "Titre du modèle", "document-title": "Titre du document", + "title": "Titre", "description": "Description", "time-to-complete": "Temps de réalisation (jours)", "send-in-order": "Envoyer dans l'ordre ?", @@ -241,7 +260,6 @@ "submit": "Soumettre", "reset": "Réinitialiser", "my-signature": "Ma signature", - "initial-alert": "Mon initiale introuvable", "signature": "Signature", "upload-image": "Télécharger une image", "clear": "Vider", @@ -280,7 +298,7 @@ "deactivate": "désactiver", "this-user": "cet utilisateur ", "delete-user": "Supprimer l'utilisateur", - "delete": "supprimer", + "delete": "Supprimer", "add-user": "Ajouter un utilisateur", "password-generateed": "Le mot de passe ne sera généré qu'une seule fois ; assurez-vous de le copier.", "Team status": "Statut de l'équipe", @@ -379,6 +397,7 @@ "certificate": "Certificat", "decline": "refusé", "finish": "terminé", + "done": "Terminé", "mail": "Mail", "sign-now": "Signez maintenant", "successfully-signed": "Signé avec succès !", @@ -388,6 +407,10 @@ "Email-verified-alert-1": "L'e-mail est vérifié.", "Email-verified-alert-2": "L'e-mail est déjà vérifié.", "upload-stamp-image": "Télécharger l'image du tampon", + "draw-signature": "Dessiner la signature", + "draw-initials": "Dessiner les initiales", + "enter-text": "Saisir du texte", + "enter-widgettype": "Saisir {{widgetType}}", "draw": "Dessiner", "type": "Taper", "color-type": { @@ -400,7 +423,7 @@ "upload": "Télécharger", "initial-teb": "Initiales", "signature-tab": "Signature", - "your-signature": "Votre signature", + "initial-alert": "Mon initiale est introuvable", "copy-title": "Copier le widget vers", "contact-delete-alert": "Êtes-vous sûr de vouloir supprimer ce contact ?", "reset-password": "Le lien de réinitialisation du mot de passe a été envoyé à votre identifiant de messagerie", @@ -465,13 +488,13 @@ "add-recipients": "Ajouter des destinataires", "loading-mssg": "Cela pourrait prendre du temps", "send-mail": "Envoyer un mail", - "signature-field-widget": "Au moins un champ de signature doit être ajouté pour chaque utilisateur. Vous n'avez pas ajouté de champs de signature pour {{signersName}}", + "signature-field-widget": "Chaque utilisateur doit avoir au moins un widget de signature. Vous n’avez pas ajouté de widget de signature pour {{signersName}}.", "placeholder-alert-1": "Veuillez vous assurer qu'au moins un widget de signature est ajouté pour tous les destinataires.", "placeholder-alert-2": "Veuillez confirmer que vous avez rempli le champ de texte.", "placeholder-alert-3": "Etes-vous sûr de vouloir envoyer ce document pour signature ? ", "placeholder-alert-4": "Vous avez envoyé avec succès des mails à tous les", "placeholder-mail-alert": "Vous avez envoyé un e-mail avec succès à {{name}}. Les signataires suivants recevront un e-mail une fois que {{name}} aura signé le document.", - "placeholder-mail-alert-you": "Les signataires suivants recevront un e-mail dès que vous signez le document.", + "placeholder-mail-alert-you": "Les signataires suivants recevront un e-mail une fois que vous aurez signé le document.", "placeholder-alert-5": "Voulez-vous signer des documents maintenant ?", "placeholder-alert-6": "Veuillez configurer l'adaptateur de messagerie pour envoyer du courrier !", "placeholder-alert-7": "Veuillez sélectionner le signataire pour ajouter un espace réservé !", @@ -600,7 +623,8 @@ "tour-mssg": { "home-layout-1": "Vous vous êtes connecté avec succès ! Jetons un coup d'oeil.", "home-layout-2": "Pour télécharger des documents à auto-signature ou pour demander la signature d'autres personnes, sélectionnez simplement les boutons correspondants.", - "home-layout-3": "Vous êtes prêt à commencer à utiliser {{appName}} ! Si vous avez besoin d'aide, n'hésitez pas à nous contacter.", + "home-layout-3": "Vous êtes prêt à commencer à utiliser {{appName}} !", + "home-layout-4": "Ajoutez-nous une étoile sur", "generate-token": "Effectuez la mise à niveau maintenant pour générer un jeton API de production.", "opensign-drive-1": "Cliquez sur les liens du fil d'Ariane pour naviguer facilement dans la hiérarchie des dossiers et afficher les documents dans chaque dossier.", "opensign-drive-2": "Cliquez sur le bouton Ajouter pour créer un nouveau dossier ou document.", @@ -610,34 +634,32 @@ "opensign-drive-6": "Faites un clic droit sur un document pour voir les options telles que Télécharger, Renommer, Déplacer et Supprimer. Cliquez sur le document pour l'ouvrir.", "opensign-drive-7": "Faites un clic droit sur n'importe quel dossier pour voir les options. Choisissez 'Renommer' pour changer le nom du dossier ou cliquez sur le dossier pour naviguer dans son contenu.", "pdf-request-file-1": "Liste des signataires qui doivent encore signer le document.", - "pdf-request-file-2": "Cliquez sur l'un des espaces réservés apparaissant sur le document pour signer. Vous verrez alors des options pour dessiner votre signature, la saisir ou télécharger une image.", - "pdf-request-file-3": "Cliquez sur les boutons Refuser ou Terminer pour parcourir votre document. Utilisez le menu à points de suspension pour des options supplémentaires, notamment le bouton Télécharger.", + "pdf-request-file-2": "Cliquez sur l'un des champs figurant dans le document pour commencer. Vous pourrez ensuite remplir les informations requises.", + "pdf-request-file-3": "Une fois que vous avez rempli tous les champs obligatoires, cliquez sur « Terminer ». Vous pourrez ensuite télécharger le document signé. Selon les paramètres de l'expéditeur, vous pourriez recevoir une copie du document complété avec le certificat de finalisation une fois que tous les destinataires auront signé.", "pdf-request-file-4": "Liste des signataires ayant déjà signé le document.", "pdf-request-file-5": "Vous pouvez cliquer sur 'Signer automatiquement tout' pour signer automatiquement à tous les emplacements que vous êtes censé signer. Assurez-vous de lire correctement le document avant de cliquer sur ce bouton.", "pdf-request-file-6": "Veuillez remplir les champs à la page {{pagenumbers}}, tous mis en évidence avec la même couleur pour une identification facile.", - "placeholder-sign-1": "Sélectionnez un destinataire dans cette liste pour ajouter un espace réservé à l'endroit où il est censé signer. L'espace réservé apparaîtra de la même couleur que le nom du destinataire une fois que vous le déposerez sur le document.", + "placeholder-sign-1": "Sélectionnez un destinataire dans cette liste pour ajouter un widget. Le widget apparaîtra dans la même couleur que le nom du destinataire une fois déposé sur le document.", "placeholder-sign-2": "Cliquer sur le bouton 'Ajouter des destinataires' vous permettra d'ajouter plus de signataires.", "placeholder-sign-3": "Cliquez sur ce bouton pour ajouter plus de destinataires/signataires au document", - "placeholder-sign-4": "Faites glisser ou cliquez sur un champ pour l'ajouter au document.", - "placeholder-sign-5": "La zone de contenu PDF affiche déjà les espaces réservés existants du modèle. Pour votre commodité, ces espaces réservés correspondront à la couleur du nom du destinataire, ce qui les rendra facilement identifiables.", + "placeholder-sign-4": "Faites glisser ou cliquez sur un widget pour l'ajouter au document.", + "placeholder-sign-5": "La zone de contenu du PDF affiche déjà les widgets existants du modèle. Pour plus de commodité, ces widgets correspondront à la couleur du nom du destinataire, ce qui les rend facilement identifiables.", "placeholder-sign-6": "En cliquant sur 'Suivant', le document sera enregistré. À l'étape suivante, vous pouvez personnaliser les e-mails à envoyer aux destinataires ou copier les liens de signature et les partager vous-même avec les destinataires.", "report-1": "Cliquez sur le bouton 'Ajouter' pour créer un nouveau modèle. Les modèles sont des documents réutilisables conçus pour générer rapidement de nouveaux documents avec la même structure et différents signataires. Par exemple, un modèle RH pour l'intégration peut avoir des rôles prédéfinis tels que 'Responsable RH' et ' Nouvel employé'. Chaque fois que vous utilisez le modèle, vous pouvez attribuer le rôle 'Nouvel employé' à différents membres du personnel entrants, tandis que le rôle 'Responsable RH' reste constant, facilitant ainsi un processus d'intégration fluide pour chaque recrue", "redirect": "Cliquez sur le bouton 'Utiliser' pour créer un nouveau document à partir d'un modèle existant.", - "bulksend": "Pour envoyer rapidement plusieurs documents en utilisant un modèle existant en créant simplement les adresses e-mail des destinataires, cliquez sur le bouton 'Envoi en masse'.", - "option": "Ce menu révèle plus d'options telles que Modifier et Supprimer. Utilisez le bouton « Modifier » pour ajouter des rôles de signataire, modifier les champs et mettre à jour votre modèle. Les modifications s'appliqueront à tous les futurs documents créés à partir de ce modèle mais n'affecteront pas les documents existants. Utilisez le bouton Supprimer, vous pouvez supprimer le modèle ", - "signyour-self-1": "Sélectionnez et faites glisser vos widgets préférés sur le PDF pour personnaliser votre document avant de le signer. Choisissez les endroits parfaits pour chaque modification afin d'adapter le document à vos besoins.", + "bulksend": "Pour envoyer rapidement plusieurs documents en utilisant un modèle existant, saisissez simplement les adresses e-mail des destinataires et cliquez sur le bouton 'Envoi groupé'. Vous pouvez envoyer jusqu'à 50 destinataires.", + "option": "Ce menu affiche plus d'options comme Modifier, Supprimer, Renommer, Dupliquer, Partager, etc. <1>Cliquez ici pour en savoir plus sur toutes les options disponibles. <3>Remarque : Les modifications apportées à un modèle existant s'appliqueront à tous les futurs documents créés à partir de ce modèle, mais n'affecteront pas les documents déjà envoyés.", + "signyour-self-1": "Sélectionnez ou faites glisser vos widgets préférés sur le PDF pour personnaliser votre document avant de le signer. Choisissez les emplacements parfaits pour chaque widget afin d'adapter le document à vos besoins.", "signyour-self-2": "Faites glisser et déposer n'importe où dans cette zone. Vous pourrez la redimensionner et la déplacer plus tard.", "template-placeholder-1": "Cliquer sur le bouton 'Ajouter un rôle' vous permettra d'ajouter différents rôles de signataire. Vous pourrez attacher des utilisateurs à chaque rôle dans les étapes suivantes.", - "template-placeholder-2": "Une fois les rôles ajoutés, sélectionnez un rôle dans la liste pour ajouter un espace réservé à l'endroit où il est censé signer. L'espace réservé apparaîtra dans la même couleur que le nom du rôle une fois que vous l'aurez déposé sur le document.", - "template-placeholder-3": "Faites glisser ou cliquez sur un champ pour l'ajouter au document.", - "template-placeholder-4": "Faites glisser l'espace réservé pour un rôle n'importe où sur le document. N'oubliez pas qu'il apparaîtra dans la même couleur que le nom du destinataire pour une référence facile.", - "template-placeholder-5": "Cliquer sur 'Suivant' stockera le modèle actuel. Après l'enregistrement, vous serez invité à créer un nouveau document à partir de ce modèle si vous le souhaitez.", + "template-placeholder-2": "Après avoir ajouté des rôles, choisissez-en un dans la liste pour placer un widget pour ce destinataire. Vous pouvez cliquer sur le widget ou le faire glisser sur le document. Une fois placé, le widget s'affichera dans la même couleur que le rôle sélectionné.", + "template-placeholder-3": "Cliquer sur 'Suivant' stockera le modèle actuel. Après l'enregistrement, vous serez invité à créer un nouveau document à partir de ce modèle si vous le souhaitez.", "webhook-1": "Mettez à niveau maintenant pour définir le webhook", "Need your Signature": "En cliquant sur cette carte, vous accéderez à la liste des documents en attente de révision.", "Out for signatures": "En cliquant sur cette carte, vous accéderez à une liste de documents en attente de signature.", "Recent signature requests": "Voici une liste de documents qui attendent votre signature.", "Recently sent for signatures": "Il s'agit d'une liste de documents que vous avez envoyés à d'autres parties pour signature.", - "Drafts": "Il s'agit de documents que vous avez commencés mais que vous n'avez pas finalisés pour envoi.", + "Drafts": "Ce sont des documents que vous avez commencés mais que vous n'avez pas finalisés pour l'envoi.", "public-template": "Cette vidéo montre comment configurer votre profil public personnalisé, tel que 'https://opensign.me/your-username'. Vous apprendrez également comment personnaliser votre slogan et rendre vos modèles disponibles pour la signature publique.", "allowModify-widgets": "Vous pouvez faire glisser et déposer n'importe lequel de ces champs sur le document, en plus des champs déjà désignés pour vous par le créateur du document." }, @@ -696,7 +718,7 @@ "quota-mail-info": "Pour maintenir la qualité du service et prévenir le spam, OpenSign permet jusqu'à 15 e-mails par mois avec le plan gratuit. Passez à l'offre supérieure pour un envoi illimité d'e-mails.", "quota-mail-reset": "Les crédits de votre email de demande de signature seront réinitialisés le", "quota-mail": "Vous avez atteint votre limite de 15 e-mails de demande de signature pour ce mois. Mettez à niveau maintenant pour continuer à envoyer des e-mails directement.", - "quota-mail-tip-tip": "Astuce: Vous pouvez toujours signer un nombre <1>illimité de documents en partageant manuellement le lien de demande de signature.", + "quota-mail-tip": "Astuce: Vous pouvez toujours signer un nombre <1>illimité de documents en partageant manuellement le lien de demande de signature.", "quota-mail-head": "Quota atteint", "unauthorized-modal": "Vous n'êtes pas autorisé à effectuer cette action, veuillez contacter {{adminEmail}}.", "sent-this-month": "envoyé ce mois-ci", @@ -728,7 +750,7 @@ "public-tour-message": "Le modèle doit être public avant que vous puissiez générer un lien partageable.", "add-user-template": "Vous devez ajouter un rôle avant de pouvoir lui ajouter des champs. ", "pdf-uncompatible": "PDF n'est pas compatible, veuillez contacter {{appName}}", - "text-field-tour": "Les champs de type 'Texte' doivent être remplis à l'avance avant l'envoi du document. Si vous avez besoin que les signataires fournissent des informations, utilisez plutôt le champ 'Saisie de texte'.", + "text-field-tour": "Les champs 'Pré-remplissage' doivent être remplis avant l'envoi du document. Si vous avez besoin de l'intervention des signataires, utilisez plutôt les champs réservés aux signataires.", "attach-signer-tour": "Vous devez associer un signataire à chaque rôle. Vous pouvez le faire en cliquant sur cette icône. Une fois que vous avez sélectionné un signataire, il sera attaché à tous les champs associés à ce rôle qui apparaissent dans la même couleur.", "allowed-signature-types": "Types de signature autorisés", "at-least-one-signature-type": "Au moins un type de signature doit être activé.", @@ -776,7 +798,7 @@ "agree-p1": "Je confirme avoir lu et compris les ", "agree-p2": "Divulgation des enregistrements électroniques et des signatures", "agree-p3": "et consentez à l'utilisation d'enregistrements et de signatures électroniques.", - "agrre-button": " Accepter et continuer ", + "agrre-button": "Je confirme et j'accepte de continuer", "term-cond-title": "Termes et conditions", "term-cond-h": "DIVULGATION D'ENREGISTREMENT ÉLECTRONIQUE ET DE SIGNATURE", "term-cond-p1": "Cette divulgation d'enregistrement électronique et de signature (' Divulgation ') est un accord entre le créateur du document (' Expéditeur ') et le signataire (' Vous '), facilité via la plateforme {{appName}} ( Plateforme ). En signant des documents via {{appName}}, vous acceptez les conditions décrites dans cette divulgation. Veuillez la lire attentivement avant de continuer.", @@ -988,7 +1010,7 @@ "finish-mssg": "Êtes-vous sûr de vouloir terminer le document ?", "review": "Revoir", "next-field": "Champ suivant", - "required-mssg":"{{leftRequiredWidget}} champs sur {{totalWidget}} restants", + "required-mssg": "{{leftRequiredWidget}} champs sur {{totalWidget}} restants", "verify-document": "Vérifier le document", "verify-document-signature": "Vérifier la signature du document", "select-pdf-document": "Sélectionner le document PDF", @@ -1032,14 +1054,161 @@ "not-calculated": "Non calculé", "not-found-in-signature": "Introuvable dans la signature", "readonly-error": "Le widget en lecture seule {{widgetName}} doit avoir une valeur par défaut ou vous pouvez le rendre facultatif.", - "choose-one":"Choisissez-en un", + "choose-one": "Choisissez-en un", "search-templates": "Rechercher des modèles…", "search-documents": "Rechercher des documents…", "search-contacts": "Rechercher des contacts…", + "add-role-alert": "Veuillez ajouter au moins un rôle", + "edit-draft": "Modifier le brouillon", "invalid-email-found": "Adresse e-mail invalide trouvée : {{email}}", "duplicate-email-found": "Adresse e-mail en double trouvée : {{email}}", "vertical": "Vertical", "horizontal": "Horizontal", "billing": "Facturation", - "console": "Console" + "console": "Console", + "prefill-widget": "Widgets de Préremplissage", + "action-prohibited": "Cette action n'est pas autorisée pour votre domaine de messagerie. Veuillez contacter votre administrateur pour obtenir de l'aide.", + "must-have-at-least-one-vacant-role": "Vous devez laisser au moins un rôle non attribué avant de définir un template comme 'public'.", + "remove-duplicate": "Veuillez supprimer l'option en double", + "prefill-bulk-error": "L'envoi en masse n'est pas autorisé lorsque des widgets de pré-remplissage sont ajoutés. Veuillez supprimer les widgets de pré-remplissage pour continuer.", + "session-expired-title": "Session expirée", + "access-denied": "Accès refusé", + "upgrade": "Mettre à jour", + "do-not-access-app": "Vous n'avez pas accès à cette application.", + "dont-have-access": "Vous n'avez pas accès.", + "valid-email-alert": "Veuillez saisir une adresse e-mail valide.", + "otp-not-validate": "OTP non valide.", + "domain-not-allowed": "Ce domaine n'est pas autorisé", + "atleast-one-recipient-alert": "Veuillez ajouter au moins un destinataire !", + "incorrect-password-or-decryption-failed": "Mot de passe incorrect ou échec du déchiffrement.", + "incorrect-password-for-file": "Mot de passe incorrect pour le fichier : {{file}}", + "error-uploading-pdf": "Erreur lors du téléchargement du PDF.", + "provide-password": "Veuillez fournir le mot de passe.", + "only-pdf-allowed": "Seuls les fichiers PDF sont autorisés.", + "invalid-username-password-region": "Nom d'utilisateur/mot de passe ou région invalide.", + "pfx-extension-alert": "Veuillez télécharger un fichier avec l'extension .pfx.", + "email-already-exist": "L'e-mail existe déjà", + "branding": "Image de marque", + "branding-help": "Le branding permet le white labelling de votre application", + "custom-sub-domain": "Sous-domaine personnalisé", + "app-name": "Nom de l'application", + "provide-domain-name": "Fournissez votre nom de domaine", + "provide-app-name": "Fournissez le nom de votre application", + "logo": "Logo", + "upload-app-logo": "Téléchargez le logo de votre application", + "prefill-unfilled-widget": "Les champs obligatoires suivants ne peuvent pas être vides : {{emptyWidget}}. Veuillez les remplir pour continuer.", + "Dashboard": "Tableau de bord", + "Analytics": "Analytique", + "Templates": "Modèles", + "Need your sign": "Besoin de votre signature", + "In Progress": "En cours", + "Completed": "Complété", + "Drafts": "Brouillons", + "Declined": "Signature refusé", + "Expired": "Expiré", + "Contactbook": "Carnet de contacts", + "My Signature": "Ma signature", + "API Token": "Jeton API", + "Webhook": "Webhook", + "Preferences": "Préférences", + "Teams": "Équipe", + "Users": "Utilisateurs", + "Drive": "Lecteur", + "Branding": "Image de marque", + "Mail": "Courrier", + "Storage": "Stockage", + "Signing certificate": "Certificat de signature", + "General": "Général", + "Organizations": "Organisations", + "OrgAdmins": "OrgAdmins", + "Debug Pdf": "Déboguer le PDF", + "New Document": "Nouveau document", + "subscription": "Abonnement", + "Draft document": "Brouillon de document", + "Draft template": "Brouillon de modèle", + "Public sign": "Signature publique", + "Signup": "Inscription", + "delete-contact": "Supprimer le contact", + "total-records-found": "Nombre total d'enregistrements trouvés : {{count}}", + "Invalid-records-found": "Enregistrements invalides trouvés : {{records}}", + "previous": "Précédent", + "page-n-of-n": "Page {{currentPage}} sur {{totalPages}}", + "import": "Importer", + "search": "Rechercher", + "viewed-on": "Consulté le : {{ViewedOn}}", + "signed-on": "Signé le : {{SignedOn}}", + "hide": "Masquer", + "show-more": "Afficher plus", + "browse-or-drag-to-replace-existing-file": "Parcourez ou faites glisser un nouveau fichier pour remplacer l'existant", + "optional-details": "Détails facultatifs", + "hide-optional-details": "masquer les détails facultatifs", + "mail-adapter-subscription-alert": "Veuillez passer au plan Professionnel ou Équipe pour configurer un SMTP personnalisé.", + "connect-to-mail": "Se connecter à Gmail", + "custom-smtp": "SMTP personnalisé", + "default-smtp": "SMTP par défaut de {{appName}}", + "host": "Hôte", + "port": "Port", + "sender-email": "Email de l'expéditeur", + "username": "Nom d'utilisateur", + "use-default-mail-adapter": "Voulez-vous vraiment utiliser les serveurs de messagerie par défaut de {{appName}} pour envoyer vos demandes de signature ? Nous vous recommandons d'utiliser votre propre serveur Gmail ou SMTP pour une meilleure délivrabilité.", + "verification-code-sent-registered-email": "Un code de vérification a été envoyé à votre email enregistré <1>{{useremail}}. Veuillez entrer le code ci-dessous pour confirmer vos paramètres.", + "smpt-credentials": "Identifiants SMTP", + "delete-account": "Supprimer le compte", + "delete-account-que": "Êtes-vous sûr de vouloir supprimer votre compte ?", + "delete-account-que-user": "Vous êtes sur le point de supprimer définitivement cet utilisateur et toutes les données associées. Cette action est irréversible.", + "user-deleted-successfully": "L'utilisateur et toutes les données associées ont été supprimés avec succès.", + "account-deletion-request-sent-via-mail": "Nous vous avons envoyé par e-mail un lien de confirmation. Approuvez la demande pour finaliser la suppression de votre compte.", + "type-exact-email-delete": "Saisissez l'adresse e-mail exacte pour activer la suppression", + "email-does-not-match": "L'adresse e-mail ne correspond pas.", + "please-type-to-confirm": "Veuillez saisir <1>{{userEmail}} pour confirmer:", + "email-settings": "Paramètres de messagerie", + "email-settings-help": "Pour assurer une meilleure délivrabilité dans la boîte de réception de vos e-mails de demande de signature, vous pouvez connecter votre propre fournisseur de messagerie. Choisissez l’une des options suivantes :", + "connect-to-gmail": "Se connecter à Gmail: ", + "connect-to-gmail-help": "Utilisez votre compte Gmail pour envoyer des e-mails de demande de signature directement depuis votre propre boîte de réception, améliorant ainsi les taux de délivrabilité et la fiabilité.", + "connect-to-smtp": "SMTP personnalisé: ", + "connect-to-smtp-help": "Utilisez votre propre serveur SMTP pour envoyer des e-mails via votre domaine. Cette option vous donne un contrôle total sur votre infrastructure de messagerie, améliorant la délivrabilité et la cohérence de la marque.", + "connect-to-default": "Si vous le souhaitez, vous pouvez également utiliser les serveurs de messagerie par défaut de {{appName}}, bien que nous recommandions d’utiliser les vôtres pour des résultats optimaux.", + "email-settings-redirect-message": "Ce paramètre a été déplacé de la console vers Paramètres du menu principal → Préférences. Cette page sera supprimée dans les prochaines versions.", + "go-to-preferences-menu": "Aller au menu Préférences", + "document-download-filename-format": "Format du nom de fichier pour le téléchargement du document", + "preview": "Aperçu : ", + "download-filename-format-help": "Choisissez comment les fichiers PDF téléchargés sont nommés. Votre sélection est enregistrée dans votre profil et utilisée dans toute l'application.", + "delete-action-prohibited": "Cette action n'est pas autorisée. Veuillez contacter votre administrateur pour demander la suppression du compte.", + "not-verified": "Non vérifié", + "verified": "Vérifié", + "expires": "Expire", + "fix-resend-error": "Vous ne pouvez pas corriger et renvoyer ce document car il contient des widgets préremplis.", + "duplicate-template-error": "Vous ne pouvez pas dupliquer ce modèle car il contient des widgets préremplis.", + "save-as-template-error": "Ce document ne peut pas être enregistré comme modèle car il contient des widgets préremplis.", + "redirecting-you-in": "Redirection dans {{redirectTimeLeft}} s...", + "pdf-tools-tour": "Cliquez sur ces boutons pour ajouter, supprimer, réorganiser, faire pivoter et zoomer les pages.", + "widgets": "Widgets", + "prefill-tour": "Utilisez cette option pour saisir des informations à l'avance avant d'envoyer le document aux destinataires.", + "empty-prefill-error": "Les champs obligatoires suivants ne peuvent pas être laissés vides :", + "please-fill-out": "Veuillez les remplir pour continuer.", + "custom-signing-certificate": "Certificat de signature personnalisé", + "signing-certificate-help": "Vous pouvez télécharger votre propre certificat de signature de documents, qui sera utilisé pour signer tous vos documents ainsi que les certificats d’achèvement. Le fichier du certificat doit être un certificat P12 au format PFX.", + "certificate-file-p12-in-PFX-format": "Fichier de certificat (certificat p12 au format PFX)", + "password-of-pfx-file": "Entrez le mot de passe du fichier pfx", + "update": "Mettre à jour", + "use-default-certificate": "Utiliser le certificat par défaut de {{appName}}", + "upgrade-to-team-plan": "Passer au plan Équipe", + "setup-file-storage": "Configurer le stockage de fichiers", + "save-and-activate": "Enregistrer et activer", + "logging-out-to-apply-settings": "Vous êtes déconnecté pour appliquer les nouveaux paramètres", + "reconnect-to-default": "Se reconnecter à {{appName}}", + "active-file-adapter": "Adaptateur de fichiers actif", + "file-adapter-unique-name": "Nom unique de l'adaptateur de fichiers", + "unique-name-for-file-adapter": "Entrez un nom unique pour l'adaptateur de fichiers", + "storage-provider": "Fournisseur de stockage", + "enter-bucket-name": "Entrez le nom du bucket", + "enter-space-name": "Entrez le nom de l'espace", + "enter-region-of-bucket": "Entrez la région du bucket", + "enter-region-of-space": "Entrez la région de l'espace", + "enter-access-key": "Entrez la clé d'accès", + "enter-secret-access-key": "Entrez la clé d'accès secrète", + "otp-email": "Nous avons envoyé un code de vérification", + "save-as-temp-warn": "Remarque : Ce document contient des widgets préremplis, qui seront automatiquement supprimés car ils sont déjà intégrés dans le document de base.", + "edit-document": "Modifier le document", + "otp-email": "Nous avons envoyé un code de vérification" } diff --git a/apps/OpenSign/public/locales/hi/translation.json b/apps/OpenSign/public/locales/hi/translation.json index ce5dcf1278..2094966ad5 100644 --- a/apps/OpenSign/public/locales/hi/translation.json +++ b/apps/OpenSign/public/locales/hi/translation.json @@ -26,6 +26,8 @@ "Name": "नाम", "Date": "दिनांक" }, + "folder": "फ़ोल्डर", + "pdf": "पीडीएफ़", "context-menu": { "Download": "डाउनलोड करें", "Rename": "नाम बदलें", @@ -44,6 +46,10 @@ "contact-now": "अभी संपर्क करें", "upgrade-to": "इसमें अपग्रेड करें", "plan": "योजना", + "connect": "कनेक्ट करें", + "connect-to-g-drive": "Google Drive से कनेक्ट करें", + "reconnect-to-g-drive": "Google Drive से फिर से कनेक्ट करें", + "gdrive-info-connect": "जब Google Drive जुड़ा होता है, तो पूर्ण दस्तावेज़ {{appName}} फ़ोल्डर में Google Drive पर सहेजा जाएगा।", "subscription-renew-warning": "आपकी सदस्यता {{remainingDays}} दिनों में समाप्त हो जाएगी। कृपया अपनी सदस्यता नवीनीकृत करें।", "subscribe-card-teamplan": "सहयोग की पूरी शक्ति को अनलॉक करें! असीमित संगठन, टीम और पदानुक्रम बनाएं। टीमों में टेम्पलेट को निर्बाध रूप से साझा करें और कस्टम उपयोगकर्ता भूमिकाएँ असाइन करें। आज ही अपने वर्कफ़्लो को उन्नत करें!", "subscribe-card-plan": "केवल {{premiumPrice}}/माह से शुरू होने वाली प्रीमियम सुविधाओं को अनलॉक करें। अपने शामिल प्रीमियम क्रेडिट के बाद प्रति अतिरिक्त क्रेडिट केवल {{addonPrice}} पर बढ़ी हुई प्रदर्शन का आनंद लें।", @@ -58,7 +64,7 @@ "welcome": "वापसी पर स्वागत है!", "Login-to-your-account": "अपने खाते में प्रवेश करे", "password": "पासवर्ड", - "forgot-password": "पासवर्ड भूल गए?", + "forgot-password": "पासवर्ड भूल गए", "loading": "लोड हो रहा है...", "of": "का", "sign-SSO": "SSO के साथ साइन इन करें", @@ -181,7 +187,20 @@ "created-date": "निर्माण तिथि", "Type": "प्रकार", "Logs": "लॉग", - "Expiry-date": "समाप्ति तिथि" + "Expiry-date": "समाप्ति तिथि", + "Company": "कंपनी", + "JobTitle": "पद", + "Time to complete (Days)": "पूरा करने का समय (दिन)", + "Auto reminder": "स्वचालित अनुस्मारक", + "Remind once in every (Days)": "हर (दिन) में एक बार याद दिलाएं", + "Enable OTP verification": "OTP सत्यापन सक्षम करें", + "Enable Tour": "टूर सक्षम करें", + "Notify on signatures": "हस्ताक्षर पर सूचित करें", + "Allow modifications": "संशोधन की अनुमति दें", + "Redirect url": "रीडायरेक्ट URL", + "Created Date": "निर्माण तिथि", + "Updated Date": "अद्यतन तिथि", + "Expiry Date": "समाप्ति तिथि" }, "report-help": { "Draft Documents": "ये वे दस्तावेज़ हैं जिन्हें आपने शुरू तो किया है लेकिन भेजने के लिए अंतिम रूप नहीं दिया है।", @@ -193,16 +212,15 @@ "Contactbook": "यह आपके द्वारा जोड़े गए संपर्कों/हस्ताक्षरकर्ताओं की सूची है। जब आप किसी नए दस्तावेज़ में हस्ताक्षरकर्ताओं को जोड़ने का प्रयास करेंगे तो ये सुझावों के रूप में दिखाई देंगे।", "Templates": "यह उन टेम्पलेट्स की सूची है जो दस्तावेज़ बनाने के लिए आपके लिए उपलब्ध हैं। आप टेम्पलेट का उपयोग करके एक नया दस्तावेज़ बनाने के लिए 'उपयोग करें' बटन पर क्लिक कर सकते हैं, दस्तावेज़ को संशोधित कर सकते हैं और अगले चरण में हस्ताक्षरकर्ताओं को जोड़ सकते हैं।" }, - "form-name": { - "Sign Yourself": "स्वयं हस्ताक्षर करें", - "Request Signatures": "हस्ताक्षर का अनुरोध करें", - "New Template": "नया टेम्पलेट" - }, + "Sign Yourself": "स्वयं हस्ताक्षर करें", + "Request Signatures": "हस्ताक्षर का अनुरोध करें", + "New Template": "नया टेम्पलेट", "file-type": "pdf, png, jpg, jpeg", "docx": "docx", "file-selected": "फ़ाइल चयनित", "template-title": "टेम्पलेट शीर्षक", "document-title": "दस्तावेज़ शीर्षक", + "title": "शीर्षक", "description": "विवरण", "time-to-complete": "पूरा करने का समय (दिन)", "send-in-order": "क्रम से भेजें", @@ -379,6 +397,7 @@ "certificate": "प्रमाण पत्र", "decline": "अस्वीकार करें", "finish": "समाप्त करें", + "done": "हो गया", "mail": "मेल", "sign-now": "अभी हस्ताक्षर करें", "successfully-signed": "सफलतापूर्वक हस्ताक्षर किए गए!", @@ -388,6 +407,10 @@ "Email-verified-alert-1": "ईमेल सत्यापित है।", "Email-verified-alert-2": "ईमेल पहले से ही सत्यापित है।", "upload-stamp-image": "मोहर छवि अपलोड करें", + "draw-signature": "हस्ताक्षर बनाएं", + "draw-initials": "इनिशियल्स बनाएं", + "enter-text": "पाठ दर्ज करें", + "enter-widgettype": "{{widgetType}} दर्ज करें", "draw": "आरेखित करें", "type": "टाइप", "color-type": { @@ -465,13 +488,13 @@ "add-recipients": "प्राप्तकर्ता जोड़ें", "loading-mssg": "इसमें कुछ समय लग सकता है", "send-mail": "मेल भेजें", - "signature-field-widget": "प्रत्येक उपयोगकर्ता के लिए कम से कम एक हस्ताक्षर फ़ील्ड जोड़ा जाना चाहिए। आपने {{signersName}} के लिए हस्ताक्षर फ़ील्ड नहीं जोड़े हैं", + "signature-field-widget": "प्रत्येक उपयोगकर्ता के पास कम से कम एक हस्ताक्षर विजेट होना चाहिए। आपने {{signersName}} के लिए हस्ताक्षर विजेट नहीं जोड़ा है।", "placeholder-alert-1": "कृपया सुनिश्चित करें कि सभी प्राप्तकर्ताओं के लिए कम से कम एक हस्ताक्षर विजेट जोड़ा गया है।", "placeholder-alert-2": "कृपया पुष्टि करें कि आपने टेक्स्ट फ़ील्ड भर दिया है।", "placeholder-alert-3": " क्या आप वाकई इस दस्तावेज़ को हस्ताक्षर के लिए भेजना चाहते हैं?", "placeholder-alert-4": "आपने सभी प्राप्तकर्ताओं को सफलतापूर्वक मेल भेज दिए हैं!", "placeholder-mail-alert": "आपने {{name}} को सफलतापूर्वक ईमेल भेज दिया है। {{name}} द्वारा दस्तावेज़ पर हस्ताक्षर करने के बाद बाद के हस्ताक्षरकर्ताओं को ईमेल प्राप्त होंगे", - "placeholder-mail-alert-you": "आपके द्वारा दस्तावेज़ पर हस्ताक्षर करने के बाद बाद के हस्ताक्षरकर्ताओं को ईमेल प्राप्त होंगे।", + "placeholder-mail-alert-you": "आपके दस्तावेज़ पर हस्ताक्षर करने के बाद अगले हस्ताक्षरकर्ता को ईमेल प्राप्त होगा।", "placeholder-alert-5": "क्या आप अभी दस्तावेज़ पर हस्ताक्षर करना चाहते हैं?", "placeholder-alert-6": "मेल भेजने के लिए कृपया मेल एडॉप्टर सेटअप करें!", "placeholder-alert-7": "प्लेसहोल्डर जोड़ने के लिए कृपया हस्ताक्षरकर्ता चुनें!", @@ -600,7 +623,8 @@ "tour-mssg": { "home-layout-1": "आप सफलतापूर्वक लॉग इन हो गए हैं! आइए एक नज़र डालते हैं।", "home-layout-2": "स्व-हस्ताक्षर के लिए दस्तावेज़ अपलोड करने या दूसरों के हस्ताक्षर का अनुरोध करने के लिए, बस संबंधित बटन चुनें।", - "home-layout-3": "आप {{appName}} का उपयोग शुरू करने के लिए तैयार हैं! यदि आपको सहायता की आवश्यकता है तो हमसे संपर्क करने में संकोच न करें।", + "home-layout-3": "आप {{appName}} का उपयोग शुरू करने के लिए तैयार हैं!", + "home-layout-4": "हमें स्टार दें", "generate-token": "उत्पादन एपीआई टोकन उत्पन्न करने के लिए अभी अपग्रेड करें।", "opensign-drive-1": "फ़ोल्डर पदानुक्रम के माध्यम से आसानी से नेविगेट करने और प्रत्येक फ़ोल्डर के भीतर दस्तावेज़ देखने के लिए ब्रेडक्रंब लिंक पर क्लिक करें।", "opensign-drive-2": "नया फ़ोल्डर या दस्तावेज़ बनाने के लिए जोड़ें बटन पर क्लिक करें।", @@ -610,34 +634,32 @@ "opensign-drive-6": "डाउनलोड, नाम बदलें, स्थानांतरित करें और हटाएं जैसे विकल्प देखने के लिए किसी दस्तावेज़ पर राइट-क्लिक करें। इसे खोलने के लिए दस्तावेज़ पर क्लिक करें।", "opensign-drive-7": "विकल्प देखने के लिए किसी भी फ़ोल्डर पर राइट-क्लिक करें। फ़ोल्डर का नाम बदलने के लिए 'नाम बदलें' चुनें या इसकी सामग्री के माध्यम से नेविगेट करने के लिए फ़ोल्डर पर क्लिक करें।", "pdf-request-file-1": "उन हस्ताक्षरकर्ताओं की सूची जिन्हें अभी भी दस्तावेज़ पर हस्ताक्षर करने की आवश्यकता है।", - "pdf-request-file-2": "हस्ताक्षर करने के लिए दस्तावेज़ पर दिखाई देने वाले किसी भी प्लेसहोल्डर पर क्लिक करें। फिर आपको अपना हस्ताक्षर खींचने, टाइप करने या एक छवि अपलोड करने के विकल्प दिखाई देंगे।", - "pdf-request-file-3": "अपने दस्तावेज़ को नेविगेट करने के लिए अस्वीकार करें, या समाप्त करें बटन पर क्लिक करें। डाउनलोड बटन सहित अतिरिक्त विकल्पों के लिए दीर्घवृत्त मेनू का उपयोग करें।", + "pdf-request-file-2": "शुरू करने के लिए दस्तावेज़ में दिखाई देने वाले किसी भी फ़ील्ड पर क्लिक करें। उसके बाद आप आवश्यक जानकारी भर सकेंगे।", + "pdf-request-file-3": "एक बार जब आप सभी आवश्यक फ़ील्ड भर लें, तो 'समाप्त करें' पर क्लिक करें। उसके बाद आप हस्ताक्षरित दस्तावेज़ डाउनलोड कर सकेंगे। प्रेषक की सेटिंग्स के आधार पर, जब सभी प्राप्तकर्ता हस्ताक्षर कर लेंगे, तो आपको पूर्ण दस्तावेज़ की एक प्रति और पूर्णता प्रमाणपत्र प्राप्त हो सकता है।", "pdf-request-file-4": "उन हस्ताक्षरकर्ताओं की सूची जिन्होंने पहले ही दस्तावेज़ पर हस्ताक्षर कर दिए हैं।", "pdf-request-file-5": "आप उन सभी स्थानों पर स्वचालित रूप से हस्ताक्षर करने के लिए 'सभी पर स्वतः हस्ताक्षर करें' पर क्लिक कर सकते हैं, जिन पर आपके द्वारा हस्ताक्षर किए जाने हैं। सुनिश्चित करें कि आप इस बटन पर क्लिक करने से पहले दस्तावेज़ की ठीक से समीक्षा कर लें।", "pdf-request-file-6": "कृपया पृष्ठ संख्या {{pagenumbers}} पर फ़ील्ड पूरी करें, सभी आसान पहचान के लिए एक ही रंग में हाइलाइट किए गए हैं।", - "placeholder-sign-1": "एक प्लेस-होल्डर जोड़ने के लिए इस सूची से एक प्राप्तकर्ता का चयन करें जहां उसे हस्ताक्षर करना है। प्लेसहोल्डर दस्तावेज़ पर छोड़ने के बाद प्राप्तकर्ता के नाम के समान रंग में दिखाई देगा।", + "placeholder-sign-1": "इस सूची से एक प्राप्तकर्ता चुनें ताकि विजेट जोड़ सकें। दस्तावेज़ पर रखने के बाद विजेट उसी रंग में दिखाई देगा जो प्राप्तकर्ता के नाम का है।", "placeholder-sign-2": "'प्राप्तकर्ता जोड़ें' बटन पर क्लिक करने से आप अधिक हस्ताक्षरकर्ताओं को जोड़ सकेंगे।", "placeholder-sign-3": "दस्तावेज़ में अधिक प्राप्तकर्ताओं/हस्ताक्षरकर्ताओं को जोड़ने के लिए इस बटन पर क्लिक करें।", - "placeholder-sign-4": "इसे दस्तावेज़ में जोड़ने के लिए किसी फ़ील्ड पर खींचें या क्लिक करें।", - "placeholder-sign-5": "पीडीएफ सामग्री क्षेत्र पहले से ही टेम्पलेट के मौजूदा प्लेसहोल्डर प्रदर्शित करता है। आपकी सुविधा के लिए, ये प्लेसहोल्डर प्राप्तकर्ता के नाम के रंग से मेल खाएंगे, जिससे उन्हें आसानी से पहचाना जा सकेगा।", + "placeholder-sign-4": "दस्तावेज़ में जोड़ने के लिए विजेट को खींचें या उस पर क्लिक करें।", + "placeholder-sign-5": "PDF सामग्री क्षेत्र पहले से ही टेम्पलेट के मौजूदा विजेट दिखाता है। आपकी सुविधा के लिए, ये विजेट प्राप्तकर्ता के नाम के रंग से मेल खाएँगे ताकि वे आसानी से पहचाने जा सकें।", "placeholder-sign-6": "'अगला' पर क्लिक करने से दस्तावेज़ सहेजा जाएगा। अगले चरण में आप प्राप्तकर्ताओं को भेजे जाने वाले ईमेल को अनुकूलित कर सकते हैं या हस्ताक्षर लिंक कॉपी कर सकते हैं और उन्हें स्वयं प्राप्तकर्ताओं के साथ साझा कर सकते हैं।", "report-1": "नया टेम्पलेट बनाने के लिए 'जोड़ें' बटन पर क्लिक करें। टेम्पलेट पुन: प्रयोज्य दस्तावेज़ हैं जिन्हें समान संरचना और अलग-अलग हस्ताक्षरकर्ताओं के साथ नए दस्तावेज़ों को शीघ्रता से उत्पन्न करने के लिए डिज़ाइन किया गया है। उदाहरण के लिए, ऑनबोर्डिंग के लिए एक मानव संसाधन टेम्पलेट में 'मानव संसाधन प्रबंधक' और 'नया कर्मचारी' जैसी पूर्वनिर्धारित भूमिकाएँ हो सकती हैं। हर बार जब आप टेम्पलेट का उपयोग करते हैं, तो आप विभिन्न आने वाले कर्मचारियों को 'नया कर्मचारी' भूमिका सौंप सकते हैं, जबकि 'मानव संसाधन प्रबंधक' भूमिका स्थिर रहती है, जिससे प्रत्येक भर्ती के लिए एक सहज ऑनबोर्डिंग प्रक्रिया सुविधाजनक होती है। ", "redirect": "किसी मौजूदा टेम्पलेट से नया दस्तावेज़ बनाने के लिए 'उपयोग करें' बटन पर क्लिक करें।", - "bulksend": "केवल प्राप्तकर्ता ईमेल पते बनाकर किसी मौजूदा टेम्पलेट का उपयोग करके कई दस्तावेज़ों को शीघ्रता से भेजने के लिए, 'थोक भेजें' बटन पर क्लिक करें।", - "option": "यह मेनू संपादन और हटाएं जैसे अधिक विकल्प प्रकट करता है। हस्ताक्षरकर्ता भूमिकाएं जोड़ने, फ़ील्ड संशोधित करने और अपने टेम्पलेट को अपडेट करने के लिए 'संपादित करें' बटन का उपयोग करें। परिवर्तन इस टेम्पलेट से बनाए गए सभी भविष्य के दस्तावेज़ों पर लागू होंगे लेकिन मौजूदा दस्तावेज़ों को प्रभावित नहीं करेंगे। हटाएं बटन का उपयोग करके आप टेम्पलेट हटा सकते हैं। ", - "signyour-self-1": "हस्ताक्षर करने से पहले अपने दस्तावेज़ को अनुकूलित करने के लिए अपने पसंदीदा विजेट चुनें और उन्हें पीडीएफ पर खींचें। अपनी आवश्यकताओं के अनुसार दस्तावेज़ को अनुकूलित करने के लिए प्रत्येक संशोधन के लिए सही स्थान चुनें।", + "bulksend": "किसी मौजूदा टेम्पलेट का उपयोग करके कई दस्तावेज़ जल्दी भेजने के लिए, केवल प्राप्तकर्ताओं के ईमेल पते दर्ज करें और 'बल्क सेंड' बटन पर क्लिक करें। आप अधिकतम 50 प्राप्तकर्ताओं को भेज सकते हैं।", + "option": "इस मेनू में और विकल्प दिखाई देंगे जैसे संपादित करें, हटाएं, नाम बदलें, डुप्लिकेट करें, साझा करें आदि। <1>यहां क्लिक करें सभी उपलब्ध विकल्पों के बारे में और पढ़ने के लिए। <3>नोट: किसी मौजूदा टेम्पलेट में किए गए बदलाव उस टेम्पलेट से बनाए गए सभी भविष्य के दस्तावेज़ों पर लागू होंगे, लेकिन पहले से भेजे गए दस्तावेज़ों पर प्रभाव नहीं डालेंगे।", + "signyour-self-1": "हस्ताक्षर करने से पहले अपने दस्तावेज़ को अनुकूलित करने के लिए अपनी पसंद के विजेट चुनें या उन्हें PDF पर खींचें। अपनी आवश्यकता के अनुसार प्रत्येक विजेट को सही स्थान पर रखें।", "signyour-self-2": "इस क्षेत्र में कहीं भी खींचें और छोड़ें। आप इसे बाद में आकार बदल सकते हैं और स्थानांतरित कर सकते हैं।", "template-placeholder-1": "'भूमिका जोड़ें' बटन पर क्लिक करने से आप विभिन्न हस्ताक्षरकर्ता भूमिकाएँ जोड़ सकेंगे। आप बाद के चरणों में प्रत्येक भूमिका में उपयोगकर्ताओं को संलग्न कर सकते हैं।", - "template-placeholder-2": "भूमिकाएँ जोड़ने के बाद, सूची से एक भूमिका चुनें ताकि एक प्लेस-होल्डर जोड़ा जा सके जहाँ उसे हस्ताक्षर करना है। प्लेसहोल्डर दस्तावेज़ पर छोड़ने के बाद भूमिका के नाम के समान रंग में दिखाई देगा।", - "template-placeholder-3": "इसे दस्तावेज़ में जोड़ने के लिए किसी फ़ील्ड पर खींचें या क्लिक करें।", - "template-placeholder-4": "किसी भूमिका के लिए प्लेसहोल्डर को दस्तावेज़ पर कहीं भी खींचें। याद रखें, यह आसान संदर्भ के लिए प्राप्तकर्ता के नाम के समान रंग में दिखाई देगा।", - "template-placeholder-5": "'अगला' पर क्लिक करने से वर्तमान टेम्पलेट संग्रहीत हो जाएगा। सहेजने के बाद, यदि आप चाहें तो इस टेम्पलेट से एक नया दस्तावेज़ बनाने के लिए आपको संकेत दिया जाएगा।", + "template-placeholder-2": "भूमिकाएँ जोड़ने के बाद, सूची में से एक चुनें ताकि उस प्राप्तकर्ता के लिए विजेट रखा जा सके। आप विजेट पर क्लिक कर सकते हैं या उसे दस्तावेज़ पर खींच सकते हैं। एक बार रखे जाने के बाद, विजेट चयनित भूमिका के समान रंग में दिखाई देगा।", + "template-placeholder-3": "'अगला' पर क्लिक करने से वर्तमान टेम्पलेट संग्रहीत हो जाएगा। सहेजने के बाद, यदि आप चाहें तो इस टेम्पलेट से एक नया दस्तावेज़ बनाने के लिए आपको संकेत दिया जाएगा।", "webhook-1": "वेबहूक सेट करने के लिए अभी अपग्रेड करें", "Need your Signature": "इस कार्ड पर क्लिक करने से आप अपनी समीक्षा की प्रतीक्षा कर रहे दस्तावेज़ों की सूची पर पहुंच जाएंगे।", "Out for signatures": "इस कार्ड पर क्लिक करने से आप हस्ताक्षर की प्रतीक्षा कर रहे दस्तावेज़ों की सूची पर पहुंच जाएंगे।", "Recent signature requests": "यह उन दस्तावेज़ों की सूची है जो आपके हस्ताक्षर की प्रतीक्षा कर रहे हैं।", "Recently sent for signatures": "यह उन दस्तावेज़ों की सूची है जिन्हें आपने हस्ताक्षर के लिए अन्य पक्षों को भेजा है।", - "Drafts": "ये वे दस्तावेज़ हैं जिन्हें आपने शुरू तो किया है लेकिन भेजने के लिए अंतिम रूप नहीं दिया है।", + "Drafts": "ये वे दस्तावेज़ हैं जिन्हें आपने शुरू किया है लेकिन भेजने के लिए अंतिम रूप नहीं दिया है।", "public-template": "यह वीडियो दर्शाता है कि आप अपना व्यक्तिगत सार्वजनिक प्रोफ़ाइल कैसे सेट अप कर सकते हैं, जैसे 'https://opensign.me/your-username'। आप यह भी सीखेंगे कि अपनी टैगलाइन को कैसे अनुकूलित करें और अपने टेम्पलेट्स को सार्वजनिक हस्ताक्षर के लिए उपलब्ध कराएं।", "allowModify-widgets": "आप इन फ़ील्ड में से किसी को भी दस्तावेज़ पर खींच और छोड़ सकते हैं, इसके अतिरिक्त दस्तावेज़ निर्माता द्वारा आपके लिए पहले से निर्दिष्ट फ़ील्ड के। " }, @@ -728,7 +750,7 @@ "public-tour-message": "साझा करने योग्य लिंक उत्पन्न करने से पहले टेम्पलेट को सार्वजनिक होना चाहिए।", "add-user-template": "इसके लिए फ़ील्ड जोड़ने से पहले आपको एक भूमिका जोड़ने की आवश्यकता है।", "pdf-uncompatible": "यह पीडीएफ संगत नहीं है, कृपया {{appName}} से संपर्क करें", - "text-field-tour": "दस्तावेज़ भेजे जाने से पहले 'टेक्स्ट' प्रकार के फ़ील्ड पहले से भरे जाने चाहिए। यदि आपको हस्ताक्षरकर्ताओं से इनपुट प्रदान करने की आवश्यकता है, तो इसके बजाय 'टेक्स्ट इनपुट' फ़ील्ड का उपयोग करें।", + "text-field-tour": "दस्तावेज़ सबमिट करने से पहले 'प्रीफ़िल' फ़ील्ड को पहले से भरना होगा। यदि आपको हस्ताक्षरकर्ताओं से इनपुट की आवश्यकता है, तो इसके बजाय हस्ताक्षरकर्ता फ़ील्ड का उपयोग करें।", "attach-signer-tour": "आपको प्रत्येक भूमिका में एक हस्ताक्षरकर्ता संलग्न करने की आवश्यकता है। आप इस आइकन पर क्लिक करके ऐसा कर सकते हैं। एक बार जब आप एक हस्ताक्षरकर्ता का चयन कर लेते हैं तो यह उस भूमिका से जुड़े सभी फ़ील्ड से जुड़ जाएगा जो एक ही रंग में दिखाई देते हैं।", "allowed-signature-types": "अनुमत हस्ताक्षर प्रकार", "at-least-one-signature-type": "कम से कम एक हस्ताक्षर प्रकार सक्षम होना चाहिए।", @@ -776,7 +798,7 @@ "agree-p1": "मैं पुष्टि करता हूं कि मैंने पढ़ लिया है और समझ लिया है ", "agree-p2": "इलेक्ट्रॉनिक रिकॉर्ड और हस्ताक्षर प्रकटीकरण", "agree-p3": "और इलेक्ट्रॉनिक रिकॉर्ड और हस्ताक्षर का उपयोग करने के लिए सहमति।", - "agrre-button": " सहमत हूँ और जारी रखें", + "agrre-button": "मैं पुष्टि करता हूँ और आगे बढ़ने के लिए सहमत हूँ", "term-cond-title": "नियम और शर्तें", "term-cond-h": "इलेक्ट्रॉनिक रिकॉर्ड और हस्ताक्षर प्रकटीकरण", "term-cond-p1": "यह इलेक्ट्रॉनिक रिकॉर्ड और हस्ताक्षर प्रकटीकरण ('प्रकटीकरण') दस्तावेज़ निर्माता ('प्रेषक') और हस्ताक्षरकर्ता ('आप') के बीच एक समझौता है, जिसे {{appName}} प्लेटफ़ॉर्म ('प्लेटफ़ॉर्म') के माध्यम से सुगम बनाया गया है। {{appName}} के माध्यम से दस्तावेज़ों पर हस्ताक्षर करके, आप इस प्रकटीकरण में उल्लिखित शर्तों से सहमत होते हैं। कृपया आगे बढ़ने से पहले इसे ध्यान से पढ़ें।", @@ -1032,14 +1054,161 @@ "not-calculated": "गणना नहीं की गई", "not-found-in-signature": "हस्ताक्षर में नहीं मिला", "readonly-error": "रीड-ओनली {{widgetName}} विजेट में एक डिफ़ॉल्ट मान होना चाहिए या आप इसे वैकल्पिक बना सकते हैं।", - "choose-one":"एक का चयन", + "choose-one": "एक का चयन", "search-templates": "टेम्पलेट खोजें…", "search-documents": "दस्तावेज़ खोजें…", "search-contacts": "संपर्क खोजें…", + "add-role-alert": "कृपया कम से कम एक भूमिका जोड़ें", + "edit-draft": "ड्राफ्ट संपादित करें", "invalid-email-found": "अमान्य ईमेल पाया गया: {{email}}", "duplicate-email-found": "डुप्लिकेट ईमेल पाया गया: {{email}}", "vertical": "वर्टिकल", "horizontal": "हॉरिज़ॉन्टल", "billing": "बिलिंग", - "console": "कंसोल" + "console": "कंसोल", + "prefill-widget": "पूर्व भराव विजेट्स", + "action-prohibited": "यह क्रिया आपके ईमेल डोमेन के लिए अनुमत नहीं है। कृपया सहायता के लिए अपने व्यवस्थापक से संपर्क करें।", + "must-have-at-least-one-vacant-role": "किसी टेम्पलेट को 'public' पर सेट करने से पहले कम से कम एक भूमिका खाली होनी चाहिए।", + "remove-duplicate": "कृपया डुप्लिकेट विकल्प हटाएं", + "prefill-bulk-error": "जब प्रीफ़िल विजेट जोड़े जाते हैं तो बल्क भेजना अनुमति नहीं है। कृपया आगे बढ़ने के लिए प्रीफ़िल विजेट हटा दें।", + "session-expired-title": "सत्र समाप्त हो गया", + "access-denied": "पहुंच अस्वीकृत", + "upgrade": "अपग्रेड", + "do-not-access-app": "आपको इस एप्लिकेशन तक पहुंच नहीं है।", + "dont-have-access": "आपको पहुंच नहीं है।", + "valid-email-alert": "कृपया एक मान्य ईमेल पता दर्ज करें।", + "otp-not-validate": "ओटीपी मान्य नहीं है।", + "domain-not-allowed": "यह डोमेन अनुमति नहीं है", + "atleast-one-recipient-alert": "कृपया कम से कम एक प्राप्तकर्ता जोड़ें!", + "incorrect-password-or-decryption-failed": "गलत पासवर्ड या डिक्रिप्शन विफल।", + "incorrect-password-for-file": "फ़ाइल के लिए गलत पासवर्ड: {{file}}", + "error-uploading-pdf": "PDF अपलोड करते समय त्रुटि।", + "provide-password": "कृपया पासवर्ड प्रदान करें।", + "only-pdf-allowed": "केवल PDF फ़ाइलें अनुमत हैं।", + "invalid-username-password-region": "अमान्य उपयोगकर्ता नाम/पासवर्ड या क्षेत्र।", + "pfx-extension-alert": ".pfx एक्सटेंशन वाली फ़ाइल अपलोड करें।", + "email-already-exist": "ईमेल पहले से मौजूद है", + "branding": "ब्रांडिंग", + "branding-help": "ब्रांडिंग आपकी ऐप में वाइट लेबलिंग की सुविधा देती है", + "custom-sub-domain": "कस्टम सब-डोमेन", + "app-name": "ऐप का नाम", + "provide-domain-name": "अपना डोमेन नाम दर्ज करें", + "provide-app-name": "अपना ऐप नाम दर्ज करें", + "logo": "लोगो", + "upload-app-logo": "अपने ऐप का लोगो अपलोड करें", + "prefill-unfilled-widget": "निम्न अनिवार्य फ़ील्ड खाली नहीं छोड़े जा सकते: {{emptyWidget}}। कृपया आगे बढ़ने के लिए इन्हें भरें।", + "Dashboard": "डैशबोर्ड", + "Analytics": "विश्लेषिकी", + "Templates": "टेम्पलेट्स", + "Need your sign": "आपके हस्ताक्षर की आवश्यकता है", + "In Progress": "प्रगति में है", + "Completed": "पूरा हुआ", + "Drafts": "ड्राफ्ट", + "Declined": "अस्वीकृत", + "Expired": "समाप्त", + "Contactbook": "संपर्क पुस्तिका", + "My Signature": "मेरा हस्ताक्षर", + "API Token": "एपीआई टोकन", + "Webhook": "वेबहूक", + "Preferences": "वरीयताएँ", + "Teams": "टीमें", + "Users": "उपयोगकर्ता", + "Drive": "ड्राइव", + "Branding": "ब्रांडिंग", + "Mail": "मेल", + "Storage": "भंडारण", + "Signing certificate": "हस्ताक्षर प्रमाण पत्र", + "General": "सामान्य", + "Organizations": "संगठन", + "OrgAdmins": "संगठन व्यवस्थापक", + "Debug Pdf": "पीडीएफ़ डीबग करें", + "New Document": "नया दस्तावेज़", + "subscription": "सब्सक्रिप्शन", + "Draft document": "ड्राफ्ट दस्तावेज़", + "Draft template": "ड्राफ्ट टेम्पलेट", + "Public sign": "पब्लिक साइन", + "Signup": "साइन अप करें", + "delete-contact": "संपर्क हटाएं", + "total-records-found": "कुल रिकॉर्ड मिले: {{count}}", + "Invalid-records-found": "अमान्य रिकॉर्ड मिले: {{records}}", + "previous": "पिछला", + "page-n-of-n": "पृष्ठ {{currentPage}} का {{totalPages}}", + "import": "आयात करें", + "search": "खोजें", + "viewed-on": "देखा गया: {{ViewedOn}}", + "signed-on": "हस्ताक्षर किया गया: {{SignedOn}}", + "hide": "छिपाएं", + "show-more": "और दिखाएं", + "browse-or-drag-to-replace-existing-file": "नई फ़ाइल ब्राउज़ करें या खींचकर छोड़ें ताकि मौजूदा फ़ाइल को बदला जा सके", + "optional-details": "वैकल्पिक विवरण", + "hide-optional-details": "वैकल्पिक विवरण छिपाएं", + "mail-adapter-subscription-alert": "कस्टम SMTP सेटअप करने के लिए कृपया प्रोफेशनल या टीम प्लान में अपग्रेड करें।", + "connect-to-mail": "Gmail से कनेक्ट करें", + "custom-smtp": "कस्टम SMTP", + "default-smtp": "{{appName}} डिफ़ॉल्ट SMTP", + "host": "होस्ट", + "port": "पोर्ट", + "sender-email": "प्रेषक ईमेल", + "username": "यूज़रनेम", + "use-default-mail-adapter": "क्या आप वाकई {{appName}} के डिफ़ॉल्ट मेल सर्वर का उपयोग करके सिग्नेचर अनुरोध भेजना चाहते हैं? बेहतर इनबॉक्स डिलीवरी के लिए हम अपने Gmail या SMTP सर्वर का उपयोग करने की सिफारिश करते हैं।", + "verification-code-sent-registered-email": "आपके पंजीकृत ईमेल <1>{{useremail}} पर एक सत्यापन कोड भेजा गया है। कृपया अपनी सेटिंग की पुष्टि के लिए नीचे कोड दर्ज करें।", + "smpt-credentials": "SMTP क्रेडेंशियल्स", + "delete-account": "खाता हटाएं", + "delete-account-que": "क्या आप वाकई अपना खाता हटाना चाहते हैं?", + "delete-account-que-user": "आप इस उपयोगकर्ता और सभी संबंधित डेटा को स्थायी रूप से हटाने वाले हैं। इस क्रिया को पूर्ववत नहीं किया जा सकता।", + "user-deleted-successfully": "उपयोगकर्ता और सभी संबंधित डेटा सफलतापूर्वक हटाए गए।", + "account-deletion-request-sent-via-mail": "हमने आपको एक पुष्टि लिंक ईमेल किया है। अपने खाते को हटाने की प्रक्रिया पूरी करने के लिए अनुरोध को स्वीकृत करें।", + "type-exact-email-delete": "हटाने को सक्षम करने के लिए सटीक ईमेल टाइप करें", + "email-does-not-match": "ईमेल मेल नहीं खाता।", + "please-type-to-confirm": "कृपया पुष्टि करने के लिए <1>{{userEmail}} टाइप करें:", + "email-settings": "ईमेल सेटिंग्स", + "email-settings-help": "अपने हस्ताक्षर अनुरोध ईमेल की बेहतर इनबॉक्स डिलीवरी सुनिश्चित करने के लिए, आप अपने स्वयं के ईमेल प्रदाता को कनेक्ट कर सकते हैं। निम्न विकल्पों में से एक चुनें:", + "connect-to-gmail": "Gmail से कनेक्ट करें: ", + "connect-to-gmail-help": "अपने Gmail खाते का उपयोग करके हस्ताक्षर अनुरोध ईमेल सीधे अपने इनबॉक्स से भेजें, जिससे डिलीवरी दर और विश्वसनीयता में सुधार होगा।", + "connect-to-smtp": "कस्टम SMTP: ", + "connect-to-smtp-help": "अपने डोमेन के माध्यम से ईमेल भेजने के लिए अपने कस्टम SMTP सर्वर का उपयोग करें। यह विकल्प आपको अपने ईमेल इंफ्रास्ट्रक्चर पर पूरा नियंत्रण देता है, जिससे डिलीवरी और ब्रांड की निरंतरता में सुधार होता है।", + "connect-to-default": "यदि आप चाहें, तो आप {{appName}} के डिफ़ॉल्ट मेल सर्वर का भी उपयोग कर सकते हैं, हालांकि सर्वोत्तम परिणामों के लिए हम अपने सर्वर का उपयोग करने की सलाह देते हैं।", + "email-settings-redirect-message": "यह सेटिंग कंसोल से मुख्य मेनू सेटिंग्स → प्रेफ़रेंस में स्थानांतरित कर दी गई है। यह पेज आने वाले संस्करणों में हटा दिया जाएगा।", + "go-to-preferences-menu": "प्रेफ़रेंस मेनू पर जाएं", + "document-download-filename-format": "दस्तावेज़ डाउनलोड फ़ाइलनाम प्रारूप", + "preview": "पूर्वावलोकन: ", + "download-filename-format-help": "डाउनलोड की गई PDF फ़ाइलों का नाम कैसे रखा जाए, चुनें। आपका चयन आपके प्रोफ़ाइल में सहेजा जाएगा और पूरे ऐप में उपयोग किया जाएगा।", + "delete-action-prohibited": "यह कार्रवाई अनुमत नहीं है। कृपया अपना खाता हटाने के लिए अपने व्यवस्थापक से संपर्क करें।", + "not-verified": "सत्यापित नहीं", + "verified": "सत्यापित", + "expires": "समाप्ति", + "fix-resend-error": "आप इस दस्तावेज़ को ठीक करके पुनः नहीं भेज सकते क्योंकि इसमें प्रीफ़िल विजेट्स हैं।", + "duplicate-template-error": "आप इस टेम्पलेट को डुप्लिकेट नहीं कर सकते क्योंकि इसमें प्रीफ़िल विजेट्स हैं।", + "save-as-template-error": "इस दस्तावेज़ को टेम्पलेट के रूप में सहेजा नहीं जा सकता क्योंकि इसमें प्रीफ़िल विजेट्स हैं।", + "redirecting-you-in": "{{redirectTimeLeft}} सेकंड में आपको रीडायरेक्ट किया जा रहा है...", + "pdf-tools-tour": "पृष्ठ जोड़ने, हटाने, पुनः व्यवस्थित करने, घुमाने और ज़ूम करने के लिए इन बटनों पर क्लिक करें।", + "widgets": "विजेट्स", + "prefill-tour": "दस्तावेज़ को प्राप्तकर्ताओं को भेजने से पहले अग्रिम रूप से जानकारी दर्ज करने के लिए इस विकल्प का उपयोग करें।", + "empty-prefill-error": "निम्न आवश्यक फ़ील्ड खाली नहीं छोड़े जा सकते:", + "please-fill-out": "कृपया आगे बढ़ने के लिए इन्हें भरें।", + "custom-signing-certificate": "कस्टम साइनिंग प्रमाणपत्र", + "signing-certificate-help": "आप अपना स्वयं का दस्तावेज़ हस्ताक्षर प्रमाणपत्र अपलोड कर सकते हैं, जिसका उपयोग आपके सभी दस्तावेज़ों और पूर्णता प्रमाणपत्रों पर हस्ताक्षर करने के लिए किया जाएगा। प्रमाणपत्र फ़ाइल PFX फॉर्मेट में P12 प्रमाणपत्र होनी चाहिए।", + "certificate-file-p12-in-PFX-format": "प्रमाणपत्र फ़ाइल (PFX फॉर्मेट में p12 प्रमाणपत्र)", + "password-of-pfx-file": "pfx फ़ाइल का पासवर्ड दर्ज करें", + "update": "अपडेट करें", + "use-default-certificate": "डिफ़ॉल्ट {{appName}} प्रमाणपत्र का उपयोग करें", + "upgrade-to-team-plan": "टीम प्लान में अपग्रेड करें", + "setup-file-storage": "फ़ाइल स्टोरेज सेटअप करें", + "save-and-activate": "सहेजें और सक्रिय करें", + "logging-out-to-apply-settings": "नई सेटिंग लागू करने के लिए आपको लॉग आउट किया जा रहा है", + "reconnect-to-default": "{{appName}} से फिर से कनेक्ट करें", + "active-file-adapter": "सक्रिय फ़ाइल एडेप्टर", + "file-adapter-unique-name": "फ़ाइल एडेप्टर का यूनिक नाम", + "unique-name-for-file-adapter": "फ़ाइल एडेप्टर के लिए यूनिक नाम दर्ज करें", + "storage-provider": "स्टोरेज प्रदाता", + "enter-bucket-name": "बकेट का नाम दर्ज करें", + "enter-space-name": "स्पेस का नाम दर्ज करें", + "enter-region-of-bucket": "बकेट का क्षेत्र दर्ज करें", + "enter-region-of-space": "स्पेस का क्षेत्र दर्ज करें", + "enter-access-key": "एक्सेस की दर्ज करें", + "enter-secret-access-key": "सीक्रेट एक्सेस की दर्ज करें", + "otp-email": "हमने एक सत्यापन कोड भेजा है", + "save-as-temp-warn": "नोट: इस दस्तावेज़ में पहले से भरे हुए विजेट शामिल हैं, जिन्हें स्वचालित रूप से हटा दिया जाएगा क्योंकि वे पहले से ही मूल दस्तावेज़ में सम्मिलित हैं।", + "edit-document": "दस्तावेज़ संपादित करें", + "otp-email": "हमने एक सत्यापन कोड भेजा है" } diff --git a/apps/OpenSign/public/locales/it/translation.json b/apps/OpenSign/public/locales/it/translation.json index 660ddeeb47..5b96a88522 100644 --- a/apps/OpenSign/public/locales/it/translation.json +++ b/apps/OpenSign/public/locales/it/translation.json @@ -1,7 +1,7 @@ { "header-news": "Nuova funzionalità: Gli utenti del piano Teams possono ora integrare i propri bucket AWS S3 per l'archiviazione dei file", "header-news-btn": "Configura Ora", - "sandbox-news": "Questo è un ambiente sandbox. Si prega di non utilizzarlo per scopi di produzione.", + "sandbox-news": "Questo è un ambiente sandbox. Si prega di non utilizzarlo per scopi di produzione.", "create-account": "Crea Account", "login": "Accedi", "language": "Lingua", @@ -26,6 +26,8 @@ "Name": "Nome", "Date": "Data" }, + "folder": "Cartella", + "pdf": "Pdf", "context-menu": { "Download": "Scarica", "Rename": "Rinomina", @@ -44,6 +46,10 @@ "contact-now": "Contatta ora", "upgrade-to": "Aggiorna a", "plan": "Piano", + "connect": "Connetti", + "connect-to-g-drive": "Connetti a Google Drive", + "reconnect-to-g-drive": "Riconnetti a Google Drive", + "gdrive-info-connect": "Quando Google Drive è connesso, il documento completato verrà salvato nella cartella {{appName}} su Google Drive.", "subscription-renew-warning": "Il tuo abbonamento scadrà tra {{remainingDays}} giorni. Ti preghiamo di rinnovarlo.", "subscribe-card-teamplan": "Sblocca tutto il potenziale della collaborazione! Crea organizzazioni, team e gerarchie illimitati. Condividi modelli senza problemi tra i team e assegna ruoli personalizzati agli utenti. Migliora il tuo flusso di lavoro oggi stesso!", "subscribe-card-plan": "Sblocca le funzionalità premium a partire da soli {{premiumPrice}}/mese. Approfitta di prestazioni migliorate e paga solo {{addonPrice}} per ogni credito aggiuntivo dopo quelli inclusi.", @@ -58,7 +64,7 @@ "welcome": "Bentornato!", "Login-to-your-account": "Accedi al tuo account", "password": "Password", - "forgot-password": "Password dimenticata?", + "forgot-password": "Password dimenticata", "loading": "Caricamento...", "of": "di", "sign-SSO": "Accedi con SSO", @@ -181,7 +187,20 @@ "created-date": "Data di creazione", "Type": "Tipo", "Logs": "Log", - "Expiry-date": "Data di scadenza" + "Expiry-date": "Data di scadenza", + "Company": "Azienda", + "JobTitle": "Titolo professionale", + "Time to complete (Days)": "Tempo per completare (giorni)", + "Auto reminder": "Promemoria automatico", + "Remind once in every (Days)": "Ricorda una volta ogni (giorni)", + "Enable OTP verification": "Abilita verifica OTP", + "Enable Tour": "Abilita tour", + "Notify on signatures": "Notifica sulle firme", + "Allow modifications": "Consenti modifiche", + "Redirect url": "URL di reindirizzamento", + "Created Date": "Data di creazione", + "Updated Date": "Data di aggiornamento", + "Expiry Date": "Data di scadenza" }, "report-help": { "Draft Documents": "Questi sono documenti che hai iniziato ma non hai ancora finalizzato per l'invio.", @@ -193,16 +212,15 @@ "Contactbook": "Questa è una lista di contatti/firmatari aggiunti da te. Appariranno come suggerimenti quando provi ad aggiungere firmatari a un nuovo documento.", "Templates": "Questa è una lista di modelli disponibili per creare documenti. Puoi fare clic sul pulsante 'Usa' per creare un nuovo documento utilizzando un modello, modificare il documento e aggiungere firmatari nel passaggio successivo." }, - "form-name": { - "Sign Yourself": "Firma tu stesso", - "Request Signatures": "Richiedi firme", - "New Template": "Nuovo modello" - }, + "Sign Yourself": "Firma tu stesso", + "Request Signatures": "Richiedi firme", + "New Template": "Nuovo modello", "file-type": "pdf, png, jpg, jpeg", "docx": "docx", "file-selected": "file selezionato", "template-title": "Titolo del modello", "document-title": "Titolo del documento", + "title": "Titolo", "description": "Descrizione", "time-to-complete": "Tempo per completare (giorni)", "send-in-order": "Invia in ordine", @@ -280,7 +298,7 @@ "deactivate": "disattiva", "this-user": "questo utente", "delete-user": "Elimina utente", - "delete": "elimina", + "delete": "Elimina", "add-user": "Aggiungi utente", "password-generateed": "La password verrà generata solo una volta; assicurati di copiarla.", "Team status": "Stato del Team", @@ -379,6 +397,7 @@ "certificate": "Certificato", "decline": "Rifiuta", "finish": "Completa", + "done": "Fatto", "mail": "Email", "sign-now": "Firma ora", "successfully-signed": "Firmato con successo!", @@ -388,6 +407,10 @@ "Email-verified-alert-1": "Email verificata.", "Email-verified-alert-2": "Email già verificata.", "upload-stamp-image": "Carica immagine timbro", + "draw-signature": "Disegna la firma", + "draw-initials": "Disegna le iniziali", + "enter-text": "Inserisci testo", + "enter-widgettype": "Inserisci {{widgetType}}", "draw": "Disegno", "type": "Digitata", "color-type": { @@ -400,7 +423,7 @@ "upload": "Caricamento", "initial-teb": "Iniziali", "signature-tab": "Firma", - "your-signature": "La tua firma", + "initial-alert": "La mia iniziale non trovata", "copy-title": "Copia widget in", "contact-delete-alert": "Sei sicuro di voler eliminare questo contatto?", "reset-password-alert-1": "Il link per reimpostare la password è stato inviato al tuo indirizzo email", @@ -465,13 +488,13 @@ "add-recipients": "Aggiungi destinatari", "loading-mssg": "Questo potrebbe richiedere del tempo", "send-mail": "Invia Mail", - "signature-field-widget":"È necessario aggiungere almeno un campo firma per ogni utente. Non hai aggiunto campi firma per {{signersName}}", + "signature-field-widget": "Ogni utente deve avere almeno un widget di firma. Non hai aggiunto un widget di firma per {{signersName}}.", "placeholder-alert-1": "Assicurati che sia stato aggiunto almeno un widget per la firma per tutti i destinatari.", "placeholder-alert-2": "Conferma di aver compilato il campo di testo.", "placeholder-alert-3": "Sei sicuro di voler inviare questo documento per le firme?", "placeholder-alert-4": "Hai inviato con successo le mail a tutti i destinatari!", "placeholder-mail-alert": "Hai inviato con successo un'e-mail a {{name}}. I firmatari successivi riceveranno un'e-mail una volta che {{name}} avrà firmato il documento.", - "placeholder-mail-alert-you": "I firmatari successivi riceveranno un'email non appena firmi il documento.", + "placeholder-mail-alert-you": "I firmatari successivi riceveranno un'email dopo che avrai firmato il documento.", "placeholder-alert-5": "Vuoi firmare i documenti ora?", "placeholder-alert-6": "Configura l'adattatore email per inviare mail!", "placeholder-alert-7": "Seleziona il firmatario per aggiungere un segnaposto!", @@ -600,7 +623,8 @@ "tour-mssg": { "home-layout-1": "Accesso effettuato con successo! Diamo un'occhiata.", "home-layout-2": "Per caricare documenti da firmare personalmente o richiedere le firme di altri, seleziona semplicemente i pulsanti corrispondenti.", - "home-layout-3": "Sei pronto per iniziare a usare {{appName}}! Se hai bisogno di supporto, contattaci pure.", + "home-layout-3": "Sei pronto per iniziare a usare {{appName}}!", + "home-layout-4": "Dacci una stella su", "generate-token": "Esegui l'upgrade ora per generare un token API di produzione.", "opensign-drive-1": "Fai clic sui collegamenti breadcrumb per navigare facilmente attraverso la gerarchia delle cartelle e visualizzare i documenti in ciascuna cartella.", "opensign-drive-2": "Fai clic sul pulsante aggiungi per creare una nuova cartella o documento.", @@ -610,34 +634,32 @@ "opensign-drive-6": "Fai clic con il tasto destro su un documento per vedere opzioni come Scarica, Rinomina, Sposta e Elimina. Fai clic sul documento per aprirlo.", "opensign-drive-7": "Fai clic con il tasto destro su qualsiasi cartella per vedere le opzioni. Scegli 'Rinomina' per cambiare il nome della cartella o fai clic sulla cartella per navigare nei suoi contenuti.", "pdf-request-file-1": "Elenco dei firmatari che devono ancora firmare il documento.", - "pdf-request-file-2": "Fai clic su uno dei segnaposto che appaiono sul documento per firmare. Vedrai poi le opzioni per disegnare la tua firma, digitarla o caricare un'immagine.", - "pdf-request-file-3": "Clicca sui pulsanti Rifiuta o Fine per navigare nel tuo documento. Usa il menu con i puntini di sospensione per opzioni aggiuntive, incluso il pulsante Scarica.", + "pdf-request-file-2": "Fai clic su uno qualsiasi dei campi presenti nel documento per iniziare. Potrai quindi compilare le informazioni richieste.", + "pdf-request-file-3": "Dopo aver compilato tutti i campi richiesti, fai clic su 'Fine'. Potrai quindi scaricare il documento firmato. A seconda delle impostazioni del mittente, potresti ricevere una copia del documento completato insieme al certificato di completamento una volta che tutti i destinatari avranno firmato.", "pdf-request-file-4": "Elenco dei firmatari che hanno già firmato il documento.", "pdf-request-file-5": "Puoi fare clic su 'Firma Tutto Automaticamente' per firmare automaticamente in tutte le posizioni previste per te. Assicurati di esaminare attentamente il documento prima di fare clic su questo pulsante.", "pdf-request-file-6": "Si prega di completare i campi alla pagina {{pagenumbers}}, tutti evidenziati con lo stesso colore per una facile identificazione.", - "placeholder-sign-1": "Seleziona un destinatario da questo elenco per aggiungere un segnaposto dove deve firmare. Il segnaposto apparirà dello stesso colore del nome del destinatario una volta posizionato sul documento.", + "placeholder-sign-1": "Seleziona un destinatario da questo elenco per aggiungere un widget. Il widget apparirà con lo stesso colore del nome del destinatario una volta posizionato sul documento.", "placeholder-sign-2": "Facendo clic sul pulsante 'Aggiungi destinatari' potrai aggiungere più firmatari.", "placeholder-sign-3": "Fai clic su questo pulsante per aggiungere altri destinatari/firmatari al documento.", - "placeholder-sign-4": "Trascina o fai clic su un campo per aggiungerlo al documento.", - "placeholder-sign-5": "L'area del contenuto PDF visualizza già i segnaposti esistenti del modello. Per tua comodità, questi segnaposti corrisponderanno al colore del nome del destinatario, rendendoli facilmente identificabili.", + "placeholder-sign-4": "Trascina o fai clic su un widget per aggiungerlo al documento.", + "placeholder-sign-5": "L'area di contenuto PDF mostra già i widget esistenti del modello. Per comodità, questi widget corrisponderanno al colore del nome del destinatario, rendendoli facilmente identificabili.", "placeholder-sign-6": "Facendo clic su 'Invia' il documento verrà salvato. Nel passaggio successivo potrai personalizzare le email da inviare ai destinatari o copiare i link di firma e condividerli direttamente con i destinatari.", "report-1": "Fai clic sul pulsante 'Aggiungi' per creare un nuovo modello. I modelli sono documenti riutilizzabili progettati per generare rapidamente nuovi documenti con la stessa struttura e firmatari diversi. Ad esempio, un modello HR per l'onboarding potrebbe avere ruoli predefinita come 'Responsabile HR' e 'Nuovo Dipendente'. Ogni volta che usi il modello, puoi assegnare il ruolo 'Nuovo Dipendente' a membri dello staff in arrivo, mentre il ruolo 'Responsabile HR' rimane costante, facilitando un processo di onboarding fluido per ogni nuovo assunto.", "redirect": "Fai clic sul pulsante 'Usa' per creare un nuovo documento da un modello esistente.", - "bulksend": "Per inviare rapidamente più documenti utilizzando un modello esistente creando semplicemente gli indirizzi e-mail dei destinatari, fai clic sul pulsante 'Invio Multiplo'.", - "option": "Questo menu rivela altre opzioni come Modifica ed Elimina. Usa il pulsante 'Modifica' per aggiungere ruoli di firmatari, modificare i campi e aggiornare il modello. Le modifiche si applicheranno a tutti i futuri documenti creati da questo modello ma non influiranno sui documenti esistenti. Usa il pulsante Elimina per eliminare il modello.", - "signyour-self-1": "Seleziona e trascina i widget preferiti sul PDF per personalizzare il documento prima di firmarlo. Scegli i punti perfetti per ogni modifica per adattare il documento alle tue esigenze.", + "bulksend": "Per inviare rapidamente più documenti utilizzando un modello esistente, basta inserire gli indirizzi e-mail dei destinatari e fare clic sul pulsante 'Invio massivo'. Puoi inviare fino a 50 destinatari.", + "option": "Questo menu mostra ulteriori opzioni come Modifica, Elimina, Rinomina, Duplica, Condividi, ecc. <1>Fai clic qui per saperne di più su tutte le opzioni disponibili. <3>Nota: Le modifiche a un modello esistente si applicheranno a tutti i futuri documenti creati da quel modello, ma non influenzeranno i documenti già inviati.", + "signyour-self-1": "Seleziona o trascina i widget preferiti sul PDF per personalizzare il tuo documento prima della firma. Scegli i punti perfetti per ciascun widget per adattare il documento alle tue esigenze.", "signyour-self-2": "Trascina e rilascia ovunque in quest'area. Puoi ridimensionarlo e spostarlo in seguito.", "template-placeholder-1": "Facendo clic sul pulsante 'Aggiungi ruolo' potrai aggiungere vari ruoli di firmatari. Puoi assegnare utenti a ciascun ruolo nei passaggi successivi.", - "template-placeholder-2": "Una volta aggiunti i ruoli, seleziona un ruolo dall'elenco per aggiungere un segnaposto dove deve firmare. Il segnaposto apparirà dello stesso colore del nome del ruolo una volta posizionato sul documento.", - "template-placeholder-3": "Trascina o fai clic su un campo per aggiungerlo al documento.", - "template-placeholder-4": "Trascina il segnaposto per un ruolo ovunque sul documento. Ricorda, apparirà dello stesso colore del nome del destinatario per un facile riferimento.", - "template-placeholder-5": "Facendo clic su 'Avanti' il modello corrente verrà memorizzato. Dopo averlo salvato, ti verrà chiesto di creare un nuovo documento da questo modello, se lo desideri.", + "template-placeholder-2": "Dopo aver aggiunto i ruoli, scegli uno dall'elenco per posizionare un widget per quel destinatario. Puoi fare clic sul widget o trascinarlo nel documento. Una volta posizionato, il widget verrà visualizzato nello stesso colore del ruolo selezionato.", + "template-placeholder-3": "Facendo clic su 'Avanti' il modello corrente verrà memorizzato. Dopo averlo salvato, ti verrà chiesto di creare un nuovo documento da questo modello, se lo desideri.", "webhook-1": "Esegui l'upgrade ora per configurare il webhook.", "Need your Signature": "Facendo clic su questa scheda, accederai all'elenco dei documenti in attesa della tua revisione.", "Out for signatures": "Facendo clic su questa scheda, accederai all'elenco dei documenti in attesa di firma.", "Recent signature requests": "Questo è un elenco di documenti che aspettano la tua firma.", "Recently sent for signatures": "Questo è un elenco di documenti che hai inviato ad altre parti per la firma.", - "Drafts": "Questi sono documenti che hai iniziato ma non hai finalizzato per l'invio.", + "Drafts": "Questi sono documenti che hai iniziato ma non hai ancora finalizzato per l'invio.", "public-template": "Questo video dimostra come configurare il tuo profilo pubblico personalizzato, come 'https://opensign.me/tuo-username'. Imparerai anche come personalizzare il tuo slogan e rendere i tuoi modelli disponibili per la firma pubblica.", "allowModify-widgets": "È possibile trascinare e rilasciare uno qualsiasi di questi campi nel documento, oltre ai campi già designati dal creatore del documento." }, @@ -728,11 +750,11 @@ "public-tour-message": "Il modello deve essere pubblico prima di poter generare un link condivisibile.", "add-user-template": "Devi aggiungere un ruolo prima di poter aggiungere i campi per esso.", "pdf-uncompatible": "Questo PDF non è compatibile, contatta {{appName}}", - "text-field-tour": "I campi di tipo 'Testo' devono essere compilati in anticipo prima che il documento venga inviato. Se hai bisogno che i firmatari forniscano un input, usa invece il campo 'Testo di input'.", + "text-field-tour": "I campi 'Prefill' devono essere compilati in anticipo prima dell'invio del documento. Se hai bisogno che i firmatari forniscano input, usa invece i campi dei firmatari.", "attach-signer-tour": "Devi allegare un firmatario a ogni ruolo. Puoi farlo cliccando su questa icona. Una volta selezionato un firmatario, sarà associato a tutti i campi associati a quel ruolo che appariranno dello stesso colore.", "allowed-signature-types": "Tipi di firma consentiti", "at-least-one-signature-type": "Almeno un tipo di firma deve essere abilitato.", - "expect-default-one-more-signature-type": "Abilita un tipo di firma aggiuntivo oltre al tipo predefinita.", + "expect-default-one-signature-type": "Abilita un tipo di firma aggiuntivo oltre al tipo predefinita.", "add-signer-note": "Nota - Questo contatto verrà aggiunto alla tua lista di contatti", "allowed-signature-types-help": { "p1": "Questa preferenza di firma controlla le opzioni di firma disponibili per i tuoi firmatari. Solo i tipi di firma che selezioni appariranno nel widget di firma quando un documento viene firmato. Ad esempio, se scegli solo l'opzione 'Disegna' nelle preferenze, il tuo firmatario vedrà solo l'opzione 'Disegna' nel widget di firma, mentre gli altri tre tipi non saranno disponibili.", @@ -776,7 +798,7 @@ "agree-p1": "Confermo di aver letto e compreso il", "agree-p2": "Divulgazione sulle registrazioni e firme elettroniche", "agree-p3": "e acconsento all'uso di registrazioni e firme elettroniche.", - "agrre-button": "Accetta e Continua", + "agrre-button": "Confermo e accetto di continuare", "term-cond-title": "Termini e Condizioni", "term-cond-h": "DIVULGAZIONE SULLE REGISTRAZIONI E FIRME ELETTRONICHE", "term-cond-p1": "Questa Divulgazione sulle Registrazioni e Firme Elettroniche ('Divulgazione') è un accordo tra il Creatore del Documento ('Mittente') e il Firmatario ('Tu'), facilitato tramite la piattaforma {{appName}} (Piattaforma). Firmando documenti tramite {{appName}}, accetti i termini descritti in questa Divulgazione. Ti preghiamo di leggerla attentamente prima di procedere.", @@ -898,7 +920,7 @@ "note-length-alert": "La nota può contenere al massimo 200 caratteri.", "description-length-alert": " La descrizione può contenere al massimo 500 caratteri.", "fix-&-resend-document": "Correggi e reinvia il documento", - "do-you-want-recreate-document?": "Questo creerà una bozza da questo documento con tutti i campi intatti. Sei sicuro di voler ricreare questo documento?", + "do-you-want-recreate-document?": "Questo creerà una bozza da questo documento con tutti i campi intatti. Sei sicuro di voler ricreare questo documento?", "start-editing": "Inizia a modificare", "unsaved-changes-discard-them?": "Hai modifiche non salvate. Vuoi scartarle?", "yes-discard": "Sì, scarta", @@ -988,7 +1010,7 @@ "finish-mssg": "Sei sicuro di voler completare il documento?", "review": "Rivedere", "next-field": "Campo successivo", - "required-mssg":"{{leftRequiredWidget}} di {{totalWidget}} campi rimanenti", + "required-mssg": "{{leftRequiredWidget}} di {{totalWidget}} campi rimanenti", "verify-document": "Verifica documento", "verify-document-signature": "Verifica firma documento", "select-pdf-document": "Seleziona documento PDF", @@ -1032,14 +1054,161 @@ "not-calculated": "Non calcolato", "not-found-in-signature": "Non trovato nella firma", "readonly-error": "Il widget {{widgetName}} di sola lettura deve avere un valore predefinito oppure può essere reso facoltativo.", - "choose-one":"Scegline uno", + "choose-one": "Scegline uno", "search-templates": "Cerca modelli…", "search-documents": "Cerca documenti…", "search-contacts": "Cerca contatti…", + "add-role-alert": "Si prega di aggiungere almeno un ruolo", + "edit-draft": "Modifica bozza", "invalid-email-found": "Email non valida trovata: {{email}}", "duplicate-email-found": "Email duplicata trovata: {{email}}", "vertical": "Verticale", "horizontal": "Orizzontale", "billing": "Fatturazione", - "console": "Console" + "console": "Console", + "prefill-widget": "Widget Precompilati", + "action-prohibited": "Questa azione non è consentita per il tuo dominio email. Contatta il tuo amministratore per ricevere assistenza.", + "must-have-at-least-one-vacant-role": "Devi lasciare almeno un ruolo non assegnato prima di impostare un template su 'public'.", + "remove-duplicate": "Si prega di rimuovere l'opzione duplicata", + "prefill-bulk-error": "L'invio in blocco non è consentito quando sono stati aggiunti i widget di precompilazione. Si prega di rimuovere i widget di precompilazione per procedere.", + "session-expired-title": "Sessione scaduta", + "access-denied": "Accesso negato", + "upgrade": "Aggiorna", + "do-not-access-app": "Non hai accesso a questa applicazione.", + "dont-have-access": "Non hai accesso.", + "valid-email-alert": "Inserisci un indirizzo email valido.", + "otp-not-validate": "OTP non valido.", + "domain-not-allowed": "Questo dominio non è consentito", + "atleast-one-recipient-alert": "Aggiungi almeno un destinatario!", + "incorrect-password-or-decryption-failed": "Password errata o decrittazione non riuscita.", + "incorrect-password-for-file": "Password errata per il file: {{file}}", + "error-uploading-pdf": "Errore durante il caricamento del PDF.", + "provide-password": "Fornisci la password.", + "only-pdf-allowed": "Sono consentiti solo file PDF.", + "invalid-username-password-region": "Nome utente/password o regione non valida.", + "pfx-extension-alert": "Carica un file con estensione .pfx.", + "email-already-exist": "L'email esiste già", + "branding": "Marchio", + "branding-help": "Il branding consente il white labelling della tua app", + "custom-sub-domain": "Sottodominio personalizzato", + "app-name": "Nome dell'app", + "provide-domain-name": "Fornisci il tuo nome di dominio", + "provide-app-name": "Fornisci il nome della tua app", + "logo": "Logo", + "upload-app-logo": "Carica il logo della tua app", + "prefill-unfilled-widget": "I seguenti campi obbligatori non possono essere lasciati vuoti: {{emptyWidget}}. Per favore compilali per procedere.", + "Dashboard": "Dashboard", + "Analytics": "Analitica", + "Templates": "Modelli", + "Need your sign": "Necessita della tua firma", + "In Progress": "In corso", + "Completed": "Completati", + "Drafts": "Bozze", + "Declined": "Rifiutati", + "Expired": "Scaduti", + "Contactbook": "Rubrica", + "My Signature": "La mia firma", + "API Token": "Token API", + "Webhook": "Webhook", + "Preferences": "Preferenze", + "Teams": "Team", + "Users": "Utenti", + "Drive": "Drive", + "Branding": "Marchio", + "Mail": "Posta", + "Storage": "Archiviazione", + "Signing certificate": "Certificato di firma", + "General": "Generale", + "Organizations": "Organizzazioni", + "OrgAdmins": "OrgAdmins", + "Debug Pdf": "Debug PDF", + "New Document": "Nuovo documento", + "subscription": "Abbonamento", + "Draft document": "Bozza di documento", + "Draft template": "Bozza di modello", + "Public sign": "Firma pubblica", + "Signup": "Registrazione", + "delete-contact": "Elimina contatto", + "total-records-found": "Totale record trovati: {{count}}", + "Invalid-records-found": "Record non validi trovati: {{records}}", + "previous": "Precedente", + "page-n-of-n": "Pagina {{currentPage}} di {{totalPages}}", + "import": "Importa", + "search": "Cerca", + "viewed-on": "Visualizzato il: {{ViewedOn}}", + "signed-on": "Firmato il: {{SignedOn}}", + "hide": "Nascondi", + "show-more": "Mostra di più", + "browse-or-drag-to-replace-existing-file": "Sfoglia o trascina un nuovo file per sostituire quello esistente", + "optional-details": "Dettagli facoltativi", + "hide-optional-details": "nascondi dettagli facoltativi", + "mail-adapter-subscription-alert": "Esegui l'upgrade al piano Professional o Team per configurare un SMTP personalizzato.", + "connect-to-mail": "Connetti a Gmail", + "custom-smtp": "SMTP personalizzato", + "default-smtp": "SMTP predefinito di {{appName}}", + "host": "Host", + "port": "Porta", + "sender-email": "Email del mittente", + "username": "Nome utente", + "use-default-mail-adapter": "Sei sicuro di voler usare i server di posta predefiniti di {{appName}} per inviare le richieste di firma? Ti consigliamo di usare i tuoi server Gmail o SMTP per una migliore consegna in posta in arrivo.", + "verification-code-sent-registered-email": "Un codice di verifica è stato inviato alla tua email registrata <1>{{useremail}}. Inserisci il codice qui sotto per confermare le impostazioni.", + "smpt-credentials": "Credenziali SMTP", + "delete-account": "Elimina account", + "delete-account-que": "Sei sicuro di voler eliminare il tuo account?", + "delete-account-que-user": "Stai per eliminare in modo permanente questo utente e tutti i dati associati. Questa azione non può essere annullata.", + "user-deleted-successfully": "Utente e tutti i dati associati eliminati con successo.", + "account-deletion-request-sent-via-mail": "Le abbiamo inviato via e-mail un link di conferma. Approvi la richiesta per completare l'eliminazione del suo account.", + "type-exact-email-delete": "Digita l'e-mail esatta per abilitare l'eliminazione", + "email-does-not-match": "L'e-mail non corrisponde.", + "please-type-to-confirm": "Per favore, digita <1>{{userEmail}} per confermare:", + "email-settings": "Impostazioni e-mail", + "email-settings-help": "Per garantire una migliore consegna nella casella di posta in arrivo delle e-mail di richiesta firma, puoi collegare il tuo provider di posta elettronica. Scegli una delle seguenti opzioni:", + "connect-to-gmail": "Connetti a Gmail", + "connect-to-gmail-help": "Usa il tuo account Gmail per inviare e-mail di richiesta firma direttamente dalla tua casella di posta, migliorando il tasso di consegna e l'affidabilità.", + "connect-to-smtp": "SMTP personalizzato", + "connect-to-smtp-help": "Usa il tuo server SMTP personalizzato per inviare e-mail tramite il tuo dominio. Questa opzione ti offre il pieno controllo sulla tua infrastruttura e-mail, migliorando la consegna e la coerenza del marchio.", + "connect-to-default": "Se preferisci, puoi anche utilizzare i server di posta predefiniti di {{appName}}, anche se consigliamo di usare i tuoi per ottenere risultati ottimali.", + "email-settings-redirect-message": "Questa impostazione è stata spostata dalla console a Impostazioni del menu principale → Preferenze. Questa pagina verrà rimossa nelle prossime versioni.", + "go-to-preferences-menu": "Vai al menu Preferenze", + "document-download-filename-format": "Formato del nome file per il download del documento", + "preview": "Anteprima: ", + "download-filename-format-help": "Scegli come vengono nominati i PDF scaricati. La tua selezione viene salvata nel tuo profilo e utilizzata in tutta l'app.", + "delete-action-prohibited": "Questa azione non è consentita. Si prega di contattare l'amministratore per richiedere l'eliminazione dell'account.", + "not-verified": "Non verificato", + "verified": "Verificato", + "expires": "Scade", + "fix-resend-error": "Non è possibile correggere e reinviare questo documento perché contiene widget precompilati.", + "duplicate-template-error": "Non è possibile duplicare questo modello perché contiene widget precompilati.", + "save-as-template-error": "Questo documento non può essere salvato come modello perché contiene widget precompilati.", + "redirecting-you-in": "Reindirizzamento tra {{redirectTimeLeft}} sec...", + "pdf-tools-tour": "Fare clic su questi pulsanti per aggiungere, eliminare, riorganizzare, ruotare e ingrandire/ridurre le pagine.", + "widgets": "Widget", + "prefill-tour": "Usa questa opzione per inserire le informazioni in anticipo prima di inviare il documento ai destinatari.", + "empty-prefill-error": "I seguenti campi obbligatori non possono essere lasciati vuoti:", + "please-fill-out": "Si prega di compilarli per continuare.", + "custom-signing-certificate": "Certificato di firma personalizzato", + "signing-certificate-help": "Puoi caricare il tuo certificato di firma dei documenti, che verrà utilizzato per firmare tutti i tuoi documenti e i certificati di completamento. Il file del certificato deve essere un certificato P12 in formato PFX.", + "certificate-file-p12-in-PFX-format": "File di certificato (certificato p12 in formato PFX)", + "password-of-pfx-file": "Inserisci la password del file pfx", + "update": "Aggiorna", + "use-default-certificate": "Usa il certificato predefinito di {{appName}}", + "upgrade-to-team-plan": "Aggiorna al piano Team", + "setup-file-storage": "Configura archiviazione file", + "save-and-activate": "Salva e attiva", + "logging-out-to-apply-settings": "Stai effettuando il logout per applicare le nuove impostazioni", + "reconnect-to-default": "Riconnetti a {{appName}}", + "active-file-adapter": "File Adapter attivo", + "file-adapter-unique-name": "Nome univoco del File Adapter", + "unique-name-for-file-adapter": "Inserisci un nome univoco per il File Adapter", + "storage-provider": "Provider di archiviazione", + "enter-bucket-name": "Inserisci il nome del bucket", + "enter-space-name": "Inserisci il nome dello space", + "enter-region-of-bucket": "Inserisci la regione del bucket", + "enter-region-of-space": "Inserisci la regione dello space", + "enter-access-key": "Inserisci l'access key", + "enter-secret-access-key": "Inserisci la secret access key", + "otp-email": "Abbiamo inviato un codice di verifica", + "save-as-temp-warn": "Nota: Questo documento include widget precompilati, che verranno automaticamente rimossi poiché sono già incorporati nel documento di base.", + "edit-document": "Modifica documento", + "otp-email": "Abbiamo inviato un codice di verifica" } diff --git a/apps/OpenSign/public/logo192.png b/apps/OpenSign/public/logo192.png deleted file mode 100644 index ed55ce328a..0000000000 Binary files a/apps/OpenSign/public/logo192.png and /dev/null differ diff --git a/apps/OpenSign/public/logo512.png b/apps/OpenSign/public/logo512.png deleted file mode 100644 index bdfc693251..0000000000 Binary files a/apps/OpenSign/public/logo512.png and /dev/null differ diff --git a/apps/OpenSign/public/sample_contacts.csv b/apps/OpenSign/public/sample_contacts.csv index a4ffda392f..e22fc6c504 100644 --- a/apps/OpenSign/public/sample_contacts.csv +++ b/apps/OpenSign/public/sample_contacts.csv @@ -1,4 +1,4 @@ -Name,Email,Phone -John Doe,john@example.com,1234567890 -Jane Smith,jane@example.com,9876543210 -Foo Bar,foo@example.com,5555555555 +Name,Email,Phone,Company,JobTitle +John Doe,john@example.com,1234567890,abc firm,dev +Jane Smith,jane@example.com,9876543210,xyz firm,manager +Foo Bar,foo@example.com,5555555555,xyz firm,director diff --git a/apps/OpenSign/public/static/js/assets/images/logo-dark.png b/apps/OpenSign/public/static/js/assets/images/logo-dark.png index 33a512e4c2..7f64bc8aac 100644 Binary files a/apps/OpenSign/public/static/js/assets/images/logo-dark.png and b/apps/OpenSign/public/static/js/assets/images/logo-dark.png differ diff --git a/apps/OpenSign/public/static/js/assets/images/logo.2a7bff0c1189183fafe71d7d5b94e0cd.png b/apps/OpenSign/public/static/js/assets/images/logo.2a7bff0c1189183fafe71d7d5b94e0cd.png deleted file mode 100644 index 8db5381242..0000000000 Binary files a/apps/OpenSign/public/static/js/assets/images/logo.2a7bff0c1189183fafe71d7d5b94e0cd.png and /dev/null differ diff --git a/apps/OpenSign/public/version.txt b/apps/OpenSign/public/version.txt index c8f01ff709..1d61b97ac7 100644 Binary files a/apps/OpenSign/public/version.txt and b/apps/OpenSign/public/version.txt differ diff --git a/apps/OpenSign/src/App.jsx b/apps/OpenSign/src/App.jsx index 342964fde2..435fc2a323 100644 --- a/apps/OpenSign/src/App.jsx +++ b/apps/OpenSign/src/App.jsx @@ -1,4 +1,5 @@ -import { useState, useEffect, lazy } from "react"; +import { useState, useEffect } from "react"; +import { lazyWithRetry, hideUpgradeProgress } from "./utils"; import { Routes, Route, BrowserRouter } from "react-router"; import { pdfjs } from "react-pdf"; import Form from "./pages/Form"; @@ -13,24 +14,28 @@ import SignYourSelf from "./pages/SignyourselfPdf"; import DraftDocument from "./components/pdf/DraftDocument"; import PlaceHolderSign from "./pages/PlaceHolderSign"; import PdfRequestFiles from "./pages/PdfRequestFiles"; -import LazyPage from "./primitives/LazyPage"; +import Lazy from "./primitives/LazyPage"; import Loader from "./primitives/Loader"; import UserList from "./pages/UserList"; import { serverUrl_fn } from "./constant/appinfo"; import DocSuccessPage from "./pages/DocSuccessPage"; import ValidateSession from "./primitives/ValidateSession"; -const DebugPdf = lazy(() => import("./pages/DebugPdf")); -const ForgetPassword = lazy(() => import("./pages/ForgetPassword")); -const GuestLogin = lazy(() => import("./pages/GuestLogin")); -const ChangePassword = lazy(() => import("./pages/ChangePassword")); -const UserProfile = lazy(() => import("./pages/UserProfile")); -const Opensigndrive = lazy(() => import("./pages/Opensigndrive")); -const ManageSign = lazy(() => import("./pages/Managesign")); -const AddAdmin = lazy(() => import("./pages/AddAdmin")); -const UpdateExistUserAdmin = lazy(() => import("./pages/UpdateExistUserAdmin")); -const Preferences = lazy(() => import("./pages/Preferences")); -const Login = lazy(() => import("./pages/Login")); -const VerifyDocument = lazy(() => import("./pages/VerifyDocument")); +import DragProvider from "./components/DragProivder"; +import Title from "./components/Title"; +const DebugPdf = lazyWithRetry(() => import("./pages/DebugPdf")); +const ForgetPassword = lazyWithRetry(() => import("./pages/ForgetPassword")); +const GuestLogin = lazyWithRetry(() => import("./pages/GuestLogin")); +const ChangePassword = lazyWithRetry(() => import("./pages/ChangePassword")); +const UserProfile = lazyWithRetry(() => import("./pages/UserProfile")); +const Opensigndrive = lazyWithRetry(() => import("./pages/Opensigndrive")); +const ManageSign = lazyWithRetry(() => import("./pages/Managesign")); +const AddAdmin = lazyWithRetry(() => import("./pages/AddAdmin")); +const UpdateExistUserAdmin = lazyWithRetry( + () => import("./pages/UpdateExistUserAdmin") +); +const Preferences = lazyWithRetry(() => import("./pages/Preferences")); +const Login = lazyWithRetry(() => import("./pages/Login")); +const VerifyDocument = lazyWithRetry(() => import("./pages/VerifyDocument")); pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/legacy/build/pdf.worker.min.mjs`; const AppLoader = () => { return ( @@ -42,73 +47,46 @@ const AppLoader = () => { function App() { const [isloading, setIsLoading] = useState(true); useEffect(() => { - handleCredentials(); + // initialize creds + const id = process.env.REACT_APP_APPID ?? "opensign"; + localStorage.setItem("parseAppId", id); + localStorage.setItem("baseUrl", `${serverUrl_fn()}/`); + hideUpgradeProgress(); + localStorage.removeItem("showUpgradeProgress"); + setIsLoading(false); }, []); - const handleCredentials = () => { - const appId = process.env.REACT_APP_APPID - ? process.env.REACT_APP_APPID - : "opensign"; - const baseurl = serverUrl_fn(); - try { - localStorage.setItem("baseUrl", `${baseurl}/`); - localStorage.setItem("parseAppId", appId); - setIsLoading(false); - } catch (error) { - console.log("err ", error); - } - }; - return (
{isloading ? ( ) : ( + <Routes> <Route element={<ValidateRoute />}> - <Route exact path="/" element={<LazyPage Page={Login} />} /> - <Route - path="/addadmin" - element={<LazyPage Page={AddAdmin} />} - /> + <Route exact path="/" element={<Lazy Page={Login} />} /> + <Route path="/addadmin" element={<Lazy Page={AddAdmin} />} /> <Route path="/upgrade-2.1" - element={<LazyPage Page={UpdateExistUserAdmin} />} + element={<Lazy Page={UpdateExistUserAdmin} />} /> </Route> <Route element={<Validate />}> - <Route - path="/load/template/:templateId" - element={<TemplatePlaceholder />} - /> - <Route - exact - path="/load/placeholdersign/:docId" - element={<PlaceHolderSign />} - /> <Route exact path="/load/recipientSignPdf/:docId/:contactBookId" - element={<PdfRequestFiles />} + element={<DragProvider Page={PdfRequestFiles} />} /> </Route> - <Route - path="/loadmf/signmicroapp/login/:id/:userMail/:contactBookId/:serverUrl" - element={<LazyPage Page={GuestLogin} />} - /> - <Route - path="/login/:id/:userMail/:contactBookId/:serverUrl" - element={<LazyPage Page={GuestLogin} />} - /> <Route path="/login/:base64url" - element={<LazyPage Page={GuestLogin} />} + element={<Lazy Page={GuestLogin} />} /> - <Route path="/debugpdf" element={<LazyPage Page={DebugPdf} />} /> + <Route path="/debugpdf" element={<Lazy Page={DebugPdf} />} /> <Route path="/forgetpassword" - element={<LazyPage Page={ForgetPassword} />} + element={<Lazy Page={ForgetPassword} />} /> <Route element={ @@ -117,62 +95,52 @@ function App() { </ValidateSession> } > - <Route - path="/changepassword" - element={<LazyPage Page={ChangePassword} />} - /> + <Route path="/users" element={<UserList />} /> + <Route + path="/changepassword" + element={<Lazy Page={ChangePassword} />} + /> <Route path="/form/:id" element={<Form />} /> <Route path="/report/:id" element={<Report />} /> <Route path="/dashboard/:id" element={<Dashboard />} /> + <Route path="/profile" element={<Lazy Page={UserProfile} />} /> + <Route path="/drive" element={<Lazy Page={Opensigndrive} />} /> + <Route path="/managesign" element={<Lazy Page={ManageSign} />} /> <Route - path="/profile" - element={<LazyPage Page={UserProfile} />} - /> - <Route - path="/drive" - element={<LazyPage Page={Opensigndrive} />} + path="/template/:templateId" + element={<DragProvider Page={TemplatePlaceholder} />} /> + {/* signyouself route with no rowlevel data using docId from url */} <Route - path="/managesign" - element={<LazyPage Page={ManageSign} />} + path="/signaturePdf/:docId" + element={<DragProvider Page={SignYourSelf} />} /> + {/* draft document route to handle and navigate route page according to document status */} <Route - path="/template/:templateId" - element={<TemplatePlaceholder />} + path="/draftDocument" + element={<DragProvider Page={DraftDocument} />} /> - {/* signyouself route with no rowlevel data using docId from url */} - <Route path="/signaturePdf/:docId" element={<SignYourSelf />} /> - {/* draft document route to handle and navigate route page according to document status */} - <Route path="/draftDocument" element={<DraftDocument />} /> {/* recipient placeholder set route with no rowlevel data using docId from url*/} <Route path="/placeHolderSign/:docId" - element={<PlaceHolderSign />} - /> - {/* for user signature (need your sign route) with row level data */} - <Route path="/pdfRequestFiles" element={<PdfRequestFiles />} /> - {/* for user signature (need your sign route) with no row level data */} - <Route - path="/pdfRequestFiles/:docId" - element={<PdfRequestFiles />} + element={<DragProvider Page={PlaceHolderSign} />} /> {/* recipient signature route with no rowlevel data using docId from url */} <Route path="/recipientSignPdf/:docId/:contactBookId" - element={<PdfRequestFiles />} + element={<DragProvider Page={PdfRequestFiles} />} /> <Route path="/recipientSignPdf/:docId" - element={<PdfRequestFiles />} + element={<DragProvider Page={PdfRequestFiles} />} /> - <Route path="/users" element={<UserList />} /> <Route path="/verify-document" - element={<LazyPage Page={VerifyDocument} />} + element={<Lazy Page={VerifyDocument} />} /> <Route path="/preferences" - element={<LazyPage Page={Preferences} />} + element={<Lazy Page={Preferences} />} /> </Route> <Route path="/success" element={<DocSuccessPage />} /> diff --git a/apps/OpenSign/src/assets/images/dp.png b/apps/OpenSign/src/assets/images/dp.png index 203691f941..b8c788a26e 100644 Binary files a/apps/OpenSign/src/assets/images/dp.png and b/apps/OpenSign/src/assets/images/dp.png differ diff --git a/apps/OpenSign/src/assets/images/folder.png b/apps/OpenSign/src/assets/images/folder.png index 1520d8092f..29865a258f 100644 Binary files a/apps/OpenSign/src/assets/images/folder.png and b/apps/OpenSign/src/assets/images/folder.png differ diff --git a/apps/OpenSign/src/assets/images/login_img.svg b/apps/OpenSign/src/assets/images/login_img.svg index a5b486ed90..4061942564 100644 --- a/apps/OpenSign/src/assets/images/login_img.svg +++ b/apps/OpenSign/src/assets/images/login_img.svg @@ -1,184 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="691.365" height="586.346" viewBox="0 0 691.365 586.346"> - <defs> - <linearGradient id="linear-gradient" x1="0.5" y1="1" x2="0.5" y2="-0.001" gradientUnits="objectBoundingBox"> - <stop offset="0" stop-color="gray" stop-opacity="0.251"/> - <stop offset="0.54" stop-color="gray" stop-opacity="0.122"/> - <stop offset="1" stop-color="gray" stop-opacity="0.102"/> - </linearGradient> - </defs> - <g id="Group_644" data-name="Group 644" transform="translate(-588.635 -80)"> - <g id="Group_642" data-name="Group 642" transform="translate(22538.635 6999)"> - <path id="Path_472" data-name="Path 472" d="M482.764,637.675c51.612-29.22,67.336-29.693,124.954-17.169,81.646,17.758,88.43-49.93,108.306-186.933,33.946-233.98-108.306-295.737-108.306-295.737s-94.6-8.1-150.536-38.963C377.726,55.027,286.9,49.443,207.046,86.542c-51.069,23.7-93.125,56.714-100.31,102.034-20.09,126.746,12.9,196.58-48.819,237.954S48.944,581.5,96.263,577.564c34.968-2.906,80.842,52.415,130.687,60.111,17.382,2.684,88.7-13.043,99.578,0C341.327,655.4,464.763,647.87,482.764,637.675Z" transform="translate(-21979.895 -6980.982)" fill="#00ddf1" opacity="0.1"/> - <g id="Group_641" data-name="Group 641" transform="translate(-21545.08 -6816.88)"> - <rect id="Rectangle_263" data-name="Rectangle 263" width="217.867" height="15.073" transform="translate(0 39.052)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_264" data-name="Rectangle 264" width="217.867" height="15.073" transform="translate(0 104.137)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_265" data-name="Rectangle 265" width="217.867" height="15.073" transform="translate(0 171.964)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_266" data-name="Rectangle 266" width="13.702" height="39.052" transform="translate(19.183)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_267" data-name="Rectangle 267" width="13.702" height="2.74" transform="translate(19.183 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_268" data-name="Rectangle 268" width="13.702" height="2.74" transform="translate(19.183 27.405)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_269" data-name="Rectangle 269" width="13.702" height="39.052" transform="translate(39.737)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_270" data-name="Rectangle 270" width="13.702" height="2.74" transform="translate(39.737 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_271" data-name="Rectangle 271" width="13.702" height="2.74" transform="translate(39.737 27.405)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_272" data-name="Rectangle 272" width="13.702" height="39.052" transform="translate(60.29)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_273" data-name="Rectangle 273" width="13.702" height="2.74" transform="translate(60.29 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_274" data-name="Rectangle 274" width="13.702" height="2.74" transform="translate(60.29 27.405)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_275" data-name="Rectangle 275" width="13.702" height="39.052" transform="translate(80.844)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_276" data-name="Rectangle 276" width="13.702" height="2.74" transform="translate(80.844 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_277" data-name="Rectangle 277" width="13.702" height="2.74" transform="translate(80.844 27.405)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_278" data-name="Rectangle 278" width="13.702" height="39.052" transform="translate(101.397)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_279" data-name="Rectangle 279" width="13.702" height="2.74" transform="translate(101.397 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_280" data-name="Rectangle 280" width="13.702" height="2.74" transform="translate(101.397 27.405)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_281" data-name="Rectangle 281" width="13.702" height="39.052" transform="translate(121.95)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_282" data-name="Rectangle 282" width="13.702" height="2.74" transform="translate(121.95 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_283" data-name="Rectangle 283" width="13.702" height="2.74" transform="translate(121.95 27.405)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_284" data-name="Rectangle 284" width="13.702" height="39.052" transform="translate(142.504)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_285" data-name="Rectangle 285" width="13.702" height="2.74" transform="translate(142.504 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_286" data-name="Rectangle 286" width="13.702" height="2.74" transform="translate(142.504 27.405)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_287" data-name="Rectangle 287" width="13.702" height="39.052" transform="matrix(0.894, -0.448, 0.448, 0.894, 135.847, 138.025)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_288" data-name="Rectangle 288" width="13.702" height="2.74" transform="matrix(0.894, -0.448, 0.448, 0.894, 138.614, 143.541)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_289" data-name="Rectangle 289" width="13.702" height="2.74" transform="matrix(0.894, -0.448, 0.448, 0.894, 148.128, 162.529)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_290" data-name="Rectangle 290" width="13.702" height="39.052" transform="translate(19.183 65.771)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_291" data-name="Rectangle 291" width="13.702" height="2.74" transform="translate(19.183 71.937)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_292" data-name="Rectangle 292" width="13.702" height="2.74" transform="translate(19.183 93.176)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_293" data-name="Rectangle 293" width="13.702" height="39.052" transform="translate(39.737 65.771)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_294" data-name="Rectangle 294" width="13.702" height="2.74" transform="translate(39.737 71.937)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_295" data-name="Rectangle 295" width="13.702" height="2.74" transform="translate(39.737 93.176)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_296" data-name="Rectangle 296" width="13.702" height="39.052" transform="translate(60.29 65.771)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_297" data-name="Rectangle 297" width="13.702" height="2.74" transform="translate(60.29 71.937)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_298" data-name="Rectangle 298" width="13.702" height="2.74" transform="translate(60.29 93.176)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_299" data-name="Rectangle 299" width="13.702" height="39.052" transform="translate(145.93 65.771)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_300" data-name="Rectangle 300" width="13.702" height="2.74" transform="translate(145.93 71.937)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_301" data-name="Rectangle 301" width="13.702" height="2.74" transform="translate(145.93 93.176)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_302" data-name="Rectangle 302" width="13.702" height="39.052" transform="translate(166.483 65.771)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_303" data-name="Rectangle 303" width="13.702" height="2.74" transform="translate(166.483 71.937)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_304" data-name="Rectangle 304" width="13.702" height="2.74" transform="translate(166.483 93.176)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_305" data-name="Rectangle 305" width="13.702" height="39.052" transform="translate(187.036 65.771)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_306" data-name="Rectangle 306" width="13.702" height="2.74" transform="translate(187.036 71.937)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_307" data-name="Rectangle 307" width="13.702" height="2.74" transform="translate(187.036 93.176)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_308" data-name="Rectangle 308" width="13.702" height="39.052" transform="translate(19.183 132.912)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_309" data-name="Rectangle 309" width="13.702" height="2.74" transform="translate(19.183 139.078)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_310" data-name="Rectangle 310" width="13.702" height="2.74" transform="translate(19.183 160.317)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_311" data-name="Rectangle 311" width="13.702" height="39.052" transform="translate(39.737 132.912)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_312" data-name="Rectangle 312" width="13.702" height="2.74" transform="translate(39.737 139.078)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_313" data-name="Rectangle 313" width="13.702" height="2.74" transform="translate(39.737 160.317)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_314" data-name="Rectangle 314" width="13.702" height="39.052" transform="translate(60.29 132.912)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_315" data-name="Rectangle 315" width="13.702" height="2.74" transform="translate(60.29 139.078)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_316" data-name="Rectangle 316" width="13.702" height="2.74" transform="translate(60.29 160.317)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_317" data-name="Rectangle 317" width="13.702" height="39.052" transform="translate(80.844 132.912)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_318" data-name="Rectangle 318" width="13.702" height="2.74" transform="translate(80.844 139.078)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_319" data-name="Rectangle 319" width="13.702" height="2.74" transform="translate(80.844 160.317)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_320" data-name="Rectangle 320" width="13.702" height="39.052" transform="translate(101.397 132.912)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_321" data-name="Rectangle 321" width="13.702" height="2.74" transform="translate(101.397 139.078)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_322" data-name="Rectangle 322" width="13.702" height="2.74" transform="translate(101.397 160.317)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_323" data-name="Rectangle 323" width="13.702" height="39.052" transform="translate(121.95 132.912)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_324" data-name="Rectangle 324" width="13.702" height="2.74" transform="translate(121.95 139.078)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_325" data-name="Rectangle 325" width="13.702" height="2.74" transform="translate(121.95 160.317)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_473" data-name="Path 473" d="M797.862,159.09v35.571h-13.7V156.48Q791.039,157.693,797.862,159.09Z" transform="translate(-621.103 -155.61)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_326" data-name="Rectangle 326" width="13.702" height="2.74" transform="translate(163.057 6.166)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_327" data-name="Rectangle 327" width="13.702" height="2.74" transform="translate(163.057 27.405)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_474" data-name="Path 474" d="M827.862,165.719v30.83h-13.7V162.43c1.781.391,3.556.8,5.33,1.22Q823.7,164.636,827.862,165.719Z" transform="translate(-630.549 -157.483)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_475" data-name="Path 475" d="M827.862,166.285v.685h-13.7v-2.74h5.33Q823.7,165.2,827.862,166.285Z" transform="translate(-630.549 -158.05)" fill="#00ddf1" opacity="0.1"/> - <rect id="Rectangle_328" data-name="Rectangle 328" width="13.702" height="2.74" transform="translate(183.611 27.405)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_476" data-name="Path 476" d="M691.358,287.276s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.4,9.4,0,0,0,9.146,5.179c4.35-.233,5.8-3.549,6.166-6.639a6.851,6.851,0,0,0-9.057-7.3Z" transform="translate(-589.693 -196.649)" fill="#00ddf1"/> - <path id="Path_477" data-name="Path 477" d="M686.2,296.239a6.68,6.68,0,0,1-.089-6.426c2-3.659,6.166-2.254,6.166-2.254l.212-.075a6.762,6.762,0,0,1,4.885.11,6.762,6.762,0,0,0-5.762-.548l-.212.075s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.982,9.982,0,0,0,4.7,4.446A10.277,10.277,0,0,1,686.2,296.239Z" transform="translate(-589.706 -196.595)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_478" data-name="Path 478" d="M691.42,290.06s1.542,1.213,5.282,0" transform="translate(-591.9 -197.672)" fill="#00ddf1" opacity="0.2"/> - <path id="Path_479" data-name="Path 479" d="M690.93,277.21s2.638,7.153,2.418,9.023l2.09-.219s-3.521-6.269-2.638-8.8Z" transform="translate(-591.746 -193.626)" fill="#00ddf1"/> - <path id="Path_480" data-name="Path 480" d="M690.93,277.21s2.638,7.153,2.418,9.023l2.09-.219s-3.521-6.269-2.638-8.8Z" transform="translate(-591.746 -193.626)" fill="#00ddf1" opacity="0.2"/> - <path id="Path_481" data-name="Path 481" d="M702.92,277.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S701.536,284.391,702.92,277.6Z" transform="translate(-592.952 -193.414)" fill="#00ddf1"/> - <path id="Path_482" data-name="Path 482" d="M702.92,277.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S701.536,284.391,702.92,277.6Z" transform="translate(-592.952 -193.414)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_483" data-name="Path 483" d="M694.75,283.958s1.089-5.207,8.16-5.878" transform="translate(-592.949 -193.9)" fill="#00ddf1"/> - <path id="Path_484" data-name="Path 484" d="M819.358,386.276s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.4,9.4,0,0,0,9.146,5.18c4.35-.233,5.8-3.549,6.166-6.639a6.851,6.851,0,0,0-9.057-7.3Z" transform="translate(-629.999 -227.823)" fill="#00ddf1"/> - <path id="Path_485" data-name="Path 485" d="M814.2,395.239a6.68,6.68,0,0,1-.089-6.426c2-3.659,6.166-2.254,6.166-2.254l.212-.075a6.762,6.762,0,0,1,4.885.11,6.762,6.762,0,0,0-5.762-.548l-.212.075s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.982,9.982,0,0,0,4.7,4.446A10.276,10.276,0,0,1,814.2,395.239Z" transform="translate(-630.011 -227.769)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_486" data-name="Path 486" d="M819.42,389.06s1.542,1.213,5.282,0" transform="translate(-632.206 -228.846)" fill="#00ddf1" opacity="0.2"/> - <path id="Path_487" data-name="Path 487" d="M818.93,376.21s2.638,7.153,2.419,9.023l2.09-.219s-3.522-6.269-2.638-8.8Z" transform="translate(-632.051 -224.799)" fill="#00ddf1"/> - <path id="Path_488" data-name="Path 488" d="M818.93,376.21s2.638,7.153,2.419,9.023l2.09-.219s-3.522-6.269-2.638-8.8Z" transform="translate(-632.051 -224.799)" fill="#00ddf1" opacity="0.2"/> - <path id="Path_489" data-name="Path 489" d="M830.92,376.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S829.536,383.391,830.92,376.6Z" transform="translate(-633.257 -224.588)" fill="#00ddf1"/> - <path id="Path_490" data-name="Path 490" d="M830.92,376.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S829.536,383.391,830.92,376.6Z" transform="translate(-633.257 -224.588)" fill="#00ddf1" opacity="0.1"/> - <path id="Path_491" data-name="Path 491" d="M822.75,382.958s1.089-5.207,8.16-5.878" transform="translate(-633.254 -225.073)" fill="#00ddf1"/> - </g> - </g> - <g id="Group_643" data-name="Group 643" transform="translate(7 -63)"> - <g id="Group_639" data-name="Group 639" transform="translate(21233 8372)"> - <ellipse id="Ellipse_73" data-name="Ellipse 73" cx="49.851" cy="8.007" rx="49.851" ry="8.007" transform="translate(-20118.443 -7772.555)" fill="#00abf6" opacity="0.1"/> - <rect id="Rectangle_182" data-name="Rectangle 182" width="3.208" height="72.224" transform="translate(-20070.199 -7917.934)" fill="#535461"/> - <path id="Path_268" data-name="Path 268" d="M1025.906,587.251l-.2,3.254-.287,4.6-.118,1.913-.281,4.6-.123,1.913-.286,4.6-3.233,52.22a8.851,8.851,0,0,1-8.83,8.268H995.731a8.841,8.841,0,0,1-8.82-8.3l-3.244-52.225-.281-4.6-.117-1.913-.292-4.6-.117-1.913-.281-4.6-.2-3.254a4.6,4.6,0,0,1,4.574-4.865h34.391a4.6,4.6,0,0,1,4.569,4.9Z" transform="translate(-21072.734 -8433.181)" fill="#565661"/> - <path id="Path_269" data-name="Path 269" d="M990.949,517.36l-.287,4.589H948.106l-.286-4.589Z" transform="translate(-21037.977 -8360.036)" fill="#9d9cb5"/> - <path id="Path_270" data-name="Path 270" d="M990.93,530.08l-.281,4.594H948.9l-.286-4.594Z" transform="translate(-21038.363 -8366.248)" fill="#9d9cb5"/> - <path id="Path_271" data-name="Path 271" d="M990.912,542.8l-.287,4.589H949.686L949.4,542.8Z" transform="translate(-21038.748 -8372.46)" fill="#9d9cb5"/> - <path id="Path_272" data-name="Path 272" d="M933.875,490.464c18.684,13.517,26.466,34.656,26.466,34.656s-22.511-.773-41.2-14.289-26.46-34.651-26.46-34.651S915.2,476.953,933.875,490.464Z" transform="translate(-21028.934 -8381.328)" fill="#00abf6"/> - <path id="Path_273" data-name="Path 273" d="M892.68,476.18s23.365,12.969,30.865,23.708,36.8,25.233,36.8,25.233" transform="translate(-21028.934 -8381.328)" fill="none" stroke="#535461" stroke-miterlimit="10" stroke-width="2"/> - <path id="Path_274" data-name="Path 274" d="M975.393,443.457c10.171,7.352,14.407,18.863,14.407,18.863s-12.279-.425-22.424-7.776S953,435.68,953,435.68,965.227,436.1,975.393,443.457Z" transform="translate(-21058.393 -8361.549)" fill="#00abf6"/> - <path id="Path_275" data-name="Path 275" d="M953,435.68s12.719,7.06,16.8,12.9,20.03,13.737,20.03,13.737" transform="translate(-21058.393 -8361.549)" fill="none" stroke="#535461" stroke-miterlimit="10" stroke-width="2"/> - <path id="Path_276" data-name="Path 276" d="M1040.3,470.483c-11.68,12.836-14.151,29.612-14.151,29.612s16.469-4.042,28.139-16.883,14.151-29.612,14.151-29.612S1051.981,457.647,1040.3,470.483Z" transform="translate(-21094.119 -8370.301)" fill="#00abf6"/> - <path id="Path_277" data-name="Path 277" d="M1068.45,453.61s-15.215,13.159-19.083,22.224S1026.15,500.1,1026.15,500.1" transform="translate(-21094.119 -8370.306)" fill="none" stroke="#535461" stroke-miterlimit="10" stroke-width="2"/> - </g> - <g id="Group_638" data-name="Group 638" transform="translate(-40 36)"> - <rect id="Rectangle_254" data-name="Rectangle 254" width="12.343" height="37.459" transform="translate(741.459 392.675)" fill="#3f3d56"/> - <rect id="Rectangle_255" data-name="Rectangle 255" width="12.343" height="39.629" transform="translate(1073.647 390.726)" fill="#3f3d56"/> - <path id="Path_418" data-name="Path 418" d="M597.889,523.665v8.446l-98.7.909-1.052.02-37.511.344-.9.013-11.4.1h-.338l-69.5.643L264.408,535.2h-.1l-29.007.273-.312.007L106.1,536.658v-9.745l30.306-18.19,60.808-.507,1.3-.007.429-.007,1.3-.019,29.2-.24,1.306-.007.416-.007,1.3-.006,9.362-.078.247-.006,23.1-.195h.188l180.214-1.52,4.411-.032h.442l3.365-.033,24.459-.2,1.3-.02,1.2-.013h.624l7.607-.058,1.507-.02,2.02-.013,6.334-.058,10.05-.084,1.3-.013,2.261-.013h.422l48.536-.416Z" transform="translate(566.82 43)" fill="#65617d"/> - <path id="Path_419" data-name="Path 419" d="M597.889,523.665v8.446l-98.7.909-1.052.02-37.511.344-.9.013-11.4.1h-.338l-69.5.643L264.408,535.2h-.1l-29.007.273-.312.007L106.1,536.658v-9.745l30.306-18.19,60.808-.507,1.3-.007.429-.007,1.3-.019,29.2-.24,1.306-.007.416-.007,1.3-.006,9.362-.078.247-.006,23.1-.195h.188l180.214-1.52,4.411-.032h.442l3.365-.033,24.459-.2,1.3-.02,1.2-.013h.624l7.607-.058,1.507-.02,2.02-.013,6.334-.058,10.05-.084,1.3-.013,2.261-.013h.422l48.536-.416Z" transform="translate(566.82 43)" opacity="0.2"/> - <path id="Path_420" data-name="Path 420" d="M358.914,656.57v15.91a3.982,3.982,0,0,1-2.274,3.6,3.9,3.9,0,0,1-1.624.39l-22.673.481a3.9,3.9,0,0,1-1.754-.37,3.976,3.976,0,0,1-2.319-3.619V656.57Z" transform="translate(437.441 -122.381)" fill="#3f3d56"/> - <path id="Path_421" data-name="Path 421" d="M358.914,656.57v15.91a3.982,3.982,0,0,1-2.274,3.6,3.9,3.9,0,0,1-1.624.39l-22.673.481a3.9,3.9,0,0,1-1.754-.37,3.976,3.976,0,0,1-2.319-3.619V656.57Z" transform="translate(437.441 -122.381)" opacity="0.1"/> - <path id="Path_422" data-name="Path 422" d="M360.914,656.57v15.91a3.982,3.982,0,0,1-2.274,3.6,3.9,3.9,0,0,1-1.624.39l-22.673.481a3.9,3.9,0,0,1-1.754-.37,3.976,3.976,0,0,1-2.319-3.619V656.57Z" transform="translate(436.74 -122.381)" fill="#3f3d56"/> - <rect id="Rectangle_256" data-name="Rectangle 256" width="30.644" height="20.464" transform="translate(1046.362 534.189)" fill="#3f3d56"/> - <rect id="Rectangle_257" data-name="Rectangle 257" width="30.644" height="20.464" transform="translate(1046.362 534.189)" opacity="0.1"/> - <rect id="Rectangle_258" data-name="Rectangle 258" width="30.644" height="20.464" transform="translate(1045.062 534.189)" fill="#3f3d56"/> - <path id="Path_423" data-name="Path 423" d="M223.943,265.82v3.723l-12.343-.318v-3.4Z" transform="translate(529.859 126.848)" opacity="0.1"/> - <path id="Path_424" data-name="Path 424" d="M358.741,271.246,343.909,377.789a2.794,2.794,0,0,1-2.839,2.41L222.314,377.12l-2.254-.058a2.794,2.794,0,0,1-2.7-3.164l16.651-111.533a2.794,2.794,0,0,1,2.949-2.358l119.186,8.069a2.787,2.787,0,0,1,2.6,3.17Z" transform="translate(476.307 16.556)" fill="#65617d"/> - <path id="Path_425" data-name="Path 425" d="M169.158,99.16,156.6,197.472l109.142,3.463,13.422-94.85Z" transform="translate(549.128 185.237)" fill="#00ddf1"/> - <rect id="Rectangle_259" data-name="Rectangle 259" width="132.965" height="112.605" rx="5.33" transform="translate(853.849 282.877)" fill="#65617d"/> - <rect id="Rectangle_260" data-name="Rectangle 260" width="120.836" height="93.765" transform="translate(860.125 290.458)" fill="#00ddf1"/> - <path id="Path_426" data-name="Path 426" d="M735.273,262.82v2.462l-12.343.253V262.82Z" transform="translate(350.717 127.899)" opacity="0.1"/> - <path id="Path_427" data-name="Path 427" d="M833.626,371a2,2,0,0,1-1.949,2.131l-121.615,2.514a2,2,0,0,1-2.033-1.813L697.575,265.156a2,2,0,0,1,1.9-2.189l120.693-6,1.3-.065a1.994,1.994,0,0,1,2.092,1.819Z" transform="translate(308.06 17.643)" fill="#65617d"/> - <path id="Path_428" data-name="Path 428" d="M628.93,100.238,739.157,94.82l9.31,98.748-109.356,2.6Z" transform="translate(383.65 186.757)" fill="#00ddf1"/> - <path id="Path_429" data-name="Path 429" d="M899.741,371a2,2,0,0,1-1.949,2.131L886.28,256.963l1.3-.065a2,2,0,0,1,2.092,1.819Z" transform="translate(241.945 17.643)" opacity="0.1"/> - <rect id="Rectangle_261" data-name="Rectangle 261" width="12.343" height="11.096" transform="translate(741.459 419.038)" opacity="0.1"/> - <path id="Path_431" data-name="Path 431" d="M281.574,483.65v3.229l-30.644.819V483.65Z" transform="translate(516.08 50.533)" opacity="0.1"/> - <path id="Path_432" data-name="Path 432" d="M390.8,483.886V593.158a2.6,2.6,0,0,1-2.5,2.566l-124.506,3.313h-.033a2.6,2.6,0,0,1-2.566-2.566V483.886a2.6,2.6,0,0,1,2.566-2.566H388.23A2.6,2.6,0,0,1,390.8,483.886Z" transform="translate(460.942 -60.983)" fill="#65617d"/> - <path id="Path_434" data-name="Path 434" d="M194.6,319.15H309.914v96.311L194.6,418.06Z" transform="translate(535.815 108.164)" fill="#d4dfec"/> - <rect id="Rectangle_262" data-name="Rectangle 262" width="12.343" height="11.317" transform="translate(1073.647 419.038)" opacity="0.1"/> - <path id="Path_435" data-name="Path 435" d="M709.574,483.65v4.164L678.93,487V483.65Z" transform="translate(366.132 50.533)" opacity="0.1"/> - <path id="Path_436" data-name="Path 436" d="M797.782,483.886V596.471a2.6,2.6,0,0,1-2.6,2.566h0l-124.532-3.313a2.6,2.6,0,0,1-2.5-2.566V483.886a2.6,2.6,0,0,1,2.566-2.566H795.19a2.6,2.6,0,0,1,2.592,2.566Z" transform="translate(318.365 -60.983)" fill="#65617d"/> - <path id="Path_437" data-name="Path 437" d="M866.289,483.886V596.471a2.6,2.6,0,0,1-2.6,2.566h0V481.32h0a2.6,2.6,0,0,1,2.6,2.566Z" transform="translate(249.859 -60.983)" opacity="0.1"/> - <path id="Path_438" data-name="Path 438" d="M713.414,319.15H598.1v96.311l115.314,2.6Z" transform="translate(394.451 108.164)" fill="#d4dfec"/> - <path id="Path_439" data-name="Path 439" d="M593.3,483.886V593.158a2.6,2.6,0,0,1-2.5,2.566l-124.506,3.313h0a2.6,2.6,0,0,1-2.6-2.566V483.886a2.6,2.6,0,0,1,2.566-2.566H590.73A2.6,2.6,0,0,1,593.3,483.886Z" transform="translate(389.997 -60.983)" fill="#65617d"/> - <path id="Path_440" data-name="Path 440" d="M397.1,319.15H512.414v96.311L397.1,418.06Z" transform="translate(464.87 108.164)" fill="#d4dfec"/> - <path id="Path_441" data-name="Path 441" d="M597.889,533.65V542.1l-98.7.909-1.052.02-37.511.344-.9.013-11.4.1h-.338l-69.5.643-114.086,1.059h-.1l-29.007.273-.312.007L106.1,546.643V536.9l131.562-.864h.312l26.629-.182h.123l183.9-1.215h.188l.11-.006h.305l3.112-.019h.948l48.393-.325,2.858-.013.637-.007Z" transform="translate(566.82 33.015)" opacity="0.1"/> - <circle id="Ellipse_99" data-name="Ellipse 99" cx="33.347" cy="33.347" r="33.347" transform="translate(887.196 363.44)" fill="#fbbebe"/> - <path id="Path_442" data-name="Path 442" d="M383.74,592.973a.806.806,0,0,1,.065-.227c.65-2.332,1.806-6.276,2.67-9.427.11-.39.214-.773.312-1.137.955-3.554,2.813-11.876,3.846-17.066.364-1.826.65-3.248.708-3.963.13-1.1,2.085-5.795,4.3-11.194,1.553-3.794,3.248-7.939,4.489-11.434a39.876,39.876,0,0,0,1.9-6.4,3.313,3.313,0,0,0,0-1.384,9.543,9.543,0,0,1-.312-2.274h0c-.149-4.028,1.052-10.394,2.91-13.065,2.274-3.248,3.9-15.371,3.9-15.371s3.365.487,3.9-2.293a4,4,0,0,0,.065-.91,4.815,4.815,0,0,0-.058-.721c-.578-4.054,9.563-8.368,15.267-9.3a12.769,12.769,0,0,1,1.949-.182,17.694,17.694,0,0,0,4.06-.935q.909-.279,1.949-.65c2.391-.806,5.249-1.871,8.283-3.04,11.408-4.424,25.22-10.394,25.22-10.394.1-.461.208-.9.331-1.338a18,18,0,0,1,10.622-12.3h0v-1.3c0-2.241-.1-4.548-.195-6.847,0-.448-.039-.9-.065-1.345v-.734c0-.455-.046-.91-.071-1.358l-.117-.091a10.66,10.66,0,0,1-2.534-2.729,9.916,9.916,0,0,1-.923-1.949c-.812-2.2-1-4.658-1.546-6.984l-.117-.481a54.579,54.579,0,0,0-2.6-6.873c-1.436-3.521-2.54-7.146-3.638-10.817q-1-3.333-2.02-6.678l-1.026-3.4c-.195-.65-.39-1.3-.539-1.949h0a8.627,8.627,0,0,1-.169-.91h0a6.5,6.5,0,0,1,.156-2.995,20.854,20.854,0,0,1,.858-1.949,5.113,5.113,0,0,0,.325-.9h0a1.947,1.947,0,0,0,.052-.208,3.667,3.667,0,0,0,.071-.7,11.993,11.993,0,0,0-.338-2.527.045.045,0,0,1,0-.032,1.661,1.661,0,0,0-.032-.175,16.564,16.564,0,0,1-.234-1.949,18.483,18.483,0,0,1,2.254-10.115l.123-.234a16.383,16.383,0,0,1,1.2-1.806h0a9.122,9.122,0,0,1,.65-.793,2.594,2.594,0,0,1-3.606-.936,2.475,2.475,0,0,1-.149-.292c-.033-.078-.059-.162-.085-.247-.455-1.592.338-3.287,1.377-4.58a12.012,12.012,0,0,1,3.729-3.053h0a2.51,2.51,0,0,1,.26-.136,11.125,11.125,0,0,1,1.715-.689h0a9.781,9.781,0,0,1,1.059-.286l-2.41-.221-.974-.091A9.414,9.414,0,0,1,479,361.527h.7a7.625,7.625,0,0,1,1.02.084A2.885,2.885,0,0,1,479,358.8a9.362,9.362,0,0,0,5.97,1.988h.247a19.494,19.494,0,0,1-.221-2.124h0a21.545,21.545,0,0,1,0-2.9,5.483,5.483,0,0,0,4.4,1.468l-1.351-1.884a6.165,6.165,0,0,0,4.262,1.332l.312-.033a4.547,4.547,0,0,0,.773-.149h.058c-.123-.156-.234-.318-.344-.487l-.039-.078a6.282,6.282,0,0,1-.65-1.358,4.284,4.284,0,0,1-.156-.565h0a5.684,5.684,0,0,1,.292-3.541c2.1,1.754,4.4,4.151,7.146,2.339s2.839-5.139,7.146-4.8a6.626,6.626,0,0,1,5.464,3.976,4.385,4.385,0,0,1,4.983-1.137,4.45,4.45,0,0,1,2.521,4.476c1.786-.448,3.71-.89,5.425-.214s2.82,2.865,1.845,4.327a.931.931,0,0,1-.091.13c-.8,1.033-2.566,1.6-2.378,2.9l.273.195.845.611q4.97,3.586,9.68,7.536c1.611,1.351,3.326,2.975,3.437,5.087a5.617,5.617,0,0,1-.156,1.54h0c-.1.507-.247,1.013-.357,1.52a12.676,12.676,0,0,0-.221,3.93h0c.045.383.1.76.175,1.143.994,5.022,5.009,9.167,5.405,14.292v.364a11.546,11.546,0,0,1-.045,1.644c-.3,3.118-1.741,6.113-2.91,9.1-.072.182-.143.364-.208.546a90.5,90.5,0,0,0-4.548,18.294,65.14,65.14,0,0,1-1.3,6.555,17.365,17.365,0,0,1-3.307,6.776,10.536,10.536,0,0,1-2.183,1.949,12.132,12.132,0,0,1-1.722.916v.039c.071.4.13.793.2,1.189.039.208.071.416.11.65h0a.089.089,0,0,0,0,.039c.546,3.073,1.169,6.081,1.826,8.939l.331,1.423c8.186,2.956,9.154,9.011,9.212,11.33a6.259,6.259,0,0,1,0,.929s12.343.325,17.216,3.9a13.21,13.21,0,0,0,2.93,1.494,53.917,53.917,0,0,0,6.009,1.877c1.046.273,2.137.539,3.248.8,1.949.448,4.015.884,6.009,1.3,5.321,1.072,10.33,1.949,12.87,2.6,6.061,1.533,19.925,14.825,19.925,14.825s1.624,13.409,3.248,15.364,4.548,8.829,4.548,8.829l10.745,19.106,4.548,8.036h2.923a4.97,4.97,0,0,1,2.085,1.364c.773.689,1.631,1.546,2.384,2.326l1.247,1.332.78.864s4.723.117,6,3.852c3.846-.11,8.569.143,11.876,1.624a9.187,9.187,0,0,1,1.3.7,5.639,5.639,0,0,1,2.683,3.677,5.422,5.422,0,0,1,.117.935c0,.37,0,.741,0,1.1-.234,4.918-3.437,9.011-6.38,11.765l.208.37s-.1.234-.286.65c-.052.123-.117.26-.188.416h0c-.383.819-.994,2.046-1.793,3.482a41.136,41.136,0,0,1-6.217,8.556l-.188.195-37.511.344-.11-.13-7.276-8.679-3.619-4.314-.11-.136-.1,1.033-.351,3.443-.845,8.322-.045.416v.11l-.1.961.071-.961h-.188l-69.513.65-114.092,1.26v.546h-.091v-.546l-29.072.312Z" transform="translate(418.007 -14.269)" fill="url(#linear-gradient)"/> - <path id="Path_443" data-name="Path 443" d="M586.185,511.522s-64.641,7.8-58.469,0c2.235-2.82,2.852-11.174,2.729-20.691-.039-2.891-.143-5.886-.292-8.868-.715-14.292-2.436-28.26-2.436-28.26s56.52-26.636,50.023-5.522c-2.6,8.53-1.748,20.51.227,31.755.578,3.281,1.247,6.5,1.949,9.55a223.892,223.892,0,0,0,6.269,22.036Z" transform="translate(367.711 -46.521)" fill="#fbbebe"/> - <path id="Path_444" data-name="Path 444" d="M586.185,537.354s-64.641,7.8-58.469,0c2.235-2.82,2.852-11.174,2.729-20.692,9.855-4.21,22.394-1.072,22.394-1.072,13.2-2.631,21.666-2.118,27.078-.273A223.888,223.888,0,0,0,586.185,537.354Z" transform="translate(367.711 -72.353)" opacity="0.1"/> - <path id="Path_445" data-name="Path 445" d="M413.346,651.973v-.546l114.092-1.241,69.513-.65h.195l-.071.961.1-.961h.123v-.11l.89-8.738.338-3.307.1-1.033.091-.864,4.015-13.389,4.015-13.37,3.378-11.258,5.158-17.2s-2.923-6.821-4.548-8.77-3.248-15.267-3.248-15.267-13.864-13.208-19.925-14.728c-2.54-.65-7.555-1.514-12.883-2.6-1.994-.4-4.041-.832-6.009-1.3-1.111-.253-2.2-.52-3.248-.786a57.086,57.086,0,0,1-6.009-1.858,13.448,13.448,0,0,1-2.924-1.488c-4.775-3.5-16.742-3.9-17.2-3.9h0a.269.269,0,0,1,0-.045v-.058a6.66,6.66,0,0,0,0-.819,5.208,5.208,0,0,0-.059-.91.82.82,0,0,0-.045-.325c-.032-.234-.071-.481-.13-.741a3.226,3.226,0,0,0-.078-.344,11.181,11.181,0,0,0-.812-2.267c-.045-.1-.1-.214-.156-.318a11.861,11.861,0,0,0-1.1-1.709c-.084-.11-.175-.227-.273-.338a12.721,12.721,0,0,0-1.767-1.715c-.175-.136-.357-.279-.546-.409a3.026,3.026,0,0,0-.331-.234l-.578-.377-.539-.312c-.474-.26-.974-.513-1.52-.754-.169-.078-.351-.149-.533-.221s-.468-.182-.708-.273h-.039l-.487-.195c-.37-.123-.747-.234-1.143-.344l-.6-.156-.65-.149-.65-.136c-.65-.13-1.345-.247-2.072-.338l-.741-.091-.76-.078-.786-.065-1.117-.065-1.3-.045a81.017,81.017,0,0,0-17.054,1.814,46.946,46.946,0,0,0-11.855-1.093h-.565l-.65.039h-.416l-.838.078a6.224,6.224,0,0,0-.845.1c-.279.039-.572.071-.851.117l-.429.071c-.422.071-.851.149-1.3.24q-.214.039-.429.1c-.565.123-1.13.273-1.689.442-.279.078-.559.169-.838.266-.143.039-.279.091-.416.143l-.416.149-.409.162-.487.195c-.247.1-.487.214-.728.331-.136.058-.273.123-.4.195s-.266.13-.39.2a18.03,18.03,0,0,0-4.034,2.846l-.331.318-.325.331c-.11.11-.214.227-.318.344a15.473,15.473,0,0,0-1.182,1.462c-.1.136-.2.273-.3.416a17.335,17.335,0,0,0-1.117,1.9c-.084.156-.162.318-.24.474a21.243,21.243,0,0,0-1.3,3.411q-.182.65-.331,1.3s-13.753,6.068-25.161,10.46c-3.034,1.169-5.892,2.228-8.283,3.027-.7.234-1.345.448-1.949.65a17.347,17.347,0,0,1-4.06.935,12.778,12.778,0,0,0-1.949.182c-5.243.851-14.227,4.548-15.208,8.257a2.4,2.4,0,0,0-.065.91v.071c.65,4.548-3.9,3.9-3.9,3.9s-1.624,12.019-3.9,15.267c-1.644,2.339-2.768,7.555-2.91,11.492h0a12.741,12.741,0,0,0,.286,3.658v.091c.26.871-.364,3.248-1.423,6.3-1.15,3.346-2.826,7.5-4.437,11.427-2.43,5.925-4.716,11.3-4.859,12.486-.058.526-.227,1.468-.461,2.683-.948,4.95-3.053,14.377-4.093,18.19-.773,2.845-1.9,6.743-2.67,9.42a.91.91,0,0,1-.065.227l29.124-.286v.546h.091Z" transform="translate(417.856 -73.042)" fill="#00ddf1"/> - <path id="Path_446" data-name="Path 446" d="M445.44,607.57s37.03,19.165,50.348,16.891Z" transform="translate(396.391 -105.214)" opacity="0.1"/> - <path id="Path_447" data-name="Path 447" d="M561.44,595.57s36.056,11.694,48.074,13.318S561.44,595.57,561.44,595.57Z" transform="translate(355.751 -101.01)" opacity="0.1"/> - <path id="Path_448" data-name="Path 448" d="M585.443,530.686c-18.84,3.469-54.311,2.722-69.643,2.2,5.62-20.139,33.022-13.292,33.022-13.292C582.74,512.821,585.339,526.866,585.443,530.686Z" transform="translate(371.74 -73.754)" opacity="0.1"/> - <path id="Path_449" data-name="Path 449" d="M585.443,528.686c-18.84,3.469-54.311,2.722-69.643,2.2,5.62-20.139,33.022-13.292,33.022-13.292C582.74,510.821,585.339,524.866,585.443,528.686Z" transform="translate(371.74 -73.053)" fill="#00ddf1"/> - <path id="Path_450" data-name="Path 450" d="M776.94,672.008s22.192-3.411,22.628,6.334S788.25,694.9,788.25,694.9Z" transform="translate(280.251 -127.587)" fill="#fbbebe"/> - <path id="Path_451" data-name="Path 451" d="M578.17,479.936a30.558,30.558,0,0,1-2.923,1.13c-7,2.417-14.065,4.853-21.439,5.736s-15.111.1-21.543-3.573a18.685,18.685,0,0,1-1.949-1.267c-.715-14.292-2.436-28.26-2.436-28.26s56.52-26.636,50.023-5.522C575.318,456.711,576.195,468.69,578.17,479.936Z" transform="translate(367.508 -46.521)" opacity="0.1"/> - <path id="Path_452" data-name="Path 452" d="M536.9,360.29a6.153,6.153,0,0,1-5.405-1.137l1.351,1.878a5.5,5.5,0,0,1-4.4-1.462,22.146,22.146,0,0,0,.208,5.035,9.433,9.433,0,0,1-6.211-1.949,2.872,2.872,0,0,0,1.715,2.8,9.316,9.316,0,0,0-10.135,6.958l3.391.312a12,12,0,0,0-6.782,4.138c-1.039,1.3-1.832,2.962-1.377,4.548s2.651,2.6,3.846,1.468a18.151,18.151,0,0,0-3.963,14.806,9.4,9.4,0,0,1,.3,3.417,28.993,28.993,0,0,1-1.228,3.047c-.65,1.9-.032,3.956.546,5.847l3.047,10.018c1.1,3.619,2.2,7.244,3.645,10.745a53.328,53.328,0,0,1,2.6,6.828c.819,3.144.851,6.588,2.6,9.336a12.948,12.948,0,0,0,4.665,4.112c6.425,3.677,14.188,4.457,21.542,3.573s14.409-3.32,21.406-5.736a20.141,20.141,0,0,0,4.444-1.949c4.84-3.17,5.918-9.654,6.821-15.364a87.242,87.242,0,0,1,4.736-18.71c1.416-3.567,3.248-7.185,2.936-11.005-.4-5.074-4.411-9.186-5.405-14.175a12.344,12.344,0,0,1,.045-5.048,11.473,11.473,0,0,0,.513-3.053c-.11-2.092-1.826-3.7-3.437-5.048q-5.243-4.379-10.823-8.277c-.188-1.3,1.579-1.858,2.378-2.884,1.13-1.449-.039-3.748-1.754-4.424s-3.638-.234-5.425.214a4.281,4.281,0,0,0-7.5-3.32,6.627,6.627,0,0,0-5.47-3.95c-4.307-.338-4.392,2.956-7.146,4.768s-5.028-.578-7.146-2.319A6.029,6.029,0,0,0,536.9,360.29Z" transform="translate(374.5 -15.625)" fill="#3f3d56"/> - <path id="Path_453" data-name="Path 453" d="M768.171,669.128s-.578,1.377-1.644,3.372a44.83,44.83,0,0,1-5.847,8.556l-.175.188h-1.052l-37.511.344h-.9l-.11-.13-7.276-8.634-2.741-3.255-.11-.136-.234-.273-.13-.156-.169-.2-5.334-6.328,1.949-8.121,3.32-13.682.084-.331.65-2.6.461-1.949,1.546-6.354,5.3-21.861,9.42,4.872,9.933,17.541,5.334,9.42h2.923c.552,0,1.819,1.065,3.092,2.293.455.435.91.9,1.3,1.3,1.156,1.2,2.072,2.222,2.072,2.222s4.736.1,6.009,3.833a4.537,4.537,0,0,1,.162.552,26.191,26.191,0,0,0,1.644,4.262c.838,1.826,1.891,3.9,2.956,5.97,1.981,3.8,4,7.419,4.736,8.731l.091.162Z" transform="translate(305.476 -105.217)" fill="#00ddf1"/> - <path id="Path_454" data-name="Path 454" d="M615.681,653.093l-.065.929v.065l-.11,1.494-.864,12.025L613.6,682.093l-.3,4.08-.65,8.731v.11l-69.513.65L429.061,696.9v.546h-.091v-.728l.292-9.329.559-18.229L430.3,653.7l.045-1.54a6.841,6.841,0,0,1,7.419-6.607c3.066.26,7.049.578,11.811.916l1.949.143c27.5,1.91,78.322,4.379,129.606,1.3,1.078-.059,2.163-.123,3.248-.2,7.952-.5,15.9-1.143,23.764-1.949a6.841,6.841,0,0,1,7.536,7.3Z" transform="translate(402.161 -118.514)" opacity="0.1"/> - <path id="Path_455" data-name="Path 455" d="M429.08,698.857v-.546l114.092-1.241,69.513-.65h.195v-.11l.65-8.731.279-3.9,1.065-14.689.838-11.629v-.286a6.893,6.893,0,0,0-.071-1.6.2.2,0,0,0,0-.065,6.751,6.751,0,0,0-1.3-3.014,6.847,6.847,0,0,0-6.12-2.6c-7.867.806-15.813,1.449-23.764,1.949-1.085.078-2.17.143-3.248.2-51.284,3.047-102.106.578-129.606-1.3l-1.949-.143c-4.762-.338-8.744-.65-11.811-.916a6.847,6.847,0,0,0-7.3,5.542,7.146,7.146,0,0,0-.117,1.065l-.442,14.4-.6,18.236-.286,9.329v.728Z" transform="translate(402.122 -119.926)" fill="#3f3d56"/> - <path id="Path_456" data-name="Path 456" d="M615.925,661.692l-.8,9.959L613.937,686.5l-.3,3.716-.65,8.322-.039.416v.11h0l-.1.961.071-.961h-.188l-69.513.65L429.11,700.944v-.182l.318-9.329.65-18.229.416-12.116a4.132,4.132,0,0,1,1.988-3.411,4.061,4.061,0,0,1,2.456-.585c1.364.11,3.04.24,5,.383,3.177.234,7.094.507,11.655.793,8.445.533,19.041,1.1,31.183,1.572,33.782,1.3,79.388,1.735,122.707-2.059,1.949-.169,3.963-.357,5.931-.546a4.066,4.066,0,0,1,2.261.429,3.346,3.346,0,0,1,.559.351,3.989,3.989,0,0,1,1.3,1.6,2.315,2.315,0,0,1,.162.4A4.08,4.08,0,0,1,615.925,661.692Z" transform="translate(402.112 -122.559)" opacity="0.1"/> - <path id="Path_457" data-name="Path 457" d="M360.914,677.87v2.072a3.982,3.982,0,0,1-2.274,3.6l-26.051.5a3.976,3.976,0,0,1-2.319-3.619v-1.949Z" transform="translate(436.74 -129.843)" opacity="0.1"/> - <path id="Path_458" data-name="Path 458" d="M280.294,512.532l-33.944.65V507.55l33.944-.65Z" transform="translate(517.685 42.387)" fill="#3f3d56"/> - <path id="Path_459" data-name="Path 459" d="M280.294,512.532l-33.944.65V507.55l33.944-.65Z" transform="translate(517.685 42.387)" opacity="0.1"/> - <path id="Path_460" data-name="Path 460" d="M282.294,512.532l-33.944.65V507.55l33.944-.65Z" transform="translate(516.984 42.387)" fill="#3f3d56"/> - <path id="Path_461" data-name="Path 461" d="M552.228,360.039A6.334,6.334,0,0,1,551,357.22a6.165,6.165,0,0,0,.273,2.988A5.847,5.847,0,0,0,552.228,360.039Z" transform="translate(359.434 -17.505)"/> - <path id="Path_462" data-name="Path 462" d="M540.1,366.9a22.83,22.83,0,0,1-.24-2.4c0,.8,0,1.6,0,2.41Z" transform="translate(363.311 -20.056)"/> - <path id="Path_463" data-name="Path 463" d="M621.706,398.627a11.912,11.912,0,0,1,.234-1.722,11.7,11.7,0,0,0,.52-3.047,4.008,4.008,0,0,0-.1-.689c-.11.6-.286,1.2-.416,1.787a12.433,12.433,0,0,0-.234,3.671Z" transform="translate(334.652 -30.1)"/> - <path id="Path_464" data-name="Path 464" d="M600.922,368.894l.708.513a12.8,12.8,0,0,0,1.67-1.442,2.384,2.384,0,0,0,.247-2.365,1.95,1.95,0,0,1-.247.416C602.5,367.042,600.734,367.607,600.922,368.894Z" transform="translate(341.923 -20.441)"/> - <path id="Path_465" data-name="Path 465" d="M518.455,380.29a8,8,0,0,0-.565,1.481,11.8,11.8,0,0,1,3.248-1.228Z" transform="translate(371.008 -25.587)"/> - <path id="Path_466" data-name="Path 466" d="M531.888,368.979a9.637,9.637,0,0,1-1.221-.8,2.758,2.758,0,0,0,.058.767,7.7,7.7,0,0,1,1.163.033Z" transform="translate(366.534 -21.345)"/> - <path id="Path_467" data-name="Path 467" d="M587.579,428.33c-.266,3.151-1.735,6.185-2.923,9.173a87.2,87.2,0,0,0-4.736,18.717c-.9,5.71-1.949,12.194-6.821,15.358a19.488,19.488,0,0,1-4.437,1.949c-7,2.423-14.065,4.853-21.439,5.736s-15.111.11-21.543-3.567a12.993,12.993,0,0,1-4.664-4.112c-1.735-2.748-1.767-6.191-2.6-9.336a53.424,53.424,0,0,0-2.6-6.834c-1.436-3.5-2.54-7.146-3.638-10.739q-1.527-5.009-3.047-10.024a18.716,18.716,0,0,1-.741-3.086,11.644,11.644,0,0,0,.741,5.035q1.52,5.022,3.047,10.024c1.1,3.619,2.2,7.244,3.638,10.739a53.417,53.417,0,0,1,2.6,6.834c.819,3.144.851,6.587,2.6,9.336a12.993,12.993,0,0,0,4.664,4.112c6.432,3.677,14.188,4.45,21.543,3.567s14.409-3.313,21.439-5.736a19.487,19.487,0,0,0,4.437-1.949c4.84-3.164,5.918-9.647,6.821-15.358a87.2,87.2,0,0,1,4.736-18.717c1.416-3.56,3.248-7.179,2.936-11.005C587.592,428.408,587.579,428.369,587.579,428.33Z" transform="translate(374.359 -42.418)"/> - <path id="Path_468" data-name="Path 468" d="M510.318,421.419v-.071a9.1,9.1,0,0,0-.3-3.411,17.272,17.272,0,0,1-.253-2.157,17.769,17.769,0,0,0,.253,4.106C510.123,420.393,510.24,420.906,510.318,421.419Z" transform="translate(373.864 -38.021)"/> - <path id="Path_469" data-name="Path 469" d="M512.452,397.929a18.02,18.02,0,0,1,1.7-2.384c-1.189,1.137-3.385.123-3.846-1.455a3.788,3.788,0,0,0,0,1.949,2.852,2.852,0,0,0,2.15,1.89Z" transform="translate(373.712 -30.422)"/> - <path id="Path_470" data-name="Path 470" d="M762.946,656.57s2.059,7.471,0,13.968S762.946,656.57,762.946,656.57Z" transform="translate(285.475 -122.381)" opacity="0.1"/> - <path id="Path_471" data-name="Path 471" d="M776,668.3s.864,9.485-1.085,11.168S776,668.3,776,668.3Z" transform="translate(281.189 -126.49)" opacity="0.1"/> - <line id="Line_88" data-name="Line 88" y1="0.65" x2="66.011" transform="translate(733.267 442.068)" fill="none" stroke="#00ddf1" stroke-miterlimit="10" stroke-width="2"/> - <line id="Line_89" data-name="Line 89" y1="0.643" x2="66.011" transform="translate(733.267 450.176)" fill="none" stroke="#00ddf1" stroke-miterlimit="10" stroke-width="2"/> - <line id="Line_90" data-name="Line 90" y1="0.65" x2="66.011" transform="translate(733.267 458.277)" fill="none" stroke="#00ddf1" stroke-miterlimit="10" stroke-width="2"/> - </g> - </g> - </g> -</svg> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="691.365" height="586.346" viewBox="0 0 691.365 586.346"><defs><linearGradient id="linear-gradient" x1=".5" x2=".5" y1="1" y2="-.001" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="gray" stop-opacity=".251"/><stop offset=".54" stop-color="gray" stop-opacity=".122"/><stop offset="1" stop-color="gray" stop-opacity=".102"/></linearGradient></defs><g id="Group_644" data-name="Group 644" transform="translate(-588.635 -80)"><g id="Group_642" data-name="Group 642" transform="translate(22538.635 6999)"><path id="Path_472" fill="#00ddf1" d="M482.764,637.675c51.612-29.22,67.336-29.693,124.954-17.169,81.646,17.758,88.43-49.93,108.306-186.933,33.946-233.98-108.306-295.737-108.306-295.737s-94.6-8.1-150.536-38.963C377.726,55.027,286.9,49.443,207.046,86.542c-51.069,23.7-93.125,56.714-100.31,102.034-20.09,126.746,12.9,196.58-48.819,237.954S48.944,581.5,96.263,577.564c34.968-2.906,80.842,52.415,130.687,60.111,17.382,2.684,88.7-13.043,99.578,0C341.327,655.4,464.763,647.87,482.764,637.675Z" data-name="Path 472" opacity=".1" transform="translate(-21979.895 -6980.982)"/><g id="Group_641" data-name="Group 641" transform="translate(-21545.08 -6816.88)"><rect id="Rectangle_263" width="217.867" height="15.073" fill="#00ddf1" data-name="Rectangle 263" opacity=".1" transform="translate(0 39.052)"/><rect id="Rectangle_264" width="217.867" height="15.073" fill="#00ddf1" data-name="Rectangle 264" opacity=".1" transform="translate(0 104.137)"/><rect id="Rectangle_265" width="217.867" height="15.073" fill="#00ddf1" data-name="Rectangle 265" opacity=".1" transform="translate(0 171.964)"/><rect id="Rectangle_266" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 266" opacity=".1" transform="translate(19.183)"/><rect id="Rectangle_267" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 267" opacity=".1" transform="translate(19.183 6.166)"/><rect id="Rectangle_268" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 268" opacity=".1" transform="translate(19.183 27.405)"/><rect id="Rectangle_269" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 269" opacity=".1" transform="translate(39.737)"/><rect id="Rectangle_270" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 270" opacity=".1" transform="translate(39.737 6.166)"/><rect id="Rectangle_271" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 271" opacity=".1" transform="translate(39.737 27.405)"/><rect id="Rectangle_272" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 272" opacity=".1" transform="translate(60.29)"/><rect id="Rectangle_273" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 273" opacity=".1" transform="translate(60.29 6.166)"/><rect id="Rectangle_274" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 274" opacity=".1" transform="translate(60.29 27.405)"/><rect id="Rectangle_275" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 275" opacity=".1" transform="translate(80.844)"/><rect id="Rectangle_276" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 276" opacity=".1" transform="translate(80.844 6.166)"/><rect id="Rectangle_277" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 277" opacity=".1" transform="translate(80.844 27.405)"/><rect id="Rectangle_278" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 278" opacity=".1" transform="translate(101.397)"/><rect id="Rectangle_279" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 279" opacity=".1" transform="translate(101.397 6.166)"/><rect id="Rectangle_280" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 280" opacity=".1" transform="translate(101.397 27.405)"/><rect id="Rectangle_281" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 281" opacity=".1" transform="translate(121.95)"/><rect id="Rectangle_282" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 282" opacity=".1" transform="translate(121.95 6.166)"/><rect id="Rectangle_283" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 283" opacity=".1" transform="translate(121.95 27.405)"/><rect id="Rectangle_284" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 284" opacity=".1" transform="translate(142.504)"/><rect id="Rectangle_285" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 285" opacity=".1" transform="translate(142.504 6.166)"/><rect id="Rectangle_286" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 286" opacity=".1" transform="translate(142.504 27.405)"/><rect id="Rectangle_287" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 287" opacity=".1" transform="matrix(0.894, -0.448, 0.448, 0.894, 135.847, 138.025)"/><rect id="Rectangle_288" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 288" opacity=".1" transform="matrix(0.894, -0.448, 0.448, 0.894, 138.614, 143.541)"/><rect id="Rectangle_289" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 289" opacity=".1" transform="matrix(0.894, -0.448, 0.448, 0.894, 148.128, 162.529)"/><rect id="Rectangle_290" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 290" opacity=".1" transform="translate(19.183 65.771)"/><rect id="Rectangle_291" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 291" opacity=".1" transform="translate(19.183 71.937)"/><rect id="Rectangle_292" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 292" opacity=".1" transform="translate(19.183 93.176)"/><rect id="Rectangle_293" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 293" opacity=".1" transform="translate(39.737 65.771)"/><rect id="Rectangle_294" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 294" opacity=".1" transform="translate(39.737 71.937)"/><rect id="Rectangle_295" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 295" opacity=".1" transform="translate(39.737 93.176)"/><rect id="Rectangle_296" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 296" opacity=".1" transform="translate(60.29 65.771)"/><rect id="Rectangle_297" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 297" opacity=".1" transform="translate(60.29 71.937)"/><rect id="Rectangle_298" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 298" opacity=".1" transform="translate(60.29 93.176)"/><rect id="Rectangle_299" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 299" opacity=".1" transform="translate(145.93 65.771)"/><rect id="Rectangle_300" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 300" opacity=".1" transform="translate(145.93 71.937)"/><rect id="Rectangle_301" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 301" opacity=".1" transform="translate(145.93 93.176)"/><rect id="Rectangle_302" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 302" opacity=".1" transform="translate(166.483 65.771)"/><rect id="Rectangle_303" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 303" opacity=".1" transform="translate(166.483 71.937)"/><rect id="Rectangle_304" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 304" opacity=".1" transform="translate(166.483 93.176)"/><rect id="Rectangle_305" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 305" opacity=".1" transform="translate(187.036 65.771)"/><rect id="Rectangle_306" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 306" opacity=".1" transform="translate(187.036 71.937)"/><rect id="Rectangle_307" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 307" opacity=".1" transform="translate(187.036 93.176)"/><rect id="Rectangle_308" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 308" opacity=".1" transform="translate(19.183 132.912)"/><rect id="Rectangle_309" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 309" opacity=".1" transform="translate(19.183 139.078)"/><rect id="Rectangle_310" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 310" opacity=".1" transform="translate(19.183 160.317)"/><rect id="Rectangle_311" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 311" opacity=".1" transform="translate(39.737 132.912)"/><rect id="Rectangle_312" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 312" opacity=".1" transform="translate(39.737 139.078)"/><rect id="Rectangle_313" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 313" opacity=".1" transform="translate(39.737 160.317)"/><rect id="Rectangle_314" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 314" opacity=".1" transform="translate(60.29 132.912)"/><rect id="Rectangle_315" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 315" opacity=".1" transform="translate(60.29 139.078)"/><rect id="Rectangle_316" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 316" opacity=".1" transform="translate(60.29 160.317)"/><rect id="Rectangle_317" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 317" opacity=".1" transform="translate(80.844 132.912)"/><rect id="Rectangle_318" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 318" opacity=".1" transform="translate(80.844 139.078)"/><rect id="Rectangle_319" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 319" opacity=".1" transform="translate(80.844 160.317)"/><rect id="Rectangle_320" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 320" opacity=".1" transform="translate(101.397 132.912)"/><rect id="Rectangle_321" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 321" opacity=".1" transform="translate(101.397 139.078)"/><rect id="Rectangle_322" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 322" opacity=".1" transform="translate(101.397 160.317)"/><rect id="Rectangle_323" width="13.702" height="39.052" fill="#00ddf1" data-name="Rectangle 323" opacity=".1" transform="translate(121.95 132.912)"/><rect id="Rectangle_324" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 324" opacity=".1" transform="translate(121.95 139.078)"/><rect id="Rectangle_325" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 325" opacity=".1" transform="translate(121.95 160.317)"/><path id="Path_473" fill="#00ddf1" d="M797.862,159.09v35.571h-13.7V156.48Q791.039,157.693,797.862,159.09Z" data-name="Path 473" opacity=".1" transform="translate(-621.103 -155.61)"/><rect id="Rectangle_326" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 326" opacity=".1" transform="translate(163.057 6.166)"/><rect id="Rectangle_327" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 327" opacity=".1" transform="translate(163.057 27.405)"/><path id="Path_474" fill="#00ddf1" d="M827.862,165.719v30.83h-13.7V162.43c1.781.391,3.556.8,5.33,1.22Q823.7,164.636,827.862,165.719Z" data-name="Path 474" opacity=".1" transform="translate(-630.549 -157.483)"/><path id="Path_475" fill="#00ddf1" d="M827.862,166.285v.685h-13.7v-2.74h5.33Q823.7,165.2,827.862,166.285Z" data-name="Path 475" opacity=".1" transform="translate(-630.549 -158.05)"/><rect id="Rectangle_328" width="13.702" height="2.74" fill="#00ddf1" data-name="Rectangle 328" opacity=".1" transform="translate(183.611 27.405)"/><path id="Path_476" fill="#00ddf1" d="M691.358,287.276s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.4,9.4,0,0,0,9.146,5.179c4.35-.233,5.8-3.549,6.166-6.639a6.851,6.851,0,0,0-9.057-7.3Z" data-name="Path 476" transform="translate(-589.693 -196.649)"/><path id="Path_477" fill="#00ddf1" d="M686.2,296.239a6.68,6.68,0,0,1-.089-6.426c2-3.659,6.166-2.254,6.166-2.254l.212-.075a6.762,6.762,0,0,1,4.885.11,6.762,6.762,0,0,0-5.762-.548l-.212.075s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.982,9.982,0,0,0,4.7,4.446A10.277,10.277,0,0,1,686.2,296.239Z" data-name="Path 477" opacity=".1" transform="translate(-589.706 -196.595)"/><path id="Path_478" fill="#00ddf1" d="M691.42,290.06s1.542,1.213,5.282,0" data-name="Path 478" opacity=".2" transform="translate(-591.9 -197.672)"/><path id="Path_479" fill="#00ddf1" d="M690.93,277.21s2.638,7.153,2.418,9.023l2.09-.219s-3.521-6.269-2.638-8.8Z" data-name="Path 479" transform="translate(-591.746 -193.626)"/><path id="Path_480" fill="#00ddf1" d="M690.93,277.21s2.638,7.153,2.418,9.023l2.09-.219s-3.521-6.269-2.638-8.8Z" data-name="Path 480" opacity=".2" transform="translate(-591.746 -193.626)"/><path id="Path_481" fill="#00ddf1" d="M702.92,277.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S701.536,284.391,702.92,277.6Z" data-name="Path 481" transform="translate(-592.952 -193.414)"/><path id="Path_482" fill="#00ddf1" d="M702.92,277.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S701.536,284.391,702.92,277.6Z" data-name="Path 482" opacity=".1" transform="translate(-592.952 -193.414)"/><path id="Path_483" fill="#00ddf1" d="M694.75,283.958s1.089-5.207,8.16-5.878" data-name="Path 483" transform="translate(-592.949 -193.9)"/><path id="Path_484" fill="#00ddf1" d="M819.358,386.276s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.4,9.4,0,0,0,9.146,5.18c4.35-.233,5.8-3.549,6.166-6.639a6.851,6.851,0,0,0-9.057-7.3Z" data-name="Path 484" transform="translate(-629.999 -227.823)"/><path id="Path_485" fill="#00ddf1" d="M814.2,395.239a6.68,6.68,0,0,1-.089-6.426c2-3.659,6.166-2.254,6.166-2.254l.212-.075a6.762,6.762,0,0,1,4.885.11,6.762,6.762,0,0,0-5.762-.548l-.212.075s-4.152-1.411-6.166,2.254a6.68,6.68,0,0,0,.089,6.426,9.982,9.982,0,0,0,4.7,4.446A10.276,10.276,0,0,1,814.2,395.239Z" data-name="Path 485" opacity=".1" transform="translate(-630.011 -227.769)"/><path id="Path_486" fill="#00ddf1" d="M819.42,389.06s1.542,1.213,5.282,0" data-name="Path 486" opacity=".2" transform="translate(-632.206 -228.846)"/><path id="Path_487" fill="#00ddf1" d="M818.93,376.21s2.638,7.153,2.419,9.023l2.09-.219s-3.522-6.269-2.638-8.8Z" data-name="Path 487" transform="translate(-632.051 -224.799)"/><path id="Path_488" fill="#00ddf1" d="M818.93,376.21s2.638,7.153,2.419,9.023l2.09-.219s-3.522-6.269-2.638-8.8Z" data-name="Path 488" opacity=".2" transform="translate(-632.051 -224.799)"/><path id="Path_489" fill="#00ddf1" d="M830.92,376.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S829.536,383.391,830.92,376.6Z" data-name="Path 489" transform="translate(-633.257 -224.588)"/><path id="Path_490" fill="#00ddf1" d="M830.92,376.6s-4.159-2.124-6.015-.37-2.144,6.241-2.144,6.241S829.536,383.391,830.92,376.6Z" data-name="Path 490" opacity=".1" transform="translate(-633.257 -224.588)"/><path id="Path_491" fill="#00ddf1" d="M822.75,382.958s1.089-5.207,8.16-5.878" data-name="Path 491" transform="translate(-633.254 -225.073)"/></g></g><g id="Group_643" data-name="Group 643" transform="translate(7 -63)"><g id="Group_639" data-name="Group 639" transform="translate(21233 8372)"><ellipse id="Ellipse_73" cx="49.851" cy="8.007" fill="#00abf6" data-name="Ellipse 73" opacity=".1" rx="49.851" ry="8.007" transform="translate(-20118.443 -7772.555)"/><rect id="Rectangle_182" width="3.208" height="72.224" fill="#535461" data-name="Rectangle 182" transform="translate(-20070.199 -7917.934)"/><path id="Path_268" fill="#565661" d="M1025.906,587.251l-.2,3.254-.287,4.6-.118,1.913-.281,4.6-.123,1.913-.286,4.6-3.233,52.22a8.851,8.851,0,0,1-8.83,8.268H995.731a8.841,8.841,0,0,1-8.82-8.3l-3.244-52.225-.281-4.6-.117-1.913-.292-4.6-.117-1.913-.281-4.6-.2-3.254a4.6,4.6,0,0,1,4.574-4.865h34.391a4.6,4.6,0,0,1,4.569,4.9Z" data-name="Path 268" transform="translate(-21072.734 -8433.181)"/><path id="Path_269" fill="#9d9cb5" d="M990.949,517.36l-.287,4.589H948.106l-.286-4.589Z" data-name="Path 269" transform="translate(-21037.977 -8360.036)"/><path id="Path_270" fill="#9d9cb5" d="M990.93,530.08l-.281,4.594H948.9l-.286-4.594Z" data-name="Path 270" transform="translate(-21038.363 -8366.248)"/><path id="Path_271" fill="#9d9cb5" d="M990.912,542.8l-.287,4.589H949.686L949.4,542.8Z" data-name="Path 271" transform="translate(-21038.748 -8372.46)"/><path id="Path_272" fill="#00abf6" d="M933.875,490.464c18.684,13.517,26.466,34.656,26.466,34.656s-22.511-.773-41.2-14.289-26.46-34.651-26.46-34.651S915.2,476.953,933.875,490.464Z" data-name="Path 272" transform="translate(-21028.934 -8381.328)"/><path id="Path_273" fill="none" stroke="#535461" stroke-miterlimit="10" stroke-width="2" d="M892.68,476.18s23.365,12.969,30.865,23.708,36.8,25.233,36.8,25.233" data-name="Path 273" transform="translate(-21028.934 -8381.328)"/><path id="Path_274" fill="#00abf6" d="M975.393,443.457c10.171,7.352,14.407,18.863,14.407,18.863s-12.279-.425-22.424-7.776S953,435.68,953,435.68,965.227,436.1,975.393,443.457Z" data-name="Path 274" transform="translate(-21058.393 -8361.549)"/><path id="Path_275" fill="none" stroke="#535461" stroke-miterlimit="10" stroke-width="2" d="M953,435.68s12.719,7.06,16.8,12.9,20.03,13.737,20.03,13.737" data-name="Path 275" transform="translate(-21058.393 -8361.549)"/><path id="Path_276" fill="#00abf6" d="M1040.3,470.483c-11.68,12.836-14.151,29.612-14.151,29.612s16.469-4.042,28.139-16.883,14.151-29.612,14.151-29.612S1051.981,457.647,1040.3,470.483Z" data-name="Path 276" transform="translate(-21094.119 -8370.301)"/><path id="Path_277" fill="none" stroke="#535461" stroke-miterlimit="10" stroke-width="2" d="M1068.45,453.61s-15.215,13.159-19.083,22.224S1026.15,500.1,1026.15,500.1" data-name="Path 277" transform="translate(-21094.119 -8370.306)"/></g><g id="Group_638" data-name="Group 638" transform="translate(-40 36)"><rect id="Rectangle_254" width="12.343" height="37.459" fill="#3f3d56" data-name="Rectangle 254" transform="translate(741.459 392.675)"/><rect id="Rectangle_255" width="12.343" height="39.629" fill="#3f3d56" data-name="Rectangle 255" transform="translate(1073.647 390.726)"/><path id="Path_418" fill="#65617d" d="M597.889,523.665v8.446l-98.7.909-1.052.02-37.511.344-.9.013-11.4.1h-.338l-69.5.643L264.408,535.2h-.1l-29.007.273-.312.007L106.1,536.658v-9.745l30.306-18.19,60.808-.507,1.3-.007.429-.007,1.3-.019,29.2-.24,1.306-.007.416-.007,1.3-.006,9.362-.078.247-.006,23.1-.195h.188l180.214-1.52,4.411-.032h.442l3.365-.033,24.459-.2,1.3-.02,1.2-.013h.624l7.607-.058,1.507-.02,2.02-.013,6.334-.058,10.05-.084,1.3-.013,2.261-.013h.422l48.536-.416Z" data-name="Path 418" transform="translate(566.82 43)"/><path id="Path_419" d="M597.889,523.665v8.446l-98.7.909-1.052.02-37.511.344-.9.013-11.4.1h-.338l-69.5.643L264.408,535.2h-.1l-29.007.273-.312.007L106.1,536.658v-9.745l30.306-18.19,60.808-.507,1.3-.007.429-.007,1.3-.019,29.2-.24,1.306-.007.416-.007,1.3-.006,9.362-.078.247-.006,23.1-.195h.188l180.214-1.52,4.411-.032h.442l3.365-.033,24.459-.2,1.3-.02,1.2-.013h.624l7.607-.058,1.507-.02,2.02-.013,6.334-.058,10.05-.084,1.3-.013,2.261-.013h.422l48.536-.416Z" data-name="Path 419" opacity=".2" transform="translate(566.82 43)"/><path id="Path_420" fill="#3f3d56" d="M358.914,656.57v15.91a3.982,3.982,0,0,1-2.274,3.6,3.9,3.9,0,0,1-1.624.39l-22.673.481a3.9,3.9,0,0,1-1.754-.37,3.976,3.976,0,0,1-2.319-3.619V656.57Z" data-name="Path 420" transform="translate(437.441 -122.381)"/><path id="Path_421" d="M358.914,656.57v15.91a3.982,3.982,0,0,1-2.274,3.6,3.9,3.9,0,0,1-1.624.39l-22.673.481a3.9,3.9,0,0,1-1.754-.37,3.976,3.976,0,0,1-2.319-3.619V656.57Z" data-name="Path 421" opacity=".1" transform="translate(437.441 -122.381)"/><path id="Path_422" fill="#3f3d56" d="M360.914,656.57v15.91a3.982,3.982,0,0,1-2.274,3.6,3.9,3.9,0,0,1-1.624.39l-22.673.481a3.9,3.9,0,0,1-1.754-.37,3.976,3.976,0,0,1-2.319-3.619V656.57Z" data-name="Path 422" transform="translate(436.74 -122.381)"/><rect id="Rectangle_256" width="30.644" height="20.464" fill="#3f3d56" data-name="Rectangle 256" transform="translate(1046.362 534.189)"/><rect id="Rectangle_257" width="30.644" height="20.464" data-name="Rectangle 257" opacity=".1" transform="translate(1046.362 534.189)"/><rect id="Rectangle_258" width="30.644" height="20.464" fill="#3f3d56" data-name="Rectangle 258" transform="translate(1045.062 534.189)"/><path id="Path_423" d="M223.943,265.82v3.723l-12.343-.318v-3.4Z" data-name="Path 423" opacity=".1" transform="translate(529.859 126.848)"/><path id="Path_424" fill="#65617d" d="M358.741,271.246,343.909,377.789a2.794,2.794,0,0,1-2.839,2.41L222.314,377.12l-2.254-.058a2.794,2.794,0,0,1-2.7-3.164l16.651-111.533a2.794,2.794,0,0,1,2.949-2.358l119.186,8.069a2.787,2.787,0,0,1,2.6,3.17Z" data-name="Path 424" transform="translate(476.307 16.556)"/><path id="Path_425" fill="#00ddf1" d="M169.158,99.16,156.6,197.472l109.142,3.463,13.422-94.85Z" data-name="Path 425" transform="translate(549.128 185.237)"/><rect id="Rectangle_259" width="132.965" height="112.605" fill="#65617d" data-name="Rectangle 259" rx="5.33" transform="translate(853.849 282.877)"/><rect id="Rectangle_260" width="120.836" height="93.765" fill="#00ddf1" data-name="Rectangle 260" transform="translate(860.125 290.458)"/><path id="Path_426" d="M735.273,262.82v2.462l-12.343.253V262.82Z" data-name="Path 426" opacity=".1" transform="translate(350.717 127.899)"/><path id="Path_427" fill="#65617d" d="M833.626,371a2,2,0,0,1-1.949,2.131l-121.615,2.514a2,2,0,0,1-2.033-1.813L697.575,265.156a2,2,0,0,1,1.9-2.189l120.693-6,1.3-.065a1.994,1.994,0,0,1,2.092,1.819Z" data-name="Path 427" transform="translate(308.06 17.643)"/><path id="Path_428" fill="#00ddf1" d="M628.93,100.238,739.157,94.82l9.31,98.748-109.356,2.6Z" data-name="Path 428" transform="translate(383.65 186.757)"/><path id="Path_429" d="M899.741,371a2,2,0,0,1-1.949,2.131L886.28,256.963l1.3-.065a2,2,0,0,1,2.092,1.819Z" data-name="Path 429" opacity=".1" transform="translate(241.945 17.643)"/><rect id="Rectangle_261" width="12.343" height="11.096" data-name="Rectangle 261" opacity=".1" transform="translate(741.459 419.038)"/><path id="Path_431" d="M281.574,483.65v3.229l-30.644.819V483.65Z" data-name="Path 431" opacity=".1" transform="translate(516.08 50.533)"/><path id="Path_432" fill="#65617d" d="M390.8,483.886V593.158a2.6,2.6,0,0,1-2.5,2.566l-124.506,3.313h-.033a2.6,2.6,0,0,1-2.566-2.566V483.886a2.6,2.6,0,0,1,2.566-2.566H388.23A2.6,2.6,0,0,1,390.8,483.886Z" data-name="Path 432" transform="translate(460.942 -60.983)"/><path id="Path_434" fill="#d4dfec" d="M194.6,319.15H309.914v96.311L194.6,418.06Z" data-name="Path 434" transform="translate(535.815 108.164)"/><rect id="Rectangle_262" width="12.343" height="11.317" data-name="Rectangle 262" opacity=".1" transform="translate(1073.647 419.038)"/><path id="Path_435" d="M709.574,483.65v4.164L678.93,487V483.65Z" data-name="Path 435" opacity=".1" transform="translate(366.132 50.533)"/><path id="Path_436" fill="#65617d" d="M797.782,483.886V596.471a2.6,2.6,0,0,1-2.6,2.566h0l-124.532-3.313a2.6,2.6,0,0,1-2.5-2.566V483.886a2.6,2.6,0,0,1,2.566-2.566H795.19a2.6,2.6,0,0,1,2.592,2.566Z" data-name="Path 436" transform="translate(318.365 -60.983)"/><path id="Path_437" d="M866.289,483.886V596.471a2.6,2.6,0,0,1-2.6,2.566h0V481.32h0a2.6,2.6,0,0,1,2.6,2.566Z" data-name="Path 437" opacity=".1" transform="translate(249.859 -60.983)"/><path id="Path_438" fill="#d4dfec" d="M713.414,319.15H598.1v96.311l115.314,2.6Z" data-name="Path 438" transform="translate(394.451 108.164)"/><path id="Path_439" fill="#65617d" d="M593.3,483.886V593.158a2.6,2.6,0,0,1-2.5,2.566l-124.506,3.313h0a2.6,2.6,0,0,1-2.6-2.566V483.886a2.6,2.6,0,0,1,2.566-2.566H590.73A2.6,2.6,0,0,1,593.3,483.886Z" data-name="Path 439" transform="translate(389.997 -60.983)"/><path id="Path_440" fill="#d4dfec" d="M397.1,319.15H512.414v96.311L397.1,418.06Z" data-name="Path 440" transform="translate(464.87 108.164)"/><path id="Path_441" d="M597.889,533.65V542.1l-98.7.909-1.052.02-37.511.344-.9.013-11.4.1h-.338l-69.5.643-114.086,1.059h-.1l-29.007.273-.312.007L106.1,546.643V536.9l131.562-.864h.312l26.629-.182h.123l183.9-1.215h.188l.11-.006h.305l3.112-.019h.948l48.393-.325,2.858-.013.637-.007Z" data-name="Path 441" opacity=".1" transform="translate(566.82 33.015)"/><circle id="Ellipse_99" cx="33.347" cy="33.347" r="33.347" fill="#fbbebe" data-name="Ellipse 99" transform="translate(887.196 363.44)"/><path id="Path_442" fill="url(#linear-gradient)" d="M383.74,592.973a.806.806,0,0,1,.065-.227c.65-2.332,1.806-6.276,2.67-9.427.11-.39.214-.773.312-1.137.955-3.554,2.813-11.876,3.846-17.066.364-1.826.65-3.248.708-3.963.13-1.1,2.085-5.795,4.3-11.194,1.553-3.794,3.248-7.939,4.489-11.434a39.876,39.876,0,0,0,1.9-6.4,3.313,3.313,0,0,0,0-1.384,9.543,9.543,0,0,1-.312-2.274h0c-.149-4.028,1.052-10.394,2.91-13.065,2.274-3.248,3.9-15.371,3.9-15.371s3.365.487,3.9-2.293a4,4,0,0,0,.065-.91,4.815,4.815,0,0,0-.058-.721c-.578-4.054,9.563-8.368,15.267-9.3a12.769,12.769,0,0,1,1.949-.182,17.694,17.694,0,0,0,4.06-.935q.909-.279,1.949-.65c2.391-.806,5.249-1.871,8.283-3.04,11.408-4.424,25.22-10.394,25.22-10.394.1-.461.208-.9.331-1.338a18,18,0,0,1,10.622-12.3h0v-1.3c0-2.241-.1-4.548-.195-6.847,0-.448-.039-.9-.065-1.345v-.734c0-.455-.046-.91-.071-1.358l-.117-.091a10.66,10.66,0,0,1-2.534-2.729,9.916,9.916,0,0,1-.923-1.949c-.812-2.2-1-4.658-1.546-6.984l-.117-.481a54.579,54.579,0,0,0-2.6-6.873c-1.436-3.521-2.54-7.146-3.638-10.817q-1-3.333-2.02-6.678l-1.026-3.4c-.195-.65-.39-1.3-.539-1.949h0a8.627,8.627,0,0,1-.169-.91h0a6.5,6.5,0,0,1,.156-2.995,20.854,20.854,0,0,1,.858-1.949,5.113,5.113,0,0,0,.325-.9h0a1.947,1.947,0,0,0,.052-.208,3.667,3.667,0,0,0,.071-.7,11.993,11.993,0,0,0-.338-2.527.045.045,0,0,1,0-.032,1.661,1.661,0,0,0-.032-.175,16.564,16.564,0,0,1-.234-1.949,18.483,18.483,0,0,1,2.254-10.115l.123-.234a16.383,16.383,0,0,1,1.2-1.806h0a9.122,9.122,0,0,1,.65-.793,2.594,2.594,0,0,1-3.606-.936,2.475,2.475,0,0,1-.149-.292c-.033-.078-.059-.162-.085-.247-.455-1.592.338-3.287,1.377-4.58a12.012,12.012,0,0,1,3.729-3.053h0a2.51,2.51,0,0,1,.26-.136,11.125,11.125,0,0,1,1.715-.689h0a9.781,9.781,0,0,1,1.059-.286l-2.41-.221-.974-.091A9.414,9.414,0,0,1,479,361.527h.7a7.625,7.625,0,0,1,1.02.084A2.885,2.885,0,0,1,479,358.8a9.362,9.362,0,0,0,5.97,1.988h.247a19.494,19.494,0,0,1-.221-2.124h0a21.545,21.545,0,0,1,0-2.9,5.483,5.483,0,0,0,4.4,1.468l-1.351-1.884a6.165,6.165,0,0,0,4.262,1.332l.312-.033a4.547,4.547,0,0,0,.773-.149h.058c-.123-.156-.234-.318-.344-.487l-.039-.078a6.282,6.282,0,0,1-.65-1.358,4.284,4.284,0,0,1-.156-.565h0a5.684,5.684,0,0,1,.292-3.541c2.1,1.754,4.4,4.151,7.146,2.339s2.839-5.139,7.146-4.8a6.626,6.626,0,0,1,5.464,3.976,4.385,4.385,0,0,1,4.983-1.137,4.45,4.45,0,0,1,2.521,4.476c1.786-.448,3.71-.89,5.425-.214s2.82,2.865,1.845,4.327a.931.931,0,0,1-.091.13c-.8,1.033-2.566,1.6-2.378,2.9l.273.195.845.611q4.97,3.586,9.68,7.536c1.611,1.351,3.326,2.975,3.437,5.087a5.617,5.617,0,0,1-.156,1.54h0c-.1.507-.247,1.013-.357,1.52a12.676,12.676,0,0,0-.221,3.93h0c.045.383.1.76.175,1.143.994,5.022,5.009,9.167,5.405,14.292v.364a11.546,11.546,0,0,1-.045,1.644c-.3,3.118-1.741,6.113-2.91,9.1-.072.182-.143.364-.208.546a90.5,90.5,0,0,0-4.548,18.294,65.14,65.14,0,0,1-1.3,6.555,17.365,17.365,0,0,1-3.307,6.776,10.536,10.536,0,0,1-2.183,1.949,12.132,12.132,0,0,1-1.722.916v.039c.071.4.13.793.2,1.189.039.208.071.416.11.65h0a.089.089,0,0,0,0,.039c.546,3.073,1.169,6.081,1.826,8.939l.331,1.423c8.186,2.956,9.154,9.011,9.212,11.33a6.259,6.259,0,0,1,0,.929s12.343.325,17.216,3.9a13.21,13.21,0,0,0,2.93,1.494,53.917,53.917,0,0,0,6.009,1.877c1.046.273,2.137.539,3.248.8,1.949.448,4.015.884,6.009,1.3,5.321,1.072,10.33,1.949,12.87,2.6,6.061,1.533,19.925,14.825,19.925,14.825s1.624,13.409,3.248,15.364,4.548,8.829,4.548,8.829l10.745,19.106,4.548,8.036h2.923a4.97,4.97,0,0,1,2.085,1.364c.773.689,1.631,1.546,2.384,2.326l1.247,1.332.78.864s4.723.117,6,3.852c3.846-.11,8.569.143,11.876,1.624a9.187,9.187,0,0,1,1.3.7,5.639,5.639,0,0,1,2.683,3.677,5.422,5.422,0,0,1,.117.935c0,.37,0,.741,0,1.1-.234,4.918-3.437,9.011-6.38,11.765l.208.37s-.1.234-.286.65c-.052.123-.117.26-.188.416h0c-.383.819-.994,2.046-1.793,3.482a41.136,41.136,0,0,1-6.217,8.556l-.188.195-37.511.344-.11-.13-7.276-8.679-3.619-4.314-.11-.136-.1,1.033-.351,3.443-.845,8.322-.045.416v.11l-.1.961.071-.961h-.188l-69.513.65-114.092,1.26v.546h-.091v-.546l-29.072.312Z" data-name="Path 442" transform="translate(418.007 -14.269)"/><path id="Path_443" fill="#fbbebe" d="M586.185,511.522s-64.641,7.8-58.469,0c2.235-2.82,2.852-11.174,2.729-20.691-.039-2.891-.143-5.886-.292-8.868-.715-14.292-2.436-28.26-2.436-28.26s56.52-26.636,50.023-5.522c-2.6,8.53-1.748,20.51.227,31.755.578,3.281,1.247,6.5,1.949,9.55a223.892,223.892,0,0,0,6.269,22.036Z" data-name="Path 443" transform="translate(367.711 -46.521)"/><path id="Path_444" d="M586.185,537.354s-64.641,7.8-58.469,0c2.235-2.82,2.852-11.174,2.729-20.692,9.855-4.21,22.394-1.072,22.394-1.072,13.2-2.631,21.666-2.118,27.078-.273A223.888,223.888,0,0,0,586.185,537.354Z" data-name="Path 444" opacity=".1" transform="translate(367.711 -72.353)"/><path id="Path_445" fill="#00ddf1" d="M413.346,651.973v-.546l114.092-1.241,69.513-.65h.195l-.071.961.1-.961h.123v-.11l.89-8.738.338-3.307.1-1.033.091-.864,4.015-13.389,4.015-13.37,3.378-11.258,5.158-17.2s-2.923-6.821-4.548-8.77-3.248-15.267-3.248-15.267-13.864-13.208-19.925-14.728c-2.54-.65-7.555-1.514-12.883-2.6-1.994-.4-4.041-.832-6.009-1.3-1.111-.253-2.2-.52-3.248-.786a57.086,57.086,0,0,1-6.009-1.858,13.448,13.448,0,0,1-2.924-1.488c-4.775-3.5-16.742-3.9-17.2-3.9h0a.269.269,0,0,1,0-.045v-.058a6.66,6.66,0,0,0,0-.819,5.208,5.208,0,0,0-.059-.91.82.82,0,0,0-.045-.325c-.032-.234-.071-.481-.13-.741a3.226,3.226,0,0,0-.078-.344,11.181,11.181,0,0,0-.812-2.267c-.045-.1-.1-.214-.156-.318a11.861,11.861,0,0,0-1.1-1.709c-.084-.11-.175-.227-.273-.338a12.721,12.721,0,0,0-1.767-1.715c-.175-.136-.357-.279-.546-.409a3.026,3.026,0,0,0-.331-.234l-.578-.377-.539-.312c-.474-.26-.974-.513-1.52-.754-.169-.078-.351-.149-.533-.221s-.468-.182-.708-.273h-.039l-.487-.195c-.37-.123-.747-.234-1.143-.344l-.6-.156-.65-.149-.65-.136c-.65-.13-1.345-.247-2.072-.338l-.741-.091-.76-.078-.786-.065-1.117-.065-1.3-.045a81.017,81.017,0,0,0-17.054,1.814,46.946,46.946,0,0,0-11.855-1.093h-.565l-.65.039h-.416l-.838.078a6.224,6.224,0,0,0-.845.1c-.279.039-.572.071-.851.117l-.429.071c-.422.071-.851.149-1.3.24q-.214.039-.429.1c-.565.123-1.13.273-1.689.442-.279.078-.559.169-.838.266-.143.039-.279.091-.416.143l-.416.149-.409.162-.487.195c-.247.1-.487.214-.728.331-.136.058-.273.123-.4.195s-.266.13-.39.2a18.03,18.03,0,0,0-4.034,2.846l-.331.318-.325.331c-.11.11-.214.227-.318.344a15.473,15.473,0,0,0-1.182,1.462c-.1.136-.2.273-.3.416a17.335,17.335,0,0,0-1.117,1.9c-.084.156-.162.318-.24.474a21.243,21.243,0,0,0-1.3,3.411q-.182.65-.331,1.3s-13.753,6.068-25.161,10.46c-3.034,1.169-5.892,2.228-8.283,3.027-.7.234-1.345.448-1.949.65a17.347,17.347,0,0,1-4.06.935,12.778,12.778,0,0,0-1.949.182c-5.243.851-14.227,4.548-15.208,8.257a2.4,2.4,0,0,0-.065.91v.071c.65,4.548-3.9,3.9-3.9,3.9s-1.624,12.019-3.9,15.267c-1.644,2.339-2.768,7.555-2.91,11.492h0a12.741,12.741,0,0,0,.286,3.658v.091c.26.871-.364,3.248-1.423,6.3-1.15,3.346-2.826,7.5-4.437,11.427-2.43,5.925-4.716,11.3-4.859,12.486-.058.526-.227,1.468-.461,2.683-.948,4.95-3.053,14.377-4.093,18.19-.773,2.845-1.9,6.743-2.67,9.42a.91.91,0,0,1-.065.227l29.124-.286v.546h.091Z" data-name="Path 445" transform="translate(417.856 -73.042)"/><path id="Path_446" d="M445.44,607.57s37.03,19.165,50.348,16.891Z" data-name="Path 446" opacity=".1" transform="translate(396.391 -105.214)"/><path id="Path_447" d="M561.44,595.57s36.056,11.694,48.074,13.318S561.44,595.57,561.44,595.57Z" data-name="Path 447" opacity=".1" transform="translate(355.751 -101.01)"/><path id="Path_448" d="M585.443,530.686c-18.84,3.469-54.311,2.722-69.643,2.2,5.62-20.139,33.022-13.292,33.022-13.292C582.74,512.821,585.339,526.866,585.443,530.686Z" data-name="Path 448" opacity=".1" transform="translate(371.74 -73.754)"/><path id="Path_449" fill="#00ddf1" d="M585.443,528.686c-18.84,3.469-54.311,2.722-69.643,2.2,5.62-20.139,33.022-13.292,33.022-13.292C582.74,510.821,585.339,524.866,585.443,528.686Z" data-name="Path 449" transform="translate(371.74 -73.053)"/><path id="Path_450" fill="#fbbebe" d="M776.94,672.008s22.192-3.411,22.628,6.334S788.25,694.9,788.25,694.9Z" data-name="Path 450" transform="translate(280.251 -127.587)"/><path id="Path_451" d="M578.17,479.936a30.558,30.558,0,0,1-2.923,1.13c-7,2.417-14.065,4.853-21.439,5.736s-15.111.1-21.543-3.573a18.685,18.685,0,0,1-1.949-1.267c-.715-14.292-2.436-28.26-2.436-28.26s56.52-26.636,50.023-5.522C575.318,456.711,576.195,468.69,578.17,479.936Z" data-name="Path 451" opacity=".1" transform="translate(367.508 -46.521)"/><path id="Path_452" fill="#3f3d56" d="M536.9,360.29a6.153,6.153,0,0,1-5.405-1.137l1.351,1.878a5.5,5.5,0,0,1-4.4-1.462,22.146,22.146,0,0,0,.208,5.035,9.433,9.433,0,0,1-6.211-1.949,2.872,2.872,0,0,0,1.715,2.8,9.316,9.316,0,0,0-10.135,6.958l3.391.312a12,12,0,0,0-6.782,4.138c-1.039,1.3-1.832,2.962-1.377,4.548s2.651,2.6,3.846,1.468a18.151,18.151,0,0,0-3.963,14.806,9.4,9.4,0,0,1,.3,3.417,28.993,28.993,0,0,1-1.228,3.047c-.65,1.9-.032,3.956.546,5.847l3.047,10.018c1.1,3.619,2.2,7.244,3.645,10.745a53.328,53.328,0,0,1,2.6,6.828c.819,3.144.851,6.588,2.6,9.336a12.948,12.948,0,0,0,4.665,4.112c6.425,3.677,14.188,4.457,21.542,3.573s14.409-3.32,21.406-5.736a20.141,20.141,0,0,0,4.444-1.949c4.84-3.17,5.918-9.654,6.821-15.364a87.242,87.242,0,0,1,4.736-18.71c1.416-3.567,3.248-7.185,2.936-11.005-.4-5.074-4.411-9.186-5.405-14.175a12.344,12.344,0,0,1,.045-5.048,11.473,11.473,0,0,0,.513-3.053c-.11-2.092-1.826-3.7-3.437-5.048q-5.243-4.379-10.823-8.277c-.188-1.3,1.579-1.858,2.378-2.884,1.13-1.449-.039-3.748-1.754-4.424s-3.638-.234-5.425.214a4.281,4.281,0,0,0-7.5-3.32,6.627,6.627,0,0,0-5.47-3.95c-4.307-.338-4.392,2.956-7.146,4.768s-5.028-.578-7.146-2.319A6.029,6.029,0,0,0,536.9,360.29Z" data-name="Path 452" transform="translate(374.5 -15.625)"/><path id="Path_453" fill="#00ddf1" d="M768.171,669.128s-.578,1.377-1.644,3.372a44.83,44.83,0,0,1-5.847,8.556l-.175.188h-1.052l-37.511.344h-.9l-.11-.13-7.276-8.634-2.741-3.255-.11-.136-.234-.273-.13-.156-.169-.2-5.334-6.328,1.949-8.121,3.32-13.682.084-.331.65-2.6.461-1.949,1.546-6.354,5.3-21.861,9.42,4.872,9.933,17.541,5.334,9.42h2.923c.552,0,1.819,1.065,3.092,2.293.455.435.91.9,1.3,1.3,1.156,1.2,2.072,2.222,2.072,2.222s4.736.1,6.009,3.833a4.537,4.537,0,0,1,.162.552,26.191,26.191,0,0,0,1.644,4.262c.838,1.826,1.891,3.9,2.956,5.97,1.981,3.8,4,7.419,4.736,8.731l.091.162Z" data-name="Path 453" transform="translate(305.476 -105.217)"/><path id="Path_454" d="M615.681,653.093l-.065.929v.065l-.11,1.494-.864,12.025L613.6,682.093l-.3,4.08-.65,8.731v.11l-69.513.65L429.061,696.9v.546h-.091v-.728l.292-9.329.559-18.229L430.3,653.7l.045-1.54a6.841,6.841,0,0,1,7.419-6.607c3.066.26,7.049.578,11.811.916l1.949.143c27.5,1.91,78.322,4.379,129.606,1.3,1.078-.059,2.163-.123,3.248-.2,7.952-.5,15.9-1.143,23.764-1.949a6.841,6.841,0,0,1,7.536,7.3Z" data-name="Path 454" opacity=".1" transform="translate(402.161 -118.514)"/><path id="Path_455" fill="#3f3d56" d="M429.08,698.857v-.546l114.092-1.241,69.513-.65h.195v-.11l.65-8.731.279-3.9,1.065-14.689.838-11.629v-.286a6.893,6.893,0,0,0-.071-1.6.2.2,0,0,0,0-.065,6.751,6.751,0,0,0-1.3-3.014,6.847,6.847,0,0,0-6.12-2.6c-7.867.806-15.813,1.449-23.764,1.949-1.085.078-2.17.143-3.248.2-51.284,3.047-102.106.578-129.606-1.3l-1.949-.143c-4.762-.338-8.744-.65-11.811-.916a6.847,6.847,0,0,0-7.3,5.542,7.146,7.146,0,0,0-.117,1.065l-.442,14.4-.6,18.236-.286,9.329v.728Z" data-name="Path 455" transform="translate(402.122 -119.926)"/><path id="Path_456" d="M615.925,661.692l-.8,9.959L613.937,686.5l-.3,3.716-.65,8.322-.039.416v.11h0l-.1.961.071-.961h-.188l-69.513.65L429.11,700.944v-.182l.318-9.329.65-18.229.416-12.116a4.132,4.132,0,0,1,1.988-3.411,4.061,4.061,0,0,1,2.456-.585c1.364.11,3.04.24,5,.383,3.177.234,7.094.507,11.655.793,8.445.533,19.041,1.1,31.183,1.572,33.782,1.3,79.388,1.735,122.707-2.059,1.949-.169,3.963-.357,5.931-.546a4.066,4.066,0,0,1,2.261.429,3.346,3.346,0,0,1,.559.351,3.989,3.989,0,0,1,1.3,1.6,2.315,2.315,0,0,1,.162.4A4.08,4.08,0,0,1,615.925,661.692Z" data-name="Path 456" opacity=".1" transform="translate(402.112 -122.559)"/><path id="Path_457" d="M360.914,677.87v2.072a3.982,3.982,0,0,1-2.274,3.6l-26.051.5a3.976,3.976,0,0,1-2.319-3.619v-1.949Z" data-name="Path 457" opacity=".1" transform="translate(436.74 -129.843)"/><path id="Path_458" fill="#3f3d56" d="M280.294,512.532l-33.944.65V507.55l33.944-.65Z" data-name="Path 458" transform="translate(517.685 42.387)"/><path id="Path_459" d="M280.294,512.532l-33.944.65V507.55l33.944-.65Z" data-name="Path 459" opacity=".1" transform="translate(517.685 42.387)"/><path id="Path_460" fill="#3f3d56" d="M282.294,512.532l-33.944.65V507.55l33.944-.65Z" data-name="Path 460" transform="translate(516.984 42.387)"/><path id="Path_461" d="M552.228,360.039A6.334,6.334,0,0,1,551,357.22a6.165,6.165,0,0,0,.273,2.988A5.847,5.847,0,0,0,552.228,360.039Z" data-name="Path 461" transform="translate(359.434 -17.505)"/><path id="Path_462" d="M540.1,366.9a22.83,22.83,0,0,1-.24-2.4c0,.8,0,1.6,0,2.41Z" data-name="Path 462" transform="translate(363.311 -20.056)"/><path id="Path_463" d="M621.706,398.627a11.912,11.912,0,0,1,.234-1.722,11.7,11.7,0,0,0,.52-3.047,4.008,4.008,0,0,0-.1-.689c-.11.6-.286,1.2-.416,1.787a12.433,12.433,0,0,0-.234,3.671Z" data-name="Path 463" transform="translate(334.652 -30.1)"/><path id="Path_464" d="M600.922,368.894l.708.513a12.8,12.8,0,0,0,1.67-1.442,2.384,2.384,0,0,0,.247-2.365,1.95,1.95,0,0,1-.247.416C602.5,367.042,600.734,367.607,600.922,368.894Z" data-name="Path 464" transform="translate(341.923 -20.441)"/><path id="Path_465" d="M518.455,380.29a8,8,0,0,0-.565,1.481,11.8,11.8,0,0,1,3.248-1.228Z" data-name="Path 465" transform="translate(371.008 -25.587)"/><path id="Path_466" d="M531.888,368.979a9.637,9.637,0,0,1-1.221-.8,2.758,2.758,0,0,0,.058.767,7.7,7.7,0,0,1,1.163.033Z" data-name="Path 466" transform="translate(366.534 -21.345)"/><path id="Path_467" d="M587.579,428.33c-.266,3.151-1.735,6.185-2.923,9.173a87.2,87.2,0,0,0-4.736,18.717c-.9,5.71-1.949,12.194-6.821,15.358a19.488,19.488,0,0,1-4.437,1.949c-7,2.423-14.065,4.853-21.439,5.736s-15.111.11-21.543-3.567a12.993,12.993,0,0,1-4.664-4.112c-1.735-2.748-1.767-6.191-2.6-9.336a53.424,53.424,0,0,0-2.6-6.834c-1.436-3.5-2.54-7.146-3.638-10.739q-1.527-5.009-3.047-10.024a18.716,18.716,0,0,1-.741-3.086,11.644,11.644,0,0,0,.741,5.035q1.52,5.022,3.047,10.024c1.1,3.619,2.2,7.244,3.638,10.739a53.417,53.417,0,0,1,2.6,6.834c.819,3.144.851,6.587,2.6,9.336a12.993,12.993,0,0,0,4.664,4.112c6.432,3.677,14.188,4.45,21.543,3.567s14.409-3.313,21.439-5.736a19.487,19.487,0,0,0,4.437-1.949c4.84-3.164,5.918-9.647,6.821-15.358a87.2,87.2,0,0,1,4.736-18.717c1.416-3.56,3.248-7.179,2.936-11.005C587.592,428.408,587.579,428.369,587.579,428.33Z" data-name="Path 467" transform="translate(374.359 -42.418)"/><path id="Path_468" d="M510.318,421.419v-.071a9.1,9.1,0,0,0-.3-3.411,17.272,17.272,0,0,1-.253-2.157,17.769,17.769,0,0,0,.253,4.106C510.123,420.393,510.24,420.906,510.318,421.419Z" data-name="Path 468" transform="translate(373.864 -38.021)"/><path id="Path_469" d="M512.452,397.929a18.02,18.02,0,0,1,1.7-2.384c-1.189,1.137-3.385.123-3.846-1.455a3.788,3.788,0,0,0,0,1.949,2.852,2.852,0,0,0,2.15,1.89Z" data-name="Path 469" transform="translate(373.712 -30.422)"/><path id="Path_470" d="M762.946,656.57s2.059,7.471,0,13.968S762.946,656.57,762.946,656.57Z" data-name="Path 470" opacity=".1" transform="translate(285.475 -122.381)"/><path id="Path_471" d="M776,668.3s.864,9.485-1.085,11.168S776,668.3,776,668.3Z" data-name="Path 471" opacity=".1" transform="translate(281.189 -126.49)"/><line id="Line_88" x2="66.011" y1=".65" fill="none" stroke="#00ddf1" stroke-miterlimit="10" stroke-width="2" data-name="Line 88" transform="translate(733.267 442.068)"/><line id="Line_89" x2="66.011" y1=".643" fill="none" stroke="#00ddf1" stroke-miterlimit="10" stroke-width="2" data-name="Line 89" transform="translate(733.267 450.176)"/><line id="Line_90" x2="66.011" y1=".65" fill="none" stroke="#00ddf1" stroke-miterlimit="10" stroke-width="2" data-name="Line 90" transform="translate(733.267 458.277)"/></g></g></g></svg> \ No newline at end of file diff --git a/apps/OpenSign/src/assets/images/logo.png b/apps/OpenSign/src/assets/images/logo.png index 8db5381242..a8bdc1405d 100644 Binary files a/apps/OpenSign/src/assets/images/logo.png and b/apps/OpenSign/src/assets/images/logo.png differ diff --git a/apps/OpenSign/src/assets/images/pad.svg b/apps/OpenSign/src/assets/images/pad.svg index 2db7e9fe22..5248025546 100644 --- a/apps/OpenSign/src/assets/images/pad.svg +++ b/apps/OpenSign/src/assets/images/pad.svg @@ -1 +1 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="103.06" height="98.114" viewBox="0 0 103.06 98.114"><defs><style>.a{fill:#e0e0e0;}.b,.k{opacity:0.5;}.c{fill:url(#a);}.d{fill:#fafafa;}.e{fill:url(#b);}.f{fill:url(#c);}.g,.k{fill:#c2c2c2;}.h{fill:url(#d);}.i{fill:#fff;}.j{fill:url(#f);}</style><linearGradient id="a" x1="0.509" y1="0.997" x2="0.509" y2="-0.003" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="gray" stop-opacity="0.251"/><stop offset="0.54" stop-color="gray" stop-opacity="0.122"/><stop offset="1" stop-color="gray" stop-opacity="0.102"/></linearGradient><linearGradient id="b" x1="0.813" y1="0.841" x2="0.813" y2="-0.159" xlink:href="#a"/><linearGradient id="c" x1="1.78" y1="0.849" x2="1.78" y2="-0.151" xlink:href="#a"/><linearGradient id="d" x1="0.5" y1="1" x2="0.5" y2="0" xlink:href="#a"/><linearGradient id="f" x1="0.5" y1="0.999" x2="0.5" y2="-0.001" xlink:href="#a"/></defs><rect class="a" width="54.914" height="75.874" transform="matrix(0.978, -0.21, 0.21, 0.978, 8.686, 17.025)"/><g class="b" transform="translate(9.863 6.954)"><rect class="c" width="53.059" height="73.309" transform="matrix(0.978, -0.21, 0.21, 0.978, 0, 11.131)"/></g><rect class="d" width="51.708" height="71.69" transform="matrix(0.978, -0.21, 0.21, 0.978, 10.636, 18.471)"/><rect class="e" width="25.652" height="6.214" transform="matrix(0.978, -0.21, 0.21, 0.978, 22.788, 12.685)"/><path class="f" d="M441.307,91.352a3.672,3.672,0,1,0,4.272,2.837A3.629,3.629,0,0,0,441.307,91.352Zm1.215,5.667a2.119,2.119,0,1,1,1.578-2.513,2.093,2.093,0,0,1-1.578,2.513Z" transform="translate(-407.253 -87.292)"/><rect class="g" width="25.111" height="5.94" transform="matrix(0.978, -0.21, 0.21, 0.978, 22.996, 12.367)"/><path class="g" d="M441.629,91.351a3.51,3.51,0,1,0,4.168,2.7A3.51,3.51,0,0,0,441.629,91.351Zm1.161,5.416a2.026,2.026,0,1,1,1.556-2.405A2.026,2.026,0,0,1,442.79,96.767Z" transform="translate(-407.575 -87.291)"/><rect class="a" width="54.914" height="75.874" transform="translate(32.406 14.691)"/><g class="b" transform="translate(33.334 15.973)"><rect class="h" width="53.059" height="73.309"/></g><rect class="i" width="51.708" height="71.69" transform="translate(34.009 16.514)"/><rect class="h" width="25.652" height="6.214" transform="translate(47.105 13.405)"/><path class="j" d="M641.906,118a3.673,3.673,0,1,0,3.586,3.672A3.63,3.63,0,0,0,641.906,118Zm0,5.79a2.119,2.119,0,1,1,2.068-2.119,2.093,2.093,0,0,1-2.068,2.109Z" transform="translate(-581.976 -110.66)"/><rect class="g" width="25.111" height="5.94" transform="translate(47.375 13.139)"/><path class="g" d="M642.44,118a3.51,3.51,0,1,0,3.51,3.51A3.51,3.51,0,0,0,642.44,118Zm0,5.535a2.027,2.027,0,1,0,0-.006Z" transform="translate(-582.509 -110.66)"/><g class="b" transform="translate(0.816 92.615)"><rect class="g" width="0.472" height="2.68" transform="translate(1.103)"/><rect class="g" width="0.472" height="2.68" transform="translate(2.68 1.105) rotate(90)"/></g><g class="b" transform="translate(55.629)"><rect class="g" width="0.472" height="2.68" transform="translate(1.103)"/><rect class="g" width="0.472" height="2.68" transform="translate(2.68 1.103) rotate(90)"/></g><path class="k" d="M947.527,824.693a.579.579,0,0,1-.323-.7.278.278,0,0,0,.013-.064h0a.29.29,0,0,0-.522-.192h0a.293.293,0,0,0-.033.057.579.579,0,0,1-.7.323.278.278,0,0,0-.064-.013h0a.29.29,0,0,0-.192.521h0a.281.281,0,0,0,.057.033.579.579,0,0,1,.323.7.271.271,0,0,0-.013.064h0a.29.29,0,0,0,.521.192h0a.274.274,0,0,0,.033-.057.579.579,0,0,1,.7-.323.278.278,0,0,0,.064.013h0a.29.29,0,0,0,.192-.522h0A.274.274,0,0,0,947.527,824.693Z" transform="translate(-850.636 -727.615)"/><path class="k" d="M313.117,619.633a.579.579,0,0,1-.323-.7.277.277,0,0,0,.013-.064h0a.29.29,0,0,0-.521-.192h0a.277.277,0,0,0-.033.056.579.579,0,0,1-.7.323.287.287,0,0,0-.064-.013h0a.29.29,0,0,0-.192.522h0a.285.285,0,0,0,.057.033.579.579,0,0,1,.323.7.282.282,0,0,0-.013.064h0a.29.29,0,0,0,.521.192h0a.278.278,0,0,0,.033-.057.579.579,0,0,1,.7-.323.279.279,0,0,0,.064.012h0a.29.29,0,0,0,.192-.521h0A.276.276,0,0,0,313.117,619.633Z" transform="translate(-295.944 -548.323)"/><path class="k" d="M841.527,120.313a.579.579,0,0,1-.323-.7.279.279,0,0,0,.012-.064h0a.29.29,0,0,0-.521-.192h0a.274.274,0,0,0-.033.057.579.579,0,0,1-.7.323.282.282,0,0,0-.064-.013h0a.29.29,0,0,0-.192.521h0a.279.279,0,0,0,.057.033.579.579,0,0,1,.323.7.28.28,0,0,0-.013.064h0a.29.29,0,0,0,.521.192h0a.281.281,0,0,0,.033-.057.579.579,0,0,1,.7-.323.279.279,0,0,0,.064.013h0a.29.29,0,0,0,.192-.521h0A.279.279,0,0,0,841.527,120.313Z" transform="translate(-757.955 -111.745)"/><ellipse class="k" cx="0.946" cy="0.946" rx="0.946" ry="0.946" transform="translate(101.167 38.569)"/><ellipse class="k" cx="0.946" cy="0.946" rx="0.946" ry="0.946" transform="translate(28.047 92.875)"/><ellipse class="k" cx="0.946" cy="0.946" rx="0.946" ry="0.946" transform="translate(91.45 59.021)"/><ellipse class="k" cx="0.946" cy="0.946" rx="0.946" ry="0.946" transform="translate(10.004 11.161)"/><ellipse class="k" cx="0.946" cy="0.946" rx="0.946" ry="0.946" transform="translate(0 36.972)"/></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="103.06" height="98.114" viewBox="0 0 103.06 98.114"><defs><style>.a{fill:#e0e0e0}.b,.k{opacity:.5}.c{fill:url(#a)}.d{fill:#fafafa}.e{fill:url(#b)}.f{fill:url(#c)}.g,.k{fill:#c2c2c2}.h{fill:url(#d)}.i{fill:#fff}.j{fill:url(#f)}</style><linearGradient id="a" x1=".509" x2=".509" y1=".997" y2="-.003" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="gray" stop-opacity=".251"/><stop offset=".54" stop-color="gray" stop-opacity=".122"/><stop offset="1" stop-color="gray" stop-opacity=".102"/></linearGradient><linearGradient id="b" x1=".813" x2=".813" y1=".841" y2="-.159" xlink:href="#a"/><linearGradient id="c" x1="1.78" x2="1.78" y1=".849" y2="-.151" xlink:href="#a"/><linearGradient id="d" x1=".5" x2=".5" y1="1" y2="0" xlink:href="#a"/><linearGradient id="f" x1=".5" x2=".5" y1=".999" y2="-.001" xlink:href="#a"/></defs><rect width="54.914" height="75.874" class="a" transform="matrix(0.978, -0.21, 0.21, 0.978, 8.686, 17.025)"/><g class="b" transform="translate(9.863 6.954)"><rect width="53.059" height="73.309" class="c" transform="matrix(0.978, -0.21, 0.21, 0.978, 0, 11.131)"/></g><rect width="51.708" height="71.69" class="d" transform="matrix(0.978, -0.21, 0.21, 0.978, 10.636, 18.471)"/><rect width="25.652" height="6.214" class="e" transform="matrix(0.978, -0.21, 0.21, 0.978, 22.788, 12.685)"/><path d="M441.307,91.352a3.672,3.672,0,1,0,4.272,2.837A3.629,3.629,0,0,0,441.307,91.352Zm1.215,5.667a2.119,2.119,0,1,1,1.578-2.513,2.093,2.093,0,0,1-1.578,2.513Z" class="f" transform="translate(-407.253 -87.292)"/><rect width="25.111" height="5.94" class="g" transform="matrix(0.978, -0.21, 0.21, 0.978, 22.996, 12.367)"/><path d="M441.629,91.351a3.51,3.51,0,1,0,4.168,2.7A3.51,3.51,0,0,0,441.629,91.351Zm1.161,5.416a2.026,2.026,0,1,1,1.556-2.405A2.026,2.026,0,0,1,442.79,96.767Z" class="g" transform="translate(-407.575 -87.291)"/><rect width="54.914" height="75.874" class="a" transform="translate(32.406 14.691)"/><g class="b" transform="translate(33.334 15.973)"><rect width="53.059" height="73.309" class="h"/></g><rect width="51.708" height="71.69" class="i" transform="translate(34.009 16.514)"/><rect width="25.652" height="6.214" class="h" transform="translate(47.105 13.405)"/><path d="M641.906,118a3.673,3.673,0,1,0,3.586,3.672A3.63,3.63,0,0,0,641.906,118Zm0,5.79a2.119,2.119,0,1,1,2.068-2.119,2.093,2.093,0,0,1-2.068,2.109Z" class="j" transform="translate(-581.976 -110.66)"/><rect width="25.111" height="5.94" class="g" transform="translate(47.375 13.139)"/><path d="M642.44,118a3.51,3.51,0,1,0,3.51,3.51A3.51,3.51,0,0,0,642.44,118Zm0,5.535a2.027,2.027,0,1,0,0-.006Z" class="g" transform="translate(-582.509 -110.66)"/><g class="b" transform="translate(0.816 92.615)"><rect width=".472" height="2.68" class="g" transform="translate(1.103)"/><rect width=".472" height="2.68" class="g" transform="translate(2.68 1.105) rotate(90)"/></g><g class="b" transform="translate(55.629)"><rect width=".472" height="2.68" class="g" transform="translate(1.103)"/><rect width=".472" height="2.68" class="g" transform="translate(2.68 1.103) rotate(90)"/></g><path d="M947.527,824.693a.579.579,0,0,1-.323-.7.278.278,0,0,0,.013-.064h0a.29.29,0,0,0-.522-.192h0a.293.293,0,0,0-.033.057.579.579,0,0,1-.7.323.278.278,0,0,0-.064-.013h0a.29.29,0,0,0-.192.521h0a.281.281,0,0,0,.057.033.579.579,0,0,1,.323.7.271.271,0,0,0-.013.064h0a.29.29,0,0,0,.521.192h0a.274.274,0,0,0,.033-.057.579.579,0,0,1,.7-.323.278.278,0,0,0,.064.013h0a.29.29,0,0,0,.192-.522h0A.274.274,0,0,0,947.527,824.693Z" class="k" transform="translate(-850.636 -727.615)"/><path d="M313.117,619.633a.579.579,0,0,1-.323-.7.277.277,0,0,0,.013-.064h0a.29.29,0,0,0-.521-.192h0a.277.277,0,0,0-.033.056.579.579,0,0,1-.7.323.287.287,0,0,0-.064-.013h0a.29.29,0,0,0-.192.522h0a.285.285,0,0,0,.057.033.579.579,0,0,1,.323.7.282.282,0,0,0-.013.064h0a.29.29,0,0,0,.521.192h0a.278.278,0,0,0,.033-.057.579.579,0,0,1,.7-.323.279.279,0,0,0,.064.012h0a.29.29,0,0,0,.192-.521h0A.276.276,0,0,0,313.117,619.633Z" class="k" transform="translate(-295.944 -548.323)"/><path d="M841.527,120.313a.579.579,0,0,1-.323-.7.279.279,0,0,0,.012-.064h0a.29.29,0,0,0-.521-.192h0a.274.274,0,0,0-.033.057.579.579,0,0,1-.7.323.282.282,0,0,0-.064-.013h0a.29.29,0,0,0-.192.521h0a.279.279,0,0,0,.057.033.579.579,0,0,1,.323.7.28.28,0,0,0-.013.064h0a.29.29,0,0,0,.521.192h0a.281.281,0,0,0,.033-.057.579.579,0,0,1,.7-.323.279.279,0,0,0,.064.013h0a.29.29,0,0,0,.192-.521h0A.279.279,0,0,0,841.527,120.313Z" class="k" transform="translate(-757.955 -111.745)"/><ellipse cx=".946" cy=".946" class="k" rx=".946" ry=".946" transform="translate(101.167 38.569)"/><ellipse cx=".946" cy=".946" class="k" rx=".946" ry=".946" transform="translate(28.047 92.875)"/><ellipse cx=".946" cy=".946" class="k" rx=".946" ry=".946" transform="translate(91.45 59.021)"/><ellipse cx=".946" cy=".946" class="k" rx=".946" ry=".946" transform="translate(10.004 11.161)"/><ellipse cx=".946" cy=".946" class="k" rx=".946" ry=".946" transform="translate(0 36.972)"/></svg> \ No newline at end of file diff --git a/apps/OpenSign/src/assets/images/pdf3.png b/apps/OpenSign/src/assets/images/pdf3.png index 54868d5e81..f529b452c1 100644 Binary files a/apps/OpenSign/src/assets/images/pdf3.png and b/apps/OpenSign/src/assets/images/pdf3.png differ diff --git a/apps/OpenSign/src/assets/images/recreatedoc.png b/apps/OpenSign/src/assets/images/recreatedoc.png index 3348345cc9..0dcd06762e 100644 Binary files a/apps/OpenSign/src/assets/images/recreatedoc.png and b/apps/OpenSign/src/assets/images/recreatedoc.png differ diff --git a/apps/OpenSign/src/components/AddSigner.jsx b/apps/OpenSign/src/components/AddSigner.jsx index 4bf088502c..a1b7ed8000 100644 --- a/apps/OpenSign/src/components/AddSigner.jsx +++ b/apps/OpenSign/src/components/AddSigner.jsx @@ -49,7 +49,7 @@ const AddSigner = (props) => { e.preventDefault(); e.stopPropagation(); if (!emailRegex.test(email)) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); } else { setIsLoader(true); if (localStorage.getItem("TenantId")) { diff --git a/apps/OpenSign/src/components/AddUser.jsx b/apps/OpenSign/src/components/AddUser.jsx index 27fc8b0934..d8da34dd09 100644 --- a/apps/OpenSign/src/components/AddUser.jsx +++ b/apps/OpenSign/src/components/AddUser.jsx @@ -1,6 +1,5 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import Parse from "parse"; -import Title from "./Title"; import Loader from "../primitives/Loader"; import { copytoData, @@ -72,7 +71,7 @@ const AddUser = (props) => { e.preventDefault(); e.stopPropagation(); if (!emailRegex.test(formdata.email)) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); } else { const localUser = JSON.parse(localStorage.getItem("Extand_Class"))?.[0]; setIsFormLoader(true); @@ -100,7 +99,6 @@ const AddUser = (props) => { }; const res = await Parse.Cloud.run("adduser", params); const parseData = JSON.parse(JSON.stringify(res)); - console.log("parseData ", parseData); if (props.closePopup) { props.closePopup(); } @@ -155,7 +153,6 @@ const AddUser = (props) => { }; return ( <div className="shadow-md rounded-box my-[1px] p-3 bg-base-100 relative"> - <Title title={t("add-user")} /> {isFormLoader && ( <div className="absolute w-full h-full inset-0 flex justify-center items-center bg-base-content/30 z-50"> <Loader /> @@ -166,7 +163,7 @@ const AddUser = (props) => { <div className="mb-3"> <label htmlFor="name" - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("name")} <span className="text-[red] text-[13px]"> *</span> @@ -187,7 +184,7 @@ const AddUser = (props) => { <div className="mb-3"> <label htmlFor="email" - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("email")} <span className="text-[red] text-[13px]"> *</span> @@ -206,7 +203,7 @@ const AddUser = (props) => { /> </div> <div className="mb-3"> - <label className="block text-xs text-gray-700 font-semibold"> + <label className="block text-xs font-semibold"> {t("password")} </label> <div className="flex justify-between items-center op-input op-input-bordered op-input-sm text-base-content w-full h-full text-[13px]"> @@ -223,7 +220,7 @@ const AddUser = (props) => { <div className="mb-3"> <label htmlFor="phone" - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("phone")} {/* <span className="text-[red] text-[13px]"> *</span> */} @@ -240,7 +237,7 @@ const AddUser = (props) => { <div className="mb-3"> <label htmlFor="phone" - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("Role")} <span className="text-[red] text-[13px]"> *</span> diff --git a/apps/OpenSign/src/components/BulkSendUi.jsx b/apps/OpenSign/src/components/BulkSendUi.jsx index 439084825a..ea9b814180 100644 --- a/apps/OpenSign/src/components/BulkSendUi.jsx +++ b/apps/OpenSign/src/components/BulkSendUi.jsx @@ -17,6 +17,7 @@ const BulkSendUi = (props) => { const [isLoader, setIsLoader] = useState(false); const [signers, setSigners] = useState([]); const [emails, setEmails] = useState([]); + const [isPrefillExist, setIsPrefillExist] = useState(false); useEffect(() => { signatureExist(); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -24,9 +25,14 @@ const BulkSendUi = (props) => { //function to check at least one signature field exist const signatureExist = async () => { + const isPrefill = props?.Placeholders.some((x) => x?.Role === "prefill"); + if (isPrefill) { + setIsPrefillExist(isPrefill); + } setIsDisableBulkSend(false); const getPlaceholder = props?.Placeholders; - const checkIsSignatureExistt = getPlaceholder?.every((placeholderObj) => + const removePrefill = getPlaceholder.filter((x) => x?.Role !== "prefill"); + const checkIsSignatureExistt = removePrefill?.every((placeholderObj) => placeholderObj?.placeHolder?.some((holder) => holder?.pos?.some((posItem) => posItem?.type === "signature") ) @@ -216,7 +222,11 @@ const BulkSendUi = (props) => { <Loader /> </div> )} - {!isDisableBulkSend ? ( + {isPrefillExist ? ( + <div className="text-black p-3 bg-white w-full text-sm md:text-base flex justify-center items-center"> + {t("prefill-bulk-error")} + </div> + ) : !isDisableBulkSend ? ( <> {props.Placeholders?.length > 0 ? ( isSignatureExist ? ( diff --git a/apps/OpenSign/src/components/ColumnSelector.jsx b/apps/OpenSign/src/components/ColumnSelector.jsx new file mode 100644 index 0000000000..879461db2f --- /dev/null +++ b/apps/OpenSign/src/components/ColumnSelector.jsx @@ -0,0 +1,63 @@ +import React, { useState, useEffect } from "react"; +import ModalUi from "../primitives/ModalUi"; +import { useTranslation } from "react-i18next"; + +const ColumnSelector = ({ + isOpen, + allColumns = [], + visibleColumns = [], + columnLabels = {}, + defaultColumns = [], + onApply, + onClose +}) => { + const { t } = useTranslation(); + const [selected, setSelected] = useState(visibleColumns); + const [names, setNames] = useState(columnLabels); + + useEffect(() => { + setSelected(visibleColumns); + setNames(columnLabels); + }, [visibleColumns, columnLabels]); + + const handleChange = (col) => { + setSelected((prev) => + prev.includes(col) ? prev.filter((c) => c !== col) : [...prev, col] + ); + }; + + const handleApply = () => { + onApply && onApply(selected, names); + onClose && onClose(); + }; + + return ( + <ModalUi isOpen={isOpen} title={t("select-columns")} handleClose={onClose}> + <div className="p-[20px] flex flex-col gap-2"> + {allColumns.map((col, i) => ( + <div key={col} className="flex justify-between items-center gap-2"> + <span className="flex justify-center items-center h-full"> + <input + id={col + "_" + i} + type="checkbox" + checked={selected.includes(col)} + onChange={() => handleChange(col)} + className="mb-0" + /> + <span className="whitespace-nowrap ml-1"> + {t(`report-heading.${col}`, { defaultValue: col })} + </span> + </span> + </div> + ))} + <div className="flex justify-start mt-2"> + <button onClick={handleApply} className="op-btn op-btn-primary"> + {t("apply")} + </button> + </div> + </div> + </ModalUi> + ); +}; + +export default ColumnSelector; diff --git a/apps/OpenSign/src/components/DragProivder.jsx b/apps/OpenSign/src/components/DragProivder.jsx new file mode 100644 index 0000000000..3cb17c40b8 --- /dev/null +++ b/apps/OpenSign/src/components/DragProivder.jsx @@ -0,0 +1,51 @@ +import { HTML5Backend } from "react-dnd-html5-backend"; +import { TouchBackend } from "react-dnd-touch-backend"; +import { + DndProvider, + TouchTransition, + MouseTransition, + Preview +} from "react-dnd-multi-backend"; +import DragElement from "./pdf/DragElement"; +import LazyPage from "../primitives/LazyPage"; +import { GuidelinesProvider } from "../context/GuidelinesContext"; + +const HTML5toTouch = { + backends: [ + { + id: "html5", + backend: HTML5Backend, + transition: MouseTransition + }, + { + id: "touch", + backend: TouchBackend, + options: { enableMouseEvents: true }, + preview: true, + transition: TouchTransition + } + ] +}; + +/* This handling in only for devices which support touch */ +const generatePreview = (props) => { + const { item, style } = props; + const newStyle = { ...style }; + + return ( + <div style={newStyle}> + <DragElement {...item} /> + </div> + ); +}; + +export default function DragProvider({ Page, lazy = false }) { + return ( + <DndProvider options={HTML5toTouch}> + <Preview>{generatePreview}</Preview> + <GuidelinesProvider> + {lazy ? <LazyPage Page={Page} /> : <Page />} + </GuidelinesProvider> + </DndProvider> + ); +} diff --git a/apps/OpenSign/src/components/Header.jsx b/apps/OpenSign/src/components/Header.jsx index bad3eef04f..fe732a68dc 100644 --- a/apps/OpenSign/src/components/Header.jsx +++ b/apps/OpenSign/src/components/Header.jsx @@ -12,27 +12,43 @@ import { } from "../constant/Utils"; import { useTranslation } from "react-i18next"; import { appInfo } from "../constant/appinfo"; +import { useDispatch } from "react-redux"; +import { toggleSidebar } from "../redux/reducers/sidebarReducer.js"; -const Header = ({ showSidebar, setIsMenu, isConsole }) => { +const Header = ({ isConsole, setIsLoggingOut }) => { const { t, i18n } = useTranslation(); const navigate = useNavigate(); const { width } = useWindowSize(); + const dispatch = useDispatch(); const username = localStorage.getItem("username") || ""; const image = localStorage.getItem("profileImg") || dp; const [isOpen, setIsOpen] = useState(false); const [applogo, setAppLogo] = useState(""); + const [isDarkTheme, setIsDarkTheme] = useState(); const toggleDropdown = () => { setIsOpen(!isOpen); - if (width <= 768) { - setIsMenu(false); + closeSidebar(); + }; + const closeSidebar = () => { + if (width && width <= 768) { + dispatch(toggleSidebar(false)); } }; + useEffect(() => { initializeHead(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + useEffect(() => { + closeSidebar(); + }, [width]); + + const showSidebar = () => { + dispatch(toggleSidebar()); + }; + async function initializeHead() { const applogo = await getAppLogo(); @@ -44,8 +60,9 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { } } - const closeDropdown = async () => { + const handleLogout = async () => { setIsOpen(false); + setIsLoggingOut(true); try { await Parse.User.logOut(); } catch (err) { @@ -57,6 +74,7 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { let PageLanding = localStorage.getItem("PageLanding"); let baseUrl = localStorage.getItem("baseUrl"); let appid = localStorage.getItem("parseAppId"); + let favicon = localStorage.getItem("favicon"); localStorage.clear(); saveLanguageInLocal(i18n); @@ -66,7 +84,8 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { localStorage.setItem("userSettings", appdata); localStorage.setItem("baseUrl", baseUrl); localStorage.setItem("parseAppId", appid); - + localStorage.setItem("favicon", favicon); + setIsLoggingOut(false); navigate("/"); }; @@ -88,22 +107,15 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { useEffect(() => { - const updateLogoForTheme = () => { - const isDarkMode = + const updateThemeStatus = () => { + const isDarkTheme = document.documentElement.getAttribute("data-theme") === "opensigndark"; - const logo = isDarkMode - ? "/static/js/assets/images/logo-dark.png" // Path to the dark mode logo - : appInfo.applogo; // Use current logo for light mode - if (applogo !== logo) { - setAppLogo(logo); - } + setIsDarkTheme(isDarkTheme); }; - - // Set the logo immediately based on the current theme - updateLogoForTheme(); + updateThemeStatus(); const observer = new MutationObserver(() => { - updateLogoForTheme(); + updateThemeStatus(); }); observer.observe(document.documentElement, { @@ -112,10 +124,10 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { }); return () => observer.disconnect(); - }, [applogo]); + }, []); return ( - <div> + <> <div className="op-navbar bg-base-100 shadow touch-none"> <div className="flex-none"> <button @@ -130,7 +142,11 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { {applogo && ( <img className="object-contain h-full w-auto" - src={applogo} + src={ + isDarkTheme + ? "/static/js/assets/images/logo-dark.png" + : applogo + } alt="logo" /> )} @@ -235,7 +251,7 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { </li> </> )} - <li onClick={closeDropdown}> + <li onClick={handleLogout}> <span> <i className="fa-light fa-arrow-right-from-bracket"></i>{" "} {t("log-out")} @@ -245,7 +261,7 @@ const Header = ({ showSidebar, setIsMenu, isConsole }) => { </div> </div> </div> - </div> + </> ); }; diff --git a/apps/OpenSign/src/components/RotateAlert.jsx b/apps/OpenSign/src/components/RotateAlert.jsx index b25c57805f..3e804ff8a8 100644 --- a/apps/OpenSign/src/components/RotateAlert.jsx +++ b/apps/OpenSign/src/components/RotateAlert.jsx @@ -26,7 +26,7 @@ function RotateAlert(props) { props.setShowRotateAlert({ status: false, degree: 0 }) } type="button" - className="op-btn op-btn-ghost shadow-md" + className="op-btn op-btn-ghost text-base-content shadow-md" > {t("no")} </button> diff --git a/apps/OpenSign/src/components/Title.jsx b/apps/OpenSign/src/components/Title.jsx index 5db98c7953..a3d6cd6047 100644 --- a/apps/OpenSign/src/components/Title.jsx +++ b/apps/OpenSign/src/components/Title.jsx @@ -1,20 +1,82 @@ import { Helmet } from "react-helmet"; +import { useLocation, matchPath } from "react-router"; +import { useTranslation } from "react-i18next"; +import { useMemo } from "react"; +import { useManifestUrl } from "../hook/useManifestUrl"; -function Title({ title, drive }) { +const TITLE_MAP = { + "/": "login", + // Homelayout + "/dashboard/35KBoSgoAK": "Dashboard", + "/form/sHAnZphf69": "Sign Yourself", + "/form/8mZzFxbG1z": "Request Signatures", + "/form/template": "New Template", + "/report/6TeaPr321t": "Templates", + "/report/4Hhwbp482K": "Need your sign", + "/report/1MwEuxLEkF": "In Progress", + "/report/kQUoW4hUXz": "Completed", + "/report/ByHuevtCFY": "Drafts", + "/report/UPr2Fm5WY3": "Declined", + "/report/zNqBHXHsYH": "Expired", + "/report/contacts": "Contactbook", + "/drive": "Drive", + "/managesign": "My Signature", + "/preferences": "Preferences", + "/users": "Users", + "/profile": "profile", + "/changepassword": "change-password", + "/verify-document": "verify-document", + + "/signaturePdf/:docId": "Sign Yourself", + "/placeHolderSign/:docId": "Request Signatures", + "/template/:templateId": "New Template", + "/recipientSignPdf/:docId": "Request Signatures", + "/recipientSignPdf/:docId/:contactBookId": "Request Signatures", + "/load/recipientSignPdf/:docId/:contactBookId": "Request Signatures", + + // alone + "/debugpdf": "Debug Pdf", + "/forgetpassword": "forgot-password", + "/success": "success", + "/addadmin": "add-admin", + "/upgrade-2.1": "add-admin", + "/draftDocument": "New Document", + "/login/:base64url": "Request Signatures", + +}; + +function resolveTitle(pathname, override) { + if (override) return override; + for (let [pattern, label] of Object.entries(TITLE_MAP)) { + if (matchPath({ path: pattern, end: true }, pathname)) { + return label; + } + } + return ""; +} + +export default function Title() { + const { pathname, state } = useLocation(); + const { t } = useTranslation(); const appName = "OpenSign™"; + const logo = useMemo(() => localStorage.getItem("favicon"), []); + const prefix = useMemo( + () => resolveTitle(pathname, state?.title), + [pathname, state?.title] + ); + const title = useMemo( + () => (prefix ? `${t(prefix)} - ${appName}` : appName), + [t, prefix, appName] + ); + const manifestUrl = useManifestUrl(appName, logo); + return ( <Helmet> - <title>{drive ? title : `${title} - ${appName}`} - - + {title} + + {logo && } + ); } - -export default Title; diff --git a/apps/OpenSign/src/components/dashboard/DashboardReport.jsx b/apps/OpenSign/src/components/dashboard/DashboardReport.jsx index 8cdc3d0565..9832578b7e 100644 --- a/apps/OpenSign/src/components/dashboard/DashboardReport.jsx +++ b/apps/OpenSign/src/components/dashboard/DashboardReport.jsx @@ -1,6 +1,6 @@ -import React, { useEffect, useState, useRef } from "react"; +import { useEffect, useState, useRef } from "react"; import Parse from "parse"; -import ReportTable from "../../primitives/GetReportDisplay"; +import DocumentsReport from "../../reports/document/DocumentsReport"; import reportJson from "../../json/ReportJson"; import axios from "axios"; import Loader from "../../primitives/Loader"; @@ -198,7 +198,7 @@ function DashboardReport(props) { ) : ( <> {reportName ? ( - ) : ( -
-
-

{t("report-not-found")}

+
+
+ {t("report-not-found")}
)} diff --git a/apps/OpenSign/src/components/dashboard/GetDashboard.jsx b/apps/OpenSign/src/components/dashboard/GetDashboard.jsx index 4173d3e2d7..8bd7250b94 100644 --- a/apps/OpenSign/src/components/dashboard/GetDashboard.jsx +++ b/apps/OpenSign/src/components/dashboard/GetDashboard.jsx @@ -1,8 +1,9 @@ -import React, { Suspense, lazy } from "react"; +import React, { Suspense } from "react"; +import { lazyWithRetry } from "../../utils"; import { useTranslation } from "react-i18next"; -const DashboardButton = lazy(() => import("./DashboardButton")); -const DashboardCard = lazy(() => import("./DashboardCard")); -const DashboardReport = lazy(() => import("./DashboardReport")); +const DashboardButton = lazyWithRetry(() => import("./DashboardButton")); +const DashboardCard = lazyWithRetry(() => import("./DashboardCard")); +const DashboardReport = lazyWithRetry(() => import("./DashboardReport")); const buttonList = [ { label: "Sign yourself", diff --git a/apps/OpenSign/src/components/opensigndrive/DriveBody.jsx b/apps/OpenSign/src/components/opensigndrive/DriveBody.jsx index e140a33656..7ea1c52241 100644 --- a/apps/OpenSign/src/components/opensigndrive/DriveBody.jsx +++ b/apps/OpenSign/src/components/opensigndrive/DriveBody.jsx @@ -366,14 +366,14 @@ function DriveBody(props) { {data.Name} _ - Folder + {t("folder")} _ _ @@ -390,7 +390,7 @@ function DriveBody(props) { {data.Name} {createddate} - Pdf + {t("pdf")} {t(`drive-document-status.${status}`)} @@ -458,14 +458,14 @@ function DriveBody(props) { className="ContextMenuItem" > - Rename + {t(`context-menu.Rename`)} handleMenuItemClick("Delete", data, data.Type)} className="ContextMenuItem" > - Delete + {t(`context-menu.Delete`)} @@ -550,7 +550,6 @@ function DriveBody(props) { ) )}
- )} - @@ -627,21 +625,21 @@ function DriveBody(props) { - {props?.pdfData?.map((data, ind) => { - return ( - - {handleFolderData(data, ind, "table")} - - ); - })} + {props?.pdfData?.map((data, ind) => ( + + {handleFolderData(data, ind, "table")} + + ))}
) : (
- {props.pdfData.map((data, ind) => { - return {handleFolderData(data, ind, "list")}; - })} + {props?.pdfData?.map((data, ind) => ( + + {handleFolderData(data, ind, "list")} + + ))}
)} diff --git a/apps/OpenSign/src/components/pdf/AddRoleModal.jsx b/apps/OpenSign/src/components/pdf/AddRoleModal.jsx index f052a74a39..652e89dbd0 100644 --- a/apps/OpenSign/src/components/pdf/AddRoleModal.jsx +++ b/apps/OpenSign/src/components/pdf/AddRoleModal.jsx @@ -33,7 +33,7 @@ const AddRoleModal = (props) => { diff --git a/apps/OpenSign/src/components/pdf/AgreementContent.jsx b/apps/OpenSign/src/components/pdf/AgreementContent.jsx index fff5a0eac3..50bf880a76 100644 --- a/apps/OpenSign/src/components/pdf/AgreementContent.jsx +++ b/apps/OpenSign/src/components/pdf/AgreementContent.jsx @@ -9,7 +9,6 @@ function AgreementContent(props) { const h2Style = "text-base-content font-medium text-lg"; const ulStyle = "list-disc px-4 py-3"; const handleOnclick = () => { - props.setIsAgreeTour(false); props.setIsAgree(true); props.setIsShowAgreeTerms(false); props.showFirstWidget(); @@ -119,7 +118,7 @@ function AgreementContent(props) { {t("agrre-button")}
{isShowAgreeTerms && ( { + if (props?.handleClose) { + props?.handleClose(); + return; + } + props?.setIsMailModal(false); + navigate("/report/1MwEuxLEkF"); + }; + const handleOnchangeRequest = () => { + if (editorRef.current) { + const html = editorRef.current.editor.root.innerHTML; + props?.setCustomizeMail((prev) => ({ + ...prev, + body: html + })); + } + }; + const handleEmailSendToSigners = async () => { + setIsLoader(true); + const documentData = await contractDocument(props?.documentId); + if (documentData && documentData?.length > 0) { + props?.setDocumentDetails(documentData[0]); + if ( + documentData?.[0]?.SendinOrder && + documentData?.[0]?.SendinOrder === true + ) { + const ownerEmail = documentData[0].ExtUserPtr.Email; + const ownerDetails = documentData[0].Signers.find( + (x) => x.Email === ownerEmail + ); + props?.setCurrUserId(ownerDetails?.objectId); + } + //function is used to send email to signers for sign the document + const mailRes = await sendEmailToSigners( + documentData, + props?.signerList, + props?.customizeMail, + props?.defaultMail, + isCustomize, + ); + props?.setIsMailModal(false); + props?.setIsSend(true); + setIsLoader(false); + if (mailRes?.status === "success") { + props?.setMailStatus("success"); + } else if (mailRes?.status === "quota-reached") { + props?.setMailStatus("quotareached"); + } else if (mailRes?.status === "daily-quota-reached") { + props?.setMailStatus("dailyquotareached"); + } else { + props?.setMailStatus("failed"); + } + // setMailStatus(mail_status); + } else { + alert("something-went-wrong-mssg"); + } + }; + return ( + <> + {isLoader ? ( +
+ +
+ ) : ( + handleCloseSendmailModal()} + > +
+ {!isCustomize && {t("placeholder-alert-3")}} + { + isCustomize && ( + <> + +
{ + props?.setCustomizeMail(props?.defaultMail); + }} + > + {t("reset-to-default")} +
+ + ) + } +
+
+ + {isCustomize && ( + + )} +
+ { + !isCustomize && ( + setIsCustomize(!isCustomize)} + > + {t("cutomize-email")} + + ) + } +
+ +
+ + {t("or")} + +
+
{props?.handleShareList()}
+

+
+
+ )} + + ); +} + +export default CustomizeMail; diff --git a/apps/OpenSign/src/components/pdf/DefaultSignature.jsx b/apps/OpenSign/src/components/pdf/DefaultSignature.jsx index 47347aa244..d74b4f1d65 100644 --- a/apps/OpenSign/src/components/pdf/DefaultSignature.jsx +++ b/apps/OpenSign/src/components/pdf/DefaultSignature.jsx @@ -3,43 +3,39 @@ import { useTranslation } from "react-i18next"; import { useSelector } from "react-redux"; function DefaultSignature(props) { const { t } = useTranslation(); - const defaultSignImg = useSelector((state) => state.widget.defaultSignImg); - const myInitial = useSelector((state) => state.widget.myInitial) + const defaultSignImg = useSelector((state) => state.widget.defaultSignImg); + const myInitial = useSelector((state) => state.widget.myInitial); const tabName = ["my-signature", "my-initials"]; const [activeTab, setActiveTab] = useState(0); const confirmToaddDefaultSign = (type) => { - if (!props.isAgree) { - props.setIsAgreeTour(true); - } else { - if (props?.xyPosition.length > 0) { - //check signature or initial widgets exist or not for auto signing - const getCurrentSignerXY = props?.xyPosition.filter( - (data) => data.Id === props.uniqueId - ); - const checkIsSignInitialExist = getCurrentSignerXY?.every( - (placeholderObj) => - placeholderObj?.placeHolder?.some((placeholder) => - placeholder?.pos?.some((posItem) => posItem?.type === type) - ) - ); - if (checkIsSignInitialExist) { - props?.setDefaultSignAlert({ - isShow: true, - alertMessage: t("default-sign-alert", { widgetsType: type }), - type: type - }); - } else { - props?.setDefaultSignAlert({ - isShow: true, - alertMessage: t("defaultSign-alert", { widgetsType: type }) - }); - } + if (props?.xyPosition.length > 0) { + //check signature or initial widgets exist or not for auto signing + const getCurrentSignerXY = props?.xyPosition.filter( + (data) => data.Id === props.uniqueId + ); + const checkIsSignInitialExist = getCurrentSignerXY?.every( + (placeholderObj) => + placeholderObj?.placeHolder?.some((placeholder) => + placeholder?.pos?.some((posItem) => posItem?.type === type) + ) + ); + if (checkIsSignInitialExist) { + props?.setDefaultSignAlert({ + isShow: true, + alertMessage: t("default-sign-alert", { widgetsType: type }), + type: type + }); } else { props?.setDefaultSignAlert({ isShow: true, - alertMessage: t("please-select-position!") + alertMessage: t("defaultSign-alert", { widgetsType: type }) }); } + } else { + props?.setDefaultSignAlert({ + isShow: true, + alertMessage: t("please-select-position!") + }); } }; diff --git a/apps/OpenSign/src/components/pdf/DragElement.jsx b/apps/OpenSign/src/components/pdf/DragElement.jsx index e8bcfed528..446a3cb73c 100644 --- a/apps/OpenSign/src/components/pdf/DragElement.jsx +++ b/apps/OpenSign/src/components/pdf/DragElement.jsx @@ -1,5 +1,5 @@ -import React from "react"; -import { getWidgetType, widgets } from "../../constant/Utils"; +import { widgets } from "../../constant/Utils"; +import getWidgetType from "./getWidgetType"; function DragElement(item) { const getWidgets = widgets; diff --git a/apps/OpenSign/src/components/pdf/DropdownWidgetOption.jsx b/apps/OpenSign/src/components/pdf/DropdownWidgetOption.jsx index 4f913b949a..d427354f7f 100644 --- a/apps/OpenSign/src/components/pdf/DropdownWidgetOption.jsx +++ b/apps/OpenSign/src/components/pdf/DropdownWidgetOption.jsx @@ -21,6 +21,7 @@ function DropdownWidgetOption(props) { const [layout, setLayout] = useState("vertical"); const statusArr = ["required", "optional"]; const layoutArr = ["vertical", "horizontal"]; + const isPrefillExist = props?.roleName === "prefill"; const resetState = () => { setDropdownOptionList(["Option-1", "Option-2"]); @@ -87,7 +88,7 @@ function DropdownWidgetOption(props) { const deleteOption = true; const addOption = false; const getUpdatedOptions = dropdownOptionList.filter( - (data, index) => index !== ind + (_, index) => index !== ind ); setDropdownOptionList(getUpdatedOptions); props.handleSaveWidgetsOptions( @@ -102,6 +103,14 @@ function DropdownWidgetOption(props) { }; const handleSaveOption = () => { + if (["checkbox", radioButtonWidget, "dropdown"].includes(props.type)) { + const allUnique = + new Set(dropdownOptionList).size === dropdownOptionList.length; + if (!allUnique) { + alert("Please remove duplicate option"); + return; + } + } const defaultData = defaultCheckbox && defaultCheckbox.length > 0 ? defaultCheckbox @@ -228,37 +237,40 @@ function DropdownWidgetOption(props) { >
))} - +
+ +
- {["dropdown", radioButtonWidget].includes(props.type) && ( - <> - - - - )} - {props.type !== "checkbox" && ( + {["dropdown", radioButtonWidget].includes(props.type) && + !isPrefillExist && ( + <> + + + + )} + {props.type !== "checkbox" && !isPrefillExist && (
{statusArr.map((data, ind) => (
- {props.isShowAdvanceFeature && ( + {props.isShowAdvanceFeature && !isPrefillExist && (
0 && (
- + e.target.setCustomValidity(t("input-required"))} onInput={(e) => e.target.setCustomValidity("")} value={props.requestSubject} - onChange={(e) => props.setRequestSubject(e.target.value)} + onChange={(e) => { + props?.setRequestSubject(e.target.value); + props?.setCustomizeMail((prev) => ({ + ...prev, + subject: e.target.value + })); + }} placeholder='${senderName} has requested you to sign "${documentName}"' className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" /> diff --git a/apps/OpenSign/src/components/pdf/Guidelines.jsx b/apps/OpenSign/src/components/pdf/Guidelines.jsx new file mode 100644 index 0000000000..96a42319d5 --- /dev/null +++ b/apps/OpenSign/src/components/pdf/Guidelines.jsx @@ -0,0 +1,30 @@ +const Guidelines = ({ x1, x2, y1, y2 }) => { + return ( + <> + {/* Horizontal guidelines */} + {/* top guide */}{" "} +
+ {/* bottom guide */} +
+ {/* Vertical guidelines */} + {/* left guide */} +
+ {/* right guide */} +
+ + ); +}; + +export default Guidelines; diff --git a/apps/OpenSign/src/components/pdf/PageReorderModal.jsx b/apps/OpenSign/src/components/pdf/PageReorderModal.jsx index 03c24077da..a152fb3c20 100644 --- a/apps/OpenSign/src/components/pdf/PageReorderModal.jsx +++ b/apps/OpenSign/src/components/pdf/PageReorderModal.jsx @@ -61,14 +61,14 @@ export default function PageReorderModal({
diff --git a/apps/OpenSign/src/components/pdf/PdfHeader.jsx b/apps/OpenSign/src/components/pdf/PdfHeader.jsx index fb40e789eb..04bf23fbea 100644 --- a/apps/OpenSign/src/components/pdf/PdfHeader.jsx +++ b/apps/OpenSign/src/components/pdf/PdfHeader.jsx @@ -23,9 +23,6 @@ import { maxFileSize } from "../../constant/const"; function Header(props) { const { t } = useTranslation(); - const filterPrefill = - props?.signerPos && - props?.signerPos?.filter((data) => data.Role !== "prefill"); const isMobile = window.innerWidth < 767; const [isDownloading, setIsDownloading] = useState(""); const [isDeletePage, setIsDeletePage] = useState(false); @@ -71,14 +68,13 @@ function Header(props) { const handleFileUpload = async (e) => { const file = e.target.files[0]; if (!file) { - alert("Please upload a valid PDF file."); + alert(t("please-select-pdf")); return; } if (!file.type.includes("pdf")) { - alert("Only PDF files are allowed."); + alert(t("only-pdf-allowed")); return; } - const mb = Math.round(file?.size / Math.pow(1024, 2)); if (mb > maxFileSize) { alert(`${t("file-alert-1")} ${maxFileSize} MB`); @@ -108,18 +104,18 @@ function Header(props) { // Upload the file to Parse Server } catch (err) { console.error("Incorrect password or decryption failed", err); - alert("Incorrect password or decryption failed."); + alert(t("incorrect-password-or-decryption-failed")); } } else { - alert("Please provided Password."); + alert(t("provide-password")); } } else { console.log("Err ", err); - alert("error while uploading pdf."); + alert(t("error-uploading-pdf")); } } } else { - alert("error while uploading pdf."); + alert(t("error-uploading-pdf")); } } const uploadedPdfDoc = await PDFDocument.load(uploadedPdfBytes, { @@ -162,6 +158,21 @@ function Header(props) { } setIsReorderModal(false); }; + + const handleDownloadDoc = async () => { + await handleDownloadPdf( + props?.pdfDetails, + setIsDownloading, + props.pdfBase64 + ); + }; + const handleDownloadBtn = async () => { + if (props?.isCompleted) { + props?.setIsDownloadModal(true); + } else { + await handleDownloadDoc(); + } + }; return (
{isMobile && props?.isShowHeader ? ( @@ -201,17 +212,7 @@ function Header(props) { > { - if (props?.isCompleted) { - props?.setIsDownloadModal(true); - } else { - handleDownloadPdf( - props?.pdfDetails, - setIsDownloading, - props.pdfBase64 - ); - } - }} + onClick={() => handleDownloadBtn()} >
{ if (!props?.isMailSend) { - props?.alertSendEmail(); + props?.handleSaveDoc(); } }} className={`${ @@ -348,13 +349,7 @@ function Header(props) { )} - handleDownloadPdf( - props?.pdfDetails, - setIsDownloading, - props.pdfBase64 - ) - } + onClick={() => handleDownloadDoc()} >
{props?.isPlaceholder ? ( <> -
- {!props?.isMailSend && - props?.signersdata.length > 0 && - props?.signersdata.length !== filterPrefill.length && ( -
- {filterPrefill.length === 0 ? ( - - {t("add")}{" "} - {props?.signersdata.length - filterPrefill.length}{" "} - {t("recipients")} {t("widgets-name.signature")} - - ) : ( - - {t("add")}{" "} - {props?.signersdata.length - filterPrefill.length}{" "} - {t("more")} - {t("recipients")} {t("widgets-name.signature")} - - )} -
- )} -
+
{props?.setIsEditTemplate && ( )} {enabledBackBtn && ( @@ -518,7 +492,7 @@ function Header(props) { disabled={props?.isMailSend && true} data-tut="headerArea" className="op-btn op-btn-primary op-btn-sm mr-[3px]" - onClick={() => props?.alertSendEmail()} + onClick={() => props?.handleSaveDoc()} > {props?.completeBtnTitle ? props?.completeBtnTitle @@ -565,17 +539,7 @@ function Header(props) { @@ -614,14 +572,8 @@ function Header(props) { {!props?.templateId && ( @@ -744,8 +696,8 @@ function Header(props) { handleClose={() => setIsDeletePage(false)} >
-

{t("delete-alert-2")}

-

{t("delete-note")}

+

{t("delete-alert-2")}

+

{t("delete-note")}

diff --git a/apps/OpenSign/src/components/pdf/PdfZoom.jsx b/apps/OpenSign/src/components/pdf/PdfTools.jsx similarity index 79% rename from apps/OpenSign/src/components/pdf/PdfZoom.jsx rename to apps/OpenSign/src/components/pdf/PdfTools.jsx index caff5f9e99..8a3e55ab1e 100644 --- a/apps/OpenSign/src/components/pdf/PdfZoom.jsx +++ b/apps/OpenSign/src/components/pdf/PdfTools.jsx @@ -14,7 +14,7 @@ import { PDFDocument } from "pdf-lib"; import { maxFileSize } from "../../constant/const"; import PageReorderModal from "./PageReorderModal"; -function PdfZoom(props) { +function PdfTools(props) { const { t } = useTranslation(); const mergePdfInputRef = useRef(null); const [isDeletePage, setIsDeletePage] = useState(false); @@ -57,13 +57,14 @@ function PdfZoom(props) { }; const handleFileUpload = async (e) => { + props.setIsTour && props.setIsTour(false); const file = e.target.files[0]; if (!file) { - alert("Please upload a valid PDF file."); + alert(t("please-select-pdf")); return; } if (!file.type.includes("pdf")) { - alert("Only PDF files are allowed."); + alert(t("only-pdf-allowed")); return; } const mb = Math.round(file?.size / Math.pow(1024, 2)); @@ -95,18 +96,18 @@ function PdfZoom(props) { // Upload the file to Parse Server } catch (err) { console.error("Incorrect password or decryption failed", err); - alert("Incorrect password or decryption failed."); + alert(t("incorrect-password-or-decryption-failed")); } } else { - alert("Please provided Password."); + alert(t("provide-password")); } } else { console.log("Err ", err); - alert("error while uploading pdf."); + alert(t("error-uploading-pdf")); } } } else { - alert("error while uploading pdf."); + alert(t("error-uploading-pdf")); } } const uploadedPdfDoc = await PDFDocument.load(uploadedPdfBytes, { @@ -150,13 +151,42 @@ function PdfZoom(props) { setIsReorderModal(false); }; + const handleDeletePage = () => { + setIsDeletePage(true); + props.setIsTour && props.setIsTour(false); + }; + + const handleReorderPages = () => { + setIsReorderModal(true); + props.setIsTour && props.setIsTour(false); + }; + + const handleZoomIn = () => { + props.clickOnZoomIn(); + props.setIsTour && props.setIsTour(false); + }; + const handleZoomOut = () => { + props.clickOnZoomOut(); + props.setIsTour && props.setIsTour(false); + }; + const handleRotate = () => { + props.handleRotationFun(90); + props.setIsTour && props.setIsTour(false); + }; + const handleAntiRotate = () => { + props.handleRotationFun(-90); + props.setIsTour && props.setIsTour(false); + }; return ( <> - + {!props.isDisableEditTools && ( <> mergePdfInputRef.current.click()} title={t("add-pages")} > @@ -170,15 +200,15 @@ function PdfZoom(props) { setIsDeletePage(true)} + className="bg-gray-50 px-[4px] 2xl:py-[10px] cursor-pointer" + onClick={handleDeletePage} title={t("delete-page")} > setIsReorderModal(true)} + className="bg-gray-50 px-[4px] 2xl:py-[10px] cursor-pointer" + onClick={handleReorderPages} title={t("reorder-pages")} > @@ -187,7 +217,7 @@ function PdfZoom(props) { )} props.clickOnZoomIn()} + onClick={handleZoomIn} title={t("zoom-in")} > @@ -197,7 +227,7 @@ function PdfZoom(props) { <> props.handleRotationFun(90)} + onClick={handleRotate} title={t("rotate-right")} > @@ -205,18 +235,15 @@ function PdfZoom(props) { props.handleRotationFun(-90)} + onClick={handleAntiRotate} > )} props.clickOnZoomOut()} - style={{ - cursor: props.zoomPercent > 0 ? "pointer" : "default" - }} + className="bg-gray-50 px-[4px] 2xl:py-[10px] cursor-pointer" + onClick={handleZoomOut} title={t("zoom-out")} > @@ -229,8 +256,8 @@ function PdfZoom(props) { handleClose={() => setIsDeletePage(false)} >
-

{t("delete-alert-2")}

-

{t("delete-note")}

+

{t("delete-alert-2")}

+

{t("delete-note")}

@@ -258,4 +285,4 @@ function PdfZoom(props) { ); } -export default PdfZoom; +export default PdfTools; diff --git a/apps/OpenSign/src/components/pdf/Placeholder.jsx b/apps/OpenSign/src/components/pdf/Placeholder.jsx index d765bffb34..00f5ed186a 100644 --- a/apps/OpenSign/src/components/pdf/Placeholder.jsx +++ b/apps/OpenSign/src/components/pdf/Placeholder.jsx @@ -8,23 +8,27 @@ import { fontsizeArr, getContainerScale, handleCopyNextToWidget, - handleCopySignUrl, handleHeighlightWidget, onChangeInput, radioButtonWidget, textInputWidget, cellsWidget, textWidget, - selectFormat + selectFormat, + randomId } from "../../constant/Utils"; import PlaceholderType from "./PlaceholderType"; import moment from "moment"; import "../../styles/opensigndrive.css"; import ModalUi from "../../primitives/ModalUi"; import { useTranslation } from "react-i18next"; -import { useDispatch } from "react-redux"; -import { setIsShowModal } from "../../redux/reducers/widgetSlice"; +import { useDispatch, useSelector } from "react-redux"; +import { + setIsShowModal, + setPrefillImg +} from "../../redux/reducers/widgetSlice"; import { themeColor } from "../../constant/const"; +import { useGuidelinesContext } from "../../context/GuidelinesContext"; //function to get default format const getDefaultFormat = (dateFormat) => dateFormat || "MM/dd/yyyy"; @@ -47,6 +51,8 @@ const getDefaultDate = (dateStr, format) => { function Placeholder(props) { const { t } = useTranslation(); const dispatch = useDispatch(); + const prefillImg = useSelector((state) => state.widget.prefillImg); + const { showGuidelines } = useGuidelinesContext(); const widgetData = props.pos?.options?.defaultValue || props.pos?.options?.response; const [isDateModal, setIsDateModal] = useState(false); @@ -128,15 +134,18 @@ function Placeholder(props) { // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectDate]); - //`handleWidgetIdandPopup` is used to set current widget id and open relative popup - const handleWidgetIdandPopup = async () => { + const handleOnClickPlaceholder = async () => { + props?.setIsReqSignTourDisabled && props?.setIsReqSignTourDisabled(true); //'props.isOpenSignPad' variable is used to check flow to open signature pad for finish document + //request sign, signyourself, selfsign,public-sign, kiosk mode if ( props.isOpenSignPad && !props.isDragging && !props.pos.options?.isReadOnly && - props.pos.type !== textWidget + props?.data?.Role !== "prefill" && + props.data?.Id === props.uniqueId ) { + props.setCurrWidgetsDetails && props.setCurrWidgetsDetails(props.pos); if (props?.ispublicTemplate) { props.handleUserDetails(); } else { @@ -157,118 +166,25 @@ function Placeholder(props) { } dispatch(setIsShowModal({ [props.pos.key]: true })); } - } else if ( - props.isPlaceholder && - !props.isDragging && - props.pos.type !== textWidget - ) { - if (props.pos.key === props?.currWidgetsDetails?.key) { + } + //placeholder, template flow + else if (props.isPlaceholder && !props.isDragging) { + props.setCurrWidgetsDetails && props.setCurrWidgetsDetails(props.pos); + if ( + props.pos.key === props?.currWidgetsDetails?.key && + props?.data?.Role !== "prefill" + ) { props.handleLinkUser(props.data.Id); props.setUniqueId(props.data.Id); const checkIndex = props.xyPosition.findIndex( (data) => data.Id === props.data.Id ); props.setIsSelectId(checkIndex || 0); + } else if (props?.data?.Role === "prefill") { + dispatch(setIsShowModal({ [props.pos.key]: true })); + props.setUniqueId(props?.data?.Id); + props?.setRoleName("prefill"); } - //handle prefill 'text widget' click then save previos in tem variable after save or close button again assign current selected userId - } else if (props.pos.type === textWidget) { - dispatch(setIsShowModal({ [props.pos.key]: true })); - props.setTempSignerId(props?.uniqueId); - props.setUniqueId(props?.data?.Id); - } - }; - - const widgetClickHandler = () => { - props.setCurrWidgetsDetails && props.setCurrWidgetsDetails(props.pos); - //condition to check in request signing flow user click on agree or not - if (props?.data?.signerObjId === props?.signerObjId && !props.isDragging) { - if (!props.isAgree && !props.isSelfSign) { - props.setIsAgreeTour && props.setIsAgreeTour(true); - } else { - handleWidgetIdandPopup(); - } - } //condition for open contact details popup when sign templet from public signing flow - else if (props?.uniqueId && props.data?.Id === props?.uniqueId) { - handleWidgetIdandPopup(); - } - }; - - const handleOnClickPlaceholder = () => { - //'props.isDragging' variable is used to checking if user take any widget and try to drag then in that case - //onclick event call. so to prevent onclick and do not open unecessary modal open. - //condition only for request signing flow and self signing flow then apply one click copy sign url of previous drawn signature - if (props.isApplyAll) { - props.setRequestSignTour && props.setRequestSignTour(true); - let isCopySignature = false; - let existSignPosition = ""; - //condition for 'signature','initials','stamp' widgets only - if (["signature", "initials", "stamp"].includes(props.pos.type)) { - const widgetKey = props.pos.key; - let exitLoop = false; - const placeholders = props.data.placeHolder; - //check onclick current widget signature/stamp/initials signature url exist or not - placeholders?.forEach((holder) => { - holder?.pos?.forEach((posItem) => { - if (posItem.SignUrl && posItem.type === props.pos.type) { - existSignPosition = posItem; - return; // Break out of the current iteration - } - }); - if (existSignPosition) { - return; - } - }); - //case:- - //1- Open signpad once when if there are no any signature url draw - //2- If multiple signature widgets are present, clicking on the next widget should copy the signature URL from the previously drawn signature - //3- If the user attempts to edit the signature, open the signature pad to allow drawing a new signature upon clicking. - for (const placeholderObj of props.data.placeHolder || []) { - for (const posItem of placeholderObj.pos || []) { - if (posItem.key === widgetKey) { - //This condition is used to open signature pad to draw signature in some case - //case-1 : The condition (!posItem.SignUrl && !existSignPosition) checks if the current widget being clicked does not have a drawn signature and no signature URL exists for any signature widget. - //case-2 : The condition posItem.SignUrl is used to verify if the current widget already has a drawn signature and if the user is attempting to edit it - if ((!posItem.SignUrl && !existSignPosition) || posItem.SignUrl) { - exitLoop = true; - } else { - //else condition is used to copy the signature URL from the previously drawn signature - exitLoop = true; - isCopySignature = true; - break; - } - } - } - if (exitLoop) { - break; // Stop iterating through placeholders if exitLoop true - } - } - //existSignPosition.type === props.pos.type ensures that the current widget's type matches the type of the widget associated with the existing signature URL during the click event - if ( - existSignPosition.type === props.pos.type && - existSignPosition && - isCopySignature - ) { - props.setCurrWidgetsDetails && props.setCurrWidgetsDetails(props.pos); - //function to copy the signature URL from the previously drawn signature when clicking on the next widget. - handleCopySignUrl( - props.pos, //currect widget position details - existSignPosition, //exist sign url widget's position details - props.setXyPosition, //used to update Placeholders details - props.xyPosition, //keep Placeholders details - props.pageNumber, //current page number - props.signerObjId //current signer's object id - ); - existSignPosition = ""; - } else { - widgetClickHandler(); - } - } else { - widgetClickHandler(); - } - } else { - //The else condition is used to handle the case when the user clicks on a widget and open signature pad to draw sign - props.setCurrWidgetsDetails && props.setCurrWidgetsDetails(props.pos); - handleWidgetIdandPopup(); } }; //`handleOnClickSettingIcon` is used set current widget details and open setting of it @@ -305,17 +221,17 @@ function Placeholder(props) { } //condition for only placeholder and template flow - if (props.data && props?.pos?.type !== textWidget) { + if (props.data && props?.data?.Role !== "prefill") { props.setUniqueId(props?.data?.Id); const checkIndex = props.xyPosition - .filter((data) => data.Role !== "prefill") + .filter((data) => data?.Role !== "prefill") .findIndex((data) => data.Id === props.data.Id); props.setIsSelectId && props.setIsSelectId(checkIndex || 0); - } - //condition to handle in placeholder and template flow for text widget signerId for text widgets i have to set uniqueId in tempSignerId because - //it does not have any signer user and any signerobjId - else if (props.data && props.pos.type === textWidget && !props.isSelfSign) { - props.setTempSignerId(props.uniqueId); + } else if ( + !props.isSelfSign && + props.data && + props.pos.type === "prefill" + ) { props.setUniqueId(props?.data?.Id); } props.setCurrWidgetsDetails(props.pos); @@ -325,21 +241,17 @@ function Placeholder(props) { e.stopPropagation(); //condition to handle text widget signer obj id and unique id //when user click on copy icon of text widget in that condition text widget does not have any signerObjId - //in that case i have to save in tempSignerId as a unique id of previous select signer's unique id - //and on save or cancel button of copy all page popup i have set this temp signer Id in unique id - - if (props.data && props?.pos?.type !== textWidget) { + if (props.data && props?.data?.Role !== "prefill") { props.setUniqueId(props?.data?.Id); const checkIndex = props.xyPosition - .filter((data) => data.Role !== "prefill") + .filter((data) => data?.Role !== "prefill") .findIndex((data) => data.Id === props.data.Id); props.setIsSelectId && props.setIsSelectId(checkIndex || 0); } else if ( + !props.isSelfSign && props.data && - props.pos.type === textWidget && - !props.isSelfSign + props.pos.type === "prefill" ) { - props.setTempSignerId(props.uniqueId); props.setUniqueId(props?.data?.Id); } @@ -352,15 +264,26 @@ function Placeholder(props) { props.setIsPageCopy(true); props.setCurrWidgetsDetails(props.pos); } else { + const newId = randomId(); //function to create new widget next to just widget handleCopyNextToWidget( + newId, props.pos, - props.pos.type, props.xyPosition, props.index, props.setXyPosition, props.data && props.data?.Id ); + //condiiton is used to store copied prefill image base64 url in redux for display image + if (props?.data?.Role === "prefill") { + const getPrefillImg = prefillImg?.find((x) => x.id === props.pos.key); + dispatch( + setPrefillImg({ + id: newId, + base64: getPrefillImg?.base64 + }) + ); + } } }; @@ -385,7 +308,7 @@ function Placeholder(props) { //`onChangeInput` is used to save data related to date in a placeholder field onChangeInput( date, - props.pos.key, + props.pos, props.xyPosition, props.index, props.setXyPosition, @@ -481,23 +404,14 @@ function Placeholder(props) { e.stopPropagation(); handleOnClickSettingIcon(); }} - className="fa-light fa-gear icon" - style={{ - color: "#188ae2", - right: "29px", - top: "-19px", - cursor: "pointer", - zIndex: 99, - pointerEvents: "auto" - }} + className="fa-light fa-gear icon text-[#188ae2] right-[29px] -top-[19px] z-[99] pointer-events-auto" >
) : ( /* condition to add setting icon for placeholder & template flow for all widgets except signature and date */ - ((!props?.pos?.type && props.pos.isStamp) || - (props?.pos?.type && - !["date"].includes(props.pos.type) && - !props.isSignYourself && - !props.isSelfSign)) && ( + !props.isSignYourself && + !props.isSelfSign && + props?.pos?.type && + !["date"].includes(props.pos.type) && ( { e.stopPropagation(); @@ -511,25 +425,20 @@ function Placeholder(props) { e.stopPropagation(); handleOnClickSettingIcon(); }} - className="fa-light fa-gear icon" + className="fa-light fa-gear icon text-[#188ae2] -top-[19px] z-[99] pointer-events-auto" style={{ - color: "#188ae2", - right: props?.pos?.type === textWidget ? "32px" : "51px", - top: "-19px", - cursor: "pointer", - zIndex: 99, - pointerEvents: "auto" + right: props?.data?.Role === "prefill" ? "32px" : "51px" }} > ) )} - {/* condition for usericon for all widgets except text widgets and signyour-self flow */} - {props.pos.type !== textWidget && - !props.isSignYourself && - !props.isSelfSign && ( + {/* condition for usericon to display for all widgets except prefill widgets, signyour-self and self-sign flow */} + {!props.isSignYourself && + !props.isSelfSign && + props?.data?.Role !== "prefill" && ( { e.stopPropagation(); props.handleLinkUser(props.data.Id); @@ -548,7 +457,6 @@ function Placeholder(props) { ); props.setIsSelectId(checkIndex || 0); }} - style={{ color: "#188ae2", right: "32px", top: "-18px" }} > )} @@ -585,36 +493,32 @@ function Placeholder(props) { } }} style={{ - zIndex: "99", - top: "-18px", - right: props.isPlaceholder ? "50px" : "30px", - color: "#188ae2", - fontSize: "14px", - cursor: "pointer", - pointerEvents: "auto" + right: + props.isPlaceholder && props?.data?.Role !== "prefill" + ? "50px" + : "30px" }} - className="fa-light fa-gear icon" + className="fa-light fa-gear icon text-[#188ae2] text-[14px] z-[99] -top-[18px] pointer-events-auto" >
)} {/* copy icon for all widgets */} handleCopyPlaceholder(e)} onTouchEnd={(e) => handleCopyPlaceholder(e)} - style={{ color: "#188ae2", right: "12px", top: "-18px" }} > {/* delete icon for all widgets */} { e.stopPropagation(); //condition for template and placeholder flow if (props.data) { - props.handleDeleteSign(props.pos.key, props.data.Id); + props.handleDeleteWidget(props.pos.key, props.data.Id); } //condition for signyour-self flow else { - props.handleDeleteSign(props.pos.key); + props.handleDeleteWidget(props.pos.key); } }} //for mobile and tablet touch event @@ -622,14 +526,13 @@ function Placeholder(props) { e.stopPropagation(); //condition for template and placeholder flow if (props.data) { - props.handleDeleteSign(props.pos.key, props.data?.Id); + props.handleDeleteWidget(props.pos.key, props.data?.Id); } //condition for signyour-self flow else { - props.handleDeleteSign(props.pos.key); + props.handleDeleteWidget(props.pos.key); } }} - style={{ color: "#188ae2", right: "-8px", top: "-18px" }} > ) @@ -653,11 +556,7 @@ function Placeholder(props) { return resizePos * pos.scale * containerScale; } } else { - // if (pos.scale === containerScale) { - // return resizePos * pos.scale * props.scale; - // } else { return resizePos * containerScale * props.scale; - // } } } }; @@ -679,15 +578,7 @@ function Placeholder(props) { } else { return resizePos * pos.scale * containerScale; } - } - // else if (pos.scale === containerScale) { - // if (props.scale > 1) { - // return resizePos * pos.scale * props.scale; - // } else { - // return resizePos * pos.scale; - // } - // } - else { + } else { return resizePos * containerScale * props.scale; } } @@ -738,7 +629,6 @@ function Placeholder(props) { return "rgba(203, 233, 237, 0.69)"; } }; - const fontSize = calculateFont(props.pos.options?.fontSize); const fontColor = props.pos.options?.fontColor || "black"; @@ -822,7 +712,7 @@ function Placeholder(props) { bounds="parent" className="signYourselfBlock" style={{ - border: "1px solid #007bff", + border: "1.5px solid #007bff", borderRadius: "2px", cursor: getCursor(), zIndex: @@ -835,18 +725,20 @@ function Placeholder(props) { : "5", opacity: props.isNeedSign && props.data?.Id !== props?.uniqueId && "0.4", - background: handleBackground() + background: + props?.data?.Role === "prefill" + ? "transparent" + : handleBackground() //handle block color of widget for }} onDrag={(_, d) => { - props.handleTabDrag && props.handleTabDrag(props.pos.key); - props.showGuidelines && - props.showGuidelines( - true, - d.x, - d.y, - d.node.offsetWidth, - d.node.offsetHeight - ); + props?.handleTabDrag?.(props.pos.key); + showGuidelines( + true, + d.x, + d.y, + d.node.offsetWidth, + d.node.offsetHeight + ); }} size={{ width: @@ -868,55 +760,49 @@ function Placeholder(props) { } maxHeight="auto" onResizeStart={(e, dir, ref) => { - props.setIsResize && props.setIsResize(true); - props.showGuidelines && - props.showGuidelines( - true, - xPos(props.pos, props.isSignYourself), - yPos(props.pos, props.isSignYourself), - ref.offsetWidth, - ref.offsetHeight - ); + props?.setIsResize?.(true); + showGuidelines( + true, + xPos(props.pos, props.isSignYourself), + yPos(props.pos, props.isSignYourself), + ref.offsetWidth, + ref.offsetHeight + ); }} onResize={(e, dir, ref, delta, position) => { - props.showGuidelines && - props.showGuidelines( - true, - position.x, - position.y, - ref.offsetWidth, - ref.offsetHeight - ); + showGuidelines( + true, + position.x, + position.y, + ref.offsetWidth, + ref.offsetHeight + ); }} onResizeStop={(e, direction, ref) => { - setTimeout(() => { - props.setIsResize && props.setIsResize(false); - }, 50); - props.handleSignYourselfImageResize && - props.handleSignYourselfImageResize( - ref, - props.pos.key, - props.xyPosition, - props.setXyPosition, - props.index, - containerScale, - props.scale, - props.data && props.data.Id, - props.isResize - ); - props.showGuidelines && props.showGuidelines(false); + setTimeout(() => props?.setIsResize?.(false), 50); + props?.handleSignYourselfImageResize?.( + ref, + props.pos.key, + props.xyPosition, + props.setXyPosition, + props.index, + containerScale, + props.scale, + props.data && props.data.Id, + props.isResize + ); + showGuidelines(false); }} onDragStop={(event, dragElement) => { - props.handleStop && - props.handleStop( - event, - dragElement, - props.data?.Id, - props.pos?.key - ); - props.isDragging && - props.showGuidelines && - props.showGuidelines(false); + if (props?.isDragging) { + showGuidelines(false); + } + props?.handleStop?.( + event, + dragElement, + props.data?.Id, + props.pos?.key + ); }} position={{ x: xPos(props.pos, props.isSignYourself), @@ -953,11 +839,12 @@ function Placeholder(props) { ![radioButtonWidget, "checkbox"].includes(props.pos.type) && props.pos.key === props?.currWidgetsDetails?.key && )} - {/* 1- Show a border if props.pos.key === props?.currWidgetsDetails?.key, indicating the current user's selected widget. - 2- If props.isShowBorder is true, display border for all widgets. - 3- Use the combination of props?.isAlllowModify and !props?.assignedWidgetId.includes(props.pos.key) to determine when to show border: - 3.1- When isAlllowModify is true, show border. - 3.2- Do not display border for widgets already assigned (props.assignedWidgetId.includes(props.pos.key) is true). + + {/* 1- Show a ouline if props.pos.key === props?.currWidgetsDetails?.key, indicating the current user's selected widget. + 2- If props.isShowBorder is true, display ouline for all widgets. + 3- Use the combination of props?.isAlllowModify and !props?.assignedWidgetId.includes(props.pos.key) to determine when to show ouline: + 3.1- When isAlllowModify is true, show ouline. + 3.2- Do not display ouline for widgets already assigned (props.assignedWidgetId.includes(props.pos.key) is true). */} {props.pos.key === props?.currWidgetsDetails?.key && (props.isShowBorder || @@ -997,6 +884,11 @@ function Placeholder(props) { calculateFontsize={props.calculateFontsize} pdfDetails={props?.pdfDetails && props?.pdfDetails[0]} isNeedSign={props.isNeedSign} + isAllowModify={ + props.isShowBorder || + (props?.isAlllowModify && + !props?.assignedWidgetId.includes(props.pos.key)) + } setSelectDate={setSelectDate} selectDate={selectDate} startDate={startDate} @@ -1008,7 +900,6 @@ function Placeholder(props) {
)} -
@@ -1078,7 +969,7 @@ function Placeholder(props) { >
- {props?.isPlaceholder && ( + {props?.isPlaceholder && props?.data?.Role !== "prefill" && (
data.pageNumber === newPageNumber @@ -213,6 +215,7 @@ function PlaceholderCopy(props) { //function for getting selected type placeholder copy const handleApplyCopy = () => { + const newId = randomId(); if (selectCopyType === 4) { const signerPosition = props.xyPosition; let currentXYposition; @@ -230,8 +233,8 @@ function PlaceholderCopy(props) { ); //function to create new widget next to just widget handleCopyNextToWidget( + newId, currentXYposition, - props.widgetType, props.xyPosition, props.pageNumber, props.setXyPosition, @@ -248,8 +251,8 @@ function PlaceholderCopy(props) { ); //function to create new widget next to just widget handleCopyNextToWidget( + newId, currentXYposition, - props.widgetType, props.xyPosition, getIndex, props.setXyPosition @@ -260,11 +263,6 @@ function PlaceholderCopy(props) { } }; const handleUniqueId = () => { - const signerId = props.signerObjId ? props.signerObjId : props.Id; - if (signerId && props.widgetType === textWidget && props.setTempSignerId) { - props.setUniqueId(props?.tempSignerId); - props.setTempSignerId(""); - } props.setIsPageCopy(false); setSelectCopyType(1); }; @@ -306,7 +304,7 @@ function PlaceholderCopy(props) { +
+
+ ); + })} +
+
+ )} +
+
+ + +
+
+ + + + + + ); +} + +export default PrefillWidgetModal; diff --git a/apps/OpenSign/src/components/pdf/PrevNext.jsx b/apps/OpenSign/src/components/pdf/PrevNext.jsx index 8c3cc166c4..b1f3bcdc83 100644 --- a/apps/OpenSign/src/components/pdf/PrevNext.jsx +++ b/apps/OpenSign/src/components/pdf/PrevNext.jsx @@ -20,7 +20,7 @@ function PrevNext({ pageNumber, allPages, changePage }) { onClick={previousPage} > - + @@ -32,7 +32,7 @@ function PrevNext({ pageNumber, allPages, changePage }) { onClick={nextPage} > - +
diff --git a/apps/OpenSign/src/components/pdf/RecipientList.jsx b/apps/OpenSign/src/components/pdf/RecipientList.jsx index c616bac37e..98e8285e2f 100644 --- a/apps/OpenSign/src/components/pdf/RecipientList.jsx +++ b/apps/OpenSign/src/components/pdf/RecipientList.jsx @@ -1,4 +1,4 @@ -import React, { useRef, useState } from "react"; +import { useRef, useState } from "react"; import { useAutoAnimate } from "@formkit/auto-animate/react"; import { color, @@ -12,6 +12,7 @@ const cursor = const RecipientList = (props) => { const [animationParent] = useAutoAnimate(); const [isHover, setIsHover] = useState(); + const [isPrefill, setIsPrefill] = useState(false); const [isEdit, setIsEdit] = useState(false); //function for onhover signer name change background color const inputRef = useRef(null); @@ -80,9 +81,43 @@ const RecipientList = (props) => { }); props?.setSignerPos(changeOrderSignerList); }; + const handleSelectRecipient = (e, index, obj, prefill) => { + e.preventDefault(); + props?.setIsSelectId(index); + props?.setUniqueId(obj.Id); + props?.setRoleName(obj.Role); + props?.setBlockColor(obj?.blockColor); + props?.handleModal && props?.handleModal(); + setIsPrefill(prefill ?? false); + props.setIsTour && props?.setIsTour(false); + }; + const isSelected = (ind) => { + const isUserSelected = + (!isMobile && isHover === ind) || + (!isPrefill && props.isSelectListId === ind); + return isUserSelected; + }; return ( <> - {props.signersdata?.length > 0 && + {props?.prefillSigner?.length > 0 && + props?.prefillSigner?.map((obj, ind) => ( +
handleSelectRecipient(e, ind, obj, true)} + > + + {obj.Name} +
+ ))} + {props.signersdata.length > 0 && props.signersdata.map((obj, ind) => { return (
{ : color[ind % color.length] : "transparent" }} - onClick={(e) => { - e.preventDefault(); - props.setIsSelectId(ind); - props.setUniqueId(obj.Id); - props.setRoleName(obj.Role); - props.setBlockColor(obj?.blockColor); - if (props.handleModal) { - props.handleModal(); - } - }} + onClick={(e) => handleSelectRecipient(e, ind, obj)} > -
+
{ {isWidgetExist(obj.Id) ? ( ) : ( - <> - {obj.Name - ? getFirstLetter(obj.Name) - : getFirstLetter(obj.Role)} - + <>{getFirstLetter(obj?.Name ?? obj?.Role)} )}
{obj.Name ? ( - + {obj.Name} ) : ( { setIsEdit({ [obj.Id]: true }); props.setRoleName(obj.Role); @@ -182,7 +192,7 @@ const RecipientList = (props) => { {isEdit?.[obj.Id] && props.handleRoleChange ? ( props.handleRoleChange(e, obj.Id)} onBlur={() => { @@ -204,14 +214,7 @@ const RecipientList = (props) => { )} {obj.Name && ( - + {obj?.Role || obj?.Email} )} @@ -247,18 +250,13 @@ const RecipientList = (props) => {
)} - {props.handleDeleteUser && ( + {props.handleDeleteUser && obj?.Role !== "prefill" && (
{ e.stopPropagation(); props.handleDeleteUser(obj.Id); }} - className={`${ - (!isMobile && isHover === ind) || - props.isSelectListId === ind - ? "text-[#424242]" - : "text-base-content" - } cursor-pointer`} + className={`${isSelected(ind) ? "text-[#424242]" : "text-base-content"} cursor-pointer`} >
diff --git a/apps/OpenSign/src/components/pdf/RenderAllPdfPage.jsx b/apps/OpenSign/src/components/pdf/RenderAllPdfPage.jsx index 393e85fe36..fdcf159793 100644 --- a/apps/OpenSign/src/components/pdf/RenderAllPdfPage.jsx +++ b/apps/OpenSign/src/components/pdf/RenderAllPdfPage.jsx @@ -17,7 +17,7 @@ function RenderAllPdfPage(props) { const mergePdfInputRef = useRef(null); const [signPageNumber, setSignPageNumber] = useState([]); const [bookmarkColor, setBookmarkColor] = useState(""); - const isHeader = useSelector((state) => state.showHeader); + const isSidebar = useSelector((state) => state.sidebar.isOpen); const [pageWidth, setPageWidth] = useState(""); //set all number of pages after load pdf @@ -51,7 +51,7 @@ function RenderAllPdfPage(props) { const timer = setTimeout(updateSize, 100); // match the transition duration return () => clearTimeout(timer); - }, [isHeader, pageContainer, props?.containerWH]); + }, [isSidebar, pageContainer, props?.containerWH]); //'function `addSignatureBookmark` is used to display the page where the user's signature is located. const addSignatureBookmark = (index) => { const ispageNumber = signPageNumber.includes(index + 1); @@ -78,11 +78,11 @@ function RenderAllPdfPage(props) { const handleFileUpload = async (e) => { const file = e.target.files[0]; if (!file) { - alert("Please upload a valid PDF file."); + alert(t("please-select-pdf")); return; } if (!file.type.includes("pdf")) { - alert("Only PDF files are allowed."); + alert(t("only-pdf-allowed")); return; } const mb = Math.round(file?.size / Math.pow(1024, 2)); @@ -114,18 +114,18 @@ function RenderAllPdfPage(props) { // Upload the file to Parse Server } catch (err) { console.error("Incorrect password or decryption failed", err); - alert("Incorrect password or decryption failed."); + alert(t("incorrect-password-or-decryption-failed")); } } else { - alert("Please provided Password."); + alert(t("provide-password")); } } else { console.log("Err ", err); - alert("error while uploading pdf."); + alert(t("error-uploading-pdf")); } } } else { - alert("error while uploading pdf."); + alert(t("error-uploading-pdf")); } } const uploadedPdfDoc = await PDFDocument.load(uploadedPdfBytes, { diff --git a/apps/OpenSign/src/components/pdf/RenderPdf.jsx b/apps/OpenSign/src/components/pdf/RenderPdf.jsx index 0d6aa6b40d..160dcc25b0 100644 --- a/apps/OpenSign/src/components/pdf/RenderPdf.jsx +++ b/apps/OpenSign/src/components/pdf/RenderPdf.jsx @@ -1,4 +1,10 @@ -import React, { useState, useRef } from "react"; +import React, { + useState, + useRef, + useCallback, + useLayoutEffect, + useEffect +} from "react"; import RSC from "react-scrollbars-custom"; import { Document, Page } from "react-pdf"; import { @@ -12,22 +18,30 @@ import Placeholder from "./Placeholder"; import Alert from "../../primitives/Alert"; import { useTranslation } from "react-i18next"; import usePdfPinchZoom from "../../hook/usePdfPinchZoom"; +import { useDispatch, useSelector } from "react-redux"; +import Guidelines from "./Guidelines"; +import { useGuidelinesContext } from "../../context/GuidelinesContext"; +import { toggleSidebar } from "../../redux/reducers/sidebarReducer"; function RenderPdf(props) { const { t } = useTranslation(); + const dispatch = useDispatch(); const [scaledHeight, setScaledHeight] = useState(); - const [guideline, setGuideline] = useState({ - show: false, - x1: 0, - x2: 0, - y1: 0, - y2: 0 - }); + const { guideline } = useGuidelinesContext(); //check isGuestSigner is present in local if yes than handle login flow header in mobile view const isGuestSigner = localStorage.getItem("isGuestSigner"); - + const scrollTriggerId = useSelector((state) => state.widget.scrollTriggerId); + const isOpen = useSelector((state) => state.sidebar.isOpen); + const scrollRef = useRef(null); const pdfContainerRef = useRef(null); + useEffect(() => { + dispatch(toggleSidebar(false)); + return () => { + dispatch(toggleSidebar(true)); + }; + }, []); + // enable pinch to zoom only on actual pdf wrapper usePdfPinchZoom( pdfContainerRef, @@ -36,20 +50,6 @@ function RenderPdf(props) { props.setZoomPercent ); - const handleGuideline = (isShow, x = 0, y = 0, width = 0, height = 0) => { - if (isShow) { - setGuideline({ - show: true, - x1: x, - x2: x + width, - y1: y, - y2: y + height - }); - } else { - setGuideline({ show: false, x1: 0, x2: 0, y1: 0, y2: 0 }); - } - }; - // handle signature block width and height according to screen const posWidth = (pos, signYourself) => { const containerScale = getContainerScale( @@ -111,6 +111,98 @@ function RenderPdf(props) { } }; + // `smoothScrollTo` is used to provide smooth scrolling while focus on widget + const smoothScrollTo = (targetY, duration = 500) => { + const sb = scrollRef.current; + if (!sb) return; + const start = sb.scrollTop; + const change = targetY - start; + const startTime = performance.now(); + + const animate = (now) => { + const elapsed = now - startTime; + const t = Math.min(1, elapsed / duration); + // easeInOutQuad + const ease = t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t; + sb.scrollTo(sb.scrollLeft, start + change * ease); + if (t < 1) requestAnimationFrame(animate); + }; + + requestAnimationFrame(animate); + }; + + // `scrollToTarget` is used to focus on widget and scroll to top + const scrollToTarget = useCallback(() => { + // Get the scrollbar container ref + const sb = scrollRef.current; + // If there's no content element or no widget details, bail out + if (!sb?.contentElement || !props.currWidgetsDetails) return; + + // The absolute Y position (relative to the document) where we want to scroll + const yPosition = props?.currWidgetsDetails?.yPosition || 0; + const containerScale = getContainerScale( + props.pdfOriginalWH, + props.pageNumber, + props.containerWH + ); + + const targetTop = yPosition * containerScale * props.scale; + // The Y offset of the scrollable content container itself + const { offsetTop } = sb.contentElement; + + // Account for the header height + a little extra padding + // Different header height if user is a guest signer + const headerOffset = isGuestSigner ? 10 : 79; + // Compute the scroll position inside the container + const positionTop = targetTop - offsetTop - headerOffset; + + const pageNumber = props.pageNumber > 0 ? props.pageNumber - 1 : 0; + const ogH = props.pdfOriginalWH[pageNumber]?.height; + // If the modal for this widget is open, we may need to expand the PDF container + if (props.isShowModal[scrollTriggerId]) { + // Original PDF height for this page + if (pdfContainerRef?.current) { + // Increase container height to include the area up to the target + pdfContainerRef.current.style.height = `${ogH + (targetTop - offsetTop)}px`; + } + } else { + // Otherwise, reset any inline height override + if (pdfContainerRef?.current) { + pdfContainerRef.current.style.height = ""; + } + } + // Actually perform the scroll: keep the same horizontal scroll, scroll vertically + if (targetTop > ogH * 0.75 && !isGuestSigner && isOpen) { + smoothScrollTo(positionTop - 300); + } else if (targetTop > ogH * 0.75 && !isGuestSigner && !isOpen) { + smoothScrollTo(positionTop - 100); + } else { + smoothScrollTo(positionTop); + } + + // Highlight only the target widget; reset others to default border + document.querySelectorAll(".signYourselfBlock").forEach((w) => { + w.style.border = + w.id === String(scrollTriggerId) + ? "1.5px solid red" // active widget in red + : "1.5px solid #007bff"; // others in blue + }); + }, [ + scrollTriggerId, + props.currWidgetsDetails?.yPosition, + props.isShowModal, + props.pdfOriginalWH, + props.pageNumber + ]); + + useLayoutEffect(() => { + // Whenever scrollTriggerId changes, fire off the scroll in the next rAF + // to ensure the DOM has painted/layout is stable before scrolling + if (scrollTriggerId) { + scrollToTarget(); + } + }, [scrollTriggerId, scrollToTarget]); + // function for render placeholder block over pdf document (all signing flow) const checkSignedSigners = (data) => { let checkSign = []; @@ -147,7 +239,6 @@ function RenderPdf(props) { isSignYourself={false} posWidth={posWidth} posHeight={posHeight} - showGuidelines={handleGuideline} isDragging={props.isDragging} pdfDetails={props.pdfDetails} unSignedWidgetId={props.unSignedWidgetId} @@ -160,13 +251,11 @@ function RenderPdf(props) { ispublicTemplate={props.ispublicTemplate} handleUserDetails={props.handleUserDetails} isResize={props.isResize} - setIsAgreeTour={props.setIsAgreeTour} - isAgree={props.isAgree} handleTabDrag={props.handleTabDrag} handleStop={props.handleStop} setUniqueId={props.setUniqueId} setIsSelectId={props.setIsSelectId} - handleDeleteSign={props.handleDeleteSign} + handleDeleteWidget={props.handleDeleteWidget} setIsPageCopy={props.setIsPageCopy} handleTextSettingModal={props.handleTextSettingModal} handleCellSettingModal={props.handleCellSettingModal} @@ -174,16 +263,14 @@ function RenderPdf(props) { isFreeResize={props.isSelfSign ? true : false} isOpenSignPad={true} assignedWidgetId={props.assignedWidgetId} - isApplyAll={true} setCellCount={props.setCellCount} setFontSize={props.setFontSize} fontSize={props.fontSize} fontColor={props.fontColor} setFontColor={props.setFontColor} - setRequestSignTour={props.setRequestSignTour} + setIsReqSignTourDisabled={props.setIsReqSignTourDisabled} calculateFontsize={calculateFontsize} currWidgetsDetails={props?.currWidgetsDetails} - setTempSignerId={props.setTempSignerId} /> ) @@ -220,6 +307,7 @@ function RenderPdf(props) { {t("success-email-alert")} )} ))} @@ -348,7 +439,9 @@ function RenderPdf(props) { key={id} pos={pos} setIsPageCopy={props.setIsPageCopy} - handleDeleteSign={props.handleDeleteSign} + handleDeleteWidget={ + props.handleDeleteWidget + } handleTabDrag={props.handleTabDrag} handleStop={props.handleStop} handleSignYourselfImageResize={ @@ -362,8 +455,6 @@ function RenderPdf(props) { isSignYourself={true} posWidth={posWidth} posHeight={posHeight} - showGuidelines={handleGuideline} - pdfDetails={props.pdfDetails[0]} isDragging={props.isDragging} setIsCheckbox={props.setIsCheckbox} setCurrWidgetsDetails={ @@ -390,6 +481,9 @@ function RenderPdf(props) { currWidgetsDetails={ props?.currWidgetsDetails } + setIsReqSignTourDisabled={ + props.setIsReqSignTourDisabled + } /> ) )} @@ -428,28 +522,12 @@ function RenderPdf(props) { /> {guideline.show && ( - <> - {/* top guide */} -
- {/* bottom guide */} -
- {/* left guide */} -
- {/* right guide */} -
- + )}
diff --git a/apps/OpenSign/src/components/pdf/SignerListComponent.jsx b/apps/OpenSign/src/components/pdf/SignerListComponent.jsx index dea4b40b5f..b46cd7508a 100644 --- a/apps/OpenSign/src/components/pdf/SignerListComponent.jsx +++ b/apps/OpenSign/src/components/pdf/SignerListComponent.jsx @@ -27,12 +27,12 @@ function SignerListComponent(props) { return (
{getFirstLetter( @@ -40,11 +40,11 @@ function SignerListComponent(props) { )}
-
- +
+ {props.obj?.Name || props?.obj?.Role} - + {props.obj?.Email || props.obj?.email}
diff --git a/apps/OpenSign/src/components/pdf/SignerListPlace.jsx b/apps/OpenSign/src/components/pdf/SignerListPlace.jsx index 0c3e6dab11..8e43926e2b 100644 --- a/apps/OpenSign/src/components/pdf/SignerListPlace.jsx +++ b/apps/OpenSign/src/components/pdf/SignerListPlace.jsx @@ -1,16 +1,23 @@ -import React from "react"; import RecipientList from "./RecipientList"; -import { Tooltip } from "react-tooltip"; +// import { Tooltip } from "react-tooltip"; import { useTranslation } from "react-i18next"; function SignerListPlace(props) { const { t } = useTranslation(); + + const handleAddRecipient = () => { + props?.setIsAddSigner(true); + props.setIsTour && props.setIsTour(false); + }; return (
{props.title ? props.title : "Recipients"} - + props.setIsTour && props.setIsTour(true)}> + + + {/* {props?.title === "Roles" && ( <> @@ -30,7 +37,7 @@ function SignerListPlace(props) { )} - + */}
@@ -53,7 +60,7 @@ function SignerListPlace(props) { data-tut="addRecipient" className="op-btn op-btn-accent op-btn-outline w-full mt-[14px]" disabled={props?.isMailSend ? true : false} - onClick={() => props.setIsAddSigner(true)} + onClick={handleAddRecipient} > {t("add-recipients")}
diff --git a/apps/OpenSign/src/components/pdf/WidgetComponent.jsx b/apps/OpenSign/src/components/pdf/WidgetComponent.jsx index 1e87c60b16..28076fabb4 100644 --- a/apps/OpenSign/src/components/pdf/WidgetComponent.jsx +++ b/apps/OpenSign/src/components/pdf/WidgetComponent.jsx @@ -4,7 +4,6 @@ import RecipientList from "./RecipientList"; import { useDrag } from "react-dnd"; import WidgetList from "./WidgetList"; import { - color, isMobile, radioButtonWidget, textInputWidget, @@ -88,12 +87,12 @@ function WidgetComponent(props) { signature, stamp, initials, + textInput, name, jobTitle, company, date, text, - textInput, cells, checkbox, dropdown, @@ -110,6 +109,7 @@ function WidgetComponent(props) { // eslint-disable-next-line }, []); + //allow only (signature,stamp,initials,text,name, job title, company,email) widget when isAllowModification true and user have session token const modifiedWidgets = widget.filter( (data) => ![ @@ -121,6 +121,7 @@ function WidgetComponent(props) { "checkbox" ].includes(data.type) ); + //allow only (signature,stamp,initials,text) widget when isAllowModification true and user does not have session token const unlogedInUserWidgets = widget.filter( (data) => ![ @@ -136,25 +137,37 @@ function WidgetComponent(props) { "company" ].includes(data.type) ); - const filterWidgets = widget.filter( + const selfSignWidgets = widget.filter( (data) => - !["dropdown", radioButtonWidget, textInputWidget].includes( - data.type - ) + !["dropdown", radioButtonWidget, textInputWidget].includes(data.type) ); - const textWidgetData = widget.filter((data) => data.type !== textWidget); - const updateWidgets = props.isSignYourself - ? filterWidgets - : props.isTemplateFlow - ? textWidgetData - : props.isAlllowModify - ? userInformation - ? modifiedWidgets - : unlogedInUserWidgets - : widget; - + //if user select prefill role then allow only date,image,text,checkbox,radio,dropdownAdd commentMore actions + //dropdown widget should only be show in template flow + const prefillAllowWidgets = widget.filter((data) => + (props.isPrefillDropdown ? ["dropdown"] : []) + .concat([radioButtonWidget, textWidget, "date", "image", "checkbox"]) + .includes(data.type) + ); + //function to show widget on the base of conditionAdd commentMore actions + const handleWidgetType = () => { + if (props.isSignYourself) { + return selfSignWidgets; + } else if (props?.roleName === "prefill") { + return prefillAllowWidgets; + } else if (props.isAlllowModify) { + if (userInformation) { + return modifiedWidgets; + } else { + return unlogedInUserWidgets; + } + } else if (props?.roleName !== "prefill") { + return widget.filter((data) => ![textWidget].includes(data.type)); + } + }; const handleSelectRecipient = () => { - if ( + if (props?.roleName === "prefill") { + return "Prefill by owner"; + } else if ( props.signersdata[props.isSelectListId]?.Email || props.signersdata[props.isSelectListId]?.Role ) { @@ -180,9 +193,10 @@ function WidgetComponent(props) { className="w-full op-select op-select-bordered pointer-events-none" value={handleSelectRecipient()} style={{ - backgroundColor: props.blockColor - ? props.blockColor - : color[0] + backgroundColor: + props.roleName === "prefill" + ? "#edf6fc" + : props?.blockColor || "#edf6fc" }} >
@@ -1370,8 +1338,8 @@ function WidgetsValueModal(props) { {currWidgetsDetails?.options?.values?.map((data, ind) => (
+ {isLoader && ( +
+ +
+ )} {isFinish ? ( <>
@@ -1962,7 +1946,7 @@ function WidgetsValueModal(props) { ) : ( )}
@@ -1988,7 +1972,7 @@ function WidgetsValueModal(props) { handleClickOnNext(isFinishDoc); }} > - {t("finish")} + {t("done")} ) : (
`; + const appName = "OpenSign™"; + const logo = `
`; + const opurl = ` here.

`; const subject = `${param.senderName} has requested you to sign "${param.title}"`; const body = "
" + @@ -3356,13 +3423,20 @@ export function formatDateTime(date, dateFormat, timeZone, is12Hour) { : formatTimeInTimezone(date, timeZone); } -export const updateDateWidgetsRes = (documentData, signerId, journey) => { - const extUser = - localStorage.getItem("Extand_Class"); +export const updateDateWidgetsRes = ( + documentData, + signerId, + journey, + isRemovePrefill +) => { + const extUser = localStorage.getItem("Extand_Class"); const contactUser = documentData?.Signers.find( (data) => data.objectId === signerId ); - const placeHolders = documentData?.Placeholders; + let placeHolders = documentData?.Placeholders; + if (isRemovePrefill) { + placeHolders = placeHolders?.filter((x) => x.Role !== "prefill"); + } const userDetails = extUser ? JSON.parse(extUser)[0] : contactUser; return placeHolders?.map((item) => { if (item?.signerObjId === signerId) { @@ -3650,3 +3724,310 @@ export function getFileAsArrayBuffer(file) { reader.readAsArrayBuffer(file); }); } + +export const sendEmailToSigners = async ( + pdfDetails, + signersdata, + customizeMail, + defaultMail, + isCustomize +) => { + let htmlReqBody; + const owner = pdfDetails?.[0]?.ExtUserPtr; + let sendMail; + const getDocumentExpDate = pdfDetails?.[0]?.ExpiryDate?.iso; + const getTemplateExpDate = new Date(pdfDetails[0]?.createdAt); + getTemplateExpDate.setDate( + getTemplateExpDate.getDate() + (pdfDetails[0]?.TimeToCompleteDays || 15) + ); + const expireDate = getDocumentExpDate + ? getDocumentExpDate + : getTemplateExpDate; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + + let senderEmail = pdfDetails?.[0]?.ExtUserPtr?.Email; + let senderPhone = pdfDetails?.[0]?.ExtUserPtr?.Phone; + let signerMail = signersdata.slice(); + if (pdfDetails?.[0]?.SendinOrder && pdfDetails?.[0]?.SendinOrder === true) { + signerMail.splice(1); + } + for (let i = 0; i < signerMail.length; i++) { + try { + let url = `${localStorage.getItem("baseUrl")}functions/sendmailv3`; + const headers = { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + }; + const objectId = signerMail[i].objectId; + const hostUrl = window.location.origin; + //encode this url value `${pdfDetails?.[0].objectId}/${signerMail[i].Email}/${objectId}` to base64 using `btoa` function + const encodeBase64 = btoa( + `${pdfDetails[0]?.objectId}/${signerMail[i].Email}/${objectId}` + ); + let signPdf = `${hostUrl}/login/${encodeBase64}`; + const orgName = pdfDetails[0]?.ExtUserPtr.Company + ? pdfDetails[0].ExtUserPtr.Company + : ""; + const senderName = pdfDetails?.[0]?.ExtUserPtr.Name; + const documentName = `${pdfDetails?.[0].Name}`; + let replaceVar; + + if (customizeMail && isCustomize) { + const replacedRequestBody = customizeMail?.body.replace(/"/g, "'"); + htmlReqBody = + "" + + replacedRequestBody + + " "; + + const variables = { + document_title: documentName, + note: pdfDetails?.[0]?.Note, + sender_name: senderName, + sender_mail: senderEmail, + sender_phone: senderPhone || "", + receiver_name: signerMail[i]?.Name || "", + receiver_email: signerMail[i].Email, + receiver_phone: signerMail[i]?.Phone || "", + expiry_date: localExpireDate, + company_name: orgName, + signing_url: signPdf + }; + replaceVar = replaceMailVaribles( + customizeMail.subject, + htmlReqBody, + variables + ); + } else if (defaultMail) { + const mailBody = defaultMail?.body; + const mailSubject = defaultMail.subject; + const replacedRequestBody = mailBody.replace(/"/g, "'"); + const htmlReqBody = + "" + + replacedRequestBody + + " "; + const variables = { + document_title: documentName, + note: pdfDetails?.[0]?.Note, + sender_name: senderName, + sender_mail: senderEmail, + sender_phone: senderPhone || "", + receiver_name: signerMail[i]?.Name || "", + receiver_email: signerMail[i].Email, + receiver_phone: signerMail[i]?.Phone || "", + expiry_date: localExpireDate, + company_name: orgName, + signing_url: signPdf + }; + replaceVar = replaceMailVaribles(mailSubject, htmlReqBody, variables); + } + const mailparam = { + senderName: senderName, + note: pdfDetails?.[0]?.Note || "", + senderMail: senderEmail, + title: documentName, + organization: orgName, + localExpireDate: localExpireDate, + signingUrl: signPdf + }; + let params = { + extUserId: owner?.objectId, + recipient: signerMail[i].Email, + subject: replaceVar?.subject + ? replaceVar?.subject + : mailTemplate(mailparam).subject, + replyto: senderEmail, + from: senderEmail, + html: replaceVar?.body ? replaceVar?.body : mailTemplate(mailparam).body + }; + + sendMail = await axios.post(url, params, { headers: headers }); + } catch (error) { + console.log("error", error); + } + } + if (sendMail?.data?.result?.status === "success") { + const sessiontoken = localStorage.getItem("accesstoken"); + if (pdfDetails[0]?.objectId && sessiontoken) { + try { + let data; + if (customizeMail && isCustomize) { + data = { + RequestBody: customizeMail?.body, + RequestSubject: customizeMail.subject, + SendMail: true + }; + } else if (defaultMail?.body && defaultMail?.subject) { + data = { + RequestBody: defaultMail?.body, + RequestSubject: defaultMail?.subject, + SendMail: true + }; + } else { + data = { SendMail: true }; + } + try { + await axios.put( + `${localStorage.getItem("baseUrl")}classes/contracts_Document/${ + pdfDetails[0]?.objectId + }`, + data, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": sessiontoken + } + } + ); + } catch (err) { + console.log("axois err ", err); + } + } catch (e) { + console.log("error", e); + } + } + return { status: "success" }; + } else { + return { status: sendMail?.data?.result?.status }; + } +}; +/** + * Converts a JPEG/JPG File/Blob into a PNG File. + * + * @param {string} base64Image - A data-URL (e.g. "data:image/jpeg;base64,…") + * @param {string} filename - Desired filename (e.g. "input"). + * @returns {Promise} - A promise that resolves with a new PNG File. + */ +export function convertJpegToPng(base64Image, filename) { + const arr = base64Image.split(","); + const mimeMatch = arr[0].match(/:(.*?);/); + if (!mimeMatch) throw new Error("Invalid dataURL"); + const mime = mimeMatch[1]; + const type = mime.split("/")[1]; + if (type === "png") { + return base64Image; + } else { + const bstr = atob(arr[1]); + let n = bstr.length; + const u8arr = new Uint8Array(n); + while (n--) u8arr[n] = bstr.charCodeAt(n); + const inputFile = new File([u8arr], `${filename}.${type}`, { type: mime }); + return new Promise((resolve, reject) => { + // ensure it’s JPEG/JPG (you can remove this check if not needed) + if (!/image\/jpe?g/.test(inputFile.type)) { + return reject(new Error("Input must be a JPEG or JPG image")); + } + + // Read the file as a data URL + const reader = new FileReader(); + reader.onerror = () => reject(new Error("Failed to read the file")); + reader.onload = () => { + const img = new Image(); + img.onerror = () => reject(new Error("Failed to load image")); + img.onload = () => { + // draw image onto a canvas + const canvas = document.createElement("canvas"); + canvas.width = img.width; + canvas.height = img.height; + const ctx = canvas.getContext("2d"); + ctx.drawImage(img, 0, 0); + + // directly get PNG as base64 data URL + try { + const pngDataUrl = canvas.toDataURL("image/png"); + resolve(pngDataUrl); + } catch (err) { + reject(new Error("Failed to convert canvas to PNG")); + } + }; + img.src = reader.result; + }; + reader.readAsDataURL(inputFile); + }); + } +} +//function is used to get assigned signer's email +export const getSignerEmail = (data, signers) => { + const getEmail = + signers?.length > 0 && + signers.find((x) => x.objectId === data.signerObjId)?.Email; + return getEmail; +}; + +//function is used to delete widgets +export const handleDeleteWidget = (key, Id, pageNumber, signerPos) => { + const updateData = []; + + const filterSignerPos = signerPos.filter((data) => data.Id === Id); + + if (filterSignerPos.length > 0) { + const getPlaceHolder = filterSignerPos[0].placeHolder; + + const getPageNumer = getPlaceHolder.filter( + (data) => data.pageNumber === pageNumber + ); + + if (getPageNumer.length > 0) { + const getXYdata = getPageNumer[0].pos.filter((data) => data.key !== key); + + if (getXYdata.length > 0) { + updateData.push(getXYdata); + const newUpdatePos = getPlaceHolder.map((obj) => { + if (obj.pageNumber === pageNumber) { + return { ...obj, pos: updateData[0] }; + } + return obj; + }); + + const newUpdateSigner = signerPos.map((obj) => { + if (obj.Id === Id) { + return { ...obj, placeHolder: newUpdatePos }; + } + return obj; + }); + return newUpdateSigner; + } else { + const getRemainPage = filterSignerPos[0].placeHolder.filter( + (data) => data.pageNumber !== pageNumber + ); + //condition to check placeholder length is greater than 1 do not need to remove whole placeholder + //array only resove particular widgets + if (getRemainPage && getRemainPage.length > 0) { + const newUpdatePos = filterSignerPos.map((obj) => { + if (obj.Id === Id) { + return { ...obj, placeHolder: getRemainPage }; + } + return obj; + }); + let signerupdate = []; + signerupdate = signerPos.filter((data) => data.Id !== Id); + signerupdate.push(newUpdatePos[0]); + + return signerupdate; + } else { + const updatedData = signerPos + .map((item) => { + if (item.Id === Id && item?.Role === "prefill") { + return null; // mark this item to remove + } + if (item.Id === Id) { + const updatedItem = { ...item }; + delete updatedItem.placeHolder; + return updatedItem; + } + return item; + }) + .filter(Boolean); // remove nulls (deleted items) + + return updatedData; + } + } + } + } +}; diff --git a/apps/OpenSign/src/constant/saveFileSize.js b/apps/OpenSign/src/constant/saveFileSize.js index f2f8ba657b..0f9fac1de8 100644 --- a/apps/OpenSign/src/constant/saveFileSize.js +++ b/apps/OpenSign/src/constant/saveFileSize.js @@ -4,13 +4,18 @@ const parseAppId = process.env.REACT_APP_APPID ? process.env.REACT_APP_APPID : "opensign"; const serverUrl = serverUrl_fn(); -export const SaveFileSize = async (size, imageUrl, tenantId) => { +export const SaveFileSize = async (size, imageUrl, tenantId, userId) => { //checking server url and save file's size const tenantPtr = { __type: "Pointer", className: "partners_Tenant", objectId: tenantId }; + const UserPtr = userId && { + __type: "Pointer", + className: "_User", + objectId: userId + }; const _tenantPtr = JSON.stringify(tenantPtr); try { const res = await axios.get( @@ -53,15 +58,16 @@ export const SaveFileSize = async (size, imageUrl, tenantId) => { } catch (err) { console.log("err in save usage", err); } - saveDataFile(size, imageUrl, tenantPtr); + saveDataFile(size, imageUrl, tenantPtr, UserPtr); }; //function for save fileUrl and file size in particular client db class partners_DataFiles -const saveDataFile = async (size, imageUrl, tenantPtr) => { +const saveDataFile = async (size, imageUrl, tenantPtr, UserId) => { const data = { FileUrl: imageUrl, FileSize: size, - TenantPtr: tenantPtr + TenantPtr: tenantPtr, + ...(UserId ? { UserId: UserId } : {}) }; // console.log("data save",file, data) diff --git a/apps/OpenSign/src/context/GuidelinesContext.jsx b/apps/OpenSign/src/context/GuidelinesContext.jsx new file mode 100644 index 0000000000..f39d0eaf4d --- /dev/null +++ b/apps/OpenSign/src/context/GuidelinesContext.jsx @@ -0,0 +1,43 @@ +import { createContext, useContext, useState, useCallback } from "react"; + +const GuidelinesContext = createContext(); + +export const GuidelinesProvider = ({ children }) => { + const [guideline, setGuideline] = useState({ + show: false, + x1: 0, + x2: 0, + y1: 0, + y2: 0 + }); + + const showGuidelines = useCallback((show, x, y, width, height) => { + if (show) { + setGuideline({ + show: true, + x1: x, + x2: x + width - 1.5, + y1: y, + y2: y + height - 1 + }); + } else { + setGuideline((prev) => ({ ...prev, show: false })); + } + }, []); + + return ( + + {children} + + ); +}; + +export const useGuidelinesContext = () => { + const context = useContext(GuidelinesContext); + if (!context) { + throw new Error( + "useGuidelinesContext must be used within a GuidelinesProvider" + ); + } + return context; +}; diff --git a/apps/OpenSign/src/hook/useManifestUrl.js b/apps/OpenSign/src/hook/useManifestUrl.js new file mode 100644 index 0000000000..1b479e9dc5 --- /dev/null +++ b/apps/OpenSign/src/hook/useManifestUrl.js @@ -0,0 +1,34 @@ +import { useEffect, useMemo } from "react"; + +export function useManifestUrl(appName, logo) { + const url = useMemo(() => { + const manifest = { + short_name: appName, + name: appName, + start_url: ".", + display: "standalone", + theme_color: "#000000", + background_color: "#ffffff", + ...(logo && { + icons: [ + { src: logo, type: "image/png", sizes: "64x64 32x32 24x24 16x16" }, + { src: logo, type: "image/png", sizes: "192x192" }, + { src: logo, type: "image/png", sizes: "512x512" } + ] + }) + }; + const blob = new Blob([JSON.stringify(manifest)], { + type: "application/json" + }); + return URL.createObjectURL(blob); + }, [appName, logo]); + + useEffect(() => { + // cleanup when unmounting or when url changes + return () => { + URL.revokeObjectURL(url); + }; + }, [url]); + + return url; +} diff --git a/apps/OpenSign/src/index.css b/apps/OpenSign/src/index.css index 55370b9886..f6b3f8e9b4 100644 --- a/apps/OpenSign/src/index.css +++ b/apps/OpenSign/src/index.css @@ -24,7 +24,7 @@ body { @media screen and (max-width: 766px) { .reactour__close { width: 17px !important; - padding-left: 3px !important; + padding-left: 3px !important; } } @@ -100,49 +100,62 @@ body { border-radius: 10px; } +.op-border-hover { + @apply border-gray-300 hover:border-base-content; +} + /* Note: Dark mode styling is now handled via Tailwind utilities in tailwind.config.js */ /* You can use classes like: icon-improved, icon-muted, icon-disabled, op-btn-vscode-disabled */ /* React-tour and ReactTooltip dark mode styling */ [data-theme="opensigndark"] { + .op-border-hover { + @apply border-gray-700 hover:border-base-content; + } + + /* for change calender icon of input date type */ + ::-webkit-calendar-picker-indicator { + filter: invert(1); + } + /* React-tour modal styling */ .reactour__helper { - background-color: #1F2937 !important; - color: #E5E7EB !important; + background-color: #1f2937 !important; + color: #e5e7eb !important; border: 1px solid #374151 !important; box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5) !important; } .reactour__close { - color: #E5E7EB !important; + color: #e5e7eb !important; background-color: #374151 !important; - border: 1px solid #4B5563 !important; + border: 1px solid #4b5563 !important; } .reactour__close:hover { - background-color: #4B5563 !important; - color: #FFFFFF !important; + background-color: #4b5563 !important; + color: #ffffff !important; } /* React-tour navigation buttons */ .reactour__controls { - background-color: #1F2937 !important; + background-color: #1f2937 !important; border-top: 1px solid #374151 !important; } .reactour__controls button { background-color: #374151 !important; - color: #E5E7EB !important; - border: 1px solid #4B5563 !important; + color: #e5e7eb !important; + border: 1px solid #4b5563 !important; } .reactour__controls button:hover { - background-color: #4B5563 !important; - color: #FFFFFF !important; + background-color: #4b5563 !important; + color: #ffffff !important; } .reactour__controls button:disabled { - background-color: #3C3C3C !important; + background-color: #3c3c3c !important; color: #858585 !important; border-color: #565656 !important; cursor: not-allowed !important; @@ -150,28 +163,28 @@ body { /* ReactTooltip styling */ .react-tooltip { - background-color: #1F2937 !important; - color: #E5E7EB !important; + background-color: #1f2937 !important; + color: #e5e7eb !important; border: 1px solid #374151 !important; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4) !important; } .react-tooltip.type-dark { - background-color: #1F2937 !important; - color: #E5E7EB !important; + background-color: #1f2937 !important; + color: #e5e7eb !important; } .react-tooltip.place-top:after, .react-tooltip.place-bottom:after, .react-tooltip.place-left:after, .react-tooltip.place-right:after { - border-color: #1F2937 !important; + border-color: #1f2937 !important; } /* Tour content improvements */ .reactour__badge { - background-color: #007ACC !important; - color: #FFFFFF !important; + background-color: #007acc !important; + color: #ffffff !important; } .reactour__helper h1, @@ -180,82 +193,82 @@ body { .reactour__helper h4, .reactour__helper h5, .reactour__helper h6 { - color: #FFFFFF !important; + color: #ffffff !important; } .reactour__helper p { - color: #E5E7EB !important; + color: #e5e7eb !important; } /* VS Code-style tour buttons */ .reactour__controls .op-btn { - background-color: #007ACC !important; - color: #FFFFFF !important; - border: 1px solid #007ACC !important; + background-color: #007acc !important; + color: #ffffff !important; + border: 1px solid #007acc !important; } .reactour__controls .op-btn:hover { - background-color: #0086D1 !important; - border-color: #0086D1 !important; + background-color: #0086d1 !important; + border-color: #0086d1 !important; } .reactour__controls .op-btn-secondary { background-color: #374151 !important; - color: #E5E7EB !important; - border: 1px solid #4B5563 !important; + color: #e5e7eb !important; + border: 1px solid #4b5563 !important; } .reactour__controls .op-btn-secondary:hover { - background-color: #4B5563 !important; - color: #FFFFFF !important; + background-color: #4b5563 !important; + color: #ffffff !important; } /* React-datepicker dark mode styling */ .react-datepicker { - background-color: #1F2937 !important; + background-color: #1f2937 !important; border: 1px solid #374151 !important; - color: #E5E7EB !important; + color: #e5e7eb !important; } .react-datepicker__header { background-color: #374151 !important; - border-bottom: 1px solid #4B5563 !important; - color: #E5E7EB !important; + border-bottom: 1px solid #4b5563 !important; + color: #e5e7eb !important; } .react-datepicker__current-month, .react-datepicker__day-name { - color: #E5E7EB !important; + color: #e5e7eb !important; } .react-datepicker__day { - color: #E5E7EB !important; + color: #e5e7eb !important; } .react-datepicker__day:hover { - background-color: #4B5563 !important; - color: #FFFFFF !important; + background-color: #4b5563 !important; + color: #ffffff !important; } .react-datepicker__day--selected { - background-color: #007ACC !important; - color: #FFFFFF !important; + background-color: #007acc !important; + color: #ffffff !important; } .react-datepicker__day--keyboard-selected { background-color: #374151 !important; - color: #E5E7EB !important; + color: #e5e7eb !important; } .react-datepicker__day--outside-month { - color: #6B7280 !important; + color: #6b7280 !important; } .react-datepicker__navigation { - color: #E5E7EB !important; + color: #e5e7eb !important; } .react-datepicker__navigation:hover { - background-color: #4B5563 !important; + background-color: #4b5563 !important; } -} \ No newline at end of file +} diff --git a/apps/OpenSign/src/index.jsx b/apps/OpenSign/src/index.jsx index e3630ee9e1..46e55df442 100644 --- a/apps/OpenSign/src/index.jsx +++ b/apps/OpenSign/src/index.jsx @@ -1,19 +1,10 @@ -import React from "react"; import ReactDOM from "react-dom/client"; import "./index.css"; import "./styles/dark-theme-improvements.css"; import App from "./App"; +import { showUpgradeProgress, hideUpgradeProgress } from "./utils"; import { Provider } from "react-redux"; import { store } from "./redux/store"; -import { HTML5Backend } from "react-dnd-html5-backend"; -import { TouchBackend } from "react-dnd-touch-backend"; -import { - DndProvider, - TouchTransition, - MouseTransition, - Preview -} from "react-dnd-multi-backend"; -import DragElement from "./components/pdf/DragElement.jsx"; import Parse from "parse"; import "./polyfills"; import { serverUrl_fn } from "./constant/appinfo"; @@ -25,47 +16,22 @@ const serverUrl = serverUrl_fn(); Parse.initialize(appId); Parse.serverURL = serverUrl; +if (localStorage.getItem("showUpgradeProgress")) { + showUpgradeProgress(); +} + const savedTheme = localStorage.getItem("theme"); if (savedTheme === "dark") { document.documentElement.setAttribute("data-theme", "opensigndark"); } -const HTML5toTouch = { - backends: [ - { - id: "html5", - backend: HTML5Backend, - transition: MouseTransition - }, - { - id: "touch", - backend: TouchBackend, - options: { enableMouseEvents: true }, - preview: true, - transition: TouchTransition - } - ] -}; -const generatePreview = (props) => { - const { item, style } = props; - const newStyle = { - ...style - }; - - return ( -
- -
- ); -}; - const root = ReactDOM.createRoot(document.getElementById("root")); root.render( - - {generatePreview} - - + ); + +hideUpgradeProgress(); +localStorage.removeItem("showUpgradeProgress"); diff --git a/apps/OpenSign/src/json/ReportJson.js b/apps/OpenSign/src/json/ReportJson.js index 3f09c0a16a..37d4d0d9f1 100644 --- a/apps/OpenSign/src/json/ReportJson.js +++ b/apps/OpenSign/src/json/ReportJson.js @@ -1,9 +1,18 @@ +export const extraCols = [ + "Note", + "Time to complete (Days)", + "Enable Tour", + "Notify on signatures", + "Redirect url", + "Created Date", + "Updated Date" +]; + export default function reportJson(id) { - // console.log("json ", json); const head = ["Title", "Note", "Folder", "File", "Owner", "Signers"]; const declineHead = ["Title", "Reason", "Folder", "File", "Owner", "Signers"]; const iphead = ["Title", "Note", "Folder", "File", "Signers"]; - const contactbook = ["Name", "Email", "Phone"]; + const contactbook = ["Name", "Email", "Phone", "Company", "JobTitle"]; const dashboardReportHead = ["Title", "File", "Owner", "Signers"]; const templateReport = ["Title", "File", "Owner", "Signers"]; switch (id) { @@ -28,26 +37,26 @@ export default function reportJson(id) { btnIcon: "fa-light fa-trash", redirectUrl: "", action: "delete" - }, - { - btnId: "22534", - hoverLabel: "option", - btnColor: "", - restrictBtn: true, - textColor: "black", - btnIcon: "fa-light fa-ellipsis-vertical fa-lg", - action: "option", - subaction: [ - { - btnId: "1630", - btnLabel: "Save as template", - hoverLabel: "Save as template", - btnIcon: "fa-light fa-envelope", - redirectUrl: "", - action: "saveastemplate" - } - ] } + // { + // btnId: "22534", + // hoverLabel: "option", + // btnColor: "", + // restrictBtn: true, + // textColor: "black", + // btnIcon: "fa-light fa-ellipsis-vertical fa-lg", + // action: "option", + // subaction: [ + // { + // btnId: "1630", + // btnLabel: "Save as template", + // hoverLabel: "Save as template", + // btnIcon: "fa-light fa-envelope", + // redirectUrl: "", + // action: "saveastemplate" + // } + // ] + // } ], helpMsg: "These are documents you have started but have not finalized for sending." @@ -81,7 +90,7 @@ export default function reportJson(id) { btnId: "8901", hoverLabel: "Share", btnColor: "op-btn-primary", - btnIcon: "fa-light fa-share", + btnIcon: "fa-light fa-copy", redirectUrl: "", action: "share" }, @@ -317,7 +326,7 @@ export default function reportJson(id) { btnId: "1999", hoverLabel: "Share", btnColor: "op-btn-primary", - btnIcon: "fa-light fa-share", + btnIcon: "fa-light fa-copy", redirectUrl: "", action: "share" }, @@ -419,26 +428,26 @@ export default function reportJson(id) { btnIcon: "fa-light fa-trash", redirectUrl: "", action: "delete" - }, - { - btnId: "55534", - hoverLabel: "option", - btnColor: "", - restrictBtn: true, - textColor: "black", - btnIcon: "fa-light fa-ellipsis-vertical fa-lg", - action: "option", - subaction: [ - { - btnId: "6630", - btnLabel: "Save as template", - hoverLabel: "Save as template", - btnIcon: "fa-light fa-envelope", - redirectUrl: "", - action: "saveastemplate" - } - ] } + // { + // btnId: "55534", + // hoverLabel: "option", + // btnColor: "", + // restrictBtn: true, + // textColor: "black", + // btnIcon: "fa-light fa-ellipsis-vertical fa-lg", + // action: "option", + // subaction: [ + // { + // btnId: "6630", + // btnLabel: "Save as template", + // hoverLabel: "Save as template", + // btnIcon: "fa-light fa-envelope", + // redirectUrl: "", + // action: "saveastemplate" + // } + // ] + // } ] }; // contactbook report @@ -462,8 +471,6 @@ export default function reportJson(id) { action: "delete" } ], - import: true, - form: "ContactBook", helpMsg: "This is a list of contacts/signers added by you. These will appear as suggestions when you try to add signers to a new document." }; diff --git a/apps/OpenSign/src/json/ReportTour.jsx b/apps/OpenSign/src/json/ReportTour.jsx new file mode 100644 index 0000000000..42e134d2e6 --- /dev/null +++ b/apps/OpenSign/src/json/ReportTour.jsx @@ -0,0 +1,47 @@ +import { Trans } from "react-i18next"; + +export const templateReportTour = [ + { + selector: "[data-tut=reactourFirst]", + content: , + position: "top", + style: { fontSize: "13px" } + }, + { + selector: "[data-tut=reactourSecond]", + content: , + position: "top", + style: { fontSize: "13px" } + }, + { + selector: "[data-tut=tourbulksend]", + content: , + position: "top", + style: { fontSize: "13px" } + }, + { + selector: "[data-tut=reactourThird]", + content: ( + + This menu reveals more options such as Edit, Delete, Rename, Duplicate, + Share, etc. + + Click here + + to read more about all available options. +

+ Note: Changes to an existing template will apply to all future + documents created from that template but won't affect documents that + are already sent out. +

+
+ ), + position: "top", + style: { fontSize: "13px" } + } +]; diff --git a/apps/OpenSign/src/layout/HomeLayout.jsx b/apps/OpenSign/src/layout/HomeLayout.jsx index 8ef05b4f58..b7a80851e0 100644 --- a/apps/OpenSign/src/layout/HomeLayout.jsx +++ b/apps/OpenSign/src/layout/HomeLayout.jsx @@ -1,16 +1,14 @@ -import React, { useState, useEffect } from "react"; +import { useState, useEffect } from "react"; import Header from "../components/Header"; import Footer from "../components/Footer"; import Sidebar from "../components/sidebar/Sidebar"; -import { useWindowSize } from "../hook/useWindowSize"; import Tour from "../primitives/Tour"; import axios from "axios"; -import { useDispatch, useSelector } from "react-redux"; +import { useSelector } from "react-redux"; import Parse from "parse"; import ModalUi from "../primitives/ModalUi"; import { useNavigate, useLocation, Outlet } from "react-router"; import Loader from "../primitives/Loader"; -import { showHeader } from "../redux/reducers/showHeader"; import { useTranslation } from "react-i18next"; const HomeLayout = () => { @@ -19,9 +17,6 @@ const HomeLayout = () => { const { t, i18n } = useTranslation(); const navigate = useNavigate(); const location = useLocation(); - const dispatch = useDispatch(); - const { width } = useWindowSize(); - const [isOpen, setIsOpen] = useState(true); const arr = useSelector((state) => state.TourSteps); const [isUserValid, setIsUserValid] = useState(true); const [isLoader, setIsLoader] = useState(true); @@ -29,7 +24,7 @@ const HomeLayout = () => { const [isTour, setIsTour] = useState(false); const [tourStatusArr, setTourStatusArr] = useState([]); const [tourConfigs, setTourConfigs] = useState([]); - + const [isLoggingOut, setIsLoggingOut] = useState(false); const tenantId = localStorage.getItem("TenantId"); useEffect(() => { @@ -67,15 +62,6 @@ const HomeLayout = () => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [tenantId]); - const showSidebar = () => { - setIsOpen((value) => !value); - dispatch(showHeader(!isOpen)); - }; - useEffect(() => { - if (width && width <= 768) { - setIsOpen(false); - } - }, [width]); useEffect(() => { if (arr && arr.length > 0) { @@ -87,6 +73,7 @@ const HomeLayout = () => { }, [arr]); const handleDynamicSteps = () => { + const github = "https://github.com/OpenSignLabs/OpenSign"; if (arr && arr.length > 0) { // const resArr = arr; const resArr = arr.map((obj, index) => { @@ -105,7 +92,7 @@ const HomeLayout = () => { { selector: '[data-tut="nonpresentmask"]', content: t("tour-mssg.home-layout-1"), - position: "center", + position: "center" }, { selector: '[data-tut="tourbutton"]', @@ -115,8 +102,23 @@ const HomeLayout = () => { ...resArr, { selector: '[data-tut="nonpresentmask"]', - content: t("tour-mssg.home-layout-3", { appName }), - position: "center", + content: () => ( +
+ {t("tour-mssg.home-layout-3", { appName })} +

+ ⭐ Star us on + + GitHub + +

+
+ ), + position: "center" } ]); checkTourStatus(); @@ -146,19 +148,11 @@ const HomeLayout = () => { updatedTourStatus = [{ loginTour: true }]; } - // console.log("updatedTourStatus ", updatedTourStatus); await axios.put( serverUrl + "classes/contracts_Users/" + extUserId, - { - TourStatus: updatedTourStatus - }, - { - headers: { - "X-Parse-Application-Id": appId - } - } + { TourStatus: updatedTourStatus }, + { headers: { "X-Parse-Application-Id": appId } } ); - // console.log("updatedRes ", updatedRes); }; async function checkTourStatus() { @@ -175,12 +169,6 @@ const HomeLayout = () => { } } - const closeSidebar = () => { - if (width <= 1023) { - setIsOpen(false); - } - }; - const handleLoginBtn = async () => { try { await Parse?.User?.logOut(); @@ -192,12 +180,11 @@ const HomeLayout = () => { } }; return ( -
-
- {!isLoader && ( -
- )} -
+
+ {/* HEADER */} +
+ {!isLoader &&
} +
{isUserValid ? ( <> {isLoader ? ( @@ -206,27 +193,37 @@ const HomeLayout = () => {
) : ( <> -
- -
+ +
+ )} + {/* BODY */} +
+ {/* SIDEBAR with width animation */} + + {/* MAIN (includes both content + footer in one scrollable column) */} +
-
{}
-
-
+
+ {/* your page content */} +
{}
+ {/* sticky-but-scrollable footer */} +
+
+
-
+
@@ -235,7 +232,7 @@ const HomeLayout = () => { ) : (
-

Your session has expired.

+

{t("session-expired")}

diff --git a/apps/OpenSign/src/pages/AddAdmin.jsx b/apps/OpenSign/src/pages/AddAdmin.jsx index 3e8211c9a2..ac3f38d519 100644 --- a/apps/OpenSign/src/pages/AddAdmin.jsx +++ b/apps/OpenSign/src/pages/AddAdmin.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import Parse from "parse"; import { appInfo } from "../constant/appinfo"; import { NavLink, useNavigate } from "react-router"; @@ -11,7 +11,6 @@ import { import { useDispatch } from "react-redux"; import { showTenant } from "../redux/reducers/ShowTenant"; import Loader from "../primitives/Loader"; -import Title from "../components/Title"; import { useTranslation } from "react-i18next"; import { emailRegex } from "../constant/const"; @@ -73,6 +72,7 @@ const AddAdmin = () => { const defaultmenuid = localStorage.getItem("defaultmenuid"); const PageLanding = localStorage.getItem("PageLanding"); const userSettings = localStorage.getItem("userSettings"); + const favicon = localStorage.getItem("favicon"); localStorage.clear(); saveLanguageInLocal(i18n); @@ -84,12 +84,13 @@ const AddAdmin = () => { localStorage.setItem("userSettings", userSettings); localStorage.setItem("baseUrl", baseUrl); localStorage.setItem("parseAppId", appid); + localStorage.setItem("favicon", favicon); }; const handleSubmit = async (event) => { event.preventDefault(); if (!emailRegex.test(email)) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); } else { if (lengthValid && caseDigitValid && specialCharValid) { clearStorage(); @@ -265,7 +266,6 @@ const AddAdmin = () => { }; return (
- {state.loading ? ( <div className="text-[grey] flex justify-center items-center text-lg md:text-2xl"> <Loader /> diff --git a/apps/OpenSign/src/pages/ChangePassword.jsx b/apps/OpenSign/src/pages/ChangePassword.jsx index bf693a9866..b162a4388a 100644 --- a/apps/OpenSign/src/pages/ChangePassword.jsx +++ b/apps/OpenSign/src/pages/ChangePassword.jsx @@ -1,7 +1,6 @@ -import React, { useState } from "react"; +import { useState } from "react"; import Parse from "parse"; import { Navigate } from "react-router"; -import Title from "../components/Title"; import { useTranslation } from "react-i18next"; function ChangePassword() { @@ -56,7 +55,6 @@ function ChangePassword() { } return ( <div className="w-full bg-base-100 text-base-content shadow rounded-box p-2"> - <Title title="Change Password" /> <div className="text-xl font-bold border-b-[1px] border-gray-300"> {t("change-password")} </div> diff --git a/apps/OpenSign/src/pages/Dashboard.jsx b/apps/OpenSign/src/pages/Dashboard.jsx index d135c3c0e5..4a50285285 100644 --- a/apps/OpenSign/src/pages/Dashboard.jsx +++ b/apps/OpenSign/src/pages/Dashboard.jsx @@ -1,7 +1,6 @@ import React, { useState, useEffect } from "react"; import GetDashboard from "../components/dashboard/GetDashboard"; import { useNavigate, useParams } from "react-router"; -import Title from "../components/Title"; import { useDispatch } from "react-redux"; import { saveTourSteps } from "../redux/reducers/TourStepsReducer"; import dashboardJson from "../json/dashboardJson"; @@ -57,7 +56,6 @@ const Dashboard = () => { return ( <React.Fragment> - <Title title="Dashboard" /> {loading ? ( <div className="h-[300px] w-full bg-white flex justify-center items-center rounded-md"> <Loader /> diff --git a/apps/OpenSign/src/pages/DebugPdf.jsx b/apps/OpenSign/src/pages/DebugPdf.jsx index 52b52a8303..1b45c40331 100644 --- a/apps/OpenSign/src/pages/DebugPdf.jsx +++ b/apps/OpenSign/src/pages/DebugPdf.jsx @@ -1,12 +1,12 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage"; -import Title from "../components/Title"; import RenderDebugPdf from "../components/RenderDebugPdf"; import { pdfjs } from "react-pdf"; import ModalUi from "../primitives/ModalUi"; import Alert from "../primitives/Alert"; import HandleError from "../primitives/HandleError"; import { useWindowSize } from "../hook/useWindowSize"; +import { useTranslation } from "react-i18next"; function processDimensions(x, y, width, height) { if (width < 0) { @@ -27,6 +27,7 @@ function processDimensions(x, y, width, height) { }; } const DebugPdf = () => { + const {t} = useTranslation() const { width } = useWindowSize(); const [pdf, setPdf] = useState(""); const [isModal, setIsModal] = useState(true); @@ -215,8 +216,7 @@ const DebugPdf = () => { }; return ( <div> - {copied && <Alert type="success">Copied</Alert>} - <Title title={"Debug Pdf"} /> + {copied && <Alert type="success">{t("copied")}</Alert>} {width < 800 ? ( <HandleError handleError={"Debug PDF only availble for PC"} /> ) : ( diff --git a/apps/OpenSign/src/pages/DocSuccessPage.jsx b/apps/OpenSign/src/pages/DocSuccessPage.jsx index 1cb63b16d6..81961f1ea2 100644 --- a/apps/OpenSign/src/pages/DocSuccessPage.jsx +++ b/apps/OpenSign/src/pages/DocSuccessPage.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import Confetti from "react-confetti"; // Import the confetti library import { @@ -10,7 +10,6 @@ import { import ModalUi from "../primitives/ModalUi"; import Loader from "../primitives/Loader"; import DownloadPdfZip from "../primitives/DownloadPdfZip"; -import Title from "../components/Title"; import CheckCircle from "../primitives/CheckCircle"; const DocSuccessPage = () => { @@ -62,7 +61,6 @@ const DocSuccessPage = () => { return ( <> - <Title title="Success" /> {/* Confetti Effect */} {showConfetti && ( <Confetti width={window.innerWidth} height={window.innerHeight} /> diff --git a/apps/OpenSign/src/pages/ForgetPassword.jsx b/apps/OpenSign/src/pages/ForgetPassword.jsx index 25d1469a5c..12bb2cb49f 100644 --- a/apps/OpenSign/src/pages/ForgetPassword.jsx +++ b/apps/OpenSign/src/pages/ForgetPassword.jsx @@ -1,5 +1,4 @@ -import React, { useEffect, useState } from "react"; -import Title from "../components/Title"; +import { useEffect, useState } from "react"; import { useNavigate } from "react-router"; import login_img from "../assets/images/login_img.svg"; import Parse from "parse"; @@ -40,7 +39,7 @@ function ForgotPassword() { const handleSubmit = async (event) => { event.preventDefault(); if (!emailRegex.test(state.email)) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); } else { setIsLoading(true); localStorage.setItem("appLogo", appInfo.applogo); @@ -87,7 +86,6 @@ function ForgotPassword() { <Loader /> </div> )} - <Title title="Forgot password" /> {toast?.message && <Alert type={toast.type}>{toast.message}</Alert>} <div className="md:p-10 lg:p-16"> <div className="md:p-4 lg:p-10 p-4 bg-base-100 text-base-content op-card"> diff --git a/apps/OpenSign/src/pages/Form.jsx b/apps/OpenSign/src/pages/Form.jsx index 72673a1bfc..60a4a7a69d 100644 --- a/apps/OpenSign/src/pages/Form.jsx +++ b/apps/OpenSign/src/pages/Form.jsx @@ -5,7 +5,6 @@ import Parse from "parse"; import Alert from "../primitives/Alert"; import SelectFolder from "../components/shared/fields/SelectFolder"; import SignersInput from "../components/shared/fields/SignersInput"; -import Title from "../components/Title"; import PageNotFound from "./PageNotFound"; import { SaveFileSize } from "../constant/saveFileSize"; import { @@ -195,7 +194,9 @@ const Forms = (props) => { setIsDecrypting(false); setfileload(false); removeFile(e); - alert(`Incorrect password for file: ${file.name}`); + alert( + t("incorrect-password-for-file", { file: file.name }) + ); } } else { console.error("password not provided"); @@ -273,9 +274,8 @@ const Forms = (props) => { setfileload(false); removeFile(e); console.log("err in docx to pdf ", err); - const error = isOpenSignDomain - ? `${t("docx-error")} ${t("docx-error-contact")}` - : t("docx-error"); + const error = + t("docx-error"); alert(error); return; } @@ -321,7 +321,8 @@ const Forms = (props) => { } if (uploadedUrl) { const tenantId = localStorage.getItem("TenantId"); - SaveFileSize(pdfBytes.byteLength, uploadedUrl, tenantId); + const userId = extUserData?.UserId?.objectId; + SaveFileSize(pdfBytes.byteLength, uploadedUrl, tenantId, userId); setFileUpload(uploadedUrl); setfileload(false); const title = generateTitleFromFilename(filesNameArr?.[0]); @@ -555,6 +556,8 @@ const Forms = (props) => { e.preventDefault(); setIsPassword(false); setfileload(true); + const tenantId = localStorage.getItem("TenantId"); + const userId = extUserData?.UserId?.objectId; try { const size = formData?.file?.size; const name = generatePdfName(16); @@ -579,8 +582,7 @@ const Forms = (props) => { removeFile(); const title = generateTitleFromFilename(formData?.file?.name); setFormData((obj) => ({ ...obj, password: "", Name: title })); - const tenantId = localStorage.getItem("TenantId"); - SaveFileSize(size, fileRes.url, tenantId); + SaveFileSize(size, fileRes?.url, tenantId, userId); return fileRes.url; } else { removeFile(); @@ -630,7 +632,6 @@ const Forms = (props) => { return ( <div className="shadow-md rounded-box my-[2px] p-3 bg-base-100 text-base-content"> - <Title title={props?.title} /> {isAlert?.message && <Alert type={isAlert.type}>{isAlert.message}</Alert>} {isSubmit ? ( <div className="h-[300px] flex justify-center items-center"> @@ -680,9 +681,7 @@ const Forms = (props) => { </ModalUi> <form onSubmit={handleSubmit}> <div className="mb-[11px]"> - <h1 className="text-[20px] font-semibold"> - {t(`form-name.${props?.title}`)} - </h1> + <h1 className="text-[20px] font-semibold">{t(props?.title)}</h1> {props.title === "Sign Yourself" && ( <div className="text-gray-500 text-xs mt-1"> {t("signyour-self-description")} @@ -793,6 +792,7 @@ const Forms = (props) => { onChange={handleSigners} isReset={isReset} helptextZindex={50} + isAddYourSelfCheckbox required /> )} @@ -1029,6 +1029,7 @@ const Forms = (props) => { helptextZindex={50} helpText={t("bcc-help")} isCaptureAllData + isAddYourSelfCheckbox /> )} </> @@ -1223,7 +1224,7 @@ const Forms = (props) => { {t("next")} </button> <div - className="op-btn op-btn-ghost" + className="op-btn op-btn-ghost text-base-content" onClick={() => handleCancel()} > {t("cancel")} diff --git a/apps/OpenSign/src/pages/GuestLogin.jsx b/apps/OpenSign/src/pages/GuestLogin.jsx index 4af963d7e7..51ef036992 100644 --- a/apps/OpenSign/src/pages/GuestLogin.jsx +++ b/apps/OpenSign/src/pages/GuestLogin.jsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect } from "react"; +import { useState, useEffect } from "react"; import { useNavigate, useParams } from "react-router"; import axios from "axios"; import { @@ -14,7 +14,6 @@ import Parse from "parse"; import { useTranslation } from "react-i18next"; import SelectLanguage from "../components/pdf/SelectLanguage"; import LoaderWithMsg from "../primitives/LoaderWithMsg"; -import Title from "../components/Title"; import ModalUi from "../primitives/ModalUi"; import Loader from "../primitives/Loader"; @@ -36,8 +35,14 @@ function GuestLogin() { const [documentId, setDocumentId] = useState(id); const [contactId, setContactId] = useState(contactBookId); const [sendmail, setSendmail] = useState(); - const [contact, setContact] = useState({ name: "", phone: "", email: "" }); - + const [contact, setContact] = useState({ + name: "", + phone: "", + email: "", + jobTitle: "", + company: "" + }); + const [isOptionalDetails, setIsOptionalDetails] = useState(false); const navigateToDoc = async (docId, contactId) => { try { @@ -72,8 +77,10 @@ function GuestLogin() { //function generate serverUrl and parseAppId from url and save it in local storage const handleServerUrl = async () => { setAppLogo(logo); + const favicon = localStorage.getItem("favicon"); localStorage.clear(); // Clears everything + localStorage.setItem("favicon", favicon); localStorage.setItem( "appname", "OpenSign™" @@ -214,7 +221,7 @@ function GuestLogin() { const handleUserData = async (e) => { e.preventDefault(); if (!emailRegex.test(contact.email?.toLowerCase()?.replace(/\s/g, ""))) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); } else { const params = { ...contact, docId: documentId }; try { @@ -253,7 +260,6 @@ function GuestLogin() { return ( <div> - <Title title="Request Sign" /> {/* OTP Verification Modal */} {EnterOTP && ( @@ -356,7 +362,7 @@ function GuestLogin() { <div className="mb-2"> <label htmlFor="name" - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("name")} <span className="text-[red] text-[13px]"> *</span> @@ -378,7 +384,7 @@ function GuestLogin() { <div className="mb-2"> <label htmlFor="email" - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("email")} <span className="text-[red] text-[13px]"> *</span> @@ -393,23 +399,74 @@ function GuestLogin() { disabled /> </div> - <div className="mt-2.5"> - <label - htmlFor="phone" - className="block text-xs text-gray-700 font-semibold" - > - {t("phone")} - </label> - <input - type="text" - name="phone" - value={contact.phone} - onChange={handleInputChange} - className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" - disabled={loading} - placeholder={t("phone-optional")} - /> - </div> + {isOptionalDetails && ( + <> + <div className="mb-2"> + <label + htmlFor="phone" + className="block text-xs font-semibold" + > + {t("phone")} + </label> + <input + type="text" + name="phone" + value={contact.phone} + onChange={handleInputChange} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + disabled={loading} + placeholder={t("phone-optional")} + /> + </div> + <div className="mb-2"> + <label + htmlFor="company" + className="block text-xs font-semibold" + > + {t("company")} + </label> + <input + type="text" + id="company" + name="company" + value={contact.company} + onChange={handleInputChange} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + disabled={loading} + placeholder={t("phone-optional")} + /> + </div> + <div className="mb-2"> + <label + htmlFor="jobTitle" + className="block text-xs font-semibold" + > + {t("job-title")} + </label> + <input + type="text" + id="jobTitle" + name="jobTitle" + value={contact.jobTitle} + onChange={handleInputChange} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + disabled={loading} + placeholder={t("phone-optional")} + /> + </div> + </> + )} + <button + onClick={(e) => { + e.preventDefault(); + setIsOptionalDetails(!isOptionalDetails); + }} + className="op-link op-link-secondary max-w-fit text-xs" + > + {isOptionalDetails + ? t("hide-optional-details") + : t("optional-details")} + </button> <div className="mt-2 flex justify-start"> <button type="submit" diff --git a/apps/OpenSign/src/pages/Login.jsx b/apps/OpenSign/src/pages/Login.jsx index 554033ea47..b57f86aac8 100644 --- a/apps/OpenSign/src/pages/Login.jsx +++ b/apps/OpenSign/src/pages/Login.jsx @@ -1,8 +1,7 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import Parse from "parse"; import { useDispatch } from "react-redux"; import axios from "axios"; -import Title from "../components/Title"; import { NavLink, useNavigate, useLocation } from "react-router"; import login_img from "../assets/images/login_img.svg"; import { useWindowSize } from "../hook/useWindowSize"; @@ -125,13 +124,17 @@ function Login() { } } catch (error) { console.error("Error while logging in user", error); - showToast("danger", "Invalid username/password or region"); + if (error?.code === 1001) { + showToast("danger", t("action-prohibited")); + } else { + showToast("danger", t("invalid-username-password-region")); + } } }; const handleLoginBtn = async (event) => { event.preventDefault(); if (!emailRegex.test(state.email)) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); return; } await handleLogin(); @@ -329,6 +332,7 @@ function Login() { let PageLanding = localStorage.getItem("PageLanding"); let baseUrl = localStorage.getItem("baseUrl"); let appid = localStorage.getItem("parseAppId"); + let favicon = localStorage.getItem("favicon"); localStorage.clear(); saveLanguageInLocal(i18n); @@ -339,6 +343,7 @@ function Login() { localStorage.setItem("userSettings", appdata); localStorage.setItem("baseUrl", baseUrl); localStorage.setItem("parseAppId", appid); + localStorage.setItem("favicon", favicon); }; const continueLoginFlow = async () => { @@ -403,8 +408,7 @@ function Login() { {errMsg} </div> ) : ( - <div> - <Title title="Login" /> + <> {state.loading && ( <div aria-live="assertive" @@ -495,7 +499,7 @@ function Login() { to="/forgetpassword" className="text-[13px] op-link op-link-primary underline-offset-1 focus:outline-none ml-1" > - {t("forgot-password")} + {t("forgot-password")}? </NavLink> </div> </div> @@ -539,7 +543,7 @@ function Login() { <label htmlFor="Company" style={{ display: "flex" }} - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("company")}{" "} <span className="text-[red] text-[13px]">*</span> @@ -566,7 +570,7 @@ function Login() { <label htmlFor="JobTitle" style={{ display: "flex" }} - className="block text-xs text-gray-700 font-semibold" + className="block text-xs font-semibold" > {t("job-title")} <span className="text-[red] text-[13px]">*</span> @@ -599,7 +603,7 @@ function Login() { </button> <button type="button" - className="op-btn op-btn-ghost" + className="op-btn op-btn-ghost text-base-content" onClick={logOutUser} > {t("cancel")} @@ -616,7 +620,7 @@ function Login() { <Loader /> </div> )} - </div> + </> ); } export default Login; diff --git a/apps/OpenSign/src/pages/Managesign.jsx b/apps/OpenSign/src/pages/Managesign.jsx index 0655183017..eb5b267300 100644 --- a/apps/OpenSign/src/pages/Managesign.jsx +++ b/apps/OpenSign/src/pages/Managesign.jsx @@ -1,4 +1,4 @@ -import React, { useState, useRef, useEffect } from "react"; +import { useState, useRef, useEffect } from "react"; import SignatureCanvas from "react-signature-canvas"; import "../styles/managesign.css"; import "../styles/signature.css"; @@ -12,8 +12,7 @@ import { SaveFileSize } from "../constant/saveFileSize"; import Alert from "../primitives/Alert"; import Loader from "../primitives/Loader"; import { useTranslation } from "react-i18next"; -import sanitizeFileName from "../primitives/sanitizeFileName"; -import Title from "../components/Title"; +import { sanitizeFileName } from "../utils"; const ManageSign = () => { const { t } = useTranslation(); const [penColor, setPenColor] = useState("blue"); @@ -206,7 +205,8 @@ const ManageSign = () => { const fileRes = await getSecureUrl(response?.url()); if (fileRes?.url) { const tenantId = localStorage.getItem("TenantId"); - SaveFileSize(file.size, fileRes?.url, tenantId); + const userId = Parse?.User?.current()?.id; + SaveFileSize(file.size, fileRes?.url, tenantId, userId); return fileRes?.url; } else { alert(t("something-went-wrong-mssg")); @@ -298,7 +298,6 @@ const ManageSign = () => { }; return ( <div className="relative h-full bg-base-100 text-base-content flex shadow-md rounded-box overflow-auto"> - <Title title="My signature" /> {isLoader && ( <div className="absolute bg-black bg-opacity-30 z-50 w-full h-full flex justify-center items-center"> <Loader /> @@ -324,13 +323,8 @@ const ManageSign = () => { hidden /> <div className="relative"> - {isLoader && ( - <div className="absolute bg-black bg-opacity-30 z-50 w-full h-full flex justify-center items-center"> - <Loader /> - </div> - )} {image ? ( - <div className="signatureCanvas relative border-[2px] border-[#888] rounded-box overflow-hidden"> + <div className="mysignatureCanvas relative border-[2px] border-[#888] rounded-box overflow-hidden"> <img alt="signature" src={image} @@ -342,10 +336,8 @@ const ManageSign = () => { ref={canvasRef} penColor={penColor} canvasProps={{ - width: "456px", - height: "180px", className: - "signatureCanvas border-[2px] border-[#888] rounded-box" + "mysignatureCanvas border-[2px] border-[#888] rounded-box" }} onEnd={() => handleSignatureChange(canvasRef.current.toDataURL()) diff --git a/apps/OpenSign/src/pages/Opensigndrive.jsx b/apps/OpenSign/src/pages/Opensigndrive.jsx index 0fc741ec94..36caacc095 100644 --- a/apps/OpenSign/src/pages/Opensigndrive.jsx +++ b/apps/OpenSign/src/pages/Opensigndrive.jsx @@ -1,4 +1,5 @@ -import React, { useEffect, useState, useRef } from "react"; +import React, { useEffect, useState, useRef, useCallback } from "react"; +import { lazyWithRetry } from "../utils"; import "../styles/opensigndrive.css"; import { getThemeIconColor, @@ -7,7 +8,6 @@ import { getDrive } from "../constant/Utils"; import { useNavigate } from "react-router"; -import Title from "../components/Title"; import Parse from "parse"; import ModalUi from "../primitives/ModalUi"; import TourContentWithBtn from "../primitives/TourContentWithBtn"; @@ -16,7 +16,7 @@ import axios from "axios"; import Loader from "../primitives/Loader"; import { useTranslation } from "react-i18next"; -const DriveBody = React.lazy( +const DriveBody = lazyWithRetry( () => import("../components/opensigndrive/DriveBody") ); const dropdowncss = @@ -35,6 +35,8 @@ function Opensigndrive() { const { t } = useTranslation(); const navigate = useNavigate(); const scrollRef = useRef(null); + // Create a ref for the "sentinel" element at the bottom of the list + const bottomRef = useRef(null); const [isList, setIsList] = useState(false); const [selectedSort, setSelectedSort] = useState("Date"); const [sortingOrder, setSortingOrder] = useState("Descending"); @@ -60,7 +62,7 @@ function Opensigndrive() { const [loading, setLoading] = useState(false); const sortOrder = ["Ascending", "Descending"]; const sortingValue = ["Name", "Date"]; - const [isDontShow, setIsDontShow] = useState(false); + const [isDontShow, setIsDontShow] = useState(true); const [tourData, setTourData] = useState(); const [showTourFirstTIme, setShowTourFirstTime] = useState(true); const [searchTerm, setSearchTerm] = useState(""); @@ -221,39 +223,38 @@ function Opensigndrive() { } }; - //function to fetch drive details list on scroll bottom - const handleScroll = () => { - //get document of render openSign-drive component using id - const documentList = document.getElementById("renderList"); - const { scrollTop, clientHeight, scrollHeight } = documentList; - const scrolled = Math.ceil(scrollTop + clientHeight); // ceil return e.g 3.14 => 4 - const totalHeight = Math.floor(scrollHeight); // floor return e.g 3.14 => 3 - - // clientHeight property returns the height of an element's content area, including padding but not including borders, margins, or scrollbars. - // scrollHeight property returns the entire height of an element,including the parts that are not visible due to overflow.. - // scrollTop property show height of element, how much the content has been scrolled from the top. - // When the sum of scrollTop and clientHeight is equal to scrollHeight, it means that the user has scrolled to the bottom of the div. - - if (scrolled >= totalHeight) { - //disableLoading is used disable initial loader - const disableLoading = true; - // If the fetched data length is less than the limit, it means there's no more data to fetch - if (!loading && pdfData.length % 50 === 0) { - getPdfDocumentList(disableLoading); - } + // Memoize the loader function so it only changes when deps change + const loadMore = useCallback(() => { + // Only fetch if we're not already loading and we've got a full "page" (50 items) + if (!loading && pdfData.length % 50 === 0) { + // Pass `true` to disable the initial loader UI + getPdfDocumentList(true); } - }; - //useEffect is used to call handleScroll function on scrolling event + }, [loading, pdfData.length, getPdfDocumentList]); + useEffect(() => { - const documentList = document.getElementById("renderList"); - if (documentList) { - documentList.addEventListener("scroll", handleScroll); - return () => { - documentList.removeEventListener("scroll", handleScroll); - }; - } - // eslint-disable-next-line - }, [loading, sortingOrder, selectedSort]); // Add/remove scroll event listener when loading changes + const container = document.getElementById("renderList") || null; + if (!container) return; + // Set up the IntersectionObserver + const observer = new IntersectionObserver( + ([entry]) => { + // 5. When the sentinel comes fully into view, trigger loadMore() + if (entry.isIntersecting) loadMore(); + }, + { + root: container, // Determine the scroll container (null = viewport) + rootMargin: "0px", // no extra margin + threshold: 1.0 // fire when 100% of sentinel is visible + } + ); + // Start observing the sentinel DOM node + if (bottomRef.current) observer.observe(bottomRef.current); + // Clean up on unmount or if loadMore changes + return () => { + if (bottomRef.current) observer.unobserve(bottomRef.current); + observer.disconnect(); + }; + }, [loadMore]); //function for handle folder name path const handleRoute = (index, folderData) => { @@ -554,9 +555,27 @@ function Opensigndrive() { }; }, []); + const handleHighlightClick = () => { + setIsTour(false); + setShowTourFirstTime(false); + }; + + const handleFolderOptions = () => { + setIsOptions(!isOptions); + handleHighlightClick(); + }; + + const handleSortOptions = () => { + setIsShowSort(!isShowSort); + handleHighlightClick(); + }; + + const handleViewOption = () => { + setIsList(!isList); + handleHighlightClick(); + }; return ( <div className="bg-base-100 text-base-content rounded-box w-full shadow-md"> - <Title title={`${drivename} Drive`} drive={true} /> <ModalUi isOpen={isAlert.isShow} title={t("alert")} @@ -614,7 +633,7 @@ function Opensigndrive() { </button> <button type="button" - className="op-btn op-btn-ghost ml-1" + className="op-btn op-btn-ghost text-base-content ml-1" onClick={oncloseFolder} > {t("close")} @@ -643,14 +662,13 @@ function Opensigndrive() { onRequestClose={closeTour} steps={tourData} isOpen={isTour} - closeWithMask={false} scrollOffset={-100} - rounded={5} /> )} <div data-tut="reactourFirst" onMouseEnter={(e) => handleMouseEnter(e)} + onClick={handleHighlightClick} ref={scrollRef} className="w-full whitespace-nowrap cursor-pointer select-none overflow-x-auto" > @@ -682,7 +700,7 @@ function Opensigndrive() { <div id="folder-menu" className={`${isOptions ? "dropdown show dropDownStyle" : "dropdown"} hidden md:block cursor-pointer hover:bg-gray-200 p-2 rounded-md`} - onClick={() => setIsOptions(!isOptions)} + onClick={handleFolderOptions} > <div data-tut="reactourSecond"> <i @@ -712,14 +730,14 @@ function Opensigndrive() { onClick={() => navigate("/form/sHAnZphf69")} > <i className="fa-light fa-pen-nib mr-[5px]"></i> - {t("form-name.Sign Yourself")} + {t("Sign Yourself")} </span> <span className="dropdown-item text-[10px] md:text-[13px]" onClick={() => navigate("/form/8mZzFxbG1z")} > <i className="fa-light fa-file-signature mr-[5px]"></i> - {t("form-name.Request Signatures")} + {t("Request Signatures")} </span> </div> </div> @@ -727,7 +745,7 @@ function Opensigndrive() { <div id="menu-container" className={isShowSort ? "dropdown show" : "dropdown"} - onClick={() => setIsShowSort(!isShowSort)} + onClick={handleSortOptions} > <div data-tut="reactourThird" @@ -739,7 +757,12 @@ function Opensigndrive() { aria-hidden="true" style={{ color: `${getThemeIconColor()}` }} ></i> - <span style={{ fontSize: "15px", color: `${getThemeIconColor()}` }}> + <span + style={{ + fontSize: "15px", + color: `${getThemeIconColor()}` + }} + > {selectedSort} </span> </div> @@ -796,7 +819,7 @@ function Opensigndrive() { <div className="cursor-pointer p-2 hover:bg-gray-200 rounded-md flex justify-center items-center" data-tut="reactourForth" - onClick={() => setIsList(!isList)} + onClick={handleViewOption} > <i className={`${isList ? "fa-light fa-th-large" : "fa-light fa-list"} text-[20px]`} @@ -840,14 +863,14 @@ function Opensigndrive() { onClick={() => navigate("/form/sHAnZphf69")} > <i className="fa-light fa-pen-nib mr-[5px]"></i> - {t("form-name.Sign Yourself")} + {t("Sign Yourself")} </span> <span className="dropdown-item text-[10px] md:text-[13px]" onClick={() => navigate("/form/8mZzFxbG1z")} > <i className="fa-light fa-file-signature mr-[5px]"></i> - {t("form-name.Request Signatures")} + {t("Request Signatures")} </span> </div> </div> @@ -891,6 +914,8 @@ function Opensigndrive() { setSkip={setSkip} sortingData={sortingData} /> + {/* sentinel */} + <div ref={bottomRef} className="h-1" /> {loading && ( <div className="text-center pb-[20px]">{t("loading")}</div> )} diff --git a/apps/OpenSign/src/pages/PageNotFound.jsx b/apps/OpenSign/src/pages/PageNotFound.jsx index 1c439b27f7..6edae68480 100644 --- a/apps/OpenSign/src/pages/PageNotFound.jsx +++ b/apps/OpenSign/src/pages/PageNotFound.jsx @@ -1,15 +1,13 @@ -// NotFound.js -import React from "react"; -import Title from "../components/Title"; +import { useTranslation } from "react-i18next"; const PageNotFound = ({ prefix }) => { + const { t } = useTranslation(); return ( <div className="flex items-center justify-center h-screen w-full bg-base-100 text-base-content rounded-box"> - <Title title={"Page Not Found"} /> <div className="text-center"> <h1 className="text-[60px] lg:text-[120px] font-semibold">404</h1> <p className="text-[30px] lg:text-[50px]"> - {prefix ? prefix : "Page"} Not Found + {prefix ? `${prefix} Not Found` : t("page-not-found")} </p> </div> </div> diff --git a/apps/OpenSign/src/pages/PdfRequestFiles.jsx b/apps/OpenSign/src/pages/PdfRequestFiles.jsx index b898e8836d..044f5f354f 100644 --- a/apps/OpenSign/src/pages/PdfRequestFiles.jsx +++ b/apps/OpenSign/src/pages/PdfRequestFiles.jsx @@ -3,8 +3,7 @@ import { PDFDocument } from "pdf-lib"; import "../styles/signature.css"; import Parse from "parse"; import axios from "axios"; -import { DndProvider, useDrop } from "react-dnd"; -import { HTML5Backend } from "react-dnd-html5-backend"; +import { useDrop } from "react-dnd"; import { useDispatch, useSelector } from "react-redux"; import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage"; import Tour from "../primitives/Tour"; @@ -14,11 +13,12 @@ import { setSaveSignCheckbox, setMyInitial, setDefaultSignImg, - resetWidgetState + resetWidgetState, + setPrefillImg } from "../redux/reducers/widgetSlice.js"; import { contractDocument, - multiSignEmbed, + embedWidgetsToDoc, embedDocId, pdfNewWidthFun, signPdfFun, @@ -48,13 +48,13 @@ import { widgetDataValue, getOriginalWH, handleCheckResponse, + convertJpegToPng } from "../constant/Utils"; import Header from "../components/pdf/PdfHeader"; import RenderPdf from "../components/pdf/RenderPdf"; -import Title from "../components/Title"; import DefaultSignature from "../components/pdf/DefaultSignature"; import SignerListComponent from "../components/pdf/SignerListComponent"; -import PdfZoom from "../components/pdf/PdfZoom"; +import PdfTools from "../components/pdf/PdfTools"; import { useTranslation } from "react-i18next"; import ModalUi from "../primitives/ModalUi"; import TourContentWithBtn from "../primitives/TourContentWithBtn"; @@ -68,16 +68,15 @@ import AgreementSign from "../components/pdf/AgreementSign"; import WidgetComponent from "../components/pdf/WidgetComponent"; import PlaceholderCopy from "../components/pdf/PlaceholderCopy"; import TextFontSetting from "../components/pdf/TextFontSetting"; -import WidgetsValueModal from "../components/pdf/WidgetsValueModal.jsx"; +import WidgetsValueModal from "../components/pdf/WidgetsValueModal"; +import * as utils from "../utils"; function PdfRequestFiles( ) { const { t } = useTranslation(); const dispatch = useDispatch(); + const prefillImg = useSelector((state) => state.widget.prefillImg); const isShowModal = useSelector((state) => state.widget.isShowModal); - const saveSignCheckbox = useSelector( - (state) => state.widget.saveSignCheckbox - ); const defaultSignImg = useSelector((state) => state.widget.defaultSignImg); const myInitial = useSelector((state) => state.widget.myInitial); const appName = @@ -91,8 +90,9 @@ function PdfRequestFiles( const [pageNumber, setPageNumber] = useState(1); const [handleError, setHandleError] = useState(); const [isCelebration, setIsCelebration] = useState(false); - const [requestSignTour, setRequestSignTour] = useState(true); + const [isReqSignTourDisabled, setIsReqSignTourDisabled] = useState(true); const [tourStatus, setTourStatus] = useState([]); + const [isDontShowCheckbox, setIsDontShowCheckbox] = useState(false); const [isLoading, setIsLoading] = useState({ isLoad: true, message: t("loading-mssg") @@ -110,11 +110,8 @@ function PdfRequestFiles( const [expiredDate, setExpiredDate] = useState(""); const [isResize, setIsResize] = useState(false); const [signerUserId, setSignerUserId] = useState(); - const [isDontShow, setIsDontShow] = useState(false); + const [isDontShow, setIsDontShow] = useState(true); const [isDownloading, setIsDownloading] = useState(""); - // tempSignerId is used to temporarily store the currently selected signer's unique ID, When editing a text widget, it automatically attaches a prefill user, and since prefill users are not shown in the signer list, the selected signer from before editing would be lost. To handle this, we store the currently selected signer's unique ID in tempSignerId before entering the text widget edit mode. Once the text widget settings are completed, - // we restore the original selected signer by setting tempSignerId back to uniqueId.This ensures that the correct signer remains selected and visible in the UI even after interacting with a prefill-only widget like the text widget. - const [tempSignerId, setTempSignerId] = useState(""); const [defaultSignAlert, setDefaultSignAlert] = useState({ isShow: false, alertMessage: "" @@ -138,13 +135,12 @@ function PdfRequestFiles( const [scale, setScale] = useState(1); const [uniqueId, setUniqueId] = useState(""); const [documentId, setDocumentId] = useState(""); - const isHeader = useSelector((state) => state.showHeader); + const isSidebar = useSelector((state) => state.sidebar.isOpen); const divRef = useRef(null); const [isDownloadModal, setIsDownloadModal] = useState(false); const [signatureType, setSignatureType] = useState([]); const [pdfBase64Url, setPdfBase64Url] = useState(""); const [isAgree, setIsAgree] = useState(false); - const [isAgreeTour, setIsAgreeTour] = useState(false); const [redirectTimeLeft, setRedirectTimeLeft] = useState(5); const [isredirectCanceled, setIsredirectCanceled] = useState(true); const [isDragging, setIsDragging] = useState(false); @@ -159,6 +155,11 @@ function PdfRequestFiles( const [assignedWidgetId, setAssignedWidgetId] = useState([]); const [showSignPagenumber, setShowSignPagenumber] = useState([]); const [owner, setOwner] = useState({}); + const [tenantMailTemplate, setTenantMailTemplate] = useState({ + body: "", + subject: "" + }); + const [isOptionalDetails, setIsOptionalDetails] = useState(false); const [, drop] = useDrop({ accept: "BOX", drop: (item, monitor) => addPositionOfSignature(item, monitor), @@ -215,7 +216,7 @@ function PdfRequestFiles( const timer = setTimeout(updateSize, 100); // match the transition duration return () => clearTimeout(timer); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [divRef.current, isHeader]); + }, [divRef.current, isSidebar]); const redirectUrl = pdfDetails?.[0]?.RedirectUrl || ""; useEffect(() => { if (isredirectCanceled) return; // Stop the redirect timer if canceled @@ -248,6 +249,12 @@ function PdfRequestFiles( const filterSignTypes = signatureType?.filter( (x) => x.enabled === true ); + if (tenantDetails?.RequestBody) { + setTenantMailTemplate({ + body: tenantDetails?.RequestBody, + subject: tenantDetails?.RequestSubject + }); + } return filterSignTypes; } @@ -262,7 +269,6 @@ function PdfRequestFiles( isSuccessPage = false, ) => { try { - let isUpdatedSubscribe; const senderUser = localStorage.getItem( `Parse/${localStorage.getItem("parseAppId")}/currentUser` ); @@ -278,7 +284,7 @@ function PdfRequestFiles( //getting document details const documentData = await contractDocument(docId); // Filter out 'prefill' roles from the Placeholder array - const filteredPlaceholder = documentData[0].Placeholders.filter( + const filteredPlaceholder = documentData[0]?.Placeholders?.filter( (data) => data.Role !== "prefill" ); // Reassign the updated Placeholder back to the documentData array @@ -287,6 +293,14 @@ function PdfRequestFiles( Placeholders: filteredPlaceholder }; if (documentData && documentData.length > 0) { + const prefillImg = await utils?.savePrefillImg( + documentData[0]?.Placeholders + ); + if (prefillImg && Array.isArray(prefillImg)) { + prefillImg.forEach((img) => { + dispatch(setPrefillImg(img)); + }); + } const userSignatureType = documentData[0]?.ExtUserPtr?.SignatureType || signatureTypes; const docSignTypes = @@ -314,7 +328,7 @@ function PdfRequestFiles( setOwner(documentData?.[0]?.ExtUserPtr); const isCompleted = documentData[0].IsCompleted && documentData[0].IsCompleted; - const expireDate = documentData[0].ExpiryDate.iso; + const expireDate = documentData[0]?.ExpiryDate?.iso; const declined = documentData[0].IsDeclined && documentData[0].IsDeclined; const expireUpdateDate = new Date(expireDate).getTime(); @@ -369,7 +383,7 @@ function PdfRequestFiles( } } else { if (currUserId) { - const checkCurrentUser = documentData[0].Placeholders.find( + const checkCurrentUser = documentData[0]?.Placeholders?.find( (data) => data?.signerObjId === currUserId ); if (checkCurrentUser) { @@ -403,9 +417,11 @@ function PdfRequestFiles( let signers = []; let unSignedSigner = []; - + const removePrefill = documentData[0]?.Placeholders.filter( + (x) => x.Role !== "prefill" + ); const placeholdersOrSigners = []; - for (const placeholder of documentData[0].Placeholders) { + for (const placeholder of removePrefill) { //`emailExist` variable to handle condition for quick send flow and show unsigned signers list const signerIdExist = placeholder?.signerObjId; if (signerIdExist) { @@ -458,10 +474,9 @@ function PdfRequestFiles( checkAlreadySign || !currUserId || declined || - currDate > expireUpdateDate || - !isTourEnabled + currDate > expireUpdateDate ) { - setRequestSignTour(true); + setIsReqSignTourDisabled(true); } else { const isEnableOTP = documentData?.[0]?.IsEnableOTP || false; const sessionToken = localStorage.getItem("accesstoken"); @@ -475,22 +490,8 @@ function PdfRequestFiles( setContractName("_Users"); currUserId = res[0].objectId; setSignerUserId(currUserId); - const tourData = res[0].TourStatus && res[0].TourStatus; - if (tourData && tourData.length > 0) { - const checkTourRequest = tourData.filter( - (data) => data?.requestSign - ); - setTourStatus(tourData); - setRequestSignTour(checkTourRequest[0]?.requestSign || false); - } else { - setRequestSignTour(false); - } - dispatch( - setSaveSignCheckbox({ - ...saveSignCheckbox, - isVisible: true - }) - ); + storeSignerDetails(res?.[0]); + handleTourStatus(isTourEnabled, res?.[0]?.TourStatus); //function to get default signatur of current user from `contracts_Signature` class const defaultSignRes = await getDefaultSignature( jsonSender?.objectId @@ -498,7 +499,6 @@ function PdfRequestFiles( if (defaultSignRes?.status === "success") { dispatch( setSaveSignCheckbox({ - ...saveSignCheckbox, isVisible: true, signId: defaultSignRes?.res?.id }) @@ -507,6 +507,8 @@ function PdfRequestFiles( const initials = defaultSignRes?.res?.defaultInitial || ""; dispatch(setDefaultSignImg(sign)); dispatch(setMyInitial(initials)); + } else { + dispatch(setSaveSignCheckbox({ isVisible: true })); } } else if (res?.length === 0) { const res = await contactBook(currUserId); @@ -515,17 +517,9 @@ function PdfRequestFiles( } else if (res[0] && res.length) { setContractName("_Contactbook"); const objectId = res[0].objectId; + storeSignerDetails(res?.[0]); setSignerUserId(objectId); - const tourData = res[0].TourStatus && res[0].TourStatus; - if (tourData && tourData.length > 0) { - const checkTourRequest = tourData.filter( - (data) => data?.requestSign - ); - setTourStatus(tourData); - setRequestSignTour(checkTourRequest[0]?.requestSign || false); - } else { - setRequestSignTour(false); - } + handleTourStatus(isTourEnabled, res?.[0]?.TourStatus); } else if (res.length === 0) { setHandleError(t("user-not-exist")); } @@ -543,25 +537,10 @@ function PdfRequestFiles( } ); const contact = resContact?.data?.result; - localStorage.setItem( - "signer", - JSON.stringify({ - Name: contact?.Name, - Email: contact?.Email, - UserId: contact?.UserId?.objectId - }) - ); + storeSignerDetails(contact); setContractName("_Contactbook"); setSignerUserId(contact?.objectId); - const tourData = contact?.TourStatus && contact?.TourStatus; - if (tourData && tourData.length > 0) { - const checkTourRequest = - tourData?.some((data) => data?.requestSign) || false; - setTourStatus(tourData); - setRequestSignTour(checkTourRequest); - } else { - setRequestSignTour(false); - } + handleTourStatus(isTourEnabled, contact?.TourStatus); } catch (err) { console.log("err while getting tourstatus", err); } @@ -595,6 +574,38 @@ function PdfRequestFiles( setIsLoading({ isLoad: false }); } }; + + // `storeSignerDetails` is used to stor signer details to set in text type widgets + const storeSignerDetails = (signer) => { + localStorage.setItem( + "signer", + JSON.stringify({ + Name: signer?.Name, + Email: signer?.Email, + UserId: signer?.UserId?.objectId, + JobTitle: signer?.JobTitle, + Company: signer?.Company + }) + ); + }; + + // `handleTourStatus` is used to disable/enable tour + const handleTourStatus = (isTourEnabled, tourData) => { + if (isTourEnabled) { + if (tourData && tourData.length > 0) { + const checkTourRequest = + tourData?.some((data) => data?.requestSign) || false; + setTourStatus(tourData); + setIsDontShowCheckbox(!checkTourRequest); + setIsReqSignTourDisabled(checkTourRequest); + } else { + setIsReqSignTourDisabled(false); + } + } else { + setIsReqSignTourDisabled(true); + } + }; + //function for embed signature or image url in pdf async function embedWidgetsData( ) { @@ -643,7 +654,7 @@ function PdfRequestFiles( (data) => data.signerObjId === signerObjectId ); if (checkUser && checkUser.length > 0) { - const status = handleCheckResponse(checkUser,setminRequiredCount) + const status = handleCheckResponse(checkUser, setminRequiredCount); if (status?.showAlert) { setUnSignedWidgetId(status?.widgetKey); setPageNumber(status?.tourPageNumber); @@ -653,6 +664,7 @@ function PdfRequestFiles( // `widgets` is Used to return widgets details with page number of current user const widgets = checkUser?.[0]?.placeHolder; let pdfArrBuffer; + const isSignYourSelfFlow = false; //`contractDocument` function used to get updated SignedUrl // to resolve issue of widgets get remove automatically when more than 1 signers try to sign doc at a time const documentData = await contractDocument(docId); @@ -665,6 +677,23 @@ function PdfRequestFiles( } else { pdfArrBuffer = arrayBuffer; } + const prefillDetails = signerPos.find( + (x) => x.Role === "prefill" + ); + //condition to embed prefill widgets details in pdf in public signing flow + if (prefillDetails && props.templateId) { + const prefillwidgets = prefillDetails?.placeHolder; + const pdfDoc = await PDFDocument.load(pdfArrBuffer); + const pdfbase64 = await embedWidgetsToDoc( + prefillwidgets, + pdfDoc, + isSignYourSelfFlow, + scale, + prefillImg + ); + //convert base64 to arraybuffer is used in pdf-lib + pdfArrBuffer = base64ToArrayBuffer(pdfbase64); + } } else if ( documentData === "Error: Something went wrong!" || (documentData.result && documentData.result.error) @@ -677,11 +706,8 @@ function PdfRequestFiles( } else { setHandleError("Document not Found!"); } - // Load a PDFDocument from the existing PDF bytes - const existingPdfBytes = pdfArrBuffer; try { - const pdfDoc = await PDFDocument.load(existingPdfBytes); - const isSignYourSelfFlow = false; + const pdfDoc = await PDFDocument.load(pdfArrBuffer); const extUserPtr = pdfDetails[0].ExtUserPtr; const HeaderDocId = extUserPtr?.HeaderDocId; //embed document's object id to all pages in pdf document @@ -692,7 +718,7 @@ function PdfRequestFiles( } } //embed all widgets in document - const pdfBytes = await multiSignEmbed( + const pdfBytes = await embedWidgetsToDoc( widgets, pdfDoc, isSignYourSelfFlow, @@ -727,11 +753,13 @@ function PdfRequestFiles( updatedDoc.updatedPdfDetails?.[0]?.Signers.findIndex( (x) => x.objectId === contactId ); + const removePrefill = + updatedDoc.updatedPdfDetails?.[0]?.Placeholders?.filter( + (x) => x.Role !== "prefill" + ); const newIndex = index + 1; const usermail = { - Email: - updatedDoc.updatedPdfDetails?.[0]?.Placeholders[newIndex] - ?.email || "" + Email: removePrefill[newIndex]?.email || "" }; const user = usermail?.Email ? usermail @@ -741,9 +769,11 @@ function PdfRequestFiles( sendInOrder ) { const requestBody = - updatedDoc.updatedPdfDetails?.[0]?.RequestBody; + updatedDoc.updatedPdfDetails?.[0]?.RequestBody || + tenantMailTemplate?.body; const requestSubject = - updatedDoc.updatedPdfDetails?.[0]?.RequestSubject; + updatedDoc.updatedPdfDetails?.[0]?.RequestSubject || + tenantMailTemplate?.subject; if (user) { const expireDate = expiry; const newDate = new Date(expireDate); @@ -931,8 +961,8 @@ function PdfRequestFiles( let filterSignerPos = []; if (signerObjId) { //get current signerObjId placeholder details - filterSignerPos = updateSignPos?.filter( - (data) => data.Id === signerObjId + filterSignerPos = updateSignPos.filter( + (data) => data.Id === signerObjId && data.Role !== "prefill" ); } @@ -965,7 +995,7 @@ function PdfRequestFiles( //update new placeholder of current signer const newUpdateSigner = updateSignPos.map((obj) => { if (signerObjId) { - if (obj.Id === signerObjId) { + if (obj.Id === uniqueId && obj.Role !== "prefill") { return { ...obj, placeHolder: newUpdateSignPos }; } } @@ -1098,19 +1128,18 @@ function PdfRequestFiles( }); }; //function to add default signature for all requested placeholder of sign - const addDefaultSignature = () => { + const addDefaultSignature = async () => { const type = defaultSignAlert?.type; //get current signers placeholder position data const currentSignerPosition = signerPos?.filter( (data) => data.signerObjId === signerObjectId ); const defaultSign = type === "signature" ? defaultSignImg : myInitial; + const placeHolder = currentSignerPosition[0].placeHolder; + const filename = type === "signature" ? "mysign" : "myinitials"; + const signImg = await convertJpegToPng(defaultSign, filename); //function for save default signature url for all placeholder position - const updatePlace = addDefaultSignatureImg( - currentSignerPosition[0].placeHolder, - defaultSign, - type - ); + const updatePlace = addDefaultSignatureImg(placeHolder, signImg, type); const updatesignerPos = signerPos.map((x) => x.signerObjId === signerObjectId ? { ...x, placeHolder: updatePlace } : x @@ -1123,7 +1152,7 @@ function PdfRequestFiles( }; //function to close tour and save tour status const closeRequestSignTour = async () => { - setRequestSignTour(true); + setIsReqSignTourDisabled(true); if (isDontShow) { const isEnableOTP = pdfDetails?.[0]?.IsEnableOTP || false; const sessionToken = localStorage.getItem("accesstoken"); @@ -1194,6 +1223,7 @@ function PdfRequestFiles( content: () => ( <TourContentWithBtn message={t("tour-mssg.pdf-request-file-6", { pagenumbers })} + isDontShowCheckbox={isDontShowCheckbox} isChecked={handleDontShow} /> ), @@ -1205,6 +1235,7 @@ function PdfRequestFiles( content: () => ( <TourContentWithBtn message={t("tour-mssg.pdf-request-file-1")} + isDontShowCheckbox={isDontShowCheckbox} isChecked={handleDontShow} /> ), @@ -1216,6 +1247,19 @@ function PdfRequestFiles( content: () => ( <TourContentWithBtn message={t("tour-mssg.pdf-request-file-2")} + isDontShowCheckbox={isDontShowCheckbox} + isChecked={handleDontShow} + /> + ), + position: "top", + style: { fontSize: "13px" } + }, + { + selector: '[data-tut="pdftools"]', + content: () => ( + <TourContentWithBtn + message={t("pdf-tools-tour")} + isDontShowCheckbox={isDontShowCheckbox} isChecked={handleDontShow} /> ), @@ -1227,6 +1271,7 @@ function PdfRequestFiles( content: () => ( <TourContentWithBtn message={t("tour-mssg.pdf-request-file-3")} + isDontShowCheckbox={isDontShowCheckbox} isChecked={handleDontShow} /> ), @@ -1239,6 +1284,7 @@ function PdfRequestFiles( content: () => ( <TourContentWithBtn message={t("tour-mssg.pdf-request-file-4")} + isDontShowCheckbox={isDontShowCheckbox} isChecked={handleDontShow} /> ), @@ -1257,6 +1303,7 @@ function PdfRequestFiles( content: () => ( <TourContentWithBtn message={t("tour-mssg.pdf-request-file-5")} + isDontShowCheckbox={isDontShowCheckbox} isChecked={handleDontShow} /> ), @@ -1269,6 +1316,7 @@ function PdfRequestFiles( content: () => ( <TourContentWithBtn message={t("tour-mssg.allowModify-widgets")} + isDontShowCheckbox={isDontShowCheckbox} isChecked={handleDontShow} /> ), @@ -1305,12 +1353,14 @@ function PdfRequestFiles( onRequestClose={closeRequestSignTour} steps={isMobile ? mobileTour : defaultSignTour} isOpen={true} - closeWithMask={false} - rounded={5} /> ); }; + const handleCloseTour = () => { + closeTour(); + setIsReqSignTourDisabled(true); + }; const clickOnZoomIn = () => { onClickZoomIn(scale, zoomPercent, setScale, setZoomPercent); @@ -1320,11 +1370,17 @@ function PdfRequestFiles( }; const handleDownloadBtn = async () => { const url = pdfDetails?.[0]?.SignedUrl || pdfDetails?.[0]?.URL; + const isCompleted = pdfDetails?.[0]?.IsCompleted || false; const name = pdfDetails?.[0]?.Name?.length > 100 ? pdfDetails?.[0]?.Name?.slice(0, 100) : pdfDetails?.[0]?.Name || "Document"; - await fetchUrl(url, name); + const formatId = pdfDetails?.[0]?.ExtUserPtr?.DownloadFilenameFormat; + const docName = utils?.buildDownloadFilename(formatId, { + docName: name, + isSigned: isCompleted + }); + await fetchUrl(url, docName); }; const handleDeclineMssg = () => { const user = pdfDetails[0]?.DeclineBy?.email; @@ -1379,17 +1435,6 @@ function PdfRequestFiles( alert(t("expiry-date-error")); } }; - const AgreementTour = [ - { - selector: '[data-tut="IsAgree"]', - content: () => <p className="p-0">{t("agrrement-alert")}</p>, - position: "top", - style: { fontSize: "13px" } - } - ]; - const handleCloseAgreeTour = () => { - setIsAgreeTour(false); - }; // `handleRedirectCancel` is used to cancel redirecting to redirectUrl const handleRedirectCancel = () => { setIsredirectCanceled(true); @@ -1419,80 +1464,95 @@ function PdfRequestFiles( getSignerPos(item, monitor); }; const getSignerPos = (item, monitor) => { - const posZIndex = zIndex + 1; - setZIndex(posZIndex); - const key = randomId(); - const containerScale = getContainerScale( - pdfOriginalWH, - pageNumber, - containerWH - ); - let dropData = [], - dropObj; - let placeHolder; - const dragTypeValue = item?.text ? item.text : monitor.type; - const widgetWidth = - defaultWidthHeight(dragTypeValue).width * containerScale; - const widgetHeight = - defaultWidthHeight(dragTypeValue).height * containerScale; - const extUser = localStorage.getItem("Extand_Class"); - const parseUser = extUser && JSON.parse(extUser)[0]; - const widgetValue = widgetDataValue(dragTypeValue, parseUser); - //adding and updating drop position in array when user drop signature button in div - if (item === "onclick") { - // `getBoundingClientRect()` is used to get accurate measurement width, height of the Pdf div - const divWidth = divRef.current.getBoundingClientRect().width; - const divHeight = divRef.current.getBoundingClientRect().height; - // Compute the pixel‐space center within the PDF viewport: - const centerX_Pixels = divWidth / 2 - widgetWidth / 2; - const xPosition_Final = centerX_Pixels / (containerScale * scale); - dropObj = { - //onclick put placeholder center on pdf - xPosition: xPosition_Final, - yPosition: widgetHeight + divHeight / 2, - isStamp: - (dragTypeValue === "stamp" || dragTypeValue === "image") && true, - key: key, - scale: containerScale, - zIndex: posZIndex, - type: dragTypeValue, - options: addWidgetOptions(dragTypeValue, owner, widgetValue), - Width: widgetWidth / (containerScale * scale), - Height: widgetHeight / (containerScale * scale) - }; - dropData.push(dropObj); - placeHolder = { pageNumber: pageNumber, pos: dropData }; - } else { - const offset = monitor.getClientOffset(); - //This method returns the offset of the current pointer (mouse) position relative to the client viewport. - const containerRect = document - .getElementById("container") - .getBoundingClientRect(); - //`containerRect.left`, The distance from the left of the viewport to the left side of the element. - //`containerRect.top` The distance from the top of the viewport to the top of the element. - const x = offset.x - containerRect.left; - const y = offset.y - containerRect.top; - const getXPosition = signBtnPosition[0] ? x - signBtnPosition[0].xPos : x; - const getYPosition = signBtnPosition[0] ? y - signBtnPosition[0].yPos : y; - dropObj = { - xPosition: getXPosition / (containerScale * scale), - yPosition: getYPosition / (containerScale * scale), - isStamp: - (dragTypeValue === "stamp" || dragTypeValue === "image") && true, - key: key, - scale: containerScale, - zIndex: posZIndex, - type: dragTypeValue, - options: addWidgetOptions(dragTypeValue, owner, widgetValue), - Width: widgetWidth / (containerScale * scale), - Height: widgetHeight / (containerScale * scale) - }; - dropData.push(dropObj); - placeHolder = { pageNumber: pageNumber, pos: dropData }; - } if (uniqueId) { - let filterSignerPos, currentPagePosition; + const posZIndex = zIndex + 1; + setZIndex(posZIndex); + const key = randomId(); + const containerScale = getContainerScale( + pdfOriginalWH, + pageNumber, + containerWH + ); + let filterSignerPos, + currentPagePosition, + dropData = [], + dropObj, + placeHolder; filterSignerPos = signerPos?.find((data) => data.Id === uniqueId); + const dragTypeValue = item?.text ? item.text : monitor.type; + const widgetWidth = + defaultWidthHeight(dragTypeValue).width * containerScale; + const widgetHeight = + defaultWidthHeight(dragTypeValue).height * containerScale; + const extUser = localStorage.getItem("Extand_Class"); + const parseUser = extUser && JSON.parse(extUser)[0]; + const widgetValue = widgetDataValue(dragTypeValue, parseUser); + //adding and updating drop position in array when user drop signature button in div + if (item === "onclick") { + // `getBoundingClientRect()` is used to get accurate measurement width, height of the Pdf div + const divWidth = divRef.current.getBoundingClientRect().width; + const divHeight = divRef.current.getBoundingClientRect().height; + // Compute the pixel‐space center within the PDF viewport: + const centerX_Pixels = divWidth / 2 - widgetWidth / 2; + const xPosition_Final = centerX_Pixels / (containerScale * scale); + dropObj = { + //onclick put placeholder center on pdf + xPosition: xPosition_Final, + yPosition: widgetHeight + divHeight / 2, + isStamp: + (dragTypeValue === "stamp" || dragTypeValue === "image") && true, + key: key, + scale: containerScale, + zIndex: posZIndex, + type: dragTypeValue, + options: addWidgetOptions( + dragTypeValue, + owner, + filterSignerPos?.placeHolder, + widgetValue + ), + Width: widgetWidth / (containerScale * scale), + Height: widgetHeight / (containerScale * scale) + }; + dropData.push(dropObj); + placeHolder = { pageNumber: pageNumber, pos: dropData }; + } else { + const offset = monitor.getClientOffset(); + //This method returns the offset of the current pointer (mouse) position relative to the client viewport. + const containerRect = document + .getElementById("container") + .getBoundingClientRect(); + //`containerRect.left`, The distance from the left of the viewport to the left side of the element. + //`containerRect.top` The distance from the top of the viewport to the top of the element. + const x = offset.x - containerRect.left; + const y = offset.y - containerRect.top; + const getXPosition = signBtnPosition[0] + ? x - signBtnPosition[0].xPos + : x; + const getYPosition = signBtnPosition[0] + ? y - signBtnPosition[0].yPos + : y; + dropObj = { + xPosition: getXPosition / (containerScale * scale), + yPosition: getYPosition / (containerScale * scale), + isStamp: + (dragTypeValue === "stamp" || dragTypeValue === "image") && true, + key: key, + scale: containerScale, + zIndex: posZIndex, + type: dragTypeValue, + options: addWidgetOptions( + dragTypeValue, + owner, + filterSignerPos?.placeHolder, + widgetValue + ), + Width: widgetWidth / (containerScale * scale), + Height: widgetHeight / (containerScale * scale) + }; + dropData.push(dropObj); + placeHolder = { pageNumber: pageNumber, pos: dropData }; + } const getPlaceHolder = filterSignerPos?.placeHolder; if (getPlaceHolder) { //checking exist placeholder on same page @@ -1537,7 +1597,7 @@ function PdfRequestFiles( }; //function for delete signature block - const handleDeleteSign = (key, Id) => { + const handleDeleteWidget = (key, Id) => { const updateData = []; const filterSignerPos = signerPos?.filter((data) => data.Id === Id); if (filterSignerPos.length > 0) { @@ -1601,7 +1661,7 @@ function PdfRequestFiles( }; //function to get first widget and page number to assign currect signer and tour message const showFirstWidget = () => { - if (!requestSignTour) { + if (!isReqSignTourDisabled) { const getCurrentUserPlaceholder = signerPos?.find( (x) => x.Id === uniqueId ); @@ -1623,13 +1683,39 @@ function PdfRequestFiles( setShowSignPagenumber(sortedPagenumber); } }; + + const RedirectNotice = () => { + return !isredirectCanceled && redirectUrl ? ( + <div + className="flex flex-row gap-1 items-center justify-center mb-3" + aria-live="polite" + > + <p>{t("redirecting-you-in", { redirectTimeLeft })}</p> + <button + onClick={handleRedirectCancel} + className="underline cursor-pointer op-text-primary focus:outline-none ml-2" + > + {t("cancel")} + </button> + </div> + ) : ( + <></> + ); + }; + const handleTourHelp = () => { + setIsReqSignTourDisabled(false); + }; + + const getSignerEmail = () => { + const isSignerAssigned = unsignedSigners[0]?.objectId; + let email = formData[0]?.email; + if (isSignerAssigned) { + email = unsignedSigners[0]?.Email; + } + return email; + }; return ( - <DndProvider backend={HTML5Backend}> - <Title - title={ - "Request Sign" - } - /> + <> {isLoading.isLoad ? ( <LoaderWithMsg isLoading={isLoading} /> ) : handleError ? ( @@ -1644,29 +1730,9 @@ function PdfRequestFiles( !isDecline?.isDeclined && ( <AgreementSign setIsAgree={setIsAgree} - setIsAgreeTour={setIsAgreeTour} showFirstWidget={showFirstWidget} /> )} - <Tour - showNumber={false} - showNavigation={false} - showNavigationNumber={false} - onRequestClose={handleCloseAgreeTour} - steps={AgreementTour} - isOpen={isAgreeTour} - rounded={5} - closeWithMask={false} - /> - - {isUiLoading && ( - <div className="absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80"> - <Loader /> - <span className="text-[13px] text-base-content"> - {t("loading-mssg")} - </span> - </div> - )} {isCelebration && ( <div className="relative z-[1000]"> <Confetti @@ -1691,7 +1757,13 @@ function PdfRequestFiles( : "op-card" } relative overflow-hidden flex flex-col md:flex-row justify-between bg-base-300`} > - {!requestSignTour && + {isUiLoading && ( + <div className="absolute h-full w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2]/80"> + <Loader /> + <span className="text-[13px]">{t("loading-mssg")}</span> + </div> + )} + {!isReqSignTourDisabled && isAgree && signerObjectId && !alreadySign && @@ -1703,8 +1775,6 @@ function PdfRequestFiles( onRequestClose={closeTour} steps={tourConfig} isOpen={widgetsTour} - rounded={5} - closeWithMask={false} /> {/* this modal is used to show decline alert */} @@ -1790,14 +1860,15 @@ function PdfRequestFiles( signedUrl={pdfDetails?.[0]?.SignedUrl || ""} /> {/* pdf render view */} - <div className=" w-full md:w-[57%] flex mr-4"> - <PdfZoom + <div className="w-full md:w-[57%] flex mr-4"> + <PdfTools clickOnZoomIn={clickOnZoomIn} clickOnZoomOut={clickOnZoomOut} isDisableEditTools={true} allPages={allPages} setAllPages={setAllPages} setPageNumber={setPageNumber} + setIsTour={() => setIsReqSignTourDisabled(true)} /> <PlaceholderCopy isPageCopy={isPageCopy} @@ -1810,8 +1881,6 @@ function PdfRequestFiles( Id={uniqueId} widgetType={currWidgetsDetails?.type} setUniqueId={setUniqueId} - tempSignerId={tempSignerId} - setTempSignerId={setTempSignerId} /> <div className=" w-full md:w-[95%] "> {/* this modal is used show this document is already sign */} @@ -1829,20 +1898,8 @@ function PdfRequestFiles( <div className="h-full p-[20px] text-base-content"> {isCompleted?.message ? ( <> - <p>{isCompleted?.message}</p> - {!isredirectCanceled && redirectUrl && ( - <div className="flex flex-row gap-1 items-center justify-center mb-3 mt-2"> - <p> - Redirecting you in {redirectTimeLeft} sec... - </p> - <button - onClick={handleRedirectCancel} - className="underline cursor-pointer op-text-primary focus:outline-none ml-2" - > - Cancel - </button> - </div> - )} + <p className="mb-2">{isCompleted?.message}</p> + <RedirectNotice /> </> ) : ( <div className="px-[15px]"> @@ -1851,19 +1908,7 @@ function PdfRequestFiles( )} {!isCompleted?.message && ( <div className="flex flex-col mt-3 gap-1 px-[10px] justify-center items-center"> - {!isredirectCanceled && redirectUrl && ( - <div className="flex flex-row gap-1 items-center justify-center mb-3"> - <p> - Redirecting you in {redirectTimeLeft} sec... - </p> - <button - onClick={handleRedirectCancel} - className="underline cursor-pointer op-text-primary focus:outline-none ml-2" - > - Cancel - </button> - </div> - )} + <RedirectNotice /> <div className={`${!redirectUrl ? "m-2" : ""}`}> <button onClick={(e) => @@ -1976,11 +2021,11 @@ function PdfRequestFiles( pdfBase64={pdfBase64Url} isGuestSignFlow={isGuestSignFlow} /> - <div ref={divRef} data-tut="pdfArea" className="h-full md:h-[95%]" + onClick={() => setIsReqSignTourDisabled(true)} > {containerWH && ( <RenderPdf @@ -2011,19 +2056,18 @@ function PdfRequestFiles( scale={scale} uniqueId={uniqueId} pdfBase64Url={pdfBase64Url} - setIsAgreeTour={setIsAgreeTour} isAgree={isAgree} handleTabDrag={handleTabDrag} handleStop={handleStop} isDragging={isDragging} isAlllowModify={pdfDetails[0]?.AllowModifications} setUniqueId={setUniqueId} - handleDeleteSign={handleDeleteSign} + handleDeleteWidget={handleDeleteWidget} handleTextSettingModal={handleTextSettingModal} assignedWidgetId={assignedWidgetId} - setRequestSignTour={setRequestSignTour} + setIsReqSignTourDisabled={handleCloseTour} currWidgetsDetails={currWidgetsDetails} - setTempSignerId={setTempSignerId} + isShowModal={isShowModal} /> )} </div> @@ -2048,7 +2092,6 @@ function PdfRequestFiles( <SignerListComponent ind={ind} obj={obj} - isMenu={isHeader} signerPos={signerPos} /> </div> @@ -2060,25 +2103,24 @@ function PdfRequestFiles( {unsignedSigners.length > 0 && ( <> - <div - data-tut="reactourFirst" - className="mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300" - > - <span>{t("yet-to-sign")}</span> + <div className="mx-2 pr-2 pt-2 pb-1 text-[15px] text-base-content font-semibold border-b-[1px] border-base-300"> + <span> + {t("yet-to-sign")} + <sup onClick={handleTourHelp}> + <i className="ml-1 cursor-pointer fa-light fa-question rounded-full border-[1px] border-base-content text-[11px] py-[1px] px-[3px]"></i> + </sup> + </span> </div> - <div className="mt-[5px]"> - {unsignedSigners.map((obj, ind) => { - return ( - <div key={ind}> - <SignerListComponent - ind={ind} - obj={obj} - isMenu={isHeader} - signerPos={signerPos} - /> - </div> - ); - })} + <div data-tut="reactourFirst" className="mt-[5px]"> + {unsignedSigners.map((obj, ind) => ( + <div key={ind}> + <SignerListComponent + ind={ind} + obj={obj} + signerPos={signerPos} + /> + </div> + ))} </div> </> )} @@ -2096,7 +2138,6 @@ function PdfRequestFiles( ?.enabled || false } isAgree={isAgree} - setIsAgreeTour={setIsAgreeTour} /> )} </div> @@ -2132,9 +2173,8 @@ function PdfRequestFiles( currWidgetsDetails={currWidgetsDetails} index={pageNumber} setUniqueId={setUniqueId} - tempSignerId={tempSignerId} signatureTypes={signatureType} - allowCellResize={pdfDetails[0]?.AllowModifications ?? false} + allowCellResize={false} /> )} <DownloadPdfZip @@ -2170,7 +2210,7 @@ function PdfRequestFiles( handleSaveFontSize={handleSaveFontSize} currWidgetsDetails={currWidgetsDetails} /> - </DndProvider> + </> ); } export default PdfRequestFiles; diff --git a/apps/OpenSign/src/pages/PlaceHolderSign.jsx b/apps/OpenSign/src/pages/PlaceHolderSign.jsx index eba5650c86..b77051098c 100644 --- a/apps/OpenSign/src/pages/PlaceHolderSign.jsx +++ b/apps/OpenSign/src/pages/PlaceHolderSign.jsx @@ -1,13 +1,8 @@ -import React, { useState, useRef, useEffect } from "react"; +import { useState, useRef, useEffect } from "react"; import axios from "axios"; import Parse from "parse"; import "../styles/signature.css"; import { PDFDocument } from "pdf-lib"; -import { - maxTitleLength -} from "../constant/const"; -import { DndProvider } from "react-dnd"; -import { HTML5Backend } from "react-dnd-html5-backend"; import { useDrop } from "react-dnd"; import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage"; import WidgetComponent from "../components/pdf/WidgetComponent"; @@ -24,7 +19,7 @@ import { addZIndex, randomId, defaultWidthHeight, - multiSignEmbed, + embedWidgetsToDoc, addWidgetOptions, textInputWidget, cellsWidget, @@ -46,17 +41,18 @@ import { getBase64FromUrl, generatePdfName, mailTemplate, - getOriginalWH + getOriginalWH, + defaultMailBody, + defaultMailSubject } from "../constant/Utils"; import RenderPdf from "../components/pdf/RenderPdf"; import { useNavigate } from "react-router"; import PlaceholderCopy from "../components/pdf/PlaceholderCopy"; -import Title from "../components/Title"; import DropdownWidgetOption from "../components/pdf/DropdownWidgetOption"; import WidgetNameModal from "../components/pdf/WidgetNameModal"; import { SaveFileSize } from "../constant/saveFileSize"; -import { useSelector } from "react-redux"; -import PdfZoom from "../components/pdf/PdfZoom"; +import { useDispatch, useSelector } from "react-redux"; +import PdfTools from "../components/pdf/PdfTools"; import { useTranslation } from "react-i18next"; import RotateAlert from "../components/RotateAlert"; import Loader from "../primitives/Loader"; @@ -68,16 +64,17 @@ import LinkUserModal from "../primitives/LinkUserModal"; import { EmailBody } from "../components/pdf/EmailBody"; import LottieWithLoader from "../primitives/DotLottieReact"; import Alert from "../primitives/Alert"; -import AsyncSelect from "react-select/async"; -import AddContact from "../primitives/AddContact"; -import WidgetsValueModal from "../components/pdf/WidgetsValueModal.jsx"; +import WidgetsValueModal from "../components/pdf/WidgetsValueModal"; +import * as utils from "../utils"; +import { resetWidgetState, setPrefillImg } from "../redux/reducers/widgetSlice"; +import EditDocument from "../components/pdf/EditTemplate"; function PlaceHolderSign() { const { t } = useTranslation(); const copyUrlRef = useRef(null); + const dispatch = useDispatch(); + const prefillImg = useSelector((state) => state.widget.prefillImg); const isShowModal = useSelector((state) => state.widget.isShowModal); - const appName = - "OpenSign™"; const editorRef = useRef(); const { state } = useLocation(); const navigate = useNavigate(); @@ -113,7 +110,7 @@ function PlaceHolderSign() { const [handleError, setHandleError] = useState(); const [currentId, setCurrentId] = useState(""); const [pdfNewWidth, setPdfNewWidth] = useState(); - const [placeholderTour, setPlaceholderTour] = useState(true); + const [placeholderTour, setPlaceholderTour] = useState(false); const [checkTourStatus, setCheckTourStatus] = useState(false); const [tourStatus, setTourStatus] = useState([]); const [signerUserId, setSignerUserId] = useState(); @@ -125,9 +122,6 @@ function PlaceHolderSign() { const [selectedEmail, setSelectedEmail] = useState(false); const [isResize, setIsResize] = useState(false); const [zIndex, setZIndex] = useState(1); - // tempSignerId is used to temporarily store the currently selected signer's unique ID, When editing a text widget, it automatically attaches a prefill user, and since prefill users are not shown in the signer list, the selected signer from before editing would be lost. To handle this, we store the currently selected signer's unique ID in tempSignerId before entering the text widget edit mode. Once the text widget settings are completed, - // we restore the original selected signer by setting tempSignerId back to uniqueId.This ensures that the correct signer remains selected and visible in the UI even after interacting with a prefill-only widget like the text widget. - const [tempSignerId, setTempSignerId] = useState(""); const [blockColor, setBlockColor] = useState(""); const [isTextSetting, setIsTextSetting] = useState(false); const [pdfLoad, setPdfLoad] = useState(false); @@ -136,7 +130,7 @@ function PlaceHolderSign() { const [roleName, setRoleName] = useState(""); const [isAddUser, setIsAddUser] = useState({}); const [signerExistModal, setSignerExistModal] = useState(false); - const [isDontShow, setIsDontShow] = useState(false); + const [isDontShow, setIsDontShow] = useState(true); const [isDragging, setIsDragging] = useState(false); const [showDropdown, setShowDropdown] = useState(false); const [isUiLoading, setIsUiLoading] = useState(false); @@ -147,7 +141,7 @@ function PlaceHolderSign() { const [mailStatus, setMailStatus] = useState(""); const [isCurrUser, setIsCurrUser] = useState(false); const [pdfArrayBuffer, setPdfArrayBuffer] = useState(""); - const isHeader = useSelector((state) => state.showHeader); + const isSidebar = useSelector((state) => state.sidebar.isOpen); const [showRotateAlert, setShowRotateAlert] = useState({ status: false, degree: 0 @@ -165,20 +159,23 @@ function PlaceHolderSign() { const [isUploadPdf, setIsUploadPdf] = useState(false); //'signersName' variable used to show all signer's name that do not have a signature widget assigned const [signersName, setSignersName] = useState(""); - const [forms, setForms] = useState([]); - const [userList, setUserList] = useState([]); - const [isAttchSignerModal, setIsAttchSignerModal] = useState(false); - const [isNewContact, setIsNewContact] = useState({ status: false, id: "" }); + const [prefillSigner, setPrefillSigner] = useState([]); const [owner, setOwner] = useState({}); const [docTitle, setDocTitle] = useState(""); + const [isEditDoc, setIsEditDoc] = useState(false); const isMobile = window.innerWidth < 767; const [, drop] = useDrop({ accept: "BOX", drop: (item, monitor) => addPositionOfSignature(item, monitor), collect: (monitor) => ({ isOver: !!monitor.isOver() }) }); + const currentUser = localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ); + const user = currentUser && JSON.parse(currentUser); const documentId = docId; useEffect(() => { + dispatch(resetWidgetState([])); if (documentId) { getDocumentDetails(); } @@ -194,8 +191,8 @@ function PlaceHolderSign() { ); if (user) { try { - const defaultRequestBody = `<p>Hi {{receiver_name}},</p><br><p>We hope this email finds you well. {{sender_name}} has requested you to review and sign {{document_title}}.</p><p>Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.</p><br><p><a href='{{signing_url}}' rel='noopener noreferrer' target='_blank'>Sign here</a></p><br><br><p>If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.</p><br><p>Thanks</p><p> Team ${appName}</p><br>`; - const defaultSubject = `{{sender_name}} has requested you to sign {{document_title}}`; + const defaultRequestBody = defaultMailBody; + const defaultSubject = defaultMailSubject; setDefaultBody(defaultRequestBody); setDefaultSubject(defaultSubject); setRequestBody(defaultRequestBody); @@ -243,46 +240,27 @@ function PlaceHolderSign() { const timer = setTimeout(updateSize, 100); // match the transition duration return () => clearTimeout(timer); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [divRef.current, isHeader]); + }, [divRef.current, isSidebar]); //function for get document details const getDocumentDetails = async () => { const tenantSignTypes = await fetchTenantDetails(); //getting document details - const documentData = await contractDocument(documentId); + const documentData = await contractDocument( + documentId, + "Bcc" + ); + if (documentData && documentData.length > 0) { - setDocTitle(documentData?.[0]?.Name); - if (documentData[0]?.Placeholders?.length > 0) { - const signerNotExist = documentData[0]?.Placeholders.some( - (data) => !data.signerObjId && data.Role !== "prefill" - ); - //condition to check any role does not attach signer - if (signerNotExist) { - const filterPrefill = documentData[0]?.Placeholders?.filter( - (x) => x.Role !== "prefill" - ); - let users = []; - filterPrefill?.forEach((element) => { - let label = ""; - const signerData = documentData[0]?.Signers.find( - (x) => element.signerObjId && element.signerObjId === x.objectId - ); - if (signerData) { - label = `${signerData.Name}<${signerData.Email}>`; - } - users = [ - ...users, - { - value: element.Id, - label: label || "", - role: element.Role - } - ]; - }); - setIsAttchSignerModal(true); - setForms(users); - } + const prefillImg = await utils?.savePrefillImg( + documentData[0]?.Placeholders + ); + if (prefillImg && Array.isArray(prefillImg)) { + prefillImg.forEach((img) => { + dispatch(setPrefillImg(img)); + }); } + setDocTitle(documentData?.[0]?.Name); const url = documentData[0] && documentData[0]?.URL; //convert document url in array buffer format to use embed widgets in pdf using pdf-lib const arrayBuffer = await convertPdfArrayBuffer(url); @@ -353,10 +331,18 @@ function PlaceHolderSign() { subject: documentData?.[0]?.RequestSubject }); } + if ( + documentData[0]?.Placeholders?.length === 0 && + documentData[0]?.Signers?.length === 0 + ) { + setSignersData([]); + setSignerPos([]); + setPrefillSigner([utils?.prefillObj()]); + } //condition when placeholder have empty array with role details and signers array have signers data //and both array length are same - //this case happen using placeholder form in auto save funtionality to save draft type document without adding any placehlder - if ( + //this case happen using placeholder form in auto save funtionality to save draft type document without adding any placeholder + else if ( documentData[0]?.Placeholders?.length === documentData[0]?.Signers?.length ) { @@ -368,6 +354,7 @@ function PlaceHolderSign() { Role: placeholder[index]?.Role, blockColor: placeholder[index]?.blockColor })); + setPrefillSigner([utils?.prefillObj()]); setSignerPos(placeholder); setSignersData(updatedSigners); setIsSelectId(0); @@ -390,6 +377,9 @@ function PlaceHolderSign() { const placeholder = documentData[0]?.Placeholders.filter( (data) => data.Role !== "prefill" ); + const prefillPlaceholder = documentData[0]?.Placeholders.find( + (data) => data.Role === "prefill" + ); let updatedSigners = placeholder.map((x) => { let matchingSigner = signers.find( (y) => x.signerObjId && x.signerObjId === y.objectId @@ -405,6 +395,11 @@ function PlaceHolderSign() { return { Role: x.Role, Id: x.Id, blockColor: x.blockColor }; } }); + if (prefillPlaceholder) { + setPrefillSigner([utils?.prefillObj(prefillPlaceholder.Id)]); + } else { + setPrefillSigner([utils?.prefillObj()]); + } setSignersData(updatedSigners); setUniqueId(updatedSigners[0].Id); setBlockColor(updatedSigners[0].blockColor); @@ -418,7 +413,7 @@ function PlaceHolderSign() { // Role: "User " + (index + 1), blockColor: color[index % color.length] })); - setSignersData(updatedSigners); + setPrefillSigner([utils?.prefillObj()]); const updatedPlaceholder = documentData[0].Signers.map((x, index) => { return { // Role: updatedSigners[index].Role, @@ -450,14 +445,24 @@ function PlaceHolderSign() { const placeholder = documentData[0]?.Placeholders.filter( (data) => data.Role !== "prefill" ); - let updatedSigners = placeholder.map((x) => { - return { Role: x.Role, Id: x.Id, blockColor: x.blockColor }; - }); setSignerPos(documentData[0].Placeholders); - setSignersData(updatedSigners); - setIsSelectId(0); - setUniqueId(updatedSigners[0].Id); - setBlockColor(updatedSigners[0].blockColor); + if (placeholder.length > 0) { + let updatedSigners = placeholder.map((x) => { + return { Role: x.Role, Id: x.Id, blockColor: x.blockColor }; + }); + setSignersData(updatedSigners); + setIsSelectId(0); + setUniqueId(updatedSigners[0].Id); + setBlockColor(updatedSigners[0].blockColor); + } + const prefillPlaceholder = documentData[0]?.Placeholders.find( + (data) => data.Role === "prefill" + ); + if (prefillPlaceholder) { + setPrefillSigner([utils?.prefillObj(prefillPlaceholder.Id)]); + } else { + setPrefillSigner([utils?.prefillObj()]); + } } } } else if ( @@ -486,12 +491,11 @@ function PlaceHolderSign() { setCheckTourStatus(true); } else if (tourstatus && tourstatus.length > 0) { setTourStatus(tourstatus); - const checkTourRecipients = tourstatus.filter( - (data) => data.placeholder - ); - if (checkTourRecipients && checkTourRecipients.length > 0) { - setCheckTourStatus(checkTourRecipients[0].placeholder); - } + const tour = tourstatus?.some((data) => data.placeholder) || false; + setPlaceholderTour(!tour); + setCheckTourStatus(tour); + } else { + setPlaceholderTour(true); } setIsLoading({ isLoad: false }); } else if (res.length === 0) { @@ -506,85 +510,91 @@ function PlaceHolderSign() { }; const getSignerPos = (item, monitor) => { if (uniqueId) { - const posZIndex = zIndex + 1; - setZIndex(posZIndex); const signer = signersdata.find((x) => x.Id === uniqueId); - const key = randomId(); - const containerScale = getContainerScale( - pdfOriginalWH, - pageNumber, - containerWH - ); - let dropData = [], - dropObj; - let placeHolder; - const dragTypeValue = item?.text ? item.text : monitor.type; - const widgetWidth = - defaultWidthHeight(dragTypeValue).width * containerScale; - const widgetHeight = - defaultWidthHeight(dragTypeValue).height * containerScale; - //adding and updating drop position in array when user drop signature button in div - if (item === "onclick") { - // `getBoundingClientRect()` is used to get accurate measurement width, height of the Pdf div - const divWidth = divRef.current.getBoundingClientRect().width; - const divHeight = divRef.current.getBoundingClientRect().height; - // Compute the pixel‐space center within the PDF viewport: - const centerX_Pixels = divWidth / 2 - widgetWidth / 2; - const xPosition_Final = centerX_Pixels / (containerScale * scale); - dropObj = { - //onclick put placeholder center on pdf - xPosition: xPosition_Final, - yPosition: widgetHeight + divHeight / 2, - isStamp: - (dragTypeValue === "stamp" || dragTypeValue === "image") && true, - key: key, - scale: containerScale, - zIndex: posZIndex, - type: dragTypeValue, - options: addWidgetOptions(dragTypeValue, owner), - Width: widgetWidth / (containerScale * scale), - Height: widgetHeight / (containerScale * scale) - }; - dropData.push(dropObj); - placeHolder = { pageNumber: pageNumber, pos: dropData }; - } else { - const offset = monitor.getClientOffset(); - //This method returns the offset of the current pointer (mouse) position relative to the client viewport. - const containerRect = document - .getElementById("container") - .getBoundingClientRect(); - //`containerRect.left`, The distance from the left of the viewport to the left side of the element. - //`containerRect.top` The distance from the top of the viewport to the top of the element. - const x = offset.x - containerRect.left; - const y = offset.y - containerRect.top; - const getXPosition = signBtnPosition[0] - ? x - signBtnPosition[0].xPos - : x; - const getYPosition = signBtnPosition[0] - ? y - signBtnPosition[0].yPos - : y; - dropObj = { - xPosition: getXPosition / (containerScale * scale), - yPosition: getYPosition / (containerScale * scale), - isStamp: - (dragTypeValue === "stamp" || dragTypeValue === "image") && true, - key: key, - scale: containerScale, - zIndex: posZIndex, - type: dragTypeValue, - options: addWidgetOptions(dragTypeValue, owner), - Width: widgetWidth / (containerScale * scale), - Height: widgetHeight / (containerScale * scale) - }; - dropData.push(dropObj); - placeHolder = { pageNumber: pageNumber, pos: dropData }; - } - if (signer) { - let filterSignerPos, currentPagePosition; - if (dragTypeValue === textWidget) { - filterSignerPos = signerPos.find((data) => data.Role === "prefill"); + const prefillUser = prefillSigner.find((x) => x.Id === uniqueId); + if (signer || prefillUser) { + const posZIndex = zIndex + 1; + setZIndex(posZIndex); + const key = randomId(); + const containerScale = getContainerScale( + pdfOriginalWH, + pageNumber, + containerWH + ); + let dropData = [], + filterSignerPos, + currentPagePosition, + placeHolder, + dropObj; + filterSignerPos = signerPos.find((data) => data.Id === uniqueId); + const dragTypeValue = item?.text ? item.text : monitor.type; + const widgetWidth = + defaultWidthHeight(dragTypeValue).width * containerScale; + const widgetHeight = + defaultWidthHeight(dragTypeValue).height * containerScale; + //adding and updating drop position in array when user drop signature button in div + if (item === "onclick") { + // `getBoundingClientRect()` is used to get accurate measurement width, height of the Pdf div + const divWidth = divRef.current.getBoundingClientRect().width; + const divHeight = divRef.current.getBoundingClientRect().height; + // Compute the pixel‐space center within the PDF viewport: + const centerX_Pixels = divWidth / 2 - widgetWidth / 2; + const xPosition_Final = centerX_Pixels / (containerScale * scale); + dropObj = { + //onclick put placeholder center on pdf + xPosition: xPosition_Final, + yPosition: widgetHeight + divHeight / 2, + isStamp: + (dragTypeValue === "stamp" || dragTypeValue === "image") && true, + key: key, + scale: containerScale, + zIndex: posZIndex, + type: dragTypeValue, + options: addWidgetOptions( + dragTypeValue, + owner, + filterSignerPos?.placeHolder + ), + Width: widgetWidth / (containerScale * scale), + Height: widgetHeight / (containerScale * scale) + }; + dropData.push(dropObj); + placeHolder = { pageNumber: pageNumber, pos: dropData }; } else { - filterSignerPos = signerPos.find((data) => data.Id === uniqueId); + const offset = monitor.getClientOffset(); + //This method returns the offset of the current pointer (mouse) position relative to the client viewport. + const containerRect = document + .getElementById("container") + .getBoundingClientRect(); + //`containerRect.left`, The distance from the left of the viewport to the left side of the element. + //`containerRect.top` The distance from the top of the viewport to the top of the element. + const x = offset.x - containerRect.left; + const y = offset.y - containerRect.top; + const getXPosition = signBtnPosition[0] + ? x - signBtnPosition[0].xPos + : x; + const getYPosition = signBtnPosition[0] + ? y - signBtnPosition[0].yPos + : y; + dropObj = { + xPosition: getXPosition / (containerScale * scale), + yPosition: getYPosition / (containerScale * scale), + isStamp: + (dragTypeValue === "stamp" || dragTypeValue === "image") && true, + key: key, + scale: containerScale, + zIndex: posZIndex, + type: dragTypeValue, + options: addWidgetOptions( + dragTypeValue, + owner, + filterSignerPos?.placeHolder + ), + Width: widgetWidth / (containerScale * scale), + Height: widgetHeight / (containerScale * scale) + }; + dropData.push(dropObj); + placeHolder = { pageNumber: pageNumber, pos: dropData }; } const getPlaceHolder = filterSignerPos?.placeHolder; if (getPlaceHolder) { @@ -603,21 +613,16 @@ function PlaceHolderSign() { let xyPos = { pageNumber: pageNumber, pos: newSignPos }; updatePlace.push(xyPos); let updatesignerPos; - if (dragTypeValue === textWidget) { - updatesignerPos = signerPos.map((x) => - x.Role === "prefill" ? { ...x, placeHolder: updatePlace } : x - ); - } else { - updatesignerPos = signerPos.map((x) => - x.Id === uniqueId ? { ...x, placeHolder: updatePlace } : x - ); - } + + updatesignerPos = signerPos.map((x) => + x.Id === uniqueId ? { ...x, placeHolder: updatePlace } : x + ); + setSignerPos(updatesignerPos); } else { - //if condition when widget type is prefill label text widget - if (dragTypeValue === textWidget) { - //check text widgets data (prefill) already exist then and want to add text widget on new page - //create new page entry with old data and update placeholder + //condition for prefill role to attach prefill widget on multiple page first time there are no any prefill widget exist + if (roleName === "prefill") { + //if condition for prefill role only prefill object exist and placeholder empty then add prefill widget in placeholder if (filterSignerPos) { const addPrefillData = filterSignerPos && filterSignerPos?.placeHolder; @@ -626,20 +631,22 @@ function PlaceHolderSign() { x.Role === "prefill" ? { ...x, placeHolder: addPrefillData } : x ); setSignerPos(updatePrefillPos); - } //else condition if user do not have any text widget data + } //else condition if there are no prefill role exist in array then add prefill widget in placeholder else { const prefillTextWidget = { signerPtr: {}, signerObjId: "", - blockColor: "#f58f8c", + blockColor: utils?.prefillBlockColor, placeHolder: [placeHolder], Role: "prefill", - Id: key + Id: uniqueId }; - setSignerPos((prev) => [...prev, prefillTextWidget]); + const xyPosition = signerPos || []; + xyPosition.unshift(prefillTextWidget); + setSignerPos(xyPosition); } } else { - //else condition to add placeholder widgets on multiple page first time + //else condition to add placeholder widgets on multiple page first time for signers const updatesignerPos = signerPos.map((x) => x.Id === uniqueId && x?.placeHolder ? { ...x, placeHolder: [...x.placeHolder, placeHolder] } @@ -704,15 +711,9 @@ function PlaceHolderSign() { containerWH ); if (keyValue >= 0) { - let filterSignerPos; - if (signId) { - filterSignerPos = updateSignPos.filter((data) => data.Id === signId); - } else { - filterSignerPos = updateSignPos.filter( - (data) => data.Role === "prefill" - ); - } - + const filterSignerPos = updateSignPos.filter( + (data) => data.Id === signId + ); if (filterSignerPos.length > 0) { const getPlaceHolder = filterSignerPos[0].placeHolder; const getPageNumer = getPlaceHolder.filter( @@ -743,10 +744,6 @@ function PlaceHolderSign() { if (obj.Id === signId) { return { ...obj, placeHolder: newUpdateSignPos }; } - } else { - if (obj.Role === "prefill") { - return { ...obj, placeHolder: newUpdateSignPos }; - } } return obj; }); @@ -758,7 +755,7 @@ function PlaceHolderSign() { setTimeout(() => setIsDragging(false), 200); }; //function for delete signature block - const handleDeleteSign = (key, Id) => { + const handleDeleteWidget = (key, Id) => { const updateData = []; const filterSignerPos = signerPos.filter((data) => data.Id === Id); if (filterSignerPos.length > 0) { @@ -851,7 +848,7 @@ function PlaceHolderSign() { setSignBtnPosition([xySignature]); }; //embed prefill label widget data - const embedPrefilllData = async () => { + const embedPrefilllWidgets = async () => { const prefillExist = signerPos.filter((data) => data.Role === "prefill"); if (prefillExist && prefillExist.length > 0) { const placeholder = prefillExist[0].placeHolder; @@ -861,12 +858,14 @@ function PlaceHolderSign() { }); const isSignYourSelfFlow = false; try { + const docId = pdfDetails[0]?.objectId; //pdfOriginalWH contained all pdf's pages width,height & pagenumber in array format - const pdfBase64 = await multiSignEmbed( + const pdfBase64 = await embedWidgetsToDoc( placeholder, pdfDoc, isSignYourSelfFlow, - scale + scale, + prefillImg ); const pdfName = generatePdfName(16); const pdfUrl = await convertBase64ToFile( @@ -876,7 +875,7 @@ function PlaceHolderSign() { ); const tenantId = localStorage.getItem("TenantId"); const buffer = atob(pdfBase64); - SaveFileSize(buffer.length, pdfUrl, tenantId); + SaveFileSize(buffer.length, pdfUrl, tenantId, owner?.UserId?.objectId); return pdfUrl; } catch (err) { console.log("error to convertBase64ToFile in placeholder flow", err); @@ -899,71 +898,68 @@ function PlaceHolderSign() { return pdfDetails[0].URL; } }; - const alertSendEmail = async () => { - const filterPrefill = signerPos?.filter((data) => data.Role !== "prefill"); - const getPrefill = signerPos?.find((data) => data.Role === "prefill"); - //unassigned signature widgets signer's list - let unassignedWidget = []; - let isLabel = false; - let unfilledTextWidgetId = ""; - //checking all signers placeholder exist or not - const isPlaceholderExist = filterPrefill.every((data) => data.placeHolder); - const prefillPlaceholder = getPrefill?.placeHolder; - //condition is used to check text widget data is empty or have response - if (getPrefill) { - if (prefillPlaceholder) { - prefillPlaceholder.map((data) => { - if (!isLabel) { - const unfilledTextWidgets = data.pos.find( - (position) => !position.options.response - ); - if (unfilledTextWidgets) { - isLabel = true; - unfilledTextWidgetId = unfilledTextWidgets.key; - } - } - }); - } - } - //for loop is used to check signature widget exist or not - //if signature widget does not exist then show tour messages on signature widgets - //and show list of signers who need to add signature widget - for (let item of filterPrefill) { - let signatureExist = false; // Reset for each iteration - //condition if placeholder filed exist then check which signer do not have signature widget - if (item.placeHolder) { - for (let x of item.placeHolder) { - if (!signatureExist) { - signatureExist = x.pos.some((data) => data?.type === "signature"); + const handleSaveDoc = async () => { + let isPrefillEmpty = false, + unfilledTextWidgetId; + const prefillExist = signerPos?.find((data) => data.Role === "prefill"); + //condition to check prefill widget exit or not + if (prefillExist) { + const getPlaceholder = prefillExist?.placeHolder; + //if prefill widget exist then make sure there are no any empty prefill widget + //if empty widget exist and user try to send document then throw tour message + for (const placeholder of getPlaceholder || []) { + const requiredWidgets = placeholder.pos.filter( + (position) => position.type !== "checkbox" + ); + for (const widget of requiredWidgets) { + const hasResponse = widget?.options?.response; + const hasDefault = widget?.options?.defaultValue; + if (!hasResponse && !hasDefault && !isPrefillEmpty) { + isPrefillEmpty = true; + unfilledTextWidgetId = widget.key; + setPageNumber(placeholder.pageNumber); + setUniqueId(placeholder.Id); + break; } } - if (!signatureExist) { - unassignedWidget.push(item); - } - } else { - //condition if placeholder filed does not exist then it means there are no any signature widget for any signer - unassignedWidget.push(item); + if (isPrefillEmpty) break; } } + // keep only non-prefill signers + const filterPrefill = (signerPos ?? []).filter((s) => s.Role !== "prefill"); + + //checking all signers placeholder exist or not + const isPlaceholderExist = + filterPrefill?.length > 0 && + filterPrefill.some((data) => data.placeHolder); + // signers who don't have a signature widget (or have no placeholders at all) + const unassignedWidget = filterPrefill?.filter( + (s) => !utils?.hasSignatureWidget(s) + ); + //checking if there are any signer list which do not have signture widget then show signers name on tour messages if (unassignedWidget.length > 0) { const getSigner = unassignedWidget.map((x) => { return signersdata.find((y) => y.Id === x.Id).Name; }); - const signersName = getSigner.join(", "); - setSignersName(signersName); + const signerName = getSigner.join(", "); + setSignersName(signerName); setIsSendAlert({ mssg: "sure", alert: true }); + setUniqueId(unassignedWidget[0]?.Id); + setRoleName(""); } - if (getPrefill && isLabel) { - setIsSendAlert({ mssg: textWidget, alert: true }); + if (prefillExist && isPrefillEmpty) { + setIsSendAlert({ mssg: "prefill", alert: true }); setUnSignedWidgetId(unfilledTextWidgetId); + } else if (signersdata?.length === 0) { + alert(t("atleast-one-recipient-alert")); } else if (isPlaceholderExist && unassignedWidget.length === 0) { const IsSignerNotExist = filterPrefill?.filter((x) => !x.signerObjId); if (IsSignerNotExist && IsSignerNotExist?.length > 0) { setSignerExistModal(true); - setCurrWidgetsDetails(IsSignerNotExist[0]?.placeHolder?.[0]?.pos); + setCurrWidgetsDetails(IsSignerNotExist[0]?.placeHolder?.[0]?.pos[0]); } else { saveDocumentDetails(); } @@ -972,14 +968,16 @@ function PlaceHolderSign() { useEffect(() => { const timer = setTimeout(() => { - if (!pdfDetails?.[0]?.IsCompleted) { + if ( + !pdfDetails?.[0]?.IsCompleted && + pdfDetails?.[0]?.CreatedBy?.objectId === user?.objectId + ) { autosavedetails(); } }, 2000); return () => clearTimeout(timer); // eslint-disable-next-line react-hooks/exhaustive-deps }, [signerPos, signersdata, signatureType, pdfBase64Url]); - // `autosavedetails` is used to save doc details after every 2 sec when changes are happern in placeholder like drag-drop widgets, remove signers const autosavedetails = async () => { const signers = signersdata?.reduce((acc, x) => { @@ -1029,9 +1027,12 @@ function PlaceHolderSign() { if (pdfDetails?.[0]?.SendinOrder && pdfDetails?.[0]?.SendinOrder === true) { signerMail.splice(1); } - const pdfUrl = await embedPrefilllData(); + const pdfUrl = await embedPrefilllWidgets(); if (pdfUrl) { - const signers = signersdata?.map((x) => { + const removePrefillSigner = signersdata.filter( + (x) => x.Role !== "prefill" + ); + const signers = removePrefillSigner?.map((x) => { return { __type: "Pointer", className: "contracts_Contactbook", @@ -1056,14 +1057,12 @@ function PlaceHolderSign() { // Compute expiry date with extra days let updateExpiryDate = new Date(); updateExpiryDate.setDate(updateExpiryDate.getDate() + addExtraDays); - - // Filter out prefill roles - const filterPrefill = signerPos.filter((data) => data.Role !== "prefill"); try { const data = { Name: docTitle || pdfDetails?.[0]?.Name, - Placeholders: filterPrefill, + Placeholders: signerPos, SignedUrl: pdfUrl, + URL: pdfUrl, Signers: signers, SentToOthers: true, SignatureType: pdfDetails?.[0]?.SignatureType, @@ -1083,7 +1082,6 @@ function PlaceHolderSign() { setIsMailSend(true); setIsLoading({ isLoad: false }); setIsUiLoading(false); - setSignerPos([]); setIsSendAlert({ mssg: "confirm", alert: true }); if (docTitle) { const updatedPdfDetails = [...pdfDetails]; @@ -1129,7 +1127,7 @@ function PlaceHolderSign() { key={ind} > {copied && <Alert type="success">{t("copied")}</Alert>} - <span className="w-[220px] md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis "> + <span className="w-[220px] md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis"> {data.signerEmail} </span> <div className="flex flex-row items-center gap-3 "> @@ -1146,7 +1144,7 @@ function PlaceHolderSign() { text={t("sign-url")} url={data.url} > - <i className="fa-light fa-share-from-square op-link op-link-secondary no-underline"></i> + <i className="fa-light fa-share-from-square op-link data-[theme=opensigndark]:op-link-primary data-[theme=opensigncss]:op-link-secondary no-underline"></i> </ShareButton> </div> </div> @@ -1170,7 +1168,6 @@ function PlaceHolderSign() { pdfDetails?.[0]?.ExtUserPtr?.Email; let senderPhone = pdfDetails?.[0]?.ExtUserPtr?.Phone; let signerMail = signersdata.slice(); - if (pdfDetails?.[0]?.SendinOrder && pdfDetails?.[0]?.SendinOrder === true) { signerMail.splice(1); } @@ -1350,11 +1347,24 @@ function PlaceHolderSign() { //here you can add your messages in content and selector is key of particular steps const tourConfig = [ + { + selector: '[data-tut="prefillTour"]', + content: () => ( + <TourContentWithBtn + message={t("prefill-tour")} + isDontShowCheckbox={!checkTourStatus} + isChecked={handleDontShow} + /> + ), + position: "top", + style: { fontSize: "13px" } + }, { selector: '[data-tut="recipientArea"]', content: () => ( <TourContentWithBtn message={t("tour-mssg.placeholder-sign-1")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1366,6 +1376,7 @@ function PlaceHolderSign() { content: () => ( <TourContentWithBtn message={t("tour-mssg.placeholder-sign-3")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1377,6 +1388,7 @@ function PlaceHolderSign() { content: () => ( <TourContentWithBtn message={t("tour-mssg.placeholder-sign-4")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1388,6 +1400,19 @@ function PlaceHolderSign() { content: () => ( <TourContentWithBtn message={t("tour-mssg.placeholder-sign-5")} + isDontShowCheckbox={!checkTourStatus} + isChecked={handleDontShow} + /> + ), + position: "top", + style: { fontSize: "13px" } + }, + { + selector: '[data-tut="pdftools"]', + content: () => ( + <TourContentWithBtn + message={t("pdf-tools-tour")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1399,6 +1424,7 @@ function PlaceHolderSign() { content: () => ( <TourContentWithBtn message={t("tour-mssg.placeholder-sign-6")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1668,7 +1694,6 @@ function PlaceHolderSign() { setFontColor(); handleNameModal(); }; - const handleNameModal = () => { setIsNameModal(false); setCurrWidgetsDetails({}); @@ -1676,18 +1701,12 @@ function PlaceHolderSign() { setIsRadio(false); setIsCheckbox(false); setIsPageCopy(false); - //condition for text widget type after set all values for text widget - //change setUniqueId which is set in tempsignerId - //because textwidget do not have signer user so for selected signers we have to do - if (currWidgetsDetails.type === textWidget) { - setUniqueId(tempSignerId); - setTempSignerId(""); - } }; //function for update TourStatus const closeTour = async () => { setPlaceholderTour(false); - if (isDontShow) { + setIsDontShow(true); + if (!checkTourStatus && isDontShow) { let updatedTourStatus = []; if (tourStatus.length > 0) { updatedTourStatus = [...tourStatus]; @@ -1716,6 +1735,7 @@ function PlaceHolderSign() { } } ); + setCheckTourStatus(true); } catch (err) { console.log("axois err ", err); } @@ -1733,7 +1753,7 @@ function PlaceHolderSign() { }; //`handleAddUser` function to use add new user const handleAddUser = (data, signerObjId) => { - const id = signerObjId ? signerObjId : isNewContact?.id || uniqueId; + const id = signerObjId ? signerObjId : uniqueId; if (isAddSigner) { handleAddNewRecipients(data); } else { @@ -1745,7 +1765,18 @@ function PlaceHolderSign() { }; const updatePlaceHolder = signerPos.map((x) => { if (x.Id === id || x.signerObjId === id) { - return { ...x, signerPtr: signerPtr, signerObjId: data.objectId }; + const updated = { + ...x, + signerPtr, + signerObjId: data.objectId + }; + + // Only update email if it already exists in `x` + if ("email" in x) { + updated.email = data?.Email || ""; // keep old if no new email + } + + return updated; } return { ...x }; }); @@ -1771,14 +1802,6 @@ function PlaceHolderSign() { ); setIsSelectId(index); } - if (isNewContact.status) { - let newForm = [...forms]; - const label = `${data.Name}<${data.Email}>`; - const index = newForm.findIndex((x) => x.value === id); - newForm[index].label = label; - newForm[index].value = data?.objectId; - setForms(newForm); - } } }; //function to add new signer in document signers list @@ -1810,7 +1833,6 @@ function PlaceHolderSign() { const closePopup = () => { setIsAddUser({}); setIsAddSigner(false); - setIsNewContact({ status: false, id: "" }); }; //function for handle ontext change and save again text in delta in Request Email flow @@ -1820,7 +1842,6 @@ function PlaceHolderSign() { setRequestBody(html); } }; - const signerAssignTour = [ { selector: '[data-tut="assignSigner"]', @@ -1829,7 +1850,7 @@ function PlaceHolderSign() { style: { fontSize: "13px" } } ]; - const textFieldTour = [ + const prefillWidgetTour = [ { selector: '[data-tut="IsSigned"]', content: t("text-field-tour"), @@ -1852,7 +1873,9 @@ function PlaceHolderSign() { .filter((x) => x.Id !== Id) .map((x, i) => ({ ...x, blockColor: color[i] })); setSignersData(updateSigner); - const updatePlaceholderUser = signerPos + const prefillObj = signerPos.find((x) => x.Role === "prefill"); + const filterPrefill = signerPos.filter((x) => x.Role !== "prefill"); + const updatePlaceholderUser = filterPrefill .filter((x) => x.Id !== Id) .map((x, i) => ({ ...x, blockColor: color[i] })); const index = signersdata.findIndex((x) => x.Id === Id); @@ -1865,6 +1888,9 @@ function PlaceHolderSign() { setIsSelectId(index); setBlockColor(color[index]); } + if (prefillObj) { + updatePlaceholderUser.unshift(prefillObj); + } setSignerPos(updatePlaceholderUser); setIsMailSend(false); }; @@ -1915,765 +1941,615 @@ function PlaceHolderSign() { setPdfArrayBuffer(urlDetails.arrayBuffer); setPdfBase64Url(urlDetails.base64); }; - const handleSendDoc = () => { - if (docTitle?.length > maxTitleLength) { - alert(t("title-length-alert")); - return; - } - setIsAttchSignerModal(false); - setCheckTourStatus(true); - alertSendEmail(); - }; - //show modal to create new contact - const handleCreateNew = (e, id) => { - e.preventDefault(); - setIsNewContact({ status: true, id: id }); - }; - //`handleInputChange` function to get signers list from dropdown - const handleInputChange = (item, id) => { - const signerExist = signersdata?.some( - (x) => x.objectId && x.objectId === item.value - ); - if (signerExist) { - alert(t("already-exist-signer")); - } else { - let newForm = [...forms]; - let signerId = newForm[id].value; - newForm[id].label = item?.label; - newForm[id].value = item?.value; - setForms(newForm); - const getSigner = userList.find((x) => x.objectId === item.value); - handleAddUser(getSigner, signerId); - } + const handleEditDocumentModal = () => { + setIsEditDoc(!isEditDoc); }; - //`loadOptions` function to use show all list of signer in dropdown - const loadOptions = async (inputValue) => { + const handleEditDocumentForm = async (data) => { + setIsEditDoc(false); + const updateDocument = pdfDetails.map((x) => { + return { ...x, ...data }; + }); + setPdfDetails(updateDocument); try { - const baseURL = localStorage.getItem("baseUrl"); - const url = `${baseURL}functions/getsigners`; - const token = { - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - }; - const headers = { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - ...token + const Bcc = updateDocument?.[0]?.Bcc?.length + ? { + Bcc: updateDocument?.[0]?.Bcc?.map((x) => ({ + __type: "Pointer", + className: "contracts_Contactbook", + objectId: x.objectId + })) + } + : {}; + const RedirectUrl = updateDocument?.[0]?.RedirectUrl + ? { RedirectUrl: updateDocument?.[0]?.RedirectUrl } + : {}; + const data = { + ...(updateDocument?.[0]?.URL ? { URL: updateDocument?.[0]?.URL } : {}), + Name: updateDocument?.[0]?.Name || "", + Note: updateDocument?.[0]?.Note || "", + Description: updateDocument?.[0]?.Description || "", + SendinOrder: updateDocument?.[0]?.SendinOrder || false, + AutomaticReminders: updateDocument?.[0]?.AutomaticReminders, + IsEnableOTP: updateDocument?.[0]?.IsEnableOTP === true ? true : false, + IsTourEnabled: + updateDocument?.[0]?.IsTourEnabled === true ? true : false, + NotifyOnSignatures: + updateDocument?.[0]?.NotifyOnSignatures !== undefined + ? updateDocument?.[0]?.NotifyOnSignatures + : false, + TimeToCompleteDays: + parseInt(updateDocument?.[0]?.TimeToCompleteDays) || 15, + ...Bcc, + ...RedirectUrl }; - const search = inputValue; - const axiosRes = await axios.post(url, { search }, { headers }); - const contactRes = axiosRes?.data?.result || []; - if (contactRes) { - const res = JSON.parse(JSON.stringify(contactRes)); - const result = res; - setUserList(result); - return await result.map((item) => ({ - label: `${item.Name}<${item.Email}>`, - value: item.objectId - })); + const updateTemplateObj = new Parse.Object("contracts_Document"); + updateTemplateObj.id = pdfDetails?.[0]?.objectId; + for (const key in data) { + updateTemplateObj.set(key, data[key]); } - } catch (error) { - console.log("err", error); + await updateTemplateObj.save(); + } catch (err) { + console.log("error in save document", err); } }; - const handleDisable = () => { - const isAllSigner = signerPos.some( - (x) => !x.signerObjId && x.Role !== "prefill" - ); - return isAllSigner; - }; - const handleCloseAttachSigner = () => { - if (docTitle?.length > maxTitleLength) { - alert(t("title-length-alert")); - return; - } - setIsAttchSignerModal(false); - }; return ( <> - <Title title={state?.title ? state.title : "New Document"} /> - <DndProvider backend={HTML5Backend}> - {isLoading.isLoad ? ( - <LoaderWithMsg isLoading={isLoading} /> - ) : handleError ? ( - <HandleError handleError={handleError} /> - ) : ( - <div> - {isUiLoading && ( - <div className="absolute h-[100vh] w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80"> - <Loader /> - <span className="text-[13px] text-base-content"> - {t("loading-mssg")} - </span> - </div> - )} - <div className="relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300"> - {/* this component used for UI interaction and show their functionality */} - {!checkTourStatus && !isAttchSignerModal && ( - //this tour component used in your html component where you want to put - //onRequestClose function to close tour - //steps is defined what will be your messages and style also - //isOpen is takes boolean value to open - <Tour - onRequestClose={closeTour} - steps={tourConfig} - isOpen={placeholderTour} - rounded={5} - closeWithMask={false} - /> - )} - <Tour - onRequestClose={() => setSignerExistModal(false)} - steps={signerAssignTour} - isOpen={signerExistModal} - rounded={5} - closeWithMask={false} - /> - <Tour - onRequestClose={() => setIsSendAlert({})} - steps={textFieldTour} - isOpen={isSendAlert.mssg === textWidget} - rounded={5} - closeWithMask={false} - /> - <Tour - onRequestClose={() => handleCloseSendmailModal()} - steps={signatureWidgetTour} - isOpen={isSendAlert.mssg === "sure" && true} - rounded={5} - closeWithMask={false} - /> - {/* this component used to render all pdf pages in left side */} - <RenderAllPdfPage - allPages={allPages} - setAllPages={setAllPages} - setPageNumber={setPageNumber} - setSignBtnPosition={setSignBtnPosition} - pageNumber={pageNumber} - pdfBase64Url={pdfBase64Url} - signedUrl={pdfDetails?.[0]?.SignedUrl || ""} - setPdfArrayBuffer={setPdfArrayBuffer} - setPdfBase64Url={setPdfBase64Url} - setIsUploadPdf={setIsUploadPdf} - pdfArrayBuffer={pdfArrayBuffer} - isMergePdfBtn={true} - /> - {/* pdf render view */} - <div className=" w-full md:w-[57%] flex mr-4"> - <PdfZoom - clickOnZoomIn={clickOnZoomIn} - clickOnZoomOut={clickOnZoomOut} - handleRotationFun={handleRotationFun} - pdfArrayBuffer={pdfArrayBuffer} - pageNumber={pageNumber} - setPdfBase64Url={setPdfBase64Url} - setPdfArrayBuffer={setPdfArrayBuffer} - setIsUploadPdf={setIsUploadPdf} - setSignerPos={setSignerPos} - signerPos={signerPos} - userId={uniqueId} - allPages={allPages} - setAllPages={setAllPages} - setPageNumber={setPageNumber} - /> - <div className=" w-full md:w-[95%] "> - {/* this modal is used show alert set placeholder for all signers before send mail */} - <ModalUi - isOpen={ - isSendAlert.alert && - isSendAlert.mssg !== textWidget && - isSendAlert.mssg === "confirm" - } - title={isSendAlert.mssg === "confirm" && t("send-mail")} - handleClose={() => handleCloseSendmailModal()} - > - <div className="max-h-96 overflow-y-scroll scroll-hide p-[20px] text-base-content"> - {isSendAlert.mssg === "confirm" && ( - <> - {!isCustomize && ( - <span>{t("placeholder-alert-3")}</span> + {isLoading.isLoad ? ( + <LoaderWithMsg isLoading={isLoading} /> + ) : handleError ? ( + <HandleError handleError={handleError} /> + ) : ( + <div className="relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300"> + {isUiLoading && ( + <div className="absolute h-full w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2]/80"> + <Loader /> + <span className="text-[13px]">{t("loading-mssg")}</span> + </div> + )} + {/* + this component used for UI interaction and show their functionality + this tour component used in your html component where you want to put + onRequestClose function to close tour + steps is defined what will be your messages and style also + isOpen is takes boolean value to open + */} + <Tour + onRequestClose={closeTour} + steps={tourConfig} + isOpen={placeholderTour} + rounded={5} + closeWithMask={false} + /> + <Tour + onRequestClose={() => setSignerExistModal(false)} + steps={signerAssignTour} + isOpen={signerExistModal} + /> + <Tour + onRequestClose={() => setIsSendAlert({})} + steps={prefillWidgetTour} + isOpen={isSendAlert.mssg === "prefill"} + /> + <Tour + onRequestClose={() => handleCloseSendmailModal()} + steps={signatureWidgetTour} + isOpen={isSendAlert?.mssg === "sure" && true} + /> + {/* this component used to render all pdf pages in left side */} + <RenderAllPdfPage + allPages={allPages} + setAllPages={setAllPages} + setPageNumber={setPageNumber} + setSignBtnPosition={setSignBtnPosition} + pageNumber={pageNumber} + pdfBase64Url={pdfBase64Url} + signedUrl={pdfDetails?.[0]?.SignedUrl || ""} + setPdfArrayBuffer={setPdfArrayBuffer} + setPdfBase64Url={setPdfBase64Url} + setIsUploadPdf={setIsUploadPdf} + pdfArrayBuffer={pdfArrayBuffer} + isMergePdfBtn={true} + /> + {/* pdf render view */} + <div className="w-full md:w-[57%] flex mr-4"> + <PdfTools + clickOnZoomIn={clickOnZoomIn} + clickOnZoomOut={clickOnZoomOut} + handleRotationFun={handleRotationFun} + pdfArrayBuffer={pdfArrayBuffer} + pageNumber={pageNumber} + setPdfBase64Url={setPdfBase64Url} + setPdfArrayBuffer={setPdfArrayBuffer} + setIsUploadPdf={setIsUploadPdf} + setSignerPos={setSignerPos} + signerPos={signerPos} + userId={uniqueId} + allPages={allPages} + setAllPages={setAllPages} + setPageNumber={setPageNumber} + setIsTour={setPlaceholderTour} + /> + <div className=" w-full md:w-[95%] "> + {/* this modal is used show alert set placeholder for all signers before send mail */} + <ModalUi + isOpen={isSendAlert.alert && isSendAlert.mssg === "confirm"} + title={isSendAlert.mssg === "confirm" && t("send-mail")} + handleClose={() => handleCloseSendmailModal()} + > + <div className="max-h-96 overflow-y-scroll scroll-hide p-[20px] text-base-content"> + {isSendAlert.mssg === "confirm" && ( + <> + {!isCustomize && <span>{t("placeholder-alert-3")}</span>} + { + isCustomize && ( + <> + <EmailBody + editorRef={editorRef} + requestBody={requestBody} + requestSubject={requestSubject} + handleOnchangeRequest={handleOnchangeRequest} + setRequestSubject={setRequestSubject} + /> + <div + className="flex justify-end items-center gap-1 mt-2 op-link op-link-primary" + onClick={() => { + setRequestBody(defaultBody); + setRequestSubject(defaultSubject); + }} + > + <span>{t("reset-to-default")}</span> + </div> + </> + ) + } + <div className="flex flex-row items-center gap-2 md:gap-6 mt-2"> + <div className="flex flex-row gap-2"> + <button + onClick={() => sendEmailToSigners()} + className="op-btn op-btn-primary font-[500] text-sm shadow" + > + {t("send")} + </button> + {isCustomize && ( + <button + onClick={() => setIsCustomize(false)} + className="op-btn op-btn-ghost font-[500] text-sm" + > + {t("close")} + </button> )} - { - isCustomize && ( - <> - <EmailBody - editorRef={editorRef} - requestBody={requestBody} - requestSubject={requestSubject} - handleOnchangeRequest={ - handleOnchangeRequest - } - setRequestSubject={setRequestSubject} - /> - <div - className="flex justify-end items-center gap-1 mt-2 op-link op-link-primary" - onClick={() => { - setRequestBody(defaultBody); - setRequestSubject(defaultSubject); - }} - > - <span>{t("reset-to-default")}</span> - </div> - </> - ) - } - <div className="flex flex-row items-center gap-2 md:gap-6 mt-2"> - <div className="flex flex-row gap-2"> - <button - onClick={() => sendEmailToSigners()} - className="op-btn op-btn-primary font-[500] text-sm shadow" + </div> + { + !isCustomize && ( + <span + className="op-link op-link-accent text-sm" + onClick={() => setIsCustomize(!isCustomize)} > - {t("send")} - </button> - {isCustomize && ( - <button - onClick={() => setIsCustomize(false)} - className="op-btn op-btn-ghost font-[500] text-sm" - > - {t("close")} - </button> - )} - </div> - { - !isCustomize && ( - <span - className="op-link op-link-accent text-sm" - onClick={() => setIsCustomize(!isCustomize)} - > - {t("cutomize-email")} - </span> - ) - } - </div> - </> - )} - {isSendAlert.mssg === "confirm" && ( - <> - <div className="flex justify-center items-center mt-3"> - <span className="h-[1px] w-[20%] bg-[#ccc]"></span> - <span className="ml-[5px] mr-[5px]">{t("or")}</span> - <span className="h-[1px] w-[20%] bg-[#ccc]"></span> - </div> - <div className="my-3">{handleShareList()}</div> - <p - id="copyUrl" - ref={copyUrlRef} - className="hidden" - ></p> - </> + {t("cutomize-email")} + </span> + ) + } + </div> + </> + )} + {isSendAlert.mssg === "confirm" && ( + <> + <div className="flex justify-center items-center mt-3"> + <span className="h-[1px] w-[20%] bg-[#ccc]"></span> + <span className="ml-[5px] mr-[5px]">{t("or")}</span> + <span className="h-[1px] w-[20%] bg-[#ccc]"></span> + </div> + <div className="my-3">{handleShareList()}</div> + <p id="copyUrl" ref={copyUrlRef} className="hidden"></p> + </> + )} + </div> + </ModalUi> + {/* this modal is used show send mail message and after send mail success message */} + <ModalUi + isOpen={isSend} + title={ + mailStatus === "success" + ? t("mails-sent") + : mailStatus === "quotareached" + ? t("quota-mail-head") + : t("mail-not-delivered") + } + handleClose={() => { + setIsSend(false); + setSignerPos([]); + navigate("/report/1MwEuxLEkF"); + }} + > + <div className="h-[100%] p-[20px] text-base-content"> + {mailStatus === "success" ? ( + <div className="text-center mb-[10px]"> + <LottieWithLoader /> + {pdfDetails[0].SendinOrder ? ( + <p> + {isCurrUser + ? t("placeholder-mail-alert-you") + : t("placeholder-mail-alert", { + name: signersdata[0]?.Name + })} + </p> + ) : ( + <p>{t("placeholder-alert-4")}</p> )} + {isCurrUser && <p>{t("placeholder-alert-5")}</p>} </div> - </ModalUi> - {/* this modal is used show send mail message and after send mail success message */} - <ModalUi - isOpen={isSend} - title={ - mailStatus === "success" - ? t("mails-sent") - : mailStatus === "quotareached" - ? t("quota-mail-head") - : t("mail-not-delivered") - } - handleClose={() => { - setIsSend(false); - setSignerPos([]); - navigate("/report/1MwEuxLEkF"); - }} - > - <div className="h-[100%] p-[20px] text-base-content"> - {mailStatus === "success" ? ( - <div className="text-center mb-[10px]"> - <LottieWithLoader /> - {pdfDetails[0].SendinOrder ? ( - <p> - {isCurrUser - ? t("placeholder-mail-alert-you") - : t("placeholder-mail-alert", { - name: signersdata[0]?.Name - })} - </p> - ) : ( - <p>{t("placeholder-alert-4")}</p> - )} - {isCurrUser && <p>{t("placeholder-alert-5")}</p>} - </div> - ) : mailStatus === "quotareached" ? ( - <div className="flex flex-col gap-y-3"> - <div className="my-3">{handleShareList()}</div> - </div> + ) : mailStatus === "quotareached" ? ( + <div className="flex flex-col gap-y-3"> + <div className="my-3">{handleShareList()}</div> + </div> + ) : ( + <div className="mb-[10px]"> + {mailStatus === "dailyquotareached" ? ( + <p>{t("daily-quota-reached")}</p> ) : ( - <div className="mb-[10px]"> - {mailStatus === "dailyquotareached" ? ( - <p>{t("daily-quota-reached")}</p> - ) : ( - <p>{t("placeholder-alert-6")}</p> - )} - {isCurrUser && ( - <p className="mt-1">{t("placeholder-alert-5")}</p> - )} - </div> + <p>{t("placeholder-alert-6")}</p> )} - {!mailStatus && ( - <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> + {isCurrUser && ( + <p className="mt-1">{t("placeholder-alert-5")}</p> )} - {mailStatus !== "quotareached" && ( - <div - className={ - mailStatus === "success" - ? "flex justify-center mt-1" - : "" - } + </div> + )} + {!mailStatus && ( + <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> + )} + {mailStatus !== "quotareached" && ( + <div + className={ + mailStatus === "success" + ? "flex justify-center mt-1" + : "" + } + > + {isCurrUser && ( + <button + onClick={() => handleRecipientSign()} + type="button" + className="op-btn op-btn-primary mr-1" > - {isCurrUser && ( - <button - onClick={() => handleRecipientSign()} - type="button" - className="op-btn op-btn-primary mr-1" - > - {t("yes")} - </button> - )} - <button - onClick={() => { - setIsSend(false); - setSignerPos([]); - navigate("/report/1MwEuxLEkF"); - }} - type="button" - className="op-btn op-btn-ghost" - > - {isCurrUser ? t("no") : t("close")} - </button> - </div> + {t("yes")} + </button> )} - </div> - </ModalUi> - <ModalUi - isOpen={isShowEmail} - title={t("signers-alert")} - handleClose={() => setIsShowEmail(false)} - > - <div className="h-[100%] p-[20px]"> - <p>{t("placeholder-alert-7")}</p> - <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> <button - onClick={() => setIsShowEmail(false)} + onClick={() => { + setIsSend(false); + setSignerPos([]); + navigate("/report/1MwEuxLEkF"); + }} type="button" - className="op-btn op-btn-primary" + className="op-btn op-btn-ghost text-base-content" > - {t("ok")} + {isCurrUser ? t("no") : t("close")} </button> </div> - </ModalUi> - <ModalUi - isOpen={isAttchSignerModal} - title={t("create-document")} - handleClose={() => handleCloseAttachSigner()} - > - <div className="h-[100%] px-[20px] py-[10px]"> - <div> - <label - htmlFor="doctitle" - className="block text-xs font-semibold" - > - Title - </label> - <input - type="text" - name="doctitle" - value={docTitle} - onChange={(e) => setDocTitle(e.target.value)} - required - onInvalid={(e) => - e.target.setCustomValidity(t("input-required")) - } - onInput={(e) => e.target.setCustomValidity("")} - className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-[11px] py-[18px]" - /> - </div> - {pdfDetails[0].Placeholders?.some( - (x) => !x.signerObjId - ) && ( - <> - <div className="min-h-max max-h-[250px] overflow-y-auto"> - <div className="py-2 text-base-content flex flex-col gap-2 relative"> - {forms?.map((field, id) => { - return ( - <div - className="flex flex-col" - key={field?.value} - > - <label className="block text-xs font-semibold"> - {field?.role} - </label> - <div className="flex justify-between items-center gap-1"> - <div className="flex-1"> - <AsyncSelect - cacheOptions - defaultOptions - value={field} - loadingMessage={() => t("loading")} - noOptionsMessage={() => - t("contact-not-found") - } - loadOptions={loadOptions} - onChange={(item) => - handleInputChange(item, id) - } - unstyled - onFocus={() => loadOptions()} - classNames={{ - control: () => - "op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full h-full text-[11px]", - valueContainer: () => - "flex flex-row gap-x-[2px] gap-y-[2px] md:gap-y-0 w-full my-[2px]", - multiValue: () => - "op-badge op-badge-primary h-full text-[11px]", - multiValueLabel: () => "mb-[2px]", - menu: () => - "mt-1 shadow-md rounded-lg bg-base-200 text-base-content absolute z-9999", - menuList: () => - "shadow-md rounded-lg ", - option: () => - "bg-base-200 text-base-content rounded-lg m-1 hover:bg-base-300 p-2 ", - noOptionsMessage: () => - "p-2 bg-base-200 rounded-lg m-1 p-2" - }} - menuPortalTarget={document.getElementById( - "selectSignerModal" - )} - /> - </div> - <button - onClick={(e) => - handleCreateNew(e, field.value) - } - className="op-btn op-btn-accent op-btn-outline op-btn-sm" - > - <i className="fa-light fa-plus"></i> - </button> - </div> - </div> - ); - })} - </div> - </div> - <div className="w-full h-[0.5px] bg-[#9f9f9f] mt-[8px] mb-[15px]"></div> - <div className="flex mx-2 mb-2 gap-3"> - <button - disabled={handleDisable()} - onClick={() => handleSendDoc()} - type="submit" - className="op-btn op-btn-primary focus:outline-none" - > - <i className="fa-light fa-paper-plane"></i>{" "} - <span>{t("next")}</span> - </button> - <button - onClick={() => handleCloseAttachSigner()} - type="submit" - className="op-btn op-btn-secondary focus:outline-none" - > - <i className="fa-regular fa-pen-to-square"></i> - <span>{t("edit")}</span> - </button> - </div> - </> - )} - </div> - </ModalUi> - <ModalUi - title={""} - isOpen={isNewContact.status} - handleClose={closePopup} + )} + </div> + </ModalUi> + <ModalUi + isOpen={isShowEmail} + title={t("signers-alert")} + handleClose={() => setIsShowEmail(false)} + > + <div className="h-[100%] p-[20px]"> + <p>{t("placeholder-alert-7")}</p> + <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> + <button + onClick={() => setIsShowEmail(false)} + type="button" + className="op-btn op-btn-primary" > - <AddContact - details={handleAddUser} - closePopup={closePopup} - /> - </ModalUi> - <PlaceholderCopy - isPageCopy={isPageCopy} - setIsPageCopy={setIsPageCopy} - xyPosition={signerPos} - setXyPosition={setSignerPos} - allPages={allPages} + {t("ok")} + </button> + </div> + </ModalUi> + <PlaceholderCopy + isPageCopy={isPageCopy} + setIsPageCopy={setIsPageCopy} + xyPosition={signerPos} + setXyPosition={setSignerPos} + allPages={allPages} + pageNumber={pageNumber} + signKey={currWidgetsDetails?.key} + Id={uniqueId} + widgetType={currWidgetsDetails?.type} + setUniqueId={setUniqueId} + /> + <DropdownWidgetOption + type={radioButtonWidget} + title={t("radio-group")} + showDropdown={isRadio} + setShowDropdown={setIsRadio} + handleSaveWidgetsOptions={handleSaveWidgetsOptions} + currWidgetsDetails={currWidgetsDetails} + setCurrWidgetsDetails={setCurrWidgetsDetails} + handleClose={handleNameModal} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + isShowAdvanceFeature={true} + roleName={roleName} + /> + <DropdownWidgetOption + type="checkbox" + title={t("checkbox")} + showDropdown={isCheckbox} + setShowDropdown={setIsCheckbox} + handleSaveWidgetsOptions={handleSaveWidgetsOptions} + currWidgetsDetails={currWidgetsDetails} + setCurrWidgetsDetails={setCurrWidgetsDetails} + handleClose={handleNameModal} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + isShowAdvanceFeature={true} + roleName={roleName} + /> + <DropdownWidgetOption + type="dropdown" + title={t("dropdown-options")} + showDropdown={showDropdown} + setShowDropdown={setShowDropdown} + handleSaveWidgetsOptions={handleSaveWidgetsOptions} + currWidgetsDetails={currWidgetsDetails} + setCurrWidgetsDetails={setCurrWidgetsDetails} + handleClose={handleNameModal} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + isShowAdvanceFeature={true} + roleName={roleName} + /> + + {/* pdf header which contain funish back button */} + <Header + completeBtnTitle={t("next")} + isPlaceholder={true} + pageNumber={pageNumber} + allPages={allPages} + changePage={changePage} + pdfDetails={pdfDetails} + signerPos={signerPos} + signersdata={signersdata} + isMailSend={isMailSend} + handleSaveDoc={handleSaveDoc} + isShowHeader={true} + currentSigner={true} + handleRotationFun={handleRotationFun} + clickOnZoomIn={clickOnZoomIn} + clickOnZoomOut={clickOnZoomOut} + setIsUploadPdf={setIsUploadPdf} + pdfArrayBuffer={pdfArrayBuffer} + setPdfArrayBuffer={setPdfArrayBuffer} + setPdfBase64Url={setPdfBase64Url} + setSignerPos={setSignerPos} + userId={uniqueId} + pdfBase64={pdfBase64Url} + setIsEditTemplate={handleEditDocumentModal} + /> + + <div + ref={divRef} + data-tut="pdfArea" + className="h-full md:h-[95%]" + onClick={() => setPlaceholderTour(false)} + > + {containerWH && ( + <RenderPdf pageNumber={pageNumber} - signKey={currWidgetsDetails?.key} - Id={uniqueId} - widgetType={currWidgetsDetails?.type} + pdfNewWidth={pdfNewWidth} + pdfDetails={pdfDetails} + signerPos={signerPos} + successEmail={false} + numPages={numPages} + pageDetails={pageDetails} + placeholder={true} + drop={drop} + handleDeleteWidget={handleDeleteWidget} + handleTabDrag={handleTabDrag} + handleStop={handleStop} + setPdfLoad={setPdfLoad} + pdfLoad={pdfLoad} + setSignerPos={setSignerPos} + containerWH={containerWH} + setIsResize={setIsResize} + isResize={isResize} + setZIndex={setZIndex} + setIsPageCopy={setIsPageCopy} + signersdata={signersdata} + handleLinkUser={handleLinkUser} setUniqueId={setUniqueId} - tempSignerId={tempSignerId} - setTempSignerId={setTempSignerId} - /> - <DropdownWidgetOption - type={radioButtonWidget} - title={t("radio-group")} - showDropdown={isRadio} - setShowDropdown={setIsRadio} - handleSaveWidgetsOptions={handleSaveWidgetsOptions} - currWidgetsDetails={currWidgetsDetails} - setCurrWidgetsDetails={setCurrWidgetsDetails} - handleClose={handleNameModal} - fontSize={fontSize} - setFontSize={setFontSize} - fontColor={fontColor} - setFontColor={setFontColor} - isShowAdvanceFeature={true} - /> - <DropdownWidgetOption - type="checkbox" - title={t("checkbox")} - showDropdown={isCheckbox} - setShowDropdown={setIsCheckbox} - handleSaveWidgetsOptions={handleSaveWidgetsOptions} - currWidgetsDetails={currWidgetsDetails} - setCurrWidgetsDetails={setCurrWidgetsDetails} - handleClose={handleNameModal} - fontSize={fontSize} - setFontSize={setFontSize} - fontColor={fontColor} - setFontColor={setFontColor} - isShowAdvanceFeature={true} - /> - <DropdownWidgetOption - type="dropdown" - title={t("dropdown-options")} - showDropdown={showDropdown} + isDragging={isDragging} setShowDropdown={setShowDropdown} - handleSaveWidgetsOptions={handleSaveWidgetsOptions} - currWidgetsDetails={currWidgetsDetails} + setIsRadio={setIsRadio} + setIsCheckbox={setIsCheckbox} setCurrWidgetsDetails={setCurrWidgetsDetails} - handleClose={handleNameModal} + handleNameModal={setIsNameModal} + uniqueId={uniqueId} + pdfOriginalWH={pdfOriginalWH} + setScale={setScale} + scale={scale} + setIsSelectId={setIsSelectId} + pdfBase64Url={pdfBase64Url} fontSize={fontSize} setFontSize={setFontSize} fontColor={fontColor} setFontColor={setFontColor} - isShowAdvanceFeature={true} + unSignedWidgetId={unSignedWidgetId} + divRef={divRef} + currWidgetsDetails={currWidgetsDetails} + setRoleName={setRoleName} + isShowModal={isShowModal} /> + )} + </div> + </div> + </div> - {/* pdf header which contain funish back button */} - <Header - completeBtnTitle={t("next")} - isPlaceholder={true} - pageNumber={pageNumber} - allPages={allPages} - changePage={changePage} - pdfDetails={pdfDetails} + {/* signature button */} + <div className="w-full md:w-[23%] bg-base-100 overflow-y-auto hide-scrollbar"> + <div className={`max-h-screen`}> + {isMobile ? ( + <div> + <WidgetComponent + pdfUrl={isMailSend} + handleDivClick={handleDivClick} + handleMouseLeave={handleMouseLeave} + isSignYourself={false} + addPositionOfSignature={addPositionOfSignature} signerPos={signerPos} signersdata={signersdata} + isSelectListId={isSelectListId} + setIsSelectId={setIsSelectId} + isSigners={true} + setIsShowEmail={setIsShowEmail} isMailSend={isMailSend} - alertSendEmail={alertSendEmail} - isShowHeader={true} - currentSigner={true} - handleRotationFun={handleRotationFun} - clickOnZoomIn={clickOnZoomIn} - clickOnZoomOut={clickOnZoomOut} - setIsUploadPdf={setIsUploadPdf} - pdfArrayBuffer={pdfArrayBuffer} - setPdfArrayBuffer={setPdfArrayBuffer} - setPdfBase64Url={setPdfBase64Url} + setSelectedEmail={setSelectedEmail} + selectedEmail={selectedEmail} + setUniqueId={setUniqueId} + setRoleName={setRoleName} + initial={true} + sendInOrder={pdfDetails[0].SendinOrder} + setSignersData={setSignersData} + blockColor={blockColor} + setBlockColor={setBlockColor} + setIsAddSigner={setIsAddSigner} + handleDeleteUser={handleDeleteUser} + uniqueId={uniqueId} setSignerPos={setSignerPos} - userId={uniqueId} - pdfBase64={pdfBase64Url} + roleName={roleName} + isPrefillDropdown={false} // In document editing flow there should not be any prefill dropdown widget + prefillSigner={prefillSigner} /> - + </div> + ) : ( + <div> <div - ref={divRef} - data-tut="pdfArea" - className="h-full md:h-[95%]" + className="hidden md:block w-full h-full bg-base-100" + aria-disabled > - {containerWH && ( - <RenderPdf - pageNumber={pageNumber} - pdfNewWidth={pdfNewWidth} - pdfDetails={pdfDetails} - signerPos={signerPos} - successEmail={false} - numPages={numPages} - pageDetails={pageDetails} - placeholder={true} - drop={drop} - handleDeleteSign={handleDeleteSign} - handleTabDrag={handleTabDrag} - handleStop={handleStop} - setPdfLoad={setPdfLoad} - pdfLoad={pdfLoad} - setSignerPos={setSignerPos} - containerWH={containerWH} - setIsResize={setIsResize} - isResize={isResize} - setZIndex={setZIndex} - setIsPageCopy={setIsPageCopy} - signersdata={signersdata} - handleLinkUser={handleLinkUser} - setUniqueId={setUniqueId} - isDragging={isDragging} - setShowDropdown={setShowDropdown} - setIsRadio={setIsRadio} - setIsCheckbox={setIsCheckbox} - setCurrWidgetsDetails={setCurrWidgetsDetails} - handleNameModal={setIsNameModal} - setTempSignerId={setTempSignerId} - uniqueId={uniqueId} - pdfOriginalWH={pdfOriginalWH} - setScale={setScale} - scale={scale} - setIsSelectId={setIsSelectId} - pdfBase64Url={pdfBase64Url} - fontSize={fontSize} - setFontSize={setFontSize} - fontColor={fontColor} - setFontColor={setFontColor} - unSignedWidgetId={unSignedWidgetId} - divRef={divRef} - currWidgetsDetails={currWidgetsDetails} - /> - )} - </div> - </div> - </div> - - {/* signature button */} - <div className="w-full md:w-[23%] bg-base-100 overflow-y-auto hide-scrollbar"> - <div className={`max-h-screen`}> - {isMobile ? ( - <div> + <SignerListPlace + setSignerPos={setSignerPos} + signerPos={signerPos} + signersdata={signersdata} + isSelectListId={isSelectListId} + setIsSelectId={setIsSelectId} + setUniqueId={setUniqueId} + setRoleName={setRoleName} + sendInOrder={pdfDetails[0].SendinOrder} + setSignersData={setSignersData} + blockColor={blockColor} + setBlockColor={setBlockColor} + isMailSend={isMailSend} + setIsAddSigner={setIsAddSigner} + handleDeleteUser={handleDeleteUser} + roleName={roleName} + uniqueId={uniqueId} + prefillSigner={prefillSigner} + setIsTour={setPlaceholderTour} + /> + <div data-tut="addWidgets"> <WidgetComponent - pdfUrl={isMailSend} + isMailSend={isMailSend} handleDivClick={handleDivClick} handleMouseLeave={handleMouseLeave} isSignYourself={false} addPositionOfSignature={addPositionOfSignature} - signerPos={signerPos} - signersdata={signersdata} - isSelectListId={isSelectListId} - setIsSelectId={setIsSelectId} - isSigners={true} - setIsShowEmail={setIsShowEmail} - isMailSend={isMailSend} - setSelectedEmail={setSelectedEmail} - selectedEmail={selectedEmail} - setUniqueId={setUniqueId} - setRoleName={setRoleName} initial={true} - sendInOrder={pdfDetails[0].SendinOrder} - setSignersData={setSignersData} - blockColor={blockColor} - setBlockColor={setBlockColor} - setIsAddSigner={setIsAddSigner} - handleDeleteUser={handleDeleteUser} - uniqueId={uniqueId} - setSignerPos={setSignerPos} + isPrefillDropdown={false} + roleName={roleName} /> </div> - ) : ( - <div> - <div - className="hidden md:block w-full h-full bg-base-100" - aria-disabled - > - <SignerListPlace - setSignerPos={setSignerPos} - signerPos={signerPos} - signersdata={signersdata} - isSelectListId={isSelectListId} - setIsSelectId={setIsSelectId} - setUniqueId={setUniqueId} - setRoleName={setRoleName} - sendInOrder={pdfDetails[0].SendinOrder} - setSignersData={setSignersData} - blockColor={blockColor} - setBlockColor={setBlockColor} - isMailSend={isMailSend} - setIsAddSigner={setIsAddSigner} - handleDeleteUser={handleDeleteUser} - roleName={roleName} - uniqueId={uniqueId} - // handleAddSigner={handleAddSigner} - /> - <div data-tut="addWidgets"> - <WidgetComponent - isMailSend={isMailSend} - handleDivClick={handleDivClick} - handleMouseLeave={handleMouseLeave} - isSignYourself={false} - addPositionOfSignature={addPositionOfSignature} - initial={true} - /> - </div> - </div> - </div> - )} + </div> </div> - </div> + )} </div> </div> - )} - {isShowModal[currWidgetsDetails?.key] && ( - <WidgetsValueModal - key={currWidgetsDetails?.key} - xyPosition={signerPos} - pageNumber={pageNumber} - setXyPosition={setSignerPos} - uniqueId={uniqueId} - setPageNumber={setPageNumber} - setCurrWidgetsDetails={setCurrWidgetsDetails} - currWidgetsDetails={currWidgetsDetails} - index={pageNumber} - isSave={true} - tempSignerId={tempSignerId} - setUniqueId={setUniqueId} - signatureTypes={signatureType} - /> - )} - <ModalUi - isOpen={isAlreadyPlace.status} - title={t("document-alert")} - showClose={false} - > - <div className="h-[100%] p-[20px] text-base-content"> - <p>{isAlreadyPlace.message}</p> - <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> - <button - onClick={() => handleRecipientSign()} - type="button" - className="op-btn op-btn-primary" - > - {t("view")} - </button> - </div> - </ModalUi> - {(isAddSigner || (isAddUser && isAddUser[uniqueId])) && ( - <LinkUserModal - handleAddUser={handleAddUser} - uniqueId={uniqueId} - closePopup={closePopup} - signersData={signersdata} - signerPos={signerPos} - /> - )} - <WidgetNameModal - signatureType={signatureType} - widgetName={currWidgetsDetails?.options?.name} - defaultdata={currWidgetsDetails} - isOpen={isNameModal} - handleClose={handleNameModal} - handleData={handleWidgetdefaultdata} - isTextSetting={isTextSetting} - setIsTextSetting={setIsTextSetting} - fontSize={fontSize} - setFontSize={setFontSize} - fontColor={fontColor} - setFontColor={setFontColor} + </div> + )} + {isShowModal[currWidgetsDetails?.key] && ( + <WidgetsValueModal + key={currWidgetsDetails?.key} + xyPosition={signerPos} + pageNumber={pageNumber} + setXyPosition={setSignerPos} + uniqueId={uniqueId} + setPageNumber={setPageNumber} + setCurrWidgetsDetails={setCurrWidgetsDetails} + currWidgetsDetails={currWidgetsDetails} + index={pageNumber} + isSave={true} + setUniqueId={setUniqueId} + signatureTypes={signatureType} + /> + )} + <ModalUi + isOpen={isAlreadyPlace.status} + title={t("document-alert")} + showClose={false} + > + <div className="h-[100%] p-[20px] text-base-content"> + <p>{isAlreadyPlace.message}</p> + <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> + <button + onClick={() => handleRecipientSign()} + type="button" + className="op-btn op-btn-primary" + > + {t("view")} + </button> + </div> + </ModalUi> + {(isAddSigner || (isAddUser && isAddUser[uniqueId])) && ( + <LinkUserModal + handleAddUser={handleAddUser} + uniqueId={uniqueId} + closePopup={closePopup} + signersData={signersdata} + signerPos={signerPos} + isAddYourSelfCheckbox /> - <RotateAlert - showRotateAlert={showRotateAlert.status} - setShowRotateAlert={setShowRotateAlert} - handleRemoveWidgets={handleRemovePlaceholder} + )} + <WidgetNameModal + signatureType={signatureType} + widgetName={currWidgetsDetails?.options?.name} + defaultdata={currWidgetsDetails} + isOpen={isNameModal} + handleClose={handleNameModal} + handleData={handleWidgetdefaultdata} + isTextSetting={isTextSetting} + setIsTextSetting={setIsTextSetting} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + roleName={roleName} + /> + <RotateAlert + showRotateAlert={showRotateAlert.status} + setShowRotateAlert={setShowRotateAlert} + handleRemoveWidgets={handleRemovePlaceholder} + /> + {isEditDoc && ( + <EditDocument + title={t("edit-document")} + handleClose={handleEditDocumentModal} + pdfbase64={pdfBase64Url} + template={pdfDetails?.[0]} + onSuccess={handleEditDocumentForm} + setPdfArrayBuffer={setPdfArrayBuffer} + setPdfBase64Url={setPdfBase64Url} + isAddYourSelfCheckbox={true} /> - </DndProvider> + )} </> ); } diff --git a/apps/OpenSign/src/pages/Preferences.jsx b/apps/OpenSign/src/pages/Preferences.jsx index 107e75cc41..b34ef2df1f 100644 --- a/apps/OpenSign/src/pages/Preferences.jsx +++ b/apps/OpenSign/src/pages/Preferences.jsx @@ -1,5 +1,4 @@ import React, { useEffect, useState, useRef } from "react"; -import Title from "../components/Title"; import Alert from "../primitives/Alert"; import { useTranslation } from "react-i18next"; import Loader from "../primitives/Loader"; @@ -12,7 +11,6 @@ import { } from "../constant/Utils"; import Parse from "parse"; import { Tooltip as ReactTooltip } from "react-tooltip"; -import TimezoneSelector from "../components/shared/fields/TimezoneSelector"; import ReactQuill from "react-quill-new"; import "../styles/quill.css"; import EditorToolbar, { @@ -20,7 +18,9 @@ import EditorToolbar, { module2, formats } from "../components/pdf/EditorToolbar"; -import DateFormatSelector from "../components/shared/fields/DateFormatSelector"; +import TimezoneSelector from "../components/preferences/TimezoneSelector"; +import DateFormatSelector from "../components/preferences/DateFormatSelector"; +import FilenameFormatSelector from "../components/preferences/FilenameFormatSelector"; const Preferences = () => { const appName = @@ -60,6 +60,7 @@ const Preferences = () => { requestMail: false, completionMail: false }); + const [fileNameFormat, setFileNameFormat] = useState("DOCNAME"); useEffect(() => { fetchSignType(); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -125,6 +126,9 @@ const Preferences = () => { const isLTVEnabled = _getUser?.IsLTVEnabled !== undefined ? _getUser?.IsLTVEnabled : false; setIsLTVEnabled(isLTVEnabled); + const downloadFilenameFormat = + _getUser?.DownloadFilenameFormat || "DOCNAME"; + setFileNameFormat(downloadFilenameFormat); } } catch (err) { console.log("err while getting user details", err); @@ -164,11 +168,17 @@ const Preferences = () => { type: "danger", msg: t("at-least-one-signature-type") }); + setIsLoader(false); + setTimeout(() => setIsAlert({ type: "success", msg: "" }), 2000); + return; } else if (isDefaultSignTypeOnly) { setIsAlert({ type: "danger", - msg: t("expect-default-one-more-signature-type") + msg: t("expect-default-one-signature-type") }); + setIsLoader(false); + setTimeout(() => setIsAlert({ type: "success", msg: "" }), 2000); + return; } else { params = { ...params, SignatureType: signatureType }; } @@ -183,7 +193,8 @@ const Preferences = () => { IsTourEnabled: isTourEnabled, DateFormat: dateFormat, Is12HourTime: is12HourTime, - IsLTVEnabled: isLTVEnabled + IsLTVEnabled: isLTVEnabled, + DownloadFilenameFormat: fileNameFormat }; const updateRes = await Parse.Cloud.run("updatepreferences", params); if (updateRes) { @@ -197,6 +208,7 @@ const Preferences = () => { extUser.IsTourEnabled = isTourEnabled; extUser.DateFormat = dateFormat; extUser.Is12HourTime = is12HourTime; + extUser.DownloadFilenameFormat = fileNameFormat; const _extUser = JSON.parse(JSON.stringify(extUser)); localStorage.setItem("Extand_Class", JSON.stringify([_extUser])); } @@ -217,7 +229,7 @@ const Preferences = () => { }; const tenantEmailTemplate = async (tenantRes) => { if (tenantRes === "user does not exist!") { - alert("User does not exist"); + alert(t("user-not-exist")); } else if (tenantRes) { setIsLoader(true); const updateRes = tenantRes; @@ -389,7 +401,6 @@ const Preferences = () => { }; return ( <React.Fragment> - <Title title={t("Preferences")} /> {isalert.msg && <Alert type={isalert.type}>{isalert.msg}</Alert>} {isTopLoader ? ( <div className="flex justify-center items-center h-screen"> @@ -761,6 +772,12 @@ const Preferences = () => { setDateFormat={setDateFormat} /> </div> + <div className="mb-6"> + <FilenameFormatSelector + fileNameFormat={fileNameFormat} + setFileNameFormat={setFileNameFormat} + /> + </div> </div> {/* Save Button - Full Width */} <div className="md:col-span-12 flex justify-start mt-2"> diff --git a/apps/OpenSign/src/pages/Report.jsx b/apps/OpenSign/src/pages/Report.jsx index 3139c84312..d7689190fa 100644 --- a/apps/OpenSign/src/pages/Report.jsx +++ b/apps/OpenSign/src/pages/Report.jsx @@ -1,19 +1,20 @@ -import React, { useEffect, useState, useRef } from "react"; -import ReportTable from "../primitives/GetReportDisplay"; +import { useEffect, useState, useRef } from "react"; import Parse from "parse"; import axios from "axios"; -import reportJson from "../json/ReportJson"; +import reportJson, { extraCols } from "../json/ReportJson"; import { useParams } from "react-router"; -import Title from "../components/Title"; import PageNotFound from "./PageNotFound"; -import TourContentWithBtn from "../primitives/TourContentWithBtn"; import Loader from "../primitives/Loader"; -import { useTranslation } from "react-i18next"; +import Contactbook from "../reports/contact/Contactbook"; +import ColumnSelector from "../components/ColumnSelector"; +import TemplatesReport from "../reports/template/TemplatesReport"; +import DocumentsReport from "../reports/document/DocumentsReport"; +import { templateReportTour } from "../json/ReportTour"; const Report = () => { - const { t } = useTranslation(); const { id } = useParams(); - const [List, setList] = useState([]); + const abortController = new AbortController(); + const [list, setList] = useState([]); const [isLoader, setIsLoader] = useState(true); const [reportName, setReportName] = useState(""); const [reporthelp, setReportHelp] = useState(""); @@ -21,16 +22,17 @@ const Report = () => { const [heading, setHeading] = useState([]); const [isNextRecord, setIsNextRecord] = useState(false); const [isMoreDocs, setIsMoreDocs] = useState(true); - const [form, setForm] = useState(""); const [tourData, setTourData] = useState([]); - const [isDontShow, setIsDontShow] = useState(false); - const [isImport, setIsImport] = useState(false); - const abortController = new AbortController(); - const docPerPage = 10; const [searchTerm, setSearchTerm] = useState(""); const [mobileSearchOpen, setMobileSearchOpen] = useState(false); const [isSearchResult, setIsSearchResult] = useState(false); + const [allColumns, setAllColumns] = useState([]); + const [visibleColumns, setVisibleColumns] = useState([]); + const [columnLabels, setColumnLabels] = useState({}); + const [defaultColumns, setDefaultColumns] = useState([]); + const [isColumnModal, setIsColumnModal] = useState(false); const debounceTimer = useRef(null); + const docPerPage = 20; // below useEffect is call when id param change useEffect(() => { @@ -38,6 +40,14 @@ const Report = () => { setList([]); setSearchTerm(""); setMobileSearchOpen(false); + const saved = JSON.parse(localStorage.getItem("reportColumns") || "{}"); + if (saved[id]) { + setVisibleColumns(saved[id].visible || saved[id]); + setColumnLabels(saved[id].labels || {}); + } else { + setVisibleColumns([]); + setColumnLabels({}); + } getReportData(0, docPerPage, ""); // Function returned from useEffect is called on unmount @@ -54,15 +64,11 @@ const Report = () => { // below useEffect call when isNextRecord state is true and fetch next record useEffect(() => { if (isNextRecord) { - getReportData(List.length, 20, searchTerm); + getReportData(list.length, 20, searchTerm); } // eslint-disable-next-line }, [isNextRecord]); - const handleDontShow = (isChecked) => { - setIsDontShow(isChecked); - }; - const handleSearchChange = async (e) => { const term = e.target.value.toLowerCase(); setSearchTerm(term); @@ -118,11 +124,21 @@ const Report = () => { const json = reportJson(id); if (json) { setActions(json.actions); - setHeading(json.heading); + const savedCols = JSON.parse( + localStorage.getItem("reportColumns") || "{}" + ); + const visible = savedCols[id]?.visible || json.heading; + const labels = savedCols[id]?.labels || {}; + if (!savedCols[id] || id === "contacts") { + savedCols[id] = { visible: json.heading, labels: {} }; + localStorage.setItem("reportColumns", JSON.stringify(savedCols)); + } + setVisibleColumns(visible); + setColumnLabels(labels); + setHeading(visible); + setDefaultColumns(json.heading); setReportName(json.reportName); - setForm(json.form); setReportHelp(json?.helpMsg); - setIsImport(json?.import || false); const currentUser = Parse.User.current().id; const headers = { @@ -142,39 +158,11 @@ const Report = () => { headers: headers, signal: abortController.signal // is used to cancel fetch query }); + const extraHeads = + id === "4Hhwbp482K" ? [...extraCols, "Expiry Date"] : extraCols; + setAllColumns(Array.from(new Set([...json.heading, ...extraHeads]))); if (id === "6TeaPr321t") { - const tourConfig = [ - { - selector: "[data-tut=reactourFirst]", - content: () => ( - <TourContentWithBtn - message={t("tour-mssg.report-1")} - isChecked={handleDontShow} - /> - ), - position: "top", - style: { fontSize: "13px" } - } - ]; - - if (res.data.result && res.data.result?.length > 0) { - json.actions.map((data) => { - const newConfig = { - selector: `[data-tut="${data?.selector}"]`, - content: () => ( - <TourContentWithBtn - message={t(`tour-mssg.${data?.action}`)} - isChecked={handleDontShow} - /> - ), - position: "top", - style: { fontSize: "13px" } - }; - tourConfig.push(newConfig); - }); - } - - setTourData(tourConfig); + setTourData(templateReportTour); } if (id === "4Hhwbp482K") { const listData = res.data?.result.filter((x) => x.Signers.length > 0); @@ -234,42 +222,66 @@ const Report = () => { setIsLoader(false); } }; + + const commonProps = { + ReportName: reportName, + List: list, + setList, + actions: actions, + heading: heading, + setIsNextRecord, + isMoreDocs, + docPerPage, + mobileSearchOpen, + setMobileSearchOpen, + searchTerm, + handleSearchChange, + handleSearchPaste, + isSearchResult, + columnLabels, + openColumnModal: () => setIsColumnModal(true) + }; return ( <> - <Title title={reportName} /> {isLoader ? ( <div className="h-[100vh] flex justify-center items-center"> <Loader /> </div> ) : ( <> - {reportName ? ( - <ReportTable - ReportName={reportName} - List={List} - setList={setList} - actions={actions} - heading={heading} - setIsNextRecord={setIsNextRecord} - isMoreDocs={isMoreDocs} - docPerPage={docPerPage} - form={form} + {id === "contacts" ? ( + <Contactbook {...commonProps} /> + ) : id === "6TeaPr321t" ? ( + <TemplatesReport + {...commonProps} report_help={reporthelp} tourData={tourData} - isDontShow={isDontShow} - mobileSearchOpen={mobileSearchOpen} - setMobileSearchOpen={setMobileSearchOpen} - searchTerm={searchTerm} - handleSearchChange={handleSearchChange} - handleSearchPaste={handleSearchPaste} - isSearchResult={isSearchResult} - isImport={isImport} /> + ) : reportName ? ( + <DocumentsReport {...commonProps} report_help={reporthelp} /> ) : ( <PageNotFound prefix={"Report"} /> )} </> )} + <ColumnSelector + isOpen={isColumnModal} + allColumns={allColumns} + visibleColumns={visibleColumns} + columnLabels={columnLabels} + defaultColumns={defaultColumns} + onApply={(cols, labels) => { + setVisibleColumns(cols); + setHeading(cols); + setColumnLabels(labels); + const saved = JSON.parse( + localStorage.getItem("reportColumns") || "{}" + ); + saved[id] = { visible: cols, labels }; + localStorage.setItem("reportColumns", JSON.stringify(saved)); + }} + onClose={() => setIsColumnModal(false)} + /> </> ); }; diff --git a/apps/OpenSign/src/pages/SignyourselfPdf.jsx b/apps/OpenSign/src/pages/SignyourselfPdf.jsx index 81971123d3..fd56eba993 100644 --- a/apps/OpenSign/src/pages/SignyourselfPdf.jsx +++ b/apps/OpenSign/src/pages/SignyourselfPdf.jsx @@ -5,8 +5,6 @@ import Parse from "parse"; import Confetti from "react-confetti"; import axios from "axios"; import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage"; -import { DndProvider } from "react-dnd"; -import { HTML5Backend } from "react-dnd-html5-backend"; import { useDrop } from "react-dnd"; import EmailComponent from "../components/pdf/EmailComponent"; import WidgetComponent from "../components/pdf/WidgetComponent"; @@ -14,7 +12,7 @@ import { getTenantDetails, contractDocument, embedDocId, - multiSignEmbed, + embedWidgetsToDoc, calculateInitialWidthHeight, defaultWidthHeight, contractUsers, @@ -47,12 +45,11 @@ import Signedby from "../components/pdf/Signedby"; import Header from "../components/pdf/PdfHeader"; import RenderPdf from "../components/pdf/RenderPdf"; import PlaceholderCopy from "../components/pdf/PlaceholderCopy"; -import Title from "../components/Title"; import DropdownWidgetOption from "../components/pdf/DropdownWidgetOption"; import { useDispatch, useSelector } from "react-redux"; import TextFontSetting from "../components/pdf/TextFontSetting"; import VerifyEmail from "../components/pdf/VerifyEmail"; -import PdfZoom from "../components/pdf/PdfZoom"; +import PdfTools from "../components/pdf/PdfTools"; import { useTranslation } from "react-i18next"; import RotateAlert from "../components/RotateAlert"; import DownloadPdfZip from "../primitives/DownloadPdfZip"; @@ -77,9 +74,6 @@ function SignYourSelf() { const { docId } = useParams(); const dispatch = useDispatch(); const isShowModal = useSelector((state) => state.widget.isShowModal); - const saveSignCheckbox = useSelector( - (state) => state.widget.saveSignCheckbox - ); const appName = "OpenSign™"; const divRef = useRef(null); @@ -127,7 +121,7 @@ function SignYourSelf() { const openCellsSettingModal = () => setIsCellsSetting(true); const [pdfLoad, setPdfLoad] = useState(false); const [isAlert, setIsAlert] = useState({ isShow: false, alertMessage: "" }); - const [isDontShow, setIsDontShow] = useState(false); + const [isDontShow, setIsDontShow] = useState(true); const [isCompleted, setIsCompleted] = useState(false); const [isCelebration, setIsCelebration] = useState(false); const [pdfArrayBuffer, setPdfArrayBuffer] = useState(""); @@ -135,7 +129,7 @@ function SignYourSelf() { const [isVerifyModal, setIsVerifyModal] = useState(false); const [otp, setOtp] = useState(""); const [zoomPercent, setZoomPercent] = useState(0); - const isHeader = useSelector((state) => state.showHeader); + const isSidebar = useSelector((state) => state.sidebar.isOpen); const [scale, setScale] = useState(1); const [pdfBase64Url, setPdfBase64Url] = useState(""); const [showRotateAlert, setShowRotateAlert] = useState({ @@ -198,7 +192,7 @@ function SignYourSelf() { const timer = setTimeout(updateSize, 100); // match the transition duration return () => clearTimeout(timer); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [divRef.current, isHeader]); + }, [divRef.current, isSidebar]); //function for get document details for perticular signer with signer'object id const getDocumentDetails = async (showComplete) => { @@ -268,13 +262,14 @@ function SignYourSelf() { if (defaultSignRes?.status === "success") { dispatch( setSaveSignCheckbox({ - ...saveSignCheckbox, isVisible: true, signId: defaultSignRes?.res?.id }) ); dispatch(setDefaultSignImg(defaultSignRes?.res?.defaultSignature)); dispatch(setMyInitial(defaultSignRes?.res?.defaultInitial)); + } else { + dispatch(setSaveSignCheckbox({ isVisible: true })); } const contractUsersRes = await contractUsers(); if (contractUsersRes === "Error: Something went wrong!") { @@ -283,20 +278,14 @@ function SignYourSelf() { } else if (contractUsersRes[0] && contractUsersRes.length > 0) { setContractName("_Users"); setSignerUserId(contractUsersRes[0].objectId); - dispatch(setSaveSignCheckbox({ ...saveSignCheckbox, isVisible: true })); - - const tourstatuss = - contractUsersRes[0].TourStatus && contractUsersRes[0].TourStatus; - if (tourstatuss && tourstatuss.length > 0 && !isCompleted) { - setTourStatus(tourstatuss); - const checkTourRecipients = tourstatuss.filter( - (data) => data.signyourself - ); - if (checkTourRecipients && checkTourRecipients.length > 0) { - setCheckTourStatus(checkTourRecipients[0].signyourself); - } + const tourstatus = contractUsersRes?.[0]?.TourStatus || []; + if (tourstatus && tourstatus.length > 0 && !isCompleted) { + setTourStatus(tourstatus); + const tour = tourstatus?.some((data) => data.signyourself) || false; + setSignTour(!tour); + setCheckTourStatus(tour); } else { - setCheckTourStatus(false); + setSignTour(true); } setIsLoading({ isLoad: false }); } else if (contractUsersRes.length === 0) { @@ -304,28 +293,19 @@ function SignYourSelf() { if (contractContactBook && contractContactBook.length > 0) { setContractName("_Contactbook"); setSignerUserId(contractContactBook[0].objectId); - const tourstatuss = - contractContactBook[0].TourStatus && - contractContactBook[0].TourStatus; - - if (tourstatuss && tourstatuss.length > 0 && !isCompleted) { - setTourStatus(tourstatuss); - const checkTourRecipients = tourstatuss.filter( - (data) => data.signyourself - ); - if (checkTourRecipients && checkTourRecipients.length > 0) { - setCheckTourStatus(checkTourRecipients[0].signyourself); - } + const tourstatus = contractContactBook?.[0]?.TourStatus || []; + if (tourstatus && tourstatus.length > 0 && !isCompleted) { + setTourStatus(tourstatus); + const tour = tourstatus?.some((data) => data.signyourself) || false; + setSignTour(!tour); + setCheckTourStatus(tour); } else { - setCheckTourStatus(true); + setSignTour(true); } } else { setHandleError(t("no-data-avaliable")); } - const loadObj = { - isLoad: false - }; - setIsLoading(loadObj); + setIsLoading({ isLoad: false }); } } catch (err) { console.log("Error: error in getDocumentDetails", err); @@ -351,7 +331,6 @@ function SignYourSelf() { return ""; } }; - //function for setting position after drop signature button over pdf const addPositionOfSignature = (item, monitor) => { setCurrWidgetsDetails({}); @@ -398,7 +377,12 @@ function SignYourSelf() { scale: containerScale, Width: getWidth, Height: getHeight, - options: addWidgetSelfsignOptions(dragTypeValue, getWidgetValue, owner) + options: addWidgetSelfsignOptions( + dragTypeValue, + getWidgetValue, + owner, + xyPosition + ) }; dropData.push(dropObj); } else { @@ -427,7 +411,12 @@ function SignYourSelf() { type: dragTypeValue, Width: getWidth / (containerScale * scale), Height: getHeight / (containerScale * scale), - options: addWidgetSelfsignOptions(dragTypeValue, getWidgetValue, owner), + options: addWidgetSelfsignOptions( + dragTypeValue, + getWidgetValue, + owner, + xyPosition + ), scale: containerScale }; dropData.push(dropObj); @@ -506,7 +495,10 @@ function SignYourSelf() { }; useEffect(() => { const timer = setTimeout(() => { - if (!pdfDetails?.[0]?.IsCompleted) { + if ( + !pdfDetails?.[0]?.IsCompleted && + pdfDetails?.[0]?.CreatedBy?.objectId === jsonSender?.objectId + ) { autosavedetails(); } }, 2000); @@ -647,7 +639,7 @@ function SignYourSelf() { await embedDocId(pdfOriginalWH, pdfDoc, documentId); } //embed all widgets in document - const pdfBytes = await multiSignEmbed( + const pdfBytes = await embedWidgetsToDoc( xyPosition, pdfDoc, isSignYourSelfFlow, @@ -839,7 +831,7 @@ function SignYourSelf() { setSignBtnPosition([xySignature]); }; //function for delete signature block - const handleDeleteSign = (key) => { + const handleDeleteWidget = (key) => { setCurrWidgetsDetails({}); const updateResizeData = []; let filterData = xyPosition[index].pos.filter((data) => data.key !== key); @@ -876,6 +868,7 @@ function SignYourSelf() { content: () => ( <TourContentWithBtn message={t("tour-mssg.signyour-self-1")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -887,6 +880,19 @@ function SignYourSelf() { content: () => ( <TourContentWithBtn message={t("tour-mssg.signyour-self-2")} + isDontShowCheckbox={!checkTourStatus} + isChecked={handleDontShow} + /> + ), + position: "top", + style: { fontSize: "13px" } + }, + { + selector: '[data-tut="pdftools"]', + content: () => ( + <TourContentWithBtn + message={t("pdf-tools-tour")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -898,7 +904,8 @@ function SignYourSelf() { //function for update TourStatus const closeTour = async () => { setSignTour(false); - if (isDontShow) { + setIsDontShow(true); + if (!checkTourStatus && isDontShow) { let updatedTourStatus = []; if (tourStatus.length > 0) { updatedTourStatus = [...tourStatus]; @@ -1046,12 +1053,18 @@ function SignYourSelf() { const setCellCount = (key, newCount) => { setXyPosition((prev) => { - const getPageNumer = prev.filter((data) => data.pageNumber === pageNumber); + const getPageNumer = prev.filter( + (data) => data.pageNumber === pageNumber + ); if (getPageNumer.length > 0) { const updatePos = getPageNumer[0].pos.map((p) => - p.key === key ? { ...p, options: { ...p.options, cellCount: newCount } } : p + p.key === key + ? { ...p, options: { ...p.options, cellCount: newCount } } + : p + ); + return prev.map((obj, ind) => + ind === index ? { ...obj, pos: updatePos } : obj ); - return prev.map((obj, ind) => (ind === index ? { ...obj, pos: updatePos } : obj)); } return prev; }); @@ -1082,7 +1095,8 @@ function SignYourSelf() { cellCount: count, defaultValue: (defaultdata?.defaultValue || "").slice(0, count), fontSize: newFontSize || position.options?.fontSize || 12, - fontColor: newFontColor || position.options?.fontColor || "black" + fontColor: + newFontColor || position.options?.fontColor || "black" } }; } else { @@ -1181,22 +1195,13 @@ function SignYourSelf() { setShowRotateAlert({ status: false, degree: 0 }); }; return ( - <DndProvider backend={HTML5Backend}> - <Title title={"Signyourself"} /> + <> {isLoading.isLoad ? ( <LoaderWithMsg isLoading={isLoading} /> ) : handleError ? ( <HandleError handleError={handleError} /> ) : ( <div> - {isUiLoading && ( - <div className="absolute h-[100vh] w-full z-[999] flex flex-col justify-center items-center bg-[#e6f2f2] bg-opacity-80"> - <Loader /> - <span style={{ fontSize: "13px", fontWeight: "bold" }}> - {t("loader")} - </span> - </div> - )} {isCelebration && ( <div className="relative z-[1000]"> <Confetti @@ -1208,6 +1213,12 @@ function SignYourSelf() { </div> )} <div className="relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300"> + {isUiLoading && ( + <div className="absolute h-full w-full z-[999] flex flex-col justify-center items-center bg-[#e6f2f2]/80"> + <Loader /> + <span className="text-[13px]">{t("loader")}</span> + </div> + )} {!isEmailVerified && ( <VerifyEmail isVerifyModal={isVerifyModal} @@ -1221,18 +1232,14 @@ function SignYourSelf() { /> )} {/* this component used for UI interaction and show their functionality */} - {pdfLoad && !checkTourStatus && !isCompleted && ( + {pdfLoad && !isCompleted && ( <Tour onRequestClose={closeTour} steps={tourConfig} isOpen={signTour} - rounded={5} - closeWithMask={false} /> )} - {/* this component used to render all pdf pages in left side */} - <RenderAllPdfPage allPages={allPages} setAllPages={setAllPages} @@ -1248,8 +1255,8 @@ function SignYourSelf() { pdfArrayBuffer={pdfArrayBuffer} isMergePdfBtn={!pdfDetails?.[0]?.IsCompleted} /> - <div className=" w-full md:w-[57%] flex mr-4"> - <PdfZoom + <div className="w-full md:w-[57%] flex mr-4"> + <PdfTools clickOnZoomIn={clickOnZoomIn} clickOnZoomOut={clickOnZoomOut} handleRotationFun={handleRotationFun} @@ -1277,7 +1284,6 @@ function SignYourSelf() { <p>{isAlert.alertMessage}</p> </div> </ModalUi> - {/* this modal is used show this document is already sign */} <ModalUi isOpen={showAlreadySignDoc.status} @@ -1288,7 +1294,7 @@ function SignYourSelf() { <p>{showAlreadySignDoc.mssg}</p> <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> <button - className="op-btn op-btn-ghost shadow-md" + className="op-btn op-btn-ghost text-base-content shadow-md" onClick={() => setShowAlreadySignDoc({ status: false })} > {t("close")} @@ -1367,7 +1373,7 @@ function SignYourSelf() { handleTabDrag={handleTabDrag} handleStop={handleStop} isDragging={isDragging} - handleDeleteSign={handleDeleteSign} + handleDeleteWidget={handleDeleteWidget} pdfDetails={pdfDetails} setIsDragging={setIsDragging} xyPosition={xyPosition} @@ -1398,6 +1404,7 @@ function SignYourSelf() { setIsResize={setIsResize} divRef={divRef} currWidgetsDetails={currWidgetsDetails} + isShowModal={isShowModal} /> )} </div> @@ -1406,21 +1413,18 @@ function SignYourSelf() { <div className="w-full md:w-[23%] bg-base-100 overflow-y-auto hide-scrollbar"> <div className={`max-h-screen`}> {!isCompleted ? ( - <div> - <WidgetComponent - pdfUrl={pdfUrl} - handleDivClick={handleDivClick} - handleMouseLeave={handleMouseLeave} - xyPosition={xyPosition} - isSignYourself={true} - addPositionOfSignature={addPositionOfSignature} - isMailSend={false} - /> - </div> + <WidgetComponent + pdfUrl={pdfUrl} + handleDivClick={handleDivClick} + handleMouseLeave={handleMouseLeave} + xyPosition={xyPosition} + isSignYourself={true} + addPositionOfSignature={addPositionOfSignature} + isMailSend={false} + setIsTour={setSignTour} + /> ) : ( - <div> - <Signedby pdfDetails={pdfDetails[0]} /> - </div> + <Signedby pdfDetails={pdfDetails[0]} /> )} </div> </div> @@ -1481,7 +1485,7 @@ function SignYourSelf() { handleSaveFontSize={handleSaveFontSize} currWidgetsDetails={currWidgetsDetails} /> - </DndProvider> + </> ); } diff --git a/apps/OpenSign/src/pages/TemplatePlaceholder.jsx b/apps/OpenSign/src/pages/TemplatePlaceholder.jsx index a5eea26f37..71c444011b 100644 --- a/apps/OpenSign/src/pages/TemplatePlaceholder.jsx +++ b/apps/OpenSign/src/pages/TemplatePlaceholder.jsx @@ -3,17 +3,14 @@ import RenderAllPdfPage from "../components/pdf/RenderAllPdfPage"; import { useParams, useNavigate } from "react-router"; import axios from "axios"; import "../styles/signature.css"; -import { DndProvider } from "react-dnd"; -import { HTML5Backend } from "react-dnd-html5-backend"; import { useDrop } from "react-dnd"; import WidgetComponent from "../components/pdf/WidgetComponent"; import Tour from "../primitives/Tour"; import SignerListPlace from "../components/pdf/SignerListPlace"; import Header from "../components/pdf/PdfHeader"; import WidgetNameModal from "../components/pdf/WidgetNameModal"; -import { PDFDocument } from "pdf-lib"; -import { SaveFileSize } from "../constant/saveFileSize"; import { + copytoData, pdfNewWidthFun, contractUsers, randomId, @@ -39,19 +36,20 @@ import { convertPdfArrayBuffer, generatePdfName, textWidget, - multiSignEmbed, - getOriginalWH + getOriginalWH, + defaultMailBody, + defaultMailSubject, + handleDeleteWidget } from "../constant/Utils"; import RenderPdf from "../components/pdf/RenderPdf"; import "../styles/AddUser.css"; -import Title from "../components/Title"; import EditTemplate from "../components/pdf/EditTemplate"; import AddRoleModal from "../components/pdf/AddRoleModal"; import PlaceholderCopy from "../components/pdf/PlaceholderCopy"; import DropdownWidgetOption from "../components/pdf/DropdownWidgetOption"; import Parse from "parse"; -import { useSelector } from "react-redux"; -import PdfZoom from "../components/pdf/PdfZoom"; +import { useDispatch, useSelector } from "react-redux"; +import PdfTools from "../components/pdf/PdfTools"; import { useTranslation } from "react-i18next"; import RotateAlert from "../components/RotateAlert"; import ModalUi from "../primitives/ModalUi"; @@ -59,14 +57,30 @@ import TourContentWithBtn from "../primitives/TourContentWithBtn"; import HandleError from "../primitives/HandleError"; import LoaderWithMsg from "../primitives/LoaderWithMsg"; import LinkUserModal from "../primitives/LinkUserModal"; +import WidgetsValueModal from "../components/pdf/WidgetsValueModal"; +import Loader from "../primitives/Loader"; +import PrefillWidgetModal from "../components/pdf/PrefillWidgetsModal"; +import Alert from "../primitives/Alert"; +import LottieWithLoader from "../primitives/DotLottieReact"; +import * as utils from "../utils"; +import CustomizeMail from "../components/pdf/CustomizeMail"; +import { + resetWidgetState, + setPrefillImg +} from "../redux/reducers/widgetSlice.js"; +import ShareButton from "../primitives/ShareButton"; const TemplatePlaceholder = () => { const { t } = useTranslation(); + const journey = "Use Template"; const { templateId } = useParams(); + const dispatch = useDispatch(); + const prefillImg = useSelector((state) => state.widget.prefillImg); const divRef = useRef(null); const navigate = useNavigate(); const numPages = 1; - const isHeader = useSelector((state) => state.showHeader); + const isSidebar = useSelector((state) => state.sidebar.isOpen); + const isShowModal = useSelector((state) => state.widget.isShowModal); const [pdfDetails, setPdfDetails] = useState([]); const [allPages, setAllPages] = useState(null); const [pageNumber, setPageNumber] = useState(1); @@ -90,7 +104,7 @@ const TemplatePlaceholder = () => { }); const [handleError, setHandleError] = useState(); const [pdfNewWidth, setPdfNewWidth] = useState(); - const [templateTour, setTemplateTour] = useState(true); + const [templateTour, setTemplateTour] = useState(false); const [checkTourStatus, setCheckTourStatus] = useState(false); const [tourStatus, setTourStatus] = useState([]); const [signerUserId, setSignerUserId] = useState(); @@ -119,11 +133,10 @@ const TemplatePlaceholder = () => { const [isModalRole, setIsModalRole] = useState(false); const [roleName, setRoleName] = useState(""); const [isAddUser, setIsAddUser] = useState({}); - const [isCreateDoc, setIsCreateDoc] = useState(false); const [isEditTemplate, setIsEditTemplate] = useState(false); const [isPageCopy, setIsPageCopy] = useState(false); const [IsReceipent, setIsReceipent] = useState(true); - const [isDontShow, setIsDontShow] = useState(false); + const [isDontShow, setIsDontShow] = useState(true); const [isDragging, setIsDragging] = useState(false); const [currWidgetsDetails, setCurrWidgetsDetails] = useState([]); const [isCheckbox, setIsCheckbox] = useState(false); @@ -137,7 +150,27 @@ const TemplatePlaceholder = () => { const [updatedPdfUrl, setUpdatedPdfUrl] = useState(""); const [unSignedWidgetId, setUnSignedWidgetId] = useState(""); const [owner, setOwner] = useState({}); + const [prefillSigner, setPrefillSigner] = useState([]); + const [isPrefillModal, setIsPrefillModal] = useState(false); + const [mailStatus, setMailStatus] = useState(""); + const [isSend, setIsSend] = useState(false); + const [documentId, setDocumentId] = useState(""); + const [forms, setForms] = useState([]); + const [isUiLoading, setIsUiLoading] = useState(false); + const [isNewContact, setIsNewContact] = useState({ status: false, id: "" }); + const [alertMsg, setAlertMsg] = useState({ type: "success", message: "" }); + const [isMailModal, setIsMailModal] = useState(false); + const [customizeMail, setCustomizeMail] = useState({ body: "", subject: "" }); + const [defaultMail, setDefaultMail] = useState({ body: "", subject: "" }); + const [currUserId, setCurrUserId] = useState(false); + const [documentDetails, setDocumentDetails] = useState(); + const [copied, setCopied] = useState(false); + const currentUser = localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ); + const user = currentUser && JSON.parse(currentUser); useEffect(() => { + dispatch(resetWidgetState([])); fetchTemplate(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); @@ -161,7 +194,7 @@ const TemplatePlaceholder = () => { return () => clearTimeout(timer); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [divRef.current, isHeader]); + }, [divRef.current, isSidebar]); //function to fetch tenant Details @@ -181,6 +214,28 @@ const TemplatePlaceholder = () => { const filterSignTypes = signatureType?.filter( (x) => x.enabled === true ); + if (tenantDetails?.RequestBody) { + //customize mail state is handle to when user want to customize already set tenant email format then use that format + setCustomizeMail({ + subject: tenantDetails?.RequestSubject, + body: tenantDetails?.RequestBody + }); + setDefaultMail({ + subject: tenantDetails?.RequestSubject, + body: tenantDetails?.RequestBody + }); + } else { + const defaultRequestBody = defaultMailBody; + const defaultSubject = defaultMailSubject; + setCustomizeMail({ + subject: defaultSubject, + body: defaultRequestBody + }); + setDefaultMail({ + subject: defaultSubject, + body: defaultRequestBody + }); + } return filterSignTypes; } } catch (e) { @@ -190,7 +245,6 @@ const TemplatePlaceholder = () => { alert(t("user-not-exist")); } }; - // `fetchTemplate` function in used to get Template from server and setPlaceholder ,setSigner if present const fetchTemplate = async () => { try { @@ -213,6 +267,14 @@ const TemplatePlaceholder = () => { : []; if (documentData && documentData.length > 0) { + const prefillImg = await utils?.savePrefillImg( + documentData[0]?.Placeholders + ); + if (prefillImg && Array.isArray(prefillImg)) { + prefillImg.forEach((img) => { + dispatch(setPrefillImg(img)); + }); + } setOwner(documentData?.[0]?.ExtUserPtr); const url = documentData[0] && documentData[0]?.URL; if (url) { @@ -247,7 +309,8 @@ const TemplatePlaceholder = () => { const placeholder = documentData[0]?.Placeholders.filter( (data) => data.Role !== "prefill" ); - setSignerPos(placeholder); + setSignerPos(documentData[0]?.Placeholders); + let signers = [...documentData[0].Signers]; signersdata.forEach((x) => { if (x.objectId) { const obj = { @@ -258,7 +321,7 @@ const TemplatePlaceholder = () => { signers.push(obj); } }); - let signers = [...documentData[0].Signers]; + let updatedSigners = placeholder.map((x) => { let matchingSigner = signers.find( (y) => x.signerObjId && x.signerObjId === y.objectId @@ -275,9 +338,18 @@ const TemplatePlaceholder = () => { return { Role: x.Role, Id: x.Id, blockColor: x.blockColor }; } }); + const prefillPlaceholder = documentData[0]?.Placeholders.find( + (data) => data.Role === "prefill" + ); + if (prefillPlaceholder) { + setPrefillSigner([utils?.prefillObj(prefillPlaceholder.Id)]); + } else { + setPrefillSigner([utils?.prefillObj()]); + } setSignersData(updatedSigners); setUniqueId(updatedSigners[0].Id); setBlockColor(updatedSigners[0].blockColor); + setIsSelectId(0); } else { const updatedSigners = documentData[0].Signers.map((x, index) => ({ ...x, @@ -287,24 +359,37 @@ const TemplatePlaceholder = () => { setSignersData(updatedSigners); setUniqueId(updatedSigners[0].Id); setBlockColor(updatedSigners[0].blockColor); + setPrefillSigner([utils?.prefillObj()]); } } else { - setRoleName("Role 1"); if ( documentData[0].Placeholders && documentData[0].Placeholders.length > 0 ) { - const placeholder = documentData[0]?.Placeholders.filter( + const prefillPlaceholder = documentData[0]?.Placeholders.find( + (data) => data.Role === "prefill" + ); + if (prefillPlaceholder) { + setPrefillSigner([utils?.prefillObj(prefillPlaceholder.Id)]); + } else { + setPrefillSigner([utils?.prefillObj()]); + } + setSignerPos(documentData[0]?.Placeholders); + const signerPlaceholder = documentData[0]?.Placeholders.filter( (data) => data.Role !== "prefill" ); - let updatedSigners = placeholder.map((x) => { - return { Role: x.Role, Id: x.Id, blockColor: x.blockColor }; - }); - setSignerPos(placeholder); - setUniqueId(updatedSigners[0].Id); - setSignersData(updatedSigners); - setIsSelectId(0); - setBlockColor(updatedSigners[0].blockColor); + if (signerPlaceholder) { + let updatedSigners = signerPlaceholder.map((x) => { + return { Role: x.Role, Id: x.Id, blockColor: x.blockColor }; + }); + setUniqueId(updatedSigners[0]?.Id); + setSignersData(updatedSigners); + setIsSelectId(0); + setBlockColor(updatedSigners[0]?.blockColor); + setRoleName("Role 1"); + } + } else { + setPrefillSigner([utils?.prefillObj()]); } } } else if ( @@ -318,17 +403,16 @@ const TemplatePlaceholder = () => { setIsLoading({ isLoad: false }); } const res = await contractUsers(); - if (res[0] && res.length) { + if (res[0] && res.length > 0) { setSignerUserId(res[0].objectId); const tourstatus = res[0].TourStatus && res[0].TourStatus; if (tourstatus && tourstatus.length > 0) { setTourStatus(tourstatus); - const checkTourRecipients = tourstatus.filter( - (data) => data.templateTour - ); - if (checkTourRecipients && checkTourRecipients.length > 0) { - setCheckTourStatus(checkTourRecipients[0].templateTour); - } + const tour = tourstatus?.some((data) => data.template) || false; + setTemplateTour(!tour); + setCheckTourStatus(tour); + } else { + setTemplateTour(true); } setIsLoading({ isLoad: false }); } else if (res === "Error: Something went wrong!") { @@ -357,7 +441,8 @@ const TemplatePlaceholder = () => { const getSignerPos = (item, monitor) => { if (uniqueId) { const signer = signersdata.find((x) => x.Id === uniqueId); - if (signer) { + const prefillUser = prefillSigner.find((x) => x.Id === uniqueId); + if (signer || prefillUser) { const posZIndex = zIndex + 1; setZIndex(posZIndex); const containerScale = getContainerScale( @@ -374,8 +459,9 @@ const TemplatePlaceholder = () => { let dropData = [], dropObj, currentPagePosition, - filterSignerPos; - let placeHolder; + filterSignerPos, + placeHolder; + filterSignerPos = signerPos.find((data) => data.Id === uniqueId); if (item === "onclick") { // `getBoundingClientRect()` is used to get accurate measurement width, height of the Pdf div const divWidth = divRef.current.getBoundingClientRect().width; @@ -393,7 +479,11 @@ const TemplatePlaceholder = () => { scale: containerScale, zIndex: posZIndex, type: dragTypeValue, - options: addWidgetOptions(dragTypeValue, owner), + options: addWidgetOptions( + dragTypeValue, + owner, + filterSignerPos?.placeHolder + ), Width: widgetWidth / (containerScale * scale), Height: widgetHeight / (containerScale * scale) }; @@ -423,7 +513,11 @@ const TemplatePlaceholder = () => { // isMobile: isMobile, zIndex: posZIndex, type: item.text, - options: addWidgetOptions(dragTypeValue, owner), + options: addWidgetOptions( + dragTypeValue, + owner, + filterSignerPos?.placeHolder + ), Width: widgetWidth / (containerScale * scale), Height: widgetHeight / (containerScale * scale) }; @@ -431,11 +525,7 @@ const TemplatePlaceholder = () => { dropData.push(dropObj); placeHolder = { pageNumber: pageNumber, pos: dropData }; } - if (dragTypeValue === textWidget) { - filterSignerPos = signerPos.find((data) => data.Role === "prefill"); - } else { - filterSignerPos = signerPos.find((data) => data.Id === uniqueId); - } + const getPlaceHolder = filterSignerPos?.placeHolder; if (getPlaceHolder) { //checking exist placeholder on same page @@ -452,41 +542,36 @@ const TemplatePlaceholder = () => { const newSignPos = getPos.concat(dropData); let xyPos = { pageNumber: pageNumber, pos: newSignPos }; updatePlace.push(xyPos); - let updatesignerPos; - if (dragTypeValue === textWidget) { - updatesignerPos = signerPos.map((x) => - x.Role === "prefill" ? { ...x, placeHolder: updatePlace } : x - ); - } else { - updatesignerPos = signerPos.map((x) => - x.Id === uniqueId ? { ...x, placeHolder: updatePlace } : x - ); - } + const updatesignerPos = signerPos.map((x) => + x.Id === uniqueId ? { ...x, placeHolder: updatePlace } : x + ); setSignerPos(updatesignerPos); } else { - //if condition when widget type is prefill label text widget - if (dragTypeValue === textWidget) { - //check text widgets data (prefill) already exist then and want to add text widget on new page - //create new page entry with old data and update placeholder + //condition for prefill role to attach prefill widget on multiple page first time there are no any prefill widget exist + if (roleName === "prefill") { + //if condition for prefill role only prefill object exist and placeholder empty then add prefill widget in placeholder if (filterSignerPos) { - const addPrefillData = - filterSignerPos && filterSignerPos?.placeHolder; - addPrefillData.push(placeHolder); - const updatePrefillPos = signerPos.map((x) => - x.Role === "prefill" ? { ...x, placeHolder: addPrefillData } : x + const updatesignerPos = signerPos.map((x) => + x.Id === uniqueId && x?.placeHolder + ? { ...x, placeHolder: [...x.placeHolder, placeHolder] } + : x.Id === uniqueId + ? { ...x, placeHolder: [placeHolder] } + : x ); - setSignerPos(updatePrefillPos); - } //else condition if user do not have any text widget data + setSignerPos(updatesignerPos); + } //else condition if there are no prefill role exist in array then add prefill widget in placeholder else { const prefillTextWidget = { signerPtr: {}, signerObjId: "", - blockColor: "#f58f8c", + blockColor: utils?.prefillBlockColor, placeHolder: [placeHolder], Role: "prefill", - Id: key + Id: uniqueId }; - setSignerPos((prev) => [...prev, prefillTextWidget]); + const xyPosition = signerPos || []; + xyPosition.unshift(prefillTextWidget); + setSignerPos(xyPosition); } } else { //else condition to add placeholder widgets on multiple page first time @@ -558,7 +643,7 @@ const TemplatePlaceholder = () => { const dataNewPlace = addZIndex(signerPos, key, setZIndex); let updateSignPos = [...signerPos]; updateSignPos.splice(0, updateSignPos.length, ...dataNewPlace); - const signId = signerId; //? signerId : signerObjId; + const signId = signerId ? signerId : uniqueId; const keyValue = key ? key : dragKey; const containerScale = getContainerScale( pdfOriginalWH, @@ -566,14 +651,9 @@ const TemplatePlaceholder = () => { containerWH ); if (keyValue >= 0) { - let filterSignerPos; - if (signId) { - filterSignerPos = updateSignPos.filter((data) => data.Id === signId); - } else { - filterSignerPos = updateSignPos.filter( - (data) => data.Role === "prefill" - ); - } + const filterSignerPos = updateSignPos.filter( + (data) => data.Id === signId + ); if (filterSignerPos.length > 0) { const getPlaceHolder = filterSignerPos[0].placeHolder; @@ -605,10 +685,6 @@ const TemplatePlaceholder = () => { if (obj.Id === signId) { return { ...obj, placeHolder: newUpdateSignPos }; } - } else { - if (obj.Role === "prefill") { - return { ...obj, placeHolder: newUpdateSignPos }; - } } return obj; }); @@ -619,72 +695,11 @@ const TemplatePlaceholder = () => { } setTimeout(() => setIsDragging(false), 200); }; - //function for delete signature block - const handleDeleteSign = (key, Id) => { - const updateData = []; - const filterSignerPos = signerPos.filter((data) => data.Id === Id); - - if (filterSignerPos.length > 0) { - const getPlaceHolder = filterSignerPos[0].placeHolder; - - const getPageNumer = getPlaceHolder.filter( - (data) => data.pageNumber === pageNumber - ); - - if (getPageNumer.length > 0) { - const getXYdata = getPageNumer[0].pos.filter( - (data) => data.key !== key - ); - - if (getXYdata.length > 0) { - updateData.push(getXYdata); - const newUpdatePos = getPlaceHolder.map((obj) => { - if (obj.pageNumber === pageNumber) { - return { ...obj, pos: updateData[0] }; - } - return obj; - }); - - const newUpdateSigner = signerPos.map((obj) => { - if (obj.Id === Id) { - return { ...obj, placeHolder: newUpdatePos }; - } - return obj; - }); - - setSignerPos(newUpdateSigner); - } else { - const getRemainPage = filterSignerPos[0].placeHolder.filter( - (data) => data.pageNumber !== pageNumber - ); - //condition to check placeholder length is greater than 1 do not need to remove whole placeholder - //array only resove particular widgets - if (getRemainPage && getRemainPage.length > 0) { - const newUpdatePos = filterSignerPos.map((obj) => { - if (obj.Id === Id) { - return { ...obj, placeHolder: getRemainPage }; - } - return obj; - }); - let signerupdate = []; - signerupdate = signerPos.filter((data) => data.Id !== Id); - signerupdate.push(newUpdatePos[0]); - - setSignerPos(signerupdate); - } else { - const updatedData = signerPos.map((item) => { - if (item.Id === Id) { - // Create a copy of the item object and delete the placeHolder field - const updatedItem = { ...item }; - delete updatedItem.placeHolder; - return updatedItem; - } - return item; - }); - setSignerPos(updatedData); - } - } - } + //function is used to delete widgets + const handleDeleteWidgetObj = (key, Id) => { + const res = handleDeleteWidget(key, Id, pageNumber, signerPos); + if (res) { + setSignerPos(res); } }; @@ -716,44 +731,31 @@ const TemplatePlaceholder = () => { const handleMouseLeave = () => { setSignBtnPosition([xySignature]); }; - const alertSendEmail = async () => { - const isPlaceholderExist = signerPos.every((data) => data.placeHolder); - const getPrefill = signerPos?.find((data) => data.Role === "prefill"); - const prefillPlaceholder = getPrefill?.placeHolder; - let isLabel = false; - let unfilledTextWidgetId = ""; - //condition is used to check text widget data is empty or have response - if (getPrefill && prefillPlaceholder) { - prefillPlaceholder.map((data) => { - if (!isLabel) { - const unfilledTextWidgets = data.pos.find( - (position) => !position.options.response - ); - if (unfilledTextWidgets) { - isLabel = true; - unfilledTextWidgetId = unfilledTextWidgets.key; - } - } - }); - } - if (getPrefill && isLabel) { - setUnSignedWidgetId(unfilledTextWidgetId); - } else if (isPlaceholderExist) { - handleSaveTemplate(); - } else { - const signerList = signerPos.filter( - (data) => !data.placeHolder && data.Role !== "prefill" - ); - const getSigner = signerList.map((x) => { - return signersdata.find((y) => y.Id === x.Id).Role; - }); - const signersName = getSigner.join(", "); + const handleSaveDoc = async () => { + // keep only non-prefill signers + const filterPrefill = (signerPos ?? []).filter((s) => s.Role !== "prefill"); + + // signers who don't have a signature widget (or have no placeholders at all) + const unassignedWidget = filterPrefill?.filter( + (s) => !utils?.hasSignatureWidget(s) + ); + + if (unassignedWidget?.length > 0) { + const signersName = unassignedWidget + ?.map((x) => signersdata.find((y) => y.Id === x.Id)?.Role) + ?.join(", "); setSignersName(signersName); setIsSendAlert(true); + setUniqueId(unassignedWidget[0]?.Id); + setRoleName(""); + } else if (filterPrefill && filterPrefill?.length === 0) { + setIsAddRole(true); + } else { + handleSaveTemplate(); } }; - useEffect(() => { + if (pdfDetails?.[0]?.CreatedBy?.objectId !== user?.objectId) return; const timer = setTimeout(() => { autosavedetails(); }, 2000); @@ -788,14 +790,15 @@ const TemplatePlaceholder = () => { try { const templateCls = new Parse.Object("contracts_Template"); templateCls.id = templateId; - if (signerPos?.length > 0) { - const removePrefill = signerPos.filter((x) => x.Role !== "prefill"); - if (removePrefill.length > 0) { - templateCls.set("Placeholders", removePrefill); - } + if (signerPos && signerPos?.length > 0) { + templateCls.set("Placeholders", signerPos); + } + if (signers && signers?.length > 0) { + templateCls.set("Signers", signers); + } + if (signatureType && signatureType?.length > 0) { + templateCls.set("SignatureType", signatureType); } - templateCls.set("Signers", signers); - templateCls.set("SignatureType", signatureType); if (pdfUrl) { templateCls.set("URL", pdfUrl); } @@ -821,38 +824,8 @@ const TemplatePlaceholder = () => { }; //embed prefill label widget data - const embedPrefilllData = async () => { - const prefillExist = signerPos.filter((data) => data.Role === "prefill"); - if (prefillExist && prefillExist.length > 0) { - const placeholder = prefillExist[0].placeHolder; - const existingPdfBytes = pdfArrayBuffer; - const pdfDoc = await PDFDocument.load(existingPdfBytes, { - ignoreEncryption: true - }); - const isSignYourSelfFlow = false; - try { - //pdfOriginalWH contained all pdf's pages width,height & pagenumber in array format - const pdfBase64 = await multiSignEmbed( - placeholder, - pdfDoc, - isSignYourSelfFlow, - scale - ); - const pdfName = generatePdfName(16); - const pdfUrl = await convertBase64ToFile( - pdfName, - pdfBase64, - "", - ); - const tenantId = localStorage.getItem("TenantId"); - const buffer = atob(pdfBase64); - SaveFileSize(buffer.length, pdfUrl, tenantId); - return pdfUrl; - } catch (err) { - console.log("error to convertBase64ToFile in placeholder flow", err); - alert(err?.message); - } - } else if (pdfBase64Url) { + const embedPrefilllWidgets = async () => { + if (pdfBase64Url) { try { const pdfName = generatePdfName(16); const pdfUrl = await convertBase64ToFile( @@ -879,7 +852,7 @@ const TemplatePlaceholder = () => { alert(t("only-15-reminder-allowed")); return; } - setIsLoading({ isLoad: true, message: t("loading-mssg") }); + setIsUiLoading(true); setIsSendAlert(false); let signers = [], pdfUrl; @@ -897,7 +870,7 @@ const TemplatePlaceholder = () => { } if (pdfBase64Url) { try { - pdfUrl = await embedPrefilllData(); + pdfUrl = await embedPrefilllWidgets(); setUpdatedPdfUrl(pdfUrl); } catch (e) { console.log("error to convertBase64ToFile in placeholder flow", e); @@ -916,9 +889,8 @@ const TemplatePlaceholder = () => { const RedirectUrl = pdfDetails[0]?.RedirectUrl ? { RedirectUrl: pdfDetails[0]?.RedirectUrl } : {}; - const removePrefill = signerPos.filter((x) => x?.Role !== "prefill"); const data = { - Placeholders: removePrefill, + Placeholders: signerPos, Signers: signers, Name: pdfDetails[0]?.Name || "", Note: pdfDetails[0]?.Note || "", @@ -948,9 +920,9 @@ const TemplatePlaceholder = () => { } await updateTemplate.save(); setIsCreateDocModal(true); - setIsLoading({ isLoad: false }); + setIsUiLoading(false); } catch (e) { - setIsLoading(false); + setIsUiLoading(false); alert(t("something-went-wrong-mssg")); console.log("error", e); } @@ -958,7 +930,71 @@ const TemplatePlaceholder = () => { setIsReceipent(false); } }; - + const handleCreateDocument = async () => { + try { + setIsUiLoading(true); + const res = await utils?.handleCheckPrefillCreateDoc( + signerPos, + signersdata, + setIsPrefillModal, + scale, + updatedPdfUrl, + pdfDetails, + prefillImg, + owner?.UserId?.objectId, + ); + if (res?.status === "unfilled") { + setIsUiLoading(false); + const emptyWidget = res?.emptyResponseObjects.map((item, index) => ( + <span className="font-medium" key={index}> + {item.options.name} + </span> + )); + showAlert( + "danger", + <> + The following required field(s) cannot be left empty:{" "} + {emptyWidget.map((item, index) => ( + <span key={index}> + {index > 0 && ", "} + {item} + </span> + ))} + . Please fill them out to proceed. + </>, + 6000 + ); + } else if (res?.status === "unattach signer") { + setIsUiLoading(false); + showAlert("danger", "please attach all role to signer"); + } else if (res?.status === "success") { + setDocumentId(res.id); + setIsMailModal(true); + } + } catch (e) { + console.log("error in create document function", e); + } + }; + const navigatePageToDoc = async () => { + try { + setIsUiLoading(true); + const res = await createDocument( + pdfDetails, + signerPos, + signersdata, + updatedPdfUrl + ); + if (res.status === "success") { + navigate(`/placeHolderSign/${res.id}`, { + state: { title: "Use Template" } + }); + } else { + setHandleError(t("something-went-wrong-mssg")); + } + } catch (e) { + console.log("error in createDocument function", e); + } + }; const handleDontShow = (isChecked) => { setIsDontShow(isChecked); }; @@ -966,34 +1002,36 @@ const TemplatePlaceholder = () => { //here you can add your messages in content and selector is key of particular steps const tourConfig = [ { - selector: '[data-tut="reactourAddbtn"]', + selector: '[data-tut="prefillTour"]', content: () => ( <TourContentWithBtn - message={t("tour-mssg.template-placeholder-1")} + message={t("prefill-tour")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), position: "top", - observe: '[data-tut="reactourAddbtn--observe"]', style: { fontSize: "13px" } }, { - selector: '[data-tut="nonpresentmask"]', + selector: '[data-tut="reactourAddbtn"]', content: () => ( <TourContentWithBtn - message={t("tour-mssg.template-placeholder-2")} + message={t("tour-mssg.template-placeholder-1")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), - position: "center", - style: { fontSize: "13px" }, - action: () => handleCloseRoleModal() + position: "top", + observe: '[data-tut="reactourAddbtn--observe"]', + style: { fontSize: "13px" } }, { selector: '[data-tut="addWidgets"]', content: () => ( <TourContentWithBtn - message={t("tour-mssg.template-placeholder-3")} + message={t("tour-mssg.template-placeholder-2")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1001,10 +1039,11 @@ const TemplatePlaceholder = () => { style: { fontSize: "13px" } }, { - selector: '[data-tut="reactourThird"]', + selector: '[data-tut="pdftools"]', content: () => ( <TourContentWithBtn - message={t("tour-mssg.template-placeholder-4")} + message={t("pdf-tools-tour")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1015,7 +1054,8 @@ const TemplatePlaceholder = () => { selector: '[data-tut="headerArea"]', content: () => ( <TourContentWithBtn - message={t("tour-mssg.template-placeholder-5")} + message={t("tour-mssg.template-placeholder-3")} + isDontShowCheckbox={!checkTourStatus} isChecked={handleDontShow} /> ), @@ -1027,26 +1067,25 @@ const TemplatePlaceholder = () => { //function for update TourStatus const closeTour = async () => { setTemplateTour(false); - if (isDontShow) { + setIsDontShow(true); + if (!checkTourStatus && isDontShow) { let updatedTourStatus = []; if (tourStatus.length > 0) { updatedTourStatus = [...tourStatus]; - const templatetourIndex = tourStatus.findIndex( - (obj) => obj["templateTour"] === false || obj["templateTour"] === true + const templateIndex = tourStatus.findIndex( + (obj) => obj["template"] === false || obj["template"] === true ); - if (templatetourIndex !== -1) { - updatedTourStatus[templatetourIndex] = { templateTour: true }; + if (templateIndex !== -1) { + updatedTourStatus[templateIndex] = { template: true }; } else { - updatedTourStatus.push({ templateTour: true }); + updatedTourStatus.push({ template: true }); } } else { - updatedTourStatus = [{ templateTour: true }]; + updatedTourStatus = [{ template: true }]; } - await axios - .put( - `${localStorage.getItem( - "baseUrl" - )}classes/contracts_Users/${signerUserId}`, + try { + await axios.put( + `${localStorage.getItem("baseUrl")}classes/contracts_Users/${signerUserId}`, { TourStatus: updatedTourStatus }, { headers: { @@ -1055,37 +1094,11 @@ const TemplatePlaceholder = () => { sessionToken: localStorage.getItem("accesstoken") } } - ) - .then(() => { - // const json = Listdata.data; - // const res = json.results; - }) - .catch((err) => { - console.log("axois err ", err); - }); - } - }; - - // `handleCreateDocModal` is used to create Document from template when user click on yes from modal - const handleCreateDocModal = async () => { - setIsCreateDocModal(false); - setIsCreateDoc(true); - const removePrefill = signerPos.filter((x) => x.Role !== "prefill"); - // handle create document - const res = await createDocument( - pdfDetails, - removePrefill, - signersdata, - updatedPdfUrl - ); - if (res.status === "success") { - navigate(`/placeHolderSign/${res.id}`, { - state: { title: "Use Template" } - }); - setIsCreateDoc(false); - } else { - setHandleError(t(res.id)); - setIsCreateDoc(false); + ); + setCheckTourStatus(true); + } catch (err) { + console.log("axois err ", err); + } } }; // `handleAddSigner` is used to open Add Role Modal @@ -1128,9 +1141,14 @@ const TemplatePlaceholder = () => { .filter((x) => x.Id !== Id) .map((x, i) => ({ ...x, blockColor: color[i] })); setSignersData(updateSigner); - const updatePlaceholderUser = signerPos + const prefillObject = signerPos.find((x) => x.Role === "prefill"); + const filterPrefill = signerPos.filter((x) => x.Role !== "prefill"); + const updatePlaceholderUser = filterPrefill .filter((x) => x.Id !== Id) - .map((x, i) => ({ ...x, blockColor: color[i] })); + .map((x, i) => ({ + ...x, + blockColor: color[i] + })); const index = signersdata.findIndex((x) => x.Id === Id); if (index === signersdata.length - 1) { setUniqueId(updateSigner[updateSigner.length - 1]?.Id || ""); @@ -1141,6 +1159,9 @@ const TemplatePlaceholder = () => { setIsSelectId(index); setBlockColor(color[index]); } + if (prefillObject) { + updatePlaceholderUser.unshift(prefillObject); + } setSignerPos(updatePlaceholderUser); }; @@ -1150,14 +1171,15 @@ const TemplatePlaceholder = () => { setIsAddUser({ [id]: true }); }; // `handleAddUser` is used to adduser - const handleAddUser = (data) => { + const handleAddUser = (data, id) => { + const UserId = id ? id : uniqueId; const signerPtr = { __type: "Pointer", className: "contracts_Contactbook", objectId: data.objectId }; const updatePlaceHolder = signerPos.map((x) => { - if (x.Id === uniqueId) { + if (x.Id === UserId) { return { ...x, signerPtr: signerPtr, signerObjId: data.objectId }; } return { ...x }; @@ -1165,7 +1187,7 @@ const TemplatePlaceholder = () => { setSignerPos(updatePlaceHolder); const updateSigner = signersdata.map((x) => { - if (x.Id === uniqueId) { + if (x.Id === UserId) { return { ...x, ...data, className: "contracts_Contactbook" }; } return { ...x }; @@ -1173,6 +1195,14 @@ const TemplatePlaceholder = () => { setSignersData(updateSigner); const index = signersdata.findIndex((x) => x.Id === uniqueId); setIsSelectId(index); + if (isNewContact.status) { + let newForm = [...forms]; + const label = `${data.Name}<${data.Email}>`; + const index = newForm.findIndex((x) => x.value === id); + newForm[index].label = label; + newForm[index].value = id; + setForms(newForm); + } }; // `closePopup` is used to close Add/Choose signer modal @@ -1468,13 +1498,7 @@ const TemplatePlaceholder = () => { parseInt(defaultdata?.cellCount || 5) ), validation: - isSubscribe && inputype - ? { - type: inputype, - pattern: - inputype === "regex" ? defaultdata.textvalidate : "" - } - : {}, + {}, isReadOnly: defaultdata?.isReadOnly || false, fontSize: fontSize || currWidgetsDetails?.options?.fontSize || 12, @@ -1605,7 +1629,10 @@ const TemplatePlaceholder = () => { style: { fontSize: "13px" } } ]; - + const showAlert = (type, message, duration = 1500) => { + setAlertMsg({ type: type, message: message }); + setTimeout(() => setAlertMsg({ type: "success", message: "" }), duration); + }; const textFieldTour = [ { selector: '[data-tut="IsSigned"]', @@ -1614,410 +1641,618 @@ const TemplatePlaceholder = () => { style: { fontSize: "13px" } } ]; + const copytoclipboard = (text) => { + copytoData(text); + setCopied(true); + setTimeout(() => setCopied(false), 1500); // Reset copied state after 1.5 seconds + }; + //function show signer list and share link to share signUrl + const handleShareList = () => { + const shareLinkList = []; + let signerMail = signersdata; + for (let i = 0; i < signerMail.length; i++) { + const objectId = signerMail[i].objectId; + const hostUrl = window.location.origin; + const sendMail = false; + //encode this url value `${documentId}/${signerMail[i].Email}/${objectId}` to base64 using `btoa` function + const encodeBase64 = btoa( + `${documentId}/${signerMail[i].Email}/${objectId}/${sendMail}` + ); + let signPdf = `${hostUrl}/login/${encodeBase64}`; + shareLinkList.push({ signerEmail: signerMail[i].Email, url: signPdf }); + } + return shareLinkList.map((data, ind) => { + return ( + <div + className="flex flex-row justify-between items-center mb-1" + key={ind} + > + {copied && <Alert type="success">{t("copied")}</Alert>} + <span className="w-[220px] md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis "> + {data.signerEmail} + </span> + <div className="flex flex-row items-center gap-3 "> + <button + onClick={() => copytoclipboard(data.url)} + type="button" + className="flex flex-row items-center op-link op-link-primary" + > + <i className="fa-light fa-copy" /> + <span className=" hidden md:block ml-1 ">{t("copy-link")}</span> + </button> + <ShareButton + title={t("sign-url")} + text={t("sign-url")} + url={data.url} + > + <i className="fa-light fa-share-from-square op-link op-link-secondary no-underline"></i> + </ShareButton> + </div> + </div> + ); + }); + }; + const handleClosePrefillModal = () => { + setIsPrefillModal(false); + setIsCreateDocModal(true); + setIsUiLoading(false); + }; + + const handleUseButton = async () => { + setIsCreateDocModal(false); + //this function is used to open modal to show signers list + await utils?.handleDisplaySignerList(signerPos, signersdata, setForms); + setIsPrefillModal(true); + }; + + const handleRecipientSign = (docId, currUserId) => { + if (currUserId) { + navigate(`/recipientSignPdf/${docId}/${currUserId}`); + } else { + navigate(`/recipientSignPdf/${docId}`); + } + }; return ( <> - <Title title={"Template"} /> - <DndProvider backend={HTML5Backend}> - {isLoading.isLoad ? ( - <LoaderWithMsg isLoading={isLoading} /> - ) : handleError ? ( - <HandleError handleError={handleError} /> - ) : ( - <div> - <div className="relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300"> - {/* this component used for UI interaction and show their functionality */} - {!checkTourStatus && ( - //this tour component used in your html component where you want to put - //onRequestClose function to close tour - //steps is defined what will be your messages and style also - //isOpen is takes boolean value to open - <Tour - onRequestClose={closeTour} - steps={tourConfig} - isOpen={templateTour} - rounded={5} - closeWithMask={false} - /> - )} - {isAddRole && ( - <Tour - onRequestClose={() => setIsAddRole(false)} - steps={tourAddRole} - isOpen={isAddRole} - rounded={5} - closeWithMask={false} - /> - )} - {isSendAlert && ( - <Tour - onRequestClose={() => setIsSendAlert(false)} - steps={signatureWidgetTour} - isOpen={true} - rounded={5} - closeWithMask={false} - /> // this is the tour for add signature widget for all role - )} - {unSignedWidgetId && ( - <Tour - onRequestClose={() => setUnSignedWidgetId("")} - steps={textFieldTour} - isOpen={true} - rounded={5} - closeWithMask={false} - /> - )} + {isLoading.isLoad ? ( + <LoaderWithMsg isLoading={isLoading} /> + ) : handleError ? ( + <HandleError handleError={handleError} /> + ) : ( + <div className="relative op-card overflow-hidden flex flex-col md:flex-row justify-between bg-base-300"> + {isUiLoading && ( + <div className="absolute h-full w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2]/80"> + <Loader /> + <span className="text-[13px]">{t("loading-mssg")}</span> + </div> + )} + {alertMsg.message && ( + <Alert type={alertMsg.type}>{alertMsg.message}</Alert> + )} + {/* + this component used for UI interaction and show their functionality + this tour component used in your html component where you want to put + onRequestClose function to close tour + steps is defined what will be your messages and style also + isOpen is takes boolean value to open + */} + <Tour + onRequestClose={closeTour} + steps={tourConfig} + isOpen={templateTour} + /> + {isAddRole && ( + <Tour + onRequestClose={() => setIsAddRole(false)} + steps={tourAddRole} + isOpen={isAddRole} + /> + )} + {isSendAlert && ( + <Tour + onRequestClose={() => setIsSendAlert(false)} + steps={signatureWidgetTour} + isOpen={true} + /> // this is the tour for add signature widget for all role + )} + {unSignedWidgetId && ( + <Tour + onRequestClose={() => setUnSignedWidgetId("")} + steps={textFieldTour} + isOpen={true} + /> + )} + + {/* this component used to render all pdf pages in left side */} + <RenderAllPdfPage + allPages={allPages} + setAllPages={setAllPages} + setPageNumber={setPageNumber} + setSignBtnPosition={setSignBtnPosition} + pageNumber={pageNumber} + pdfBase64Url={pdfBase64Url} + signedUrl={pdfDetails?.[0]?.SignedUrl || ""} + setPdfArrayBuffer={setPdfArrayBuffer} + setPdfBase64Url={setPdfBase64Url} + setIsUploadPdf={setIsUploadPdf} + pdfArrayBuffer={pdfArrayBuffer} + isMergePdfBtn={true} + /> - {/* this component used to render all pdf pages in left side */} - <RenderAllPdfPage + {/* pdf render view */} + <div className="w-full md:w-[57%] flex mr-4"> + <PdfTools + clickOnZoomIn={clickOnZoomIn} + clickOnZoomOut={clickOnZoomOut} + handleRotationFun={handleRotationFun} + pdfArrayBuffer={pdfArrayBuffer} + pageNumber={pageNumber} + setPdfBase64Url={setPdfBase64Url} + setPdfArrayBuffer={setPdfArrayBuffer} + setIsUploadPdf={setIsUploadPdf} + setSignerPos={setSignerPos} + signerPos={signerPos} + userId={uniqueId} + allPages={allPages} + setAllPages={setAllPages} + setPageNumber={setPageNumber} + /> + <div className="w-full md:w-[95%]"> + <ModalUi + isOpen={!IsReceipent} + title={t("roles")} + handleClose={() => setIsReceipent(true)} + > + <div className="h-full p-[20px] text-center font-medium"> + <p>{t("template-role-alert")}</p> + </div> + </ModalUi> + {/* this modal is used show send mail message and after send mail success message */} + <ModalUi + isOpen={isCreateDocModal} + title={t("create-document")} + handleClose={() => { + setIsCreateDocModal(false); + navigate("/report/6TeaPr321t"); + }} + > + <div className="h-full p-[20px] mb-2 text-base-content"> + <p>{t("template-created-alert")}</p> + <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> + <div className="flex gap-1 flex-col md:flex-row"> + <button + onClick={() => { + handleUseButton(); + }} + type="button" + className="op-btn op-btn-sm op-btn-primary" + > + {t("use-template")} + </button> + </div> + </div> + </ModalUi> + <ModalUi + isOpen={isShowEmail} + title={t("signers-alert")} + handleClose={() => setIsShowEmail(false)} + > + <div className="h-full p-[20px]"> + <p>{t("template-creation-alert-1")}</p> + <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> + <button + onClick={() => setIsShowEmail(false)} + type="button" + className="op-btn op-btn-primary" + > + {t("ok")} + </button> + </div> + </ModalUi> + <DropdownWidgetOption + type={radioButtonWidget} + title={t("radio-group")} + showDropdown={isRadio} + setShowDropdown={setIsRadio} + handleSaveWidgetsOptions={handleSaveWidgetsOptions} + currWidgetsDetails={currWidgetsDetails} + setCurrWidgetsDetails={setCurrWidgetsDetails} + handleClose={handleNameModal} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + isShowAdvanceFeature={true} + roleName={roleName} + /> + <DropdownWidgetOption + type="checkbox" + title={t("checkbox")} + showDropdown={isCheckbox} + setShowDropdown={setIsCheckbox} + handleSaveWidgetsOptions={handleSaveWidgetsOptions} + currWidgetsDetails={currWidgetsDetails} + setCurrWidgetsDetails={setCurrWidgetsDetails} + handleClose={handleNameModal} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + isShowAdvanceFeature={true} + roleName={roleName} + /> + <DropdownWidgetOption + type="dropdown" + title={t("dropdown-options")} + showDropdown={showDropdown} + setShowDropdown={setShowDropdown} + handleSaveWidgetsOptions={handleSaveWidgetsOptions} + currWidgetsDetails={currWidgetsDetails} + setCurrWidgetsDetails={setCurrWidgetsDetails} + handleClose={handleNameModal} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + isShowAdvanceFeature={true} + roleName={roleName} + /> + <PlaceholderCopy + isPageCopy={isPageCopy} + setIsPageCopy={setIsPageCopy} + xyPosition={signerPos} + setXyPosition={setSignerPos} allPages={allPages} - setAllPages={setAllPages} - setPageNumber={setPageNumber} - setSignBtnPosition={setSignBtnPosition} pageNumber={pageNumber} - pdfBase64Url={pdfBase64Url} - signedUrl={pdfDetails?.[0]?.SignedUrl || ""} - setPdfArrayBuffer={setPdfArrayBuffer} - setPdfBase64Url={setPdfBase64Url} + signKey={currWidgetsDetails?.key} + Id={uniqueId} + widgetType={currWidgetsDetails?.type} + setUniqueId={setUniqueId} + /> + {/* pdf header which contain funish back button */} + <Header + completeBtnTitle={t("next")} + isPlaceholder={true} + pageNumber={pageNumber} + allPages={allPages} + changePage={changePage} + pdfDetails={pdfDetails} + signerPos={signerPos} + signersdata={signersdata} + handleSaveDoc={handleSaveDoc} + isShowHeader={true} + currentSigner={true} + setIsEditTemplate={handleEditTemplateModal} + dataTut4="reactourFour" + handleRotationFun={handleRotationFun} + clickOnZoomIn={clickOnZoomIn} + clickOnZoomOut={clickOnZoomOut} + setSignerPos={setSignerPos} setIsUploadPdf={setIsUploadPdf} pdfArrayBuffer={pdfArrayBuffer} - isMergePdfBtn={true} + setPdfArrayBuffer={setPdfArrayBuffer} + setPdfBase64Url={setPdfBase64Url} + userId={uniqueId} + pdfBase64={pdfBase64Url} /> - - {/* pdf render view */} - <div className=" w-full md:w-[57%] flex mr-4"> - <PdfZoom - clickOnZoomIn={clickOnZoomIn} - clickOnZoomOut={clickOnZoomOut} - handleRotationFun={handleRotationFun} - pdfArrayBuffer={pdfArrayBuffer} - pageNumber={pageNumber} - setPdfBase64Url={setPdfBase64Url} - setPdfArrayBuffer={setPdfArrayBuffer} - setIsUploadPdf={setIsUploadPdf} - setSignerPos={setSignerPos} - signerPos={signerPos} - userId={uniqueId} - allPages={allPages} - setAllPages={setAllPages} - setPageNumber={setPageNumber} - /> - <div className="w-full md:w-[95%]"> - <ModalUi - isOpen={!IsReceipent} - title={t("roles")} - handleClose={() => setIsReceipent(true)} - > - <div className="h-full p-[20px] text-center font-medium"> - <p>{t("template-role-alert")}</p> - </div> - </ModalUi> - {/* this modal is used show send mail message and after send mail success message */} - <ModalUi - isOpen={isCreateDocModal} - title={t("create-document")} - handleClose={() => { - setIsCreateDocModal(false); - navigate("/report/6TeaPr321t"); - }} - > - <div className="h-full p-[20px] mb-2 text-base-content"> - <p>{t("template-created-alert")}</p> - <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> - <div className="flex gap-1 flex-col md:flex-row"> - <button - onClick={() => handleCreateDocModal()} - type="button" - className="op-btn op-btn-sm op-btn-primary" - > - {t("create-document")} - </button> - </div> - </div> - </ModalUi> - {isCreateDoc && <LoaderWithMsg isLoading={isLoading} />} - <ModalUi - isOpen={isShowEmail} - title={t("signers-alert")} - handleClose={() => setIsShowEmail(false)} - > - <div className="h-full p-[20px]"> - <p>{t("template-creation-alert-1")}</p> - <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> - <button - onClick={() => setIsShowEmail(false)} - type="button" - className="op-btn op-btn-primary" - > - {t("ok")} - </button> - </div> - </ModalUi> - <DropdownWidgetOption - type={radioButtonWidget} - title={t("radio-group")} - showDropdown={isRadio} - setShowDropdown={setIsRadio} - handleSaveWidgetsOptions={handleSaveWidgetsOptions} - currWidgetsDetails={currWidgetsDetails} - setCurrWidgetsDetails={setCurrWidgetsDetails} - handleClose={handleNameModal} - fontSize={fontSize} - setFontSize={setFontSize} - fontColor={fontColor} - setFontColor={setFontColor} - isShowAdvanceFeature={true} - /> - <DropdownWidgetOption - type="checkbox" - title={t("checkbox")} - showDropdown={isCheckbox} - setShowDropdown={setIsCheckbox} - handleSaveWidgetsOptions={handleSaveWidgetsOptions} - currWidgetsDetails={currWidgetsDetails} - setCurrWidgetsDetails={setCurrWidgetsDetails} - handleClose={handleNameModal} - fontSize={fontSize} - setFontSize={setFontSize} - fontColor={fontColor} - setFontColor={setFontColor} - isShowAdvanceFeature={true} - /> - <DropdownWidgetOption - type="dropdown" - title={t("dropdown-options")} - showDropdown={showDropdown} + <div ref={divRef} data-tut="reactourThird" className="h-[95%]"> + {containerWH && ( + <RenderPdf + pageNumber={pageNumber} + pdfNewWidth={pdfNewWidth} + pdfDetails={pdfDetails} + signerPos={signerPos} + successEmail={false} + numPages={numPages} + pageDetails={pageDetails} + placeholder={true} + drop={drop} + handleDeleteWidget={handleDeleteWidgetObj} + handleTabDrag={handleTabDrag} + handleStop={handleStop} + setPdfLoad={setPdfLoad} + pdfLoad={pdfLoad} + setSignerPos={setSignerPos} + containerWH={containerWH} + setIsResize={setIsResize} + setZIndex={setZIndex} + handleLinkUser={handleLinkUser} + setUniqueId={setUniqueId} + signersdata={signersdata} + setIsPageCopy={setIsPageCopy} + isDragging={isDragging} setShowDropdown={setShowDropdown} - handleSaveWidgetsOptions={handleSaveWidgetsOptions} - currWidgetsDetails={currWidgetsDetails} setCurrWidgetsDetails={setCurrWidgetsDetails} - handleClose={handleNameModal} + setIsRadio={setIsRadio} + setIsCheckbox={setIsCheckbox} + handleNameModal={setIsNameModal} + pdfOriginalWH={pdfOriginalWH} + setScale={setScale} + scale={scale} + setIsSelectId={setIsSelectId} + pdfBase64Url={pdfBase64Url} fontSize={fontSize} setFontSize={setFontSize} + setCellCount={setCellCount} fontColor={fontColor} setFontColor={setFontColor} - isShowAdvanceFeature={true} - /> - <PlaceholderCopy - isPageCopy={isPageCopy} - setIsPageCopy={setIsPageCopy} - xyPosition={signerPos} - setXyPosition={setSignerPos} - allPages={allPages} - pageNumber={pageNumber} - signKey={currWidgetsDetails?.key} - Id={uniqueId} - widgetType={currWidgetsDetails?.type} - setUniqueId={setUniqueId} - /> - {/* pdf header which contain funish back button */} - <Header - completeBtnTitle={t("next")} - isPlaceholder={true} - pageNumber={pageNumber} - allPages={allPages} - changePage={changePage} - pdfDetails={pdfDetails} - signerPos={signerPos} - signersdata={signersdata} - alertSendEmail={alertSendEmail} - isShowHeader={true} - currentSigner={true} - setIsEditTemplate={handleEditTemplateModal} - dataTut4="reactourFour" - handleRotationFun={handleRotationFun} - clickOnZoomIn={clickOnZoomIn} - clickOnZoomOut={clickOnZoomOut} - setSignerPos={setSignerPos} - setIsUploadPdf={setIsUploadPdf} - pdfArrayBuffer={pdfArrayBuffer} - setPdfArrayBuffer={setPdfArrayBuffer} - setPdfBase64Url={setPdfBase64Url} - userId={uniqueId} - pdfBase64={pdfBase64Url} + isResize={isResize} + divRef={divRef} + uniqueId={uniqueId} + unSignedWidgetId={unSignedWidgetId} + currWidgetsDetails={currWidgetsDetails} + setRoleName={setRoleName} + isShowModal={isShowModal} /> - <div - ref={divRef} - data-tut="reactourThird" - className="h-[95%]" - > - {containerWH && ( - <RenderPdf - pageNumber={pageNumber} - pdfNewWidth={pdfNewWidth} - pdfDetails={pdfDetails} - signerPos={signerPos} - successEmail={false} - numPages={numPages} - pageDetails={pageDetails} - placeholder={true} - drop={drop} - handleDeleteSign={handleDeleteSign} - handleTabDrag={handleTabDrag} - handleStop={handleStop} - setPdfLoad={setPdfLoad} - pdfLoad={pdfLoad} - setSignerPos={setSignerPos} - containerWH={containerWH} - setIsResize={setIsResize} - setZIndex={setZIndex} - handleLinkUser={handleLinkUser} - setUniqueId={setUniqueId} - signersdata={signersdata} - setIsPageCopy={setIsPageCopy} - isDragging={isDragging} - setShowDropdown={setShowDropdown} - setCurrWidgetsDetails={setCurrWidgetsDetails} - setIsRadio={setIsRadio} - setIsCheckbox={setIsCheckbox} - handleNameModal={setIsNameModal} - pdfOriginalWH={pdfOriginalWH} - setScale={setScale} - scale={scale} - setIsSelectId={setIsSelectId} - pdfBase64Url={pdfBase64Url} - fontSize={fontSize} - setFontSize={setFontSize} - setCellCount={setCellCount} - fontColor={fontColor} - setFontColor={setFontColor} - isResize={isResize} - divRef={divRef} - uniqueId={uniqueId} - unSignedWidgetId={unSignedWidgetId} - currWidgetsDetails={currWidgetsDetails} - /> - )} - </div> - </div> + )} </div> - {/* signature button */} - {isMobile ? ( - <div> + </div> + </div> + {/* signature button */} + {isMobile ? ( + <div> + <WidgetComponent + dataTut2="reactourSecond" + handleDivClick={handleDivClick} + handleMouseLeave={handleMouseLeave} + isSignYourself={false} + addPositionOfSignature={addPositionOfSignature} + signerPos={signerPos} + signersdata={signersdata} + isSelectListId={isSelectListId} + setIsSelectId={setIsSelectId} + isSigners={isSigners} + setIsShowEmail={setIsShowEmail} + setSelectedEmail={setSelectedEmail} + selectedEmail={selectedEmail} + handleAddSigner={handleAddSigner} + setUniqueId={setUniqueId} + setRoleName={setRoleName} + handleDeleteUser={handleDeleteUser} + handleRoleChange={handleRoleChange} + handleOnBlur={handleOnBlur} + title={t("roles")} + initial={true} + sendInOrder={pdfDetails[0].SendinOrder} + setSignersData={setSignersData} + blockColor={blockColor} + setBlockColor={setBlockColor} + setSignerPos={setSignerPos} + uniqueId={uniqueId} + isTemplateFlow={true} // Prefill dropdown widget should be only in template flowAdd commentMore actions + roleName={roleName} + isPrefillDropdown={true} + prefillSigner={prefillSigner} + /> + </div> + ) : ( + <div className="w-[23%] bg-base-100 min-h-screen overflow-y-auto hide-scrollbar"> + <div className="max-h-screen"> + <SignerListPlace + signerPos={signerPos} + setSignerPos={setSignerPos} + signersdata={signersdata} + isSelectListId={isSelectListId} + setRoleName={setRoleName} + setIsSelectId={setIsSelectId} + handleAddSigner={handleAddSigner} + setUniqueId={setUniqueId} + handleDeleteUser={handleDeleteUser} + handleRoleChange={handleRoleChange} + handleOnBlur={handleOnBlur} + title={t("roles")} + sendInOrder={pdfDetails[0]?.SendinOrder} + setSignersData={setSignersData} + blockColor={blockColor} + setBlockColor={setBlockColor} + uniqueId={uniqueId} + prefillSigner={prefillSigner} + setIsTour={setTemplateTour} + /> + <div data-tut="addWidgets"> <WidgetComponent - dataTut2="reactourSecond" handleDivClick={handleDivClick} handleMouseLeave={handleMouseLeave} isSignYourself={false} addPositionOfSignature={addPositionOfSignature} - signerPos={signerPos} - signersdata={signersdata} - isSelectListId={isSelectListId} - setIsSelectId={setIsSelectId} - isSigners={isSigners} - setIsShowEmail={setIsShowEmail} - setSelectedEmail={setSelectedEmail} - selectedEmail={selectedEmail} - handleAddSigner={handleAddSigner} - setUniqueId={setUniqueId} - setRoleName={setRoleName} - handleDeleteUser={handleDeleteUser} - handleRoleChange={handleRoleChange} - handleOnBlur={handleOnBlur} title={t("roles")} initial={true} - sendInOrder={pdfDetails[0].SendinOrder} - setSignersData={setSignersData} - blockColor={blockColor} - setBlockColor={setBlockColor} - setSignerPos={setSignerPos} - uniqueId={uniqueId} isTemplateFlow={true} + roleName={roleName} + Add + commentMore + actions + isPrefillDropdown={true} /> </div> - ) : ( - <div className="w-[23%] bg-base-100 min-h-screen overflow-y-auto hide-scrollbar"> - <div className="max-h-screen"> - <SignerListPlace - signerPos={signerPos} - setSignerPos={setSignerPos} - signersdata={signersdata} - isSelectListId={isSelectListId} - setRoleName={setRoleName} - setIsSelectId={setIsSelectId} - handleAddSigner={handleAddSigner} - setUniqueId={setUniqueId} - handleDeleteUser={handleDeleteUser} - handleRoleChange={handleRoleChange} - handleOnBlur={handleOnBlur} - title={t("roles")} - sendInOrder={pdfDetails[0]?.SendinOrder} - setSignersData={setSignersData} - blockColor={blockColor} - setBlockColor={setBlockColor} - uniqueId={uniqueId} - /> - <div data-tut="addWidgets"> - <WidgetComponent - handleDivClick={handleDivClick} - handleMouseLeave={handleMouseLeave} - isSignYourself={false} - addPositionOfSignature={addPositionOfSignature} - title={t("roles")} - initial={true} - isTemplateFlow={true} - /> - </div> - </div> - </div> - )} + </div> </div> - </div> - )} - <div data-tut="reactourAddbtn--observe"> - <AddRoleModal - isModalRole={isModalRole} - roleName={roleName} - signersdata={signersdata} - setRoleName={setRoleName} - handleAddRole={handleAddRole} - handleCloseRoleModal={handleCloseRoleModal} - /> - </div> - <div> - {isAddUser && isAddUser[uniqueId] && ( - <LinkUserModal - handleAddUser={handleAddUser} - uniqueId={uniqueId} - closePopup={closePopup} - signersData={signersdata} - signerPos={signerPos} - setSignerPos={setSignerPos} - setSignersData={setSignersData} - isRemove={true} - /> )} </div> - {isEditTemplate && ( - <EditTemplate - title={t("edit-template")} - handleClose={handleEditTemplateModal} - pdfbase64={pdfBase64Url} - template={pdfDetails?.[0]} - onSuccess={handleEditTemplateForm} - setPdfArrayBuffer={setPdfArrayBuffer} - setPdfBase64Url={setPdfBase64Url} + )} + <div data-tut="reactourAddbtn--observe"> + <AddRoleModal + isModalRole={isModalRole} + roleName={roleName} + signersdata={signersdata} + setRoleName={setRoleName} + handleAddRole={handleAddRole} + handleCloseRoleModal={handleCloseRoleModal} + /> + </div> + <div> + {isAddUser && isAddUser[uniqueId] && ( + <LinkUserModal + handleAddUser={handleAddUser} + uniqueId={uniqueId} + closePopup={closePopup} + signersData={signersdata} + signerPos={signerPos} + setSignerPos={setSignerPos} + setSignersData={setSignersData} + isRemove={true} + isAddYourSelfCheckbox /> )} - <WidgetNameModal - signatureType={signatureType} - widgetName={currWidgetsDetails?.options?.name} - defaultdata={currWidgetsDetails} - isOpen={isNameModal} - handleClose={handleNameModal} - handleData={handleWidgetdefaultdata} - isTextSetting={isTextSetting} - setIsTextSetting={setIsTextSetting} - fontSize={fontSize} - setFontSize={setFontSize} - fontColor={fontColor} - setFontColor={setFontColor} + </div> + {isEditTemplate && ( + <EditTemplate + title={t("edit-template")} + handleClose={handleEditTemplateModal} + pdfbase64={pdfBase64Url} + template={pdfDetails?.[0]} + onSuccess={handleEditTemplateForm} + setPdfArrayBuffer={setPdfArrayBuffer} + setPdfBase64Url={setPdfBase64Url} + isAddYourSelfCheckbox={true} + /> + )} + <WidgetNameModal + signatureType={signatureType} + widgetName={currWidgetsDetails?.options?.name} + defaultdata={currWidgetsDetails} + isOpen={isNameModal} + handleClose={handleNameModal} + handleData={handleWidgetdefaultdata} + isTextSetting={isTextSetting} + setIsTextSetting={setIsTextSetting} + fontSize={fontSize} + setFontSize={setFontSize} + fontColor={fontColor} + setFontColor={setFontColor} + roleName={roleName} + /> + {isPrefillModal && ( + <PrefillWidgetModal + isPrefillModal={isPrefillModal} + prefillData={signerPos.find((x) => x.Role === "prefill")} + forms={forms} + setForms={setForms} + xyPosition={signerPos} + setXyPosition={setSignerPos} + handleCreateDocument={handleCreateDocument} + handleClosePrefillModal={handleClosePrefillModal} + handleAddUser={handleAddUser} + navigatePageToDoc={navigatePageToDoc} + setIsNewContact={setIsNewContact} + isNewContact={isNewContact} + documentFlow={"template"} + docId={pdfDetails[0]?.objectId} /> - <RotateAlert - showRotateAlert={showRotateAlert.status} - setShowRotateAlert={setShowRotateAlert} - handleRemoveWidgets={handleRemovePlaceholder} + )} + {isShowModal[currWidgetsDetails?.key] && ( + <WidgetsValueModal + key={currWidgetsDetails?.key} + xyPosition={signerPos} + pageNumber={pageNumber} + setXyPosition={setSignerPos} + uniqueId={uniqueId} + setPageNumber={setPageNumber} + setCurrWidgetsDetails={setCurrWidgetsDetails} + currWidgetsDetails={currWidgetsDetails} + index={pageNumber} + isSave={true} + setUniqueId={setUniqueId} + signatureTypes={signatureType} /> - </DndProvider> + )} + <RotateAlert + showRotateAlert={showRotateAlert.status} + setShowRotateAlert={setShowRotateAlert} + handleRemoveWidgets={handleRemovePlaceholder} + /> + <CustomizeMail + setIsMailModal={setIsMailModal} + setCustomizeMail={setCustomizeMail} + documentId={documentId} + signerList={signersdata} + setIsSend={setIsSend} + setMailStatus={setMailStatus} + customizeMail={customizeMail} + defaultMail={defaultMail} + isMailModal={isMailModal} + setCurrUserId={setCurrUserId} + handleShareList={handleShareList} + setDocumentDetails={setDocumentDetails} + /> + <ModalUi + isOpen={isSend} + title={ + mailStatus === "success" + ? t("mails-sent") + : mailStatus === "quotareached" + ? t("quota-mail-head") + : t("mail-not-delivered") + } + handleClose={() => { + setIsSend(false); + navigate("/report/1MwEuxLEkF"); + }} + > + <div className="h-[100%] p-[20px] text-base-content"> + {mailStatus === "success" ? ( + <div className="text-center mb-[10px]"> + <LottieWithLoader /> + {documentDetails.SendinOrder ? ( + <p> + {currUserId + ? t("placeholder-mail-alert-you") + : t("placeholder-mail-alert", { + name: signersdata[0]?.Name + })} + </p> + ) : ( + <p>{t("placeholder-alert-4")}</p> + )} + {currUserId && <p>{t("placeholder-alert-5")}</p>} + </div> + ) : mailStatus === "quotareached" ? ( + <div className="flex flex-col gap-y-3"> + <div className="my-3">{handleShareList()}</div> + </div> + ) : ( + <div className="mb-[10px]"> + {mailStatus === "dailyquotareached" ? ( + <p>{t("daily-quota-reached")}</p> + ) : ( + <p>{t("placeholder-alert-6")}</p> + )} + {currUserId && <p className="mt-1">{t("placeholder-alert-5")}</p>} + </div> + )} + {!mailStatus && ( + <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> + )} + {mailStatus !== "quotareached" && ( + <div + className={ + mailStatus === "success" ? "flex justify-center mt-1" : "" + } + > + {currUserId && ( + <button + onClick={() => + handleRecipientSign(documentDetails?.objectId, currUserId) + } + type="button" + className="op-btn op-btn-primary mr-1" + > + {t("yes")} + </button> + )} + <button + onClick={() => { + navigate("/report/1MwEuxLEkF"); + }} + type="button" + className="op-btn op-btn-ghost text-base-content" + > + {currUserId ? t("no") : t("close")} + </button> + </div> + )} + </div> + </ModalUi> </> ); }; diff --git a/apps/OpenSign/src/pages/UpdateExistUserAdmin.jsx b/apps/OpenSign/src/pages/UpdateExistUserAdmin.jsx index 743238aaec..0c5138ee6c 100644 --- a/apps/OpenSign/src/pages/UpdateExistUserAdmin.jsx +++ b/apps/OpenSign/src/pages/UpdateExistUserAdmin.jsx @@ -1,9 +1,8 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import Loader from "../primitives/Loader"; import Parse from "parse"; import { NavLink, useNavigate } from "react-router"; import Alert from "../primitives/Alert"; -import Title from "../components/Title"; import { useTranslation } from "react-i18next"; import { emailRegex } from "../constant/const"; const UpdateExistUserAdmin = () => { @@ -39,7 +38,7 @@ const UpdateExistUserAdmin = () => { e.preventDefault(); e.stopPropagation(); if (!emailRegex.test(formdata.email)) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); } else { setIsSubmitLoading(true); try { @@ -73,7 +72,6 @@ const UpdateExistUserAdmin = () => { }; return ( <div className="h-screen flex justify-center"> - <Title title={"Add Admin"} /> {isAlert.msg && <Alert type={isAlert.type}>{isAlert.msg}</Alert>} {loader ? ( <div className="text-[grey] flex justify-center items-center text-lg md:text-2xl"> diff --git a/apps/OpenSign/src/pages/UserList.jsx b/apps/OpenSign/src/pages/UserList.jsx index 52d2d20e69..aab50554ea 100644 --- a/apps/OpenSign/src/pages/UserList.jsx +++ b/apps/OpenSign/src/pages/UserList.jsx @@ -7,10 +7,23 @@ import ModalUi from "../primitives/ModalUi"; import pad from "../assets/images/pad.svg"; import Tooltip from "../primitives/Tooltip"; import AddUser from "../components/AddUser"; -import Title from "../components/Title"; import { useTranslation } from "react-i18next"; +import DeleteUserModal from "../primitives/DeleteUserModal"; +import axios from "axios"; + +const actions = [ + { + btnId: "4741", + hoverLabel: "Delete", + btnColor: "op-btn-secondary", + btnIcon: "fa-light fa-trash", + redirectUrl: "", + action: "delete", + restrictAdmin: true + }, +]; const heading = ["Sr.No", "Name", "Email", "Phone", "Role", "Team", "Active"]; const UserList = () => { const { t } = useTranslation(); @@ -30,6 +43,11 @@ const UserList = () => { const [isActLoader, setIsActLoader] = useState({}); const [isAdmin, setIsAdmin] = useState(false); const [formHeader, setFormHeader] = useState(t("add-user")); + const [deleteUserRes, setDeleteUserRes] = useState(""); + const [deleting, setDeleting] = useState(false); + const [isActModal, setIsActModal] = useState({}); + const Extand_Class = localStorage.getItem("Extand_Class"); + const extClass = Extand_Class && JSON.parse(Extand_Class); const recordperPage = 10; const startIndex = (currentPage - 1) * recordperPage; // user per page @@ -194,9 +212,59 @@ const UserList = () => { setIsAlert({ type, msg }); setTimeout(() => setIsAlert({ type: "success", msg: "" }), 1500); }; + + const handleDeleteAccount = async (item) => { + setDeleting(true); + if (item?.UserId?.objectId) { + const url = localStorage.getItem("baseUrl")?.replace(/\/app\/?$/, "/"); + const deleteUrl = `${url}deleteuser/${item.UserId.objectId}`; + try { + await axios.post(deleteUrl, null, { + headers: { sessiontoken: localStorage.getItem("accesstoken") } + }); + setUserList((prev) => + prev.filter((user) => user.objectId !== item.objectId) + ); + showAlert("success", t("user-deleted-successfully")); + } catch (err) { + const message = err?.response?.data?.message || err?.message; + setDeleteUserRes(message); + showAlert("danger", message); + console.log("Err in deleteuser acc", err); + } finally { + setDeleting(false); + } + } else { + showAlert("danger", t("something-went-wrong-mssg")); + setDeleteUserRes(t("something-went-wrong-mssg")); + setDeleting(false); + } + }; + const handleCloseModal = () => { + setIsActModal({}); + setDeleteUserRes(""); + setDeleting(false); + }; + + const handleActionBtn = async (act, item) => { + if (act.action === "delete") { + setIsActModal({ [`delete_${item.objectId}`]: true }); + } + }; + const handleBtnVisibility = (act, item) => { + if (act.restrictAdmin) { + return item?.objectId !== extClass?.[0]?.objectId; + } else if ( + act.restrictBtn === true && + item?.objectId === extClass?.[0]?.objectId + ) { + return true; + } else { + return true; + } + }; return ( <div className="relative"> - <Title title={isAdmin ? "Users" : "Page not found"} /> {isLoader && ( <div className="absolute w-full h-[300px] md:h-[400px] flex justify-center items-center z-30 rounded-box"> <Loader /> @@ -241,6 +309,11 @@ const UserList = () => { {t(`report-heading.${item}`)} </th> ))} + {actions?.length > 0 && ( + <th className="p-2 text-transparent pointer-events-none"> + {t("action")} + </th> + )} </tr> </thead> {userList?.length > 0 && ( @@ -315,6 +388,59 @@ const UserList = () => { ) : ( <td className="px-4 py-2 font-semibold"></td> )} + + {isAdmin && ( + <td className="px-3 py-2"> + <div className="text-base-content min-w-max flex flex-row gap-x-2 gap-y-1 justify-start items-center"> + {actions?.length > 0 && + actions.map((act, index) => ( + <React.Fragment key={index}> + {handleBtnVisibility(act, item) && ( + <div + role="button" + data-tut={act?.selector} + onClick={() => + handleActionBtn(act, item) + } + title={t( + `btnLabel.${act.hoverLabel}` + )} + className={ + act.action !== "option" + ? `${act?.btnColor || ""} op-btn op-btn-sm mr-1 ` + : "text-base-content focus:outline-none text-lg mr-2 relative" + } + > + <i className={act.btnIcon}></i> + {act.btnLabel && ( + <span className="uppercase font-medium"> + {t( + `btnLabel.${act.btnLabel}` + )} + </span> + )} + </div> + )} + <DeleteUserModal + title={t("delete-account")} + deleting={deleting} + userEmail={item?.Email} + isOpen={ + isActModal[ + "delete_" + item.objectId + ] + } + onConfirm={() => + handleDeleteAccount(item) + } + deleteRes={deleteUserRes} + handleClose={handleCloseModal} + /> + </React.Fragment> + ))} + </div> + </td> + )} </tr> ))} </tbody> diff --git a/apps/OpenSign/src/pages/UserProfile.jsx b/apps/OpenSign/src/pages/UserProfile.jsx index 17f286a3f1..fd1f25e84c 100644 --- a/apps/OpenSign/src/pages/UserProfile.jsx +++ b/apps/OpenSign/src/pages/UserProfile.jsx @@ -6,8 +6,7 @@ import { Navigate, useNavigate } from "react-router"; import Parse from "parse"; import { SaveFileSize } from "../constant/saveFileSize"; import dp from "../assets/images/dp.png"; -import Title from "../components/Title"; -import sanitizeFileName from "../primitives/sanitizeFileName"; +import { sanitizeFileName } from "../utils"; import axios from "axios"; import Tooltip from "../primitives/Tooltip"; import { @@ -22,8 +21,12 @@ import SelectLanguage from "../components/pdf/SelectLanguage"; function UserProfile() { const navigate = useNavigate(); const { t } = useTranslation(); - let UserProfile = JSON.parse(localStorage.getItem("UserInformation")); - let extendUser = JSON.parse(localStorage.getItem("Extand_Class")); + let UserProfile = + localStorage.getItem("UserInformation") && + JSON.parse(localStorage.getItem("UserInformation")); + let extendUser = + localStorage.getItem("Extand_Class") && + JSON.parse(localStorage.getItem("Extand_Class")); const [parseBaseUrl] = useState(localStorage.getItem("baseUrl")); const [parseAppId] = useState(localStorage.getItem("parseAppId")); const [editmode, setEditMode] = useState(false); @@ -42,6 +45,9 @@ function UserProfile() { const [otp, setOtp] = useState(""); const [otpLoader, setOtpLoader] = useState(false); const [isEmailVerified, setIsEmailVerified] = useState(false); + const [isdeleteModal, setIsdeleteModal] = useState(false); + const [deleteUserRes, setDeleteUserRes] = useState(""); + const [isDelLoader, setIsDelLoader] = useState(false); useEffect(() => { getUserDetail(); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -183,7 +189,8 @@ function UserProfile() { setImage(fileRes?.url); setpercentage(0); const tenantId = localStorage.getItem("TenantId"); - SaveFileSize(size, fileRes?.url, tenantId); + const userId = extendUser?.[0]?.UserId?.objectId; + SaveFileSize(size, fileRes?.url, tenantId, userId); return fileRes?.url; } } @@ -249,9 +256,37 @@ function UserProfile() { setJobTitle(extendUser?.[0]?.JobTitle); }; + const handleDeleteAccountBtn = () => { + const isAdmin = extendUser?.[0]?.UserRole === "contracts_Admin"; + if (!isAdmin) { + setDeleteUserRes(t("delete-action-prohibited")); + } + setIsdeleteModal(true); + }; + + const handleDeleteAccount = async (e) => { + e.preventDefault(); + setIsDelLoader(true); + try { + await Parse.Cloud.run("senddeleterequest", { + userId: Parse.User.current().id + }); + setDeleteUserRes(t("account-deletion-request-sent-via-mail")); + } catch (err) { + setDeleteUserRes(err.message); + console.log("Err in deleteuser acc", err); + } finally { + setIsDelLoader(false); + } + }; + + const handleCloseDeleteModal = () => { + setIsdeleteModal(false); + setDeleteUserRes(""); + }; + return ( <React.Fragment> - <Title title={"Profile"} /> {isLoader ? ( <div className="h-[100vh] flex justify-center items-center"> <Loader /> @@ -286,7 +321,9 @@ function UserProfile() { style={{ width: `${percentage}%` }} ></div> </div> - <span className="text-base-contentk text-sm">{percentage}%</span> + <span className="text-base-contentk text-sm"> + {percentage}% + </span> </div> )} <div className="text-base font-semibold pt-4"> @@ -381,15 +418,15 @@ function UserProfile() { <span className="font-semibold">{t("is-email-verified")}:</span>{" "} <span> {isEmailVerified ? ( - "Verified" + t("verified") ) : ( <span> - Not verified( + {t("not-verified")} ( <span onClick={() => handleVerifyBtn()} className="hover:underline text-blue-600 cursor-pointer" > - verify + {t("verify")} </span> ) </span> @@ -408,13 +445,13 @@ function UserProfile() { /> </li> </ul> - <div className="flex justify-center gap-2 pt-2 pb-3 md:pt-3 md:pb-4"> + <div className="flex flex-col md:flex-row justify-center gap-2 pt-2 pb-3 md:pt-3 md:pb-4 mx-2 md:mx-0"> <button type="button" onClick={(e) => { editmode ? handleSubmit(e) : setEditMode(true); }} - className="op-btn op-btn-primary w-[100px]" + className="op-btn op-btn-primary md:w-[100px]" > {editmode ? t("save") : t("edit")} </button> @@ -429,8 +466,55 @@ function UserProfile() { > {editmode ? t("cancel") : t("change-password")} </button> + <button + onClick={() => handleDeleteAccountBtn()} + className="op-link op-link-accent text-sm mx-2" + > + {t("delete-account")} + </button> </div> </div> + {isdeleteModal && ( + <ModalUi + isOpen + title={t("delete-account")} + handleClose={handleCloseDeleteModal} + > + {isDelLoader ? ( + <div className="h-[100px] flex justify-center items-center"> + <Loader /> + </div> + ) : ( + <> + {deleteUserRes ? ( + <div className="h-[100px] p-[20px] flex justify-center items-center text-sm md:text-base"> + {deleteUserRes} + </div> + ) : ( + <form onSubmit={(e) => handleDeleteAccount(e)}> + <div className="px-6 py-3 text-base-content text-sm md:text-base"> + {t("delete-account-que")} + </div> + <div className="px-6 mb-3"> + <button + type="submit" + className="op-btn op-btn-primary w-[100px]" + > + {t("yes")} + </button> + <button + className="op-btn op-btn-secondary ml-2 w-[100px]" + onClick={handleCloseDeleteModal} + > + {t("cancel")} + </button> + </div> + </form> + )} + </> + )} + </ModalUi> + )} {isVerifyModal && ( <ModalUi isOpen diff --git a/apps/OpenSign/src/pages/VerifyDocument.jsx b/apps/OpenSign/src/pages/VerifyDocument.jsx index 70e13fec5b..8d874ac79c 100644 --- a/apps/OpenSign/src/pages/VerifyDocument.jsx +++ b/apps/OpenSign/src/pages/VerifyDocument.jsx @@ -1,61 +1,65 @@ -import React, { useState, useEffect } from 'react'; -import { useTranslation } from 'react-i18next'; -import { PDFDocument, PDFName, PDFSignature, PDFRef, PDFDict } from 'pdf-lib'; // Updated import -import * as asn1js from 'asn1js'; -import { Certificate, ContentInfo, SignedData, IssuerAndSerialNumber } from 'pkijs'; -// import * as jsrsasign from 'jsrsasign'; // Removed for dynamic loading +import { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { PDFDocument, PDFName, PDFSignature, PDFRef, PDFDict } from "pdf-lib"; // Updated import +import * as asn1js from "asn1js"; +import { + Certificate, + ContentInfo, + SignedData, + IssuerAndSerialNumber +} from "pkijs"; const VerifyDocument = () => { const { t } = useTranslation(); const [selectedFile, setSelectedFile] = useState(null); const [fileBuffer, setFileBuffer] = useState(null); - const [verificationResult, setVerificationResult] = useState(''); + const [verificationResult, setVerificationResult] = useState(""); const [detailedResults, setDetailedResults] = useState([]); const [collapsedSections, setCollapsedSections] = useState({}); // const [jsrsasignStatus, setJsrsasignStatus] = useState('loading'); // Removed // OID to human-readable label mapping const oidMapping = { - '2.5.4.6': 'Country', - '2.5.4.10': 'Organization', - '2.5.4.11': 'Organizational Unit', - '2.5.4.17': 'Postal Code', - '2.5.4.8': 'State', - '2.5.4.7': 'Locality', // Alternative for City - '2.5.4.9': 'City', - '2.5.4.51': 'Address', - '2.5.4.3': 'Common Name', - '2.5.4.4': 'Surname', - '2.5.4.5': 'Serial Number', - '2.5.4.12': 'Title', - '2.5.4.13': 'Description', - '2.5.4.16': 'Postal Address', - '2.5.4.18': 'Post Office Box', - '2.5.4.20': 'Telephone Number', - '1.2.840.113549.1.9.1': 'Email Address', + "2.5.4.6": "Country", + "2.5.4.10": "Organization", + "2.5.4.11": "Organizational Unit", + "2.5.4.17": "Postal Code", + "2.5.4.8": "State", + "2.5.4.7": "Locality", // Alternative for City + "2.5.4.9": "City", + "2.5.4.51": "Address", + "2.5.4.3": "Common Name", + "2.5.4.4": "Surname", + "2.5.4.5": "Serial Number", + "2.5.4.12": "Title", + "2.5.4.13": "Description", + "2.5.4.16": "Postal Address", + "2.5.4.18": "Post Office Box", + "2.5.4.20": "Telephone Number", + "1.2.840.113549.1.9.1": "Email Address", // Common alternative OIDs - 'C': 'Country', - 'O': 'Organization', - 'OU': 'Organizational Unit', - 'CN': 'Common Name', - 'ST': 'State', - 'L': 'Locality', - 'STREET': 'Address', - 'emailAddress': 'Email Address', - 'serialNumber': 'Serial Number' + C: "Country", + O: "Organization", + OU: "Organizational Unit", + CN: "Common Name", + ST: "State", + L: "Locality", + STREET: "Address", + emailAddress: "Email Address", + serialNumber: "Serial Number" }; // Function to parse certificate subject/issuer into structured data const parseCertificateInfo = (certString) => { if (!certString) return {}; - + const parsed = {}; - + // Find all OID patterns and their positions const oidPattern = /(\d+\.\d+\.\d+\.\d+|\w+)=/g; const matches = []; let match; - + while ((match = oidPattern.exec(certString)) !== null) { matches.push({ oid: match[1], @@ -63,67 +67,67 @@ const VerifyDocument = () => { equalIndex: match.index + match[1].length }); } - + // Extract value for each OID for (let i = 0; i < matches.length; i++) { const currentMatch = matches[i]; const nextMatch = matches[i + 1]; - + const valueStart = currentMatch.equalIndex + 1; // Skip the "=" character const valueEnd = nextMatch ? nextMatch.startIndex - 2 : certString.length; // -2 to remove ", " before next OID - + const value = certString.substring(valueStart, valueEnd).trim(); const label = oidMapping[currentMatch.oid] || currentMatch.oid; - + parsed[label] = value; } - + return parsed; }; // Function to determine if status should show success icon const isSuccessStatus = (status) => { - const successTerms = ['valid', 'success', 'parsed', 'verified']; - const errorTerms = ['error', 'invalid', 'failed', 'expired']; - + const successTerms = ["valid", "success", "parsed", "verified"]; + const errorTerms = ["error", "invalid", "failed", "expired"]; + const statusLower = status.toLowerCase(); - + // Check for explicit error terms first - if (errorTerms.some(term => statusLower.includes(term))) { + if (errorTerms.some((term) => statusLower.includes(term))) { return false; } - + // Check for success terms - return successTerms.some(term => statusLower.includes(term)); + return successTerms.some((term) => statusLower.includes(term)); }; // Function to determine if certificate validity should show success icon const isCertificateValid = (validityText) => { const validityLower = validityText.toLowerCase(); - + // If it contains "valid" and doesn't contain negative terms - return validityLower.includes('valid') && - !validityLower.includes('expired') && - !validityLower.includes('not yet valid') && - !validityLower.includes('invalid'); + return ( + validityLower.includes("valid") && + !validityLower.includes("expired") && + !validityLower.includes("not yet valid") && + !validityLower.includes("invalid") + ); }; // Toggle collapsible sections const toggleSection = (signatureIndex, section) => { const key = `${signatureIndex}-${section}`; - setCollapsedSections(prev => ({ + setCollapsedSections((prev) => ({ ...prev, [key]: !prev[key] })); }; - // useEffect for jsrsasign loading removed - const handleFileChange = (event) => { const file = event.target.files[0]; - if (file && file.type === 'application/pdf') { + if (file && file.type === "application/pdf") { setSelectedFile(file); - setVerificationResult(''); + setVerificationResult(""); setDetailedResults([]); const reader = new FileReader(); reader.onload = (e) => { @@ -134,14 +138,17 @@ const VerifyDocument = () => { setSelectedFile(null); setFileBuffer(null); setDetailedResults([]); - setVerificationResult(t('please-select-pdf')); + setVerificationResult(t("please-select-pdf")); } }; const parseSignature = async (pdfDoc) => { - const signatureFields = pdfDoc.getForm().getFields().filter(field => field instanceof PDFSignature); // Updated filter logic + const signatureFields = pdfDoc + .getForm() + .getFields() + .filter((field) => field instanceof PDFSignature); // Updated filter logic if (!signatureFields.length) { - return { error: t('no-signature-found') }; + return { error: t("no-signature-found") }; } const results = []; @@ -150,25 +157,25 @@ const VerifyDocument = () => { try { if (!field.acroField || !field.acroField.dict) { results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: t('missing-acrofield-dict'), - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: t("missing-acrofield-dict"), + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked"), isCertificateDateValid: false, - calculatedDocumentHash: t('not-available'), - messageDigestInSignature: t('not-available'), - hashComparisonResult: t('not-performed'), - authenticatedAttributesSignatureResult: t('not-performed'), + calculatedDocumentHash: t("not-available"), + messageDigestInSignature: t("not-available"), + hashComparisonResult: t("not-performed"), + authenticatedAttributesSignatureResult: t("not-performed") }); - continue; + continue; } // New logic to determine the actual signature dictionary const fieldDict = field.acroField.dict; - const vEntry = fieldDict.get(PDFName.of('V')); + const vEntry = fieldDict.get(PDFName.of("V")); let actualSignatureDict = null; if (vEntry) { @@ -185,50 +192,52 @@ const VerifyDocument = () => { // Use actualSignatureDict if found, otherwise behavior might be problematic (as per existing logic) // If actualSignatureDict is null, subsequent checks for byteRangeObject etc. will fail, // leading to an error message for this signature, which is acceptable. - const signatureDict = actualSignatureDict; + const signatureDict = actualSignatureDict; // Check if signatureDict is null (meaning actualSignatureDict was not resolved) // and push an error if it is, before trying to get ByteRange or Contents. if (!signatureDict) { results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: t('signature-dictionary-not-found-or-invalid'), // New error message - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: t("signature-dictionary-not-found-or-invalid"), // New error message + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked"), isCertificateDateValid: false, - calculatedDocumentHash: t('not-available'), - messageDigestInSignature: t('not-available'), - hashComparisonResult: t('not-performed'), - authenticatedAttributesSignatureResult: t('not-performed'), + calculatedDocumentHash: t("not-available"), + messageDigestInSignature: t("not-available"), + hashComparisonResult: t("not-performed"), + authenticatedAttributesSignatureResult: t("not-performed") }); continue; } - const byteRangeObject = signatureDict.get(PDFName.of('ByteRange')); + const byteRangeObject = signatureDict.get(PDFName.of("ByteRange")); let byteRange; // Will be assigned after validation // Comprehensive validation for byteRangeObject and its contents - if (!byteRangeObject || - !byteRangeObject.array || - !Array.isArray(byteRangeObject.array) || - byteRangeObject.array.length === 0 || - byteRangeObject.array.length % 2 !== 0) { + if ( + !byteRangeObject || + !byteRangeObject.array || + !Array.isArray(byteRangeObject.array) || + byteRangeObject.array.length === 0 || + byteRangeObject.array.length % 2 !== 0 + ) { results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: t('missing-or-invalid-byterange'), - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: t("missing-or-invalid-byterange"), + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked"), isCertificateDateValid: false, - calculatedDocumentHash: t('not-available'), - messageDigestInSignature: t('not-available'), - hashComparisonResult: t('not-performed'), - authenticatedAttributesSignatureResult: t('not-performed'), + calculatedDocumentHash: t("not-available"), + messageDigestInSignature: t("not-available"), + hashComparisonResult: t("not-performed"), + authenticatedAttributesSignatureResult: t("not-performed") }); continue; } @@ -236,12 +245,13 @@ const VerifyDocument = () => { const byteRangeNumbers = []; let byteRangeIsValid = true; for (const pdfObject of byteRangeObject.array) { - if (!pdfObject || typeof pdfObject.asNumber !== 'function') { + if (!pdfObject || typeof pdfObject.asNumber !== "function") { byteRangeIsValid = false; break; } const num = pdfObject.asNumber(); - if (!Number.isFinite(num)) { // Checks for NaN, Infinity, -Infinity + if (!Number.isFinite(num)) { + // Checks for NaN, Infinity, -Infinity byteRangeIsValid = false; break; } @@ -250,43 +260,43 @@ const VerifyDocument = () => { if (!byteRangeIsValid) { results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: t('missing-or-invalid-byterange'), // Or a more specific error like "ByteRange contains non-numeric values" - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: t("missing-or-invalid-byterange"), // Or a more specific error like "ByteRange contains non-numeric values" + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked"), isCertificateDateValid: false, - calculatedDocumentHash: t('not-available'), - messageDigestInSignature: t('not-available'), - hashComparisonResult: t('not-performed'), - authenticatedAttributesSignatureResult: t('not-performed'), + calculatedDocumentHash: t("not-available"), + messageDigestInSignature: t("not-available"), + hashComparisonResult: t("not-performed"), + authenticatedAttributesSignatureResult: t("not-performed") }); continue; } byteRange = byteRangeNumbers; // Assign the validated numbers to byteRange - const contentsObject = signatureDict.get(PDFName.of('Contents')); - if (!contentsObject || typeof contentsObject.asString !== 'function') { + const contentsObject = signatureDict.get(PDFName.of("Contents")); + if (!contentsObject || typeof contentsObject.asString !== "function") { results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: t('missing-or-invalid-contents'), - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: t("missing-or-invalid-contents"), + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked"), isCertificateDateValid: false, - calculatedDocumentHash: t('not-available'), - messageDigestInSignature: t('not-available'), - hashComparisonResult: t('not-performed'), - authenticatedAttributesSignatureResult: t('not-performed'), + calculatedDocumentHash: t("not-available"), + messageDigestInSignature: t("not-available"), + hashComparisonResult: t("not-performed"), + authenticatedAttributesSignatureResult: t("not-performed") }); continue; } const contents = contentsObject.asString(); - + // The old basic check can be removed now as the more specific checks above cover these cases. // if (!byteRange || !contents) { ... } @@ -298,18 +308,18 @@ const VerifyDocument = () => { if (totalSignedLength <= 0) { results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: t('missing-or-invalid-byterange'), // totalSignedLength being non-positive implies invalid ByteRange - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: t("missing-or-invalid-byterange"), // totalSignedLength being non-positive implies invalid ByteRange + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked"), isCertificateDateValid: false, - calculatedDocumentHash: t('not-available'), - messageDigestInSignature: t('not-available'), - hashComparisonResult: t('not-performed'), - authenticatedAttributesSignatureResult: t('not-performed'), + calculatedDocumentHash: t("not-available"), + messageDigestInSignature: t("not-available"), + hashComparisonResult: t("not-performed"), + authenticatedAttributesSignatureResult: t("not-performed") }); continue; } @@ -319,131 +329,160 @@ const VerifyDocument = () => { for (let i = 0; i < byteRange.length; i += 2) { const start = byteRange[i]; - const length = byteRange[i+1]; + const length = byteRange[i + 1]; - if (start < 0 || length <= 0 || start + length > fileBuffer.byteLength) { + if ( + start < 0 || + length <= 0 || + start + length > fileBuffer.byteLength + ) { reconstructionFailed = true; break; } - pdfSignedDataBytes.set(new Uint8Array(fileBuffer.slice(start, start + length)), offset); + pdfSignedDataBytes.set( + new Uint8Array(fileBuffer.slice(start, start + length)), + offset + ); offset += length; } if (reconstructionFailed) { results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: t('missing-or-invalid-byterange'), // Error during reconstruction due to invalid segment - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: t("missing-or-invalid-byterange"), // Error during reconstruction due to invalid segment + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked"), isCertificateDateValid: false, - calculatedDocumentHash: t('not-available'), - messageDigestInSignature: t('not-available'), - hashComparisonResult: t('not-performed'), - authenticatedAttributesSignatureResult: t('not-performed'), + calculatedDocumentHash: t("not-available"), + messageDigestInSignature: t("not-available"), + hashComparisonResult: t("not-performed"), + authenticatedAttributesSignatureResult: t("not-performed") }); continue; } - + // Remove leading/trailing null bytes from hex if present from PDF content - const pkcs7Hex = contents.trim(); - - if (!pkcs7Hex) { - results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('signature-invalid-basic'), - errorDetails: t('missing-signature-contents'), // New i18n key - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), - }); - continue; + const pkcs7Hex = contents.trim(); + + if (!pkcs7Hex) { + results.push({ + name: field.getName() || t("unnamed-signature-field"), + status: t("signature-invalid-basic"), + errorDetails: t("missing-signature-contents"), // New i18n key + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked") + }); + continue; } // Convert hex string to ArrayBuffer let cmsContentBuffer; try { - cmsContentBuffer = new Uint8Array(pkcs7Hex.match(/.{1,2}/g).map(byte => parseInt(byte, 16))).buffer; + cmsContentBuffer = new Uint8Array( + pkcs7Hex.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)) + ).buffer; } catch (hexError) { - // console.error('Error converting hex string to ArrayBuffer:', hexError); // Removed - results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('signature-invalid-basic'), - errorDetails: t('invalid-signature-hex-format'), // New i18n key - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), - }); - continue; + // console.error('Error converting hex string to ArrayBuffer:', hexError); // Removed + results.push({ + name: field.getName() || t("unnamed-signature-field"), + status: t("signature-invalid-basic"), + errorDetails: t("invalid-signature-hex-format"), // New i18n key + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked") + }); + continue; } - // Parse the CMS ContentInfo const asn1 = asn1js.fromBER(cmsContentBuffer); if (asn1.offset === -1) { // console.error('Error parsing ASN.1 from signature data'); // Removed results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('signature-invalid-basic'), - errorDetails: 'ASN.1 parsing error from signature data.', - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + name: field.getName() || t("unnamed-signature-field"), + status: t("signature-invalid-basic"), + errorDetails: "ASN.1 parsing error from signature data.", + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked") }); continue; } const cmsContentInfo = new ContentInfo({ schema: asn1.result }); - if (String(cmsContentInfo.contentType).trim() !== String(ContentInfo.SIGNED_DATA).trim()) { - // console.error('Not a SignedData content type. Actual type:', cmsContentInfo.contentType, 'Expected:', ContentInfo.SIGNED_DATA); // Removed - results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('signature-invalid-basic'), - errorDetails: t('unsupported-signature-format-not-signeddata'), // New i18n key - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), - }); - continue; + if ( + String(cmsContentInfo.contentType).trim() !== + String(ContentInfo.SIGNED_DATA).trim() + ) { + // console.error('Not a SignedData content type. Actual type:', cmsContentInfo.contentType, 'Expected:', ContentInfo.SIGNED_DATA); // Removed + results.push({ + name: field.getName() || t("unnamed-signature-field"), + status: t("signature-invalid-basic"), + errorDetails: t("unsupported-signature-format-not-signeddata"), // New i18n key + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked") + }); + continue; } - + const signedData = new SignedData({ schema: cmsContentInfo.content }); - let signerInfoText = t('signer-info-not-available'); - let certSubject = ''; - let certIssuer = ''; - let certValidity = t('cert-validity-not-checked'); - let isValid = false; + let signerInfoText = t("signer-info-not-available"); + let certSubject = ""; + let certIssuer = ""; + let certValidity = t("cert-validity-not-checked"); + let isValid = false; if (signedData.signerInfos && signedData.signerInfos.length > 0) { - const signerInfo = signedData.signerInfos[0]; + const signerInfo = signedData.signerInfos[0]; if (signedData.certificates && signedData.certificates.length > 0) { let signerCertificate = null; for (const cert of signedData.certificates) { - if (cert instanceof Certificate) { + if (cert instanceof Certificate) { const issuerAndSerialNumber = signerInfo.sid; if (issuerAndSerialNumber instanceof IssuerAndSerialNumber) { let certMatch = true; - if (cert.issuer.typesAndValues.length === issuerAndSerialNumber.issuer.typesAndValues.length) { - for (let i = 0; i < cert.issuer.typesAndValues.length; i++) { - if (cert.issuer.typesAndValues[i].type !== issuerAndSerialNumber.issuer.typesAndValues[i].type || - cert.issuer.typesAndValues[i].value.valueBlock.value !== issuerAndSerialNumber.issuer.typesAndValues[i].value.valueBlock.value) { - certMatch = false; - break; - } + if ( + cert.issuer.typesAndValues.length === + issuerAndSerialNumber.issuer.typesAndValues.length + ) { + for ( + let i = 0; + i < cert.issuer.typesAndValues.length; + i++ + ) { + if ( + cert.issuer.typesAndValues[i].type !== + issuerAndSerialNumber.issuer.typesAndValues[i].type || + cert.issuer.typesAndValues[i].value.valueBlock.value !== + issuerAndSerialNumber.issuer.typesAndValues[i].value + .valueBlock.value + ) { + certMatch = false; + break; + } } } else { - certMatch = false; + certMatch = false; } - - if (certMatch && cert.serialNumber.valueBlock.valueHexView.join('') === issuerAndSerialNumber.serialNumber.valueBlock.valueHexView.join('')) { + + if ( + certMatch && + cert.serialNumber.valueBlock.valueHexView.join("") === + issuerAndSerialNumber.serialNumber.valueBlock.valueHexView.join( + "" + ) + ) { signerCertificate = cert; break; } @@ -452,74 +491,87 @@ const VerifyDocument = () => { } if (signerCertificate) { - certSubject = signerCertificate.subject.typesAndValues.map(tv => `${tv.type}=${tv.value.valueBlock.value}`).join(', '); - certIssuer = signerCertificate.issuer.typesAndValues.map(tv => `${tv.type}=${tv.value.valueBlock.value}`).join(', '); - signerInfoText = `${t('signer')}: ${certSubject}, ${t('issuer')}: ${certIssuer}`; - + certSubject = signerCertificate.subject.typesAndValues + .map((tv) => `${tv.type}=${tv.value.valueBlock.value}`) + .join(", "); + certIssuer = signerCertificate.issuer.typesAndValues + .map((tv) => `${tv.type}=${tv.value.valueBlock.value}`) + .join(", "); + signerInfoText = `${t("signer")}: ${certSubject}, ${t("issuer")}: ${certIssuer}`; + const notBefore = signerCertificate.notBefore.value; const notAfter = signerCertificate.notAfter.value; const currentDate = new Date(); - certValidity = `${t('valid-from')} ${notBefore.toLocaleDateString()} ${t('to')} ${notAfter.toLocaleDateString()}`; + certValidity = `${t("valid-from")} ${notBefore.toLocaleDateString()} ${t("to")} ${notAfter.toLocaleDateString()}`; if (currentDate < notBefore || currentDate > notAfter) { - certValidity += ` (${t('expired-or-not-yet-valid')})`; - isValid = false; // Explicitly false if expired + certValidity += ` (${t("expired-or-not-yet-valid")})`; + isValid = false; // Explicitly false if expired } else { - certValidity += ` (${t('valid')})`; - isValid = true; + certValidity += ` (${t("valid")})`; + isValid = true; } } else { - signerInfoText = t('signer-certificate-not-found'); // New i18n key + signerInfoText = t("signer-certificate-not-found"); // New i18n key } } else { - signerInfoText = t('no-certificates-in-signature'); // New i18n key + signerInfoText = t("no-certificates-in-signature"); // New i18n key } } else { - signerInfoText = t('no-signer-info-in-pkcs7'); // Re-use existing key, or make new one + signerInfoText = t("no-signer-info-in-pkcs7"); // Re-use existing key, or make new one } results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: isValid ? t('signature-valid-basic') : t('signature-invalid-basic'), + name: field.getName() || t("unnamed-signature-field"), + status: isValid + ? t("signature-valid-basic") + : t("signature-invalid-basic"), signerInfo: signerInfoText, certificateSubject: certSubject, certificateIssuer: certIssuer, certificateValidity: certValidity, - errorDetails: !isValid && signerInfoText === t('signer-info-not-available') ? t('could-not-parse-signer-info') : undefined, // New i18n key + errorDetails: + !isValid && signerInfoText === t("signer-info-not-available") + ? t("could-not-parse-signer-info") + : undefined // New i18n key }); - } catch (e) { - console.error('Error processing signature field with pkijs:', field.getName(), e); - results.push({ - name: field.getName() || t('unnamed-signature-field'), - status: t('error-processing-signature'), - errorDetails: e.message, - signerInfo: t('signer-info-not-available'), - certificateSubject: '', - certificateIssuer: '', - certificateValidity: t('cert-validity-not-checked'), + console.error( + "Error processing signature field with pkijs:", + field.getName(), + e + ); + results.push({ + name: field.getName() || t("unnamed-signature-field"), + status: t("error-processing-signature"), + errorDetails: e.message, + signerInfo: t("signer-info-not-available"), + certificateSubject: "", + certificateIssuer: "", + certificateValidity: t("cert-validity-not-checked") }); } } return { results }; }; - const handleVerifyDocument = async () => { // Removed jsrsasignStatus check if (!fileBuffer) { - setVerificationResult(t('please-select-file-to-verify')); + setVerificationResult(t("please-select-file-to-verify")); setDetailedResults([]); return; } - setVerificationResult(t('verification-in-progress')); + setVerificationResult(t("verification-in-progress")); setDetailedResults([]); try { // Removed window.KJUR and window.X509 check - const pdfDoc = await PDFDocument.load(fileBuffer, { ignoreEncryption: true }); + const pdfDoc = await PDFDocument.load(fileBuffer, { + ignoreEncryption: true + }); const signatureInfo = await parseSignature(pdfDoc); if (signatureInfo.error) { @@ -527,14 +579,23 @@ const VerifyDocument = () => { } else if (signatureInfo.results && signatureInfo.results.length > 0) { setDetailedResults(signatureInfo.results); // Overall status can be determined by checking if all signatures are valid - const allValid = signatureInfo.results.every(res => res.status === t('signature-valid-basic')); - setVerificationResult(allValid ? t('all-signatures-verified-convincing') : t('some-signatures-invalid-basic')); + const allValid = signatureInfo.results.every( + (res) => res.status === t("signature-valid-basic") + ); + setVerificationResult( + allValid + ? t("all-signatures-verified-convincing") + : t("some-signatures-invalid-basic") + ); } else { - setVerificationResult(t('no-signatures-processed')); // Should be caught by no-signature-found earlier + setVerificationResult(t("no-signatures-processed")); // Should be caught by no-signature-found earlier } } catch (e) { - console.error('Error during PDF processing or signature verification:', e); - setVerificationResult(`${t('error-verifying-pdf')}: ${e.message}`); + console.error( + "Error during PDF processing or signature verification:", + e + ); + setVerificationResult(`${t("error-verifying-pdf")}: ${e.message}`); setDetailedResults([]); } }; @@ -594,7 +655,7 @@ const VerifyDocument = () => { } `}</style> <h1 className="text-3xl font-bold mb-6 text-center text-base-content"> - {t('verify-document-signature')} + {t("verify-document-signature")} </h1> <div className="mb-6 p-6 border border-base-300 rounded-lg bg-base-200/30 shadow-sm"> @@ -602,7 +663,7 @@ const VerifyDocument = () => { htmlFor="document-upload" className="block text-lg font-medium text-base-content mb-2" > - {t('select-pdf-document')} + {t("select-pdf-document")} </label> <input type="file" @@ -613,7 +674,7 @@ const VerifyDocument = () => { /> {selectedFile && ( <p className="mt-2 text-sm text-base-content w-full truncate"> - {t('selected-file')}: {selectedFile.name} + {t("selected-file")}: {selectedFile.name} </p> )} </div> @@ -622,240 +683,388 @@ const VerifyDocument = () => { <button onClick={handleVerifyDocument} className="op-btn op-btn-primary op-btn-md" - disabled={!selectedFile || verificationResult === t('verification-in-progress')} + disabled={ + !selectedFile || + verificationResult === t("verification-in-progress") + } > {/* Removed jsrsasignStatus === 'loading' condition for spinner */} - {verificationResult === t('verification-in-progress') ? ( + {verificationResult === t("verification-in-progress") ? ( <span className="loading loading-spinner"></span> ) : ( - t('verify-signature') + t("verify-signature") )} </button> </div> - {verificationResult && verificationResult !== t('verification-in-progress') && ( - <div className="mt-8 p-6 border border-base-300 rounded-lg bg-base-200 shadow-md min-h-[120px] flex flex-col items-center justify-center"> - <h2 className="text-2xl font-bold mb-4 text-base-content text-center"> - {t('verification-status')} - </h2> - {verificationResult === "Document Verified: All signatures have been successfully validated." && ( - <div className="flex flex-col items-center my-4"> - <svg className="checkmark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52"> - <circle className="checkmark__circle" cx="26" cy="26" r="25" fill="none"/> - <path className="checkmark__check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8"/> - </svg> - </div> - )} - <p className="text-lg text-base-content mb-4 text-center">{verificationResult}</p> - {detailedResults.length > 0 && ( - <div className="w-full space-y-6"> - {detailedResults.map((res, index) => { - const signerInfo = parseCertificateInfo(res.certificateSubject); - const issuerInfo = parseCertificateInfo(res.certificateIssuer); - - return ( - <div key={index} className="bg-white border border-gray-200 rounded-xl shadow-lg overflow-hidden"> - {/* Header Section */} - <div className="bg-gradient-to-r from-blue-600 to-indigo-600 text-white p-6"> - <div className="flex items-center space-x-3"> - <span className="text-2xl">🔏</span> - <div> - <h4 className="text-xl font-bold">Signature Details</h4> - <p className="text-blue-100 text-sm">Digital Certificate Information</p> + {verificationResult && + verificationResult !== t("verification-in-progress") && ( + <div className="mt-8 p-6 border border-base-300 rounded-lg bg-base-200 shadow-md min-h-[120px] flex flex-col items-center justify-center"> + <h2 className="text-2xl font-bold mb-4 text-base-content text-center"> + {t("verification-status")} + </h2> + {verificationResult === + "Document Verified: All signatures have been successfully validated." && ( + <div className="flex flex-col items-center my-4"> + <svg + className="checkmark" + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 52 52" + > + <circle + className="checkmark__circle" + cx="26" + cy="26" + r="25" + fill="none" + /> + <path + className="checkmark__check" + fill="none" + d="M14.1 27.2l7.1 7.2 16.7-16.8" + /> + </svg> + </div> + )} + <p className="text-lg text-base-content mb-4 text-center"> + {verificationResult} + </p> + {detailedResults.length > 0 && ( + <div className="w-full space-y-6"> + {detailedResults.map((res, index) => { + const signerInfo = parseCertificateInfo( + res.certificateSubject + ); + const issuerInfo = parseCertificateInfo( + res.certificateIssuer + ); + + return ( + <div + key={index} + className="bg-white border border-gray-200 rounded-xl shadow-lg overflow-hidden" + > + {/* Header Section */} + <div className="bg-gradient-to-r from-blue-600 to-indigo-600 text-white p-6"> + <div className="flex items-center space-x-3"> + <span className="text-2xl">🔏</span> + <div> + <h4 className="text-xl font-bold"> + Signature Details + </h4> + <p className="text-blue-100 text-sm"> + Digital Certificate Information + </p> + </div> </div> </div> - </div> - {/* Basic Info Section */} - <div className="p-6 border-b border-gray-100"> - <div className="grid grid-cols-1 md:grid-cols-2 gap-4"> - <div> - <span className="text-sm font-medium text-gray-500 uppercase tracking-wide">Field Name</span> - <p className="mt-1 text-lg font-semibold text-gray-900 font-mono">{res.name}</p> - </div> - <div> - <span className="text-sm font-medium text-gray-500 uppercase tracking-wide">Overall Status</span> - <div className="mt-1 flex items-center space-x-2"> - <span className={`text-lg ${isSuccessStatus(res.status) ? 'text-green-600' : 'text-red-600'}`}> - {isSuccessStatus(res.status) ? '✅' : '❌'} + {/* Basic Info Section */} + <div className="p-6 border-b border-gray-100"> + <div className="grid grid-cols-1 md:grid-cols-2 gap-4"> + <div> + <span className="text-sm font-medium text-gray-500 uppercase tracking-wide"> + Field Name + </span> + <p className="mt-1 text-lg font-semibold text-gray-900 font-mono"> + {res.name} + </p> + </div> + <div> + <span className="text-sm font-medium text-gray-500 uppercase tracking-wide"> + Overall Status </span> - <span className="text-lg font-semibold text-gray-900">{res.status}</span> + <div className="mt-1 flex items-center space-x-2"> + <span + className={`text-lg ${isSuccessStatus(res.status) ? "text-green-600" : "text-red-600"}`} + > + {isSuccessStatus(res.status) ? "✅" : "❌"} + </span> + <span className="text-lg font-semibold text-gray-900"> + {res.status} + </span> + </div> </div> </div> </div> - </div> - {/* Signer Information Section */} - {Object.keys(signerInfo).length > 0 && ( - <div className="border-b border-gray-100"> - <button - onClick={() => toggleSection(index, 'signer')} - className="w-full px-6 py-4 text-left hover:bg-gray-50 transition-colors duration-200 focus:outline-none focus:bg-gray-50" - > - <div className="flex items-center justify-between"> - <div className="flex items-center space-x-3"> - <span className="text-xl">📇</span> - <h5 className="text-lg font-semibold text-gray-900">Signer Information</h5> + {/* Signer Information Section */} + {Object.keys(signerInfo).length > 0 && ( + <div className="border-b border-gray-100"> + <button + onClick={() => toggleSection(index, "signer")} + className="w-full px-6 py-4 text-left hover:bg-gray-50 transition-colors duration-200 focus:outline-none focus:bg-gray-50" + > + <div className="flex items-center justify-between"> + <div className="flex items-center space-x-3"> + <span className="text-xl">📇</span> + <h5 className="text-lg font-semibold text-gray-900"> + Signer Information + </h5> + </div> + <svg + className={`w-5 h-5 text-gray-400 transition-transform duration-200 ${ + collapsedSections[`${index}-signer`] + ? "transform rotate-180" + : "" + }`} + fill="none" + stroke="currentColor" + viewBox="0 0 24 24" + > + <path + strokeLinecap="round" + strokeLinejoin="round" + strokeWidth={2} + d="M19 9l-7 7-7-7" + /> + </svg> </div> - <svg - className={`w-5 h-5 text-gray-400 transition-transform duration-200 ${ - collapsedSections[`${index}-signer`] ? 'transform rotate-180' : '' - }`} - fill="none" - stroke="currentColor" - viewBox="0 0 24 24" - > - <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" /> - </svg> - </div> - </button> - {!collapsedSections[`${index}-signer`] && ( - <div className="px-6 pb-6"> - <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"> - {Object.entries(signerInfo).map(([label, value]) => ( - <div key={label} className="bg-gray-50 rounded-lg p-4"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide">{label}</span> - <p className="mt-1 text-sm font-mono text-gray-900 break-all">{value}</p> - </div> - ))} + </button> + {!collapsedSections[`${index}-signer`] && ( + <div className="px-6 pb-6"> + <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"> + {Object.entries(signerInfo).map( + ([label, value]) => ( + <div + key={label} + className="bg-gray-50 rounded-lg p-4" + > + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide"> + {label} + </span> + <p className="mt-1 text-sm font-mono text-gray-900 break-all"> + {value} + </p> + </div> + ) + )} + </div> </div> - </div> - )} - </div> - )} - - {/* Issuer Information Section */} - {Object.keys(issuerInfo).length > 0 && ( - <div className="border-b border-gray-100"> - <button - onClick={() => toggleSection(index, 'issuer')} - className="w-full px-6 py-4 text-left hover:bg-gray-50 transition-colors duration-200 focus:outline-none focus:bg-gray-50" - > - <div className="flex items-center justify-between"> - <div className="flex items-center space-x-3"> - <span className="text-xl">🏢</span> - <h5 className="text-lg font-semibold text-gray-900">Issuer Details</h5> + )} + </div> + )} + + {/* Issuer Information Section */} + {Object.keys(issuerInfo).length > 0 && ( + <div className="border-b border-gray-100"> + <button + onClick={() => toggleSection(index, "issuer")} + className="w-full px-6 py-4 text-left hover:bg-gray-50 transition-colors duration-200 focus:outline-none focus:bg-gray-50" + > + <div className="flex items-center justify-between"> + <div className="flex items-center space-x-3"> + <span className="text-xl">🏢</span> + <h5 className="text-lg font-semibold text-gray-900"> + Issuer Details + </h5> + </div> + <svg + className={`w-5 h-5 text-gray-400 transition-transform duration-200 ${ + collapsedSections[`${index}-issuer`] + ? "transform rotate-180" + : "" + }`} + fill="none" + stroke="currentColor" + viewBox="0 0 24 24" + > + <path + strokeLinecap="round" + strokeLinejoin="round" + strokeWidth={2} + d="M19 9l-7 7-7-7" + /> + </svg> + </div> + </button> + {!collapsedSections[`${index}-issuer`] && ( + <div className="px-6 pb-6"> + <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"> + {Object.entries(issuerInfo).map( + ([label, value]) => ( + <div + key={label} + className="bg-gray-50 rounded-lg p-4" + > + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide"> + {label} + </span> + <p className="mt-1 text-sm font-mono text-gray-900 break-all"> + {value} + </p> + </div> + ) + )} + </div> </div> - <svg - className={`w-5 h-5 text-gray-400 transition-transform duration-200 ${ - collapsedSections[`${index}-issuer`] ? 'transform rotate-180' : '' - }`} - fill="none" - stroke="currentColor" - viewBox="0 0 24 24" - > - <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" /> - </svg> + )} + </div> + )} + + {/* Certificate Validity Section */} + {res.certificateValidity && ( + <div className="p-6 bg-gray-50"> + <div className="flex items-center space-x-3 mb-4"> + <span className="text-xl">🕒</span> + <h5 className="text-lg font-semibold text-gray-900"> + Certificate Validity + </h5> </div> - </button> - {!collapsedSections[`${index}-issuer`] && ( - <div className="px-6 pb-6"> - <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"> - {Object.entries(issuerInfo).map(([label, value]) => ( - <div key={label} className="bg-gray-50 rounded-lg p-4"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide">{label}</span> - <p className="mt-1 text-sm font-mono text-gray-900 break-all">{value}</p> - </div> - ))} + <div className="bg-white rounded-lg p-4 border"> + <div className="flex items-center space-x-2"> + <span + className={`text-lg ${isCertificateValid(res.certificateValidity) ? "text-green-600" : "text-red-600"}`} + > + {isCertificateValid(res.certificateValidity) + ? "✅" + : "❌"} + </span> + <span className="text-sm font-mono text-gray-900"> + {res.certificateValidity} + </span> </div> </div> - )} - </div> - )} - - {/* Certificate Validity Section */} - {res.certificateValidity && ( - <div className="p-6 bg-gray-50"> - <div className="flex items-center space-x-3 mb-4"> - <span className="text-xl">🕒</span> - <h5 className="text-lg font-semibold text-gray-900">Certificate Validity</h5> </div> - <div className="bg-white rounded-lg p-4 border"> - <div className="flex items-center space-x-2"> - <span className={`text-lg ${isCertificateValid(res.certificateValidity) ? 'text-green-600' : 'text-red-600'}`}> - {isCertificateValid(res.certificateValidity) ? '✅' : '❌'} - </span> - <span className="text-sm font-mono text-gray-900">{res.certificateValidity}</span> - </div> + )} + + {/* Technical Details Section (if any) */} + {(res.calculatedDocumentHash || + res.messageDigestInSignature || + res.hashComparisonResult || + res.authenticatedAttributesSignatureResult || + res.errorDetails || + res.certificateSubject || + res.certificateIssuer) && ( + <div className="p-6 bg-gray-50 border-t"> + <details className="group"> + <summary className="flex items-center justify-between cursor-pointer text-sm font-medium text-gray-700 hover:text-gray-900"> + <span>🔧 Technical Details</span> + <svg + className="w-4 h-4 transition-transform group-open:rotate-180" + fill="none" + stroke="currentColor" + viewBox="0 0 24 24" + > + <path + strokeLinecap="round" + strokeLinejoin="round" + strokeWidth={2} + d="M19 9l-7 7-7-7" + /> + </svg> + </summary> + <div className="mt-4 space-y-3"> + {/* Raw Certificate Data */} + {res.certificateSubject && ( + <div className="bg-white rounded p-3 border"> + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1"> + Raw Certificate Subject + </span> + <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block"> + {res.certificateSubject} + </code> + </div> + )} + {res.certificateIssuer && ( + <div className="bg-white rounded p-3 border"> + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1"> + Raw Certificate Issuer + </span> + <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block"> + {res.certificateIssuer} + </code> + </div> + )} + {res.calculatedDocumentHash && + res.calculatedDocumentHash !== + t("not-available") && + res.calculatedDocumentHash !== + t("not-calculated") && ( + <div className="bg-white rounded p-3 border"> + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1"> + Calculated Document Hash + </span> + <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block"> + {res.calculatedDocumentHash} + </code> + </div> + )} + {res.messageDigestInSignature && + res.messageDigestInSignature !== + t("not-available") && + res.messageDigestInSignature !== + t("not-found-in-signature") && ( + <div className="bg-white rounded p-3 border"> + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1"> + Message Digest in Signature + </span> + <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block"> + {res.messageDigestInSignature} + </code> + </div> + )} + {res.hashComparisonResult && + res.hashComparisonResult !== + t("not-performed") && ( + <div className="bg-white rounded p-3 border"> + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1"> + Hash Comparison + </span> + <span className="text-sm text-gray-800"> + {res.hashComparisonResult} + </span> + </div> + )} + {res.authenticatedAttributesSignatureResult && + res.authenticatedAttributesSignatureResult !== + t("not-performed") && ( + <div className="bg-white rounded p-3 border"> + <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1"> + Attributes Signature Verification + </span> + <span className="text-sm text-gray-800"> + { + res.authenticatedAttributesSignatureResult + } + </span> + </div> + )} + {res.errorDetails && ( + <div className="bg-red-50 border border-red-200 rounded p-3"> + <span className="text-xs font-medium text-red-600 uppercase tracking-wide block mb-1"> + Error Details + </span> + <span className="text-sm text-red-800"> + {res.errorDetails} + </span> + </div> + )} + </div> + </details> </div> - </div> - )} - - {/* Technical Details Section (if any) */} - {(res.calculatedDocumentHash || res.messageDigestInSignature || res.hashComparisonResult || res.authenticatedAttributesSignatureResult || res.errorDetails || res.certificateSubject || res.certificateIssuer) && ( - <div className="p-6 bg-gray-50 border-t"> - <details className="group"> - <summary className="flex items-center justify-between cursor-pointer text-sm font-medium text-gray-700 hover:text-gray-900"> - <span>🔧 Technical Details</span> - <svg className="w-4 h-4 transition-transform group-open:rotate-180" fill="none" stroke="currentColor" viewBox="0 0 24 24"> - <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" /> - </svg> - </summary> - <div className="mt-4 space-y-3"> - {/* Raw Certificate Data */} - {res.certificateSubject && ( - <div className="bg-white rounded p-3 border"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1">Raw Certificate Subject</span> - <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block">{res.certificateSubject}</code> - </div> - )} - {res.certificateIssuer && ( - <div className="bg-white rounded p-3 border"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1">Raw Certificate Issuer</span> - <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block">{res.certificateIssuer}</code> - </div> - )} - {res.calculatedDocumentHash && res.calculatedDocumentHash !== t('not-available') && res.calculatedDocumentHash !== t('not-calculated') && ( - <div className="bg-white rounded p-3 border"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1">Calculated Document Hash</span> - <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block">{res.calculatedDocumentHash}</code> - </div> - )} - {res.messageDigestInSignature && res.messageDigestInSignature !== t('not-available') && res.messageDigestInSignature !== t('not-found-in-signature') && ( - <div className="bg-white rounded p-3 border"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1">Message Digest in Signature</span> - <code className="text-xs text-gray-800 break-all bg-gray-100 p-2 rounded block">{res.messageDigestInSignature}</code> - </div> - )} - {res.hashComparisonResult && res.hashComparisonResult !== t('not-performed') && ( - <div className="bg-white rounded p-3 border"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1">Hash Comparison</span> - <span className="text-sm text-gray-800">{res.hashComparisonResult}</span> - </div> - )} - {res.authenticatedAttributesSignatureResult && res.authenticatedAttributesSignatureResult !== t('not-performed') && ( - <div className="bg-white rounded p-3 border"> - <span className="text-xs font-medium text-gray-500 uppercase tracking-wide block mb-1">Attributes Signature Verification</span> - <span className="text-sm text-gray-800">{res.authenticatedAttributesSignatureResult}</span> - </div> - )} - {res.errorDetails && ( - <div className="bg-red-50 border border-red-200 rounded p-3"> - <span className="text-xs font-medium text-red-600 uppercase tracking-wide block mb-1">Error Details</span> - <span className="text-sm text-red-800">{res.errorDetails}</span> - </div> - )} - </div> - </details> - </div> - )} - </div> - ); - })} - </div> - )} + )} + </div> + ); + })} + </div> + )} + </div> + )} + {verificationResult === t("verification-in-progress") && ( + <div className="mt-8 p-4 border border-base-300 rounded-lg bg-base-200 min-h-[100px] flex justify-center items-center"> + <span className="loading loading-lg loading-dots"></span> </div> )} - {verificationResult === t('verification-in-progress') && ( - <div className="mt-8 p-4 border border-base-300 rounded-lg bg-base-200 min-h-[100px] flex justify-center items-center"> - <span className="loading loading-lg loading-dots"></span> - </div> - )} {!verificationResult && !selectedFile && ( - <div className="mt-8 p-4 border border-base-300 rounded-lg bg-base-200 min-h-[100px] flex justify-center items-center"> {/* Added flex for centering */} - <p className="text-base-content/60 italic text-center">{t('verification-results-will-appear-here')}</p> - </div> + <div className="mt-8 p-4 border border-base-300 rounded-lg bg-base-200 min-h-[100px] flex justify-center items-center"> + {" "} + {/* Added flex for centering */} + <p className="text-base-content/60 italic text-center"> + {t("verification-results-will-appear-here")} + </p> + </div> )} </div> ); diff --git a/apps/OpenSign/src/polyfills.js b/apps/OpenSign/src/polyfills.js index fb63675d13..9ca76e5f23 100644 --- a/apps/OpenSign/src/polyfills.js +++ b/apps/OpenSign/src/polyfills.js @@ -13,4 +13,4 @@ if (typeof Promise.withResolvers === "undefined") { // Usage: // const { promise, resolve, reject } = Promise.withResolvers() // console.log(promise, resolve, reject) // Promise { <pending> } [Function (anonymous)] [Function (anonymous)] -// ... Do something async and then call resolve or reject! \ No newline at end of file +// ... Do something async and then call resolve or reject! diff --git a/apps/OpenSign/src/primitives/AddContact.jsx b/apps/OpenSign/src/primitives/AddContact.jsx index e73ad291a4..255b08c26b 100644 --- a/apps/OpenSign/src/primitives/AddContact.jsx +++ b/apps/OpenSign/src/primitives/AddContact.jsx @@ -9,9 +9,12 @@ const AddContact = (props) => { const [name, setName] = useState(""); const [phone, setPhone] = useState(""); const [email, setEmail] = useState(""); + const [jobTitle, setJobTitle] = useState(""); + const [company, setCompany] = useState(""); const [addYourself, setAddYourself] = useState(false); const [isLoader, setIsLoader] = useState(false); const [isUserExist, setIsUserExist] = useState(false); + const [isOptionalDetails, setIsOptionalDetails] = useState(false); useEffect(() => { checkUserExist(); @@ -26,6 +29,8 @@ const AddContact = (props) => { setName(savedUserDetails.name); setPhone(savedUserDetails?.phone || ""); setEmail(savedUserDetails.email); + setJobTitle(savedUserDetails?.jobTitle || ""); + setCompany(savedUserDetails?.company || ""); } }, [addYourself]); @@ -54,7 +59,7 @@ const AddContact = (props) => { e.preventDefault(); e.stopPropagation(); if (!emailRegex.test(email)) { - alert("Please enter a valid email address."); + alert(t("valid-email-alert")); } else { setIsLoader(true); const user = JSON.parse( @@ -75,7 +80,7 @@ const AddContact = (props) => { { "X-Parse-Session-Token": localStorage.getItem("accesstoken") }; - const data = { name, email, phone, tenantId }; + const data = { name, email, phone, tenantId, jobTitle, company }; const headers = { "Content-Type": "application/json", "X-Parse-Application-Id": localStorage.getItem("parseAppId"), @@ -84,15 +89,12 @@ const AddContact = (props) => { const axiosRes = await axios.post(url, data, { headers }); const contactRes = axiosRes?.data?.result || {}; if (contactRes?.objectId) { - props.details(contactRes); + props.details(contactRes, props?.newContactId); if (props.closePopup) { props.closePopup(); setIsLoader(false); // Reset the form fields - setAddYourself(false); - setName(""); - setPhone(""); - setEmail(""); + handleReset(); } } } catch (err) { @@ -114,10 +116,7 @@ const AddContact = (props) => { // Define a function to handle the "add yourself" checkbox const handleAddYourselfChange = () => { if (addYourself) { - setAddYourself(false); - setName(""); - setPhone(""); - setEmail(""); + handleReset(); } else { setAddYourself(true); } @@ -127,6 +126,8 @@ const AddContact = (props) => { setName(""); setPhone(""); setEmail(""); + setJobTitle(""); + setCompany(""); }; return ( @@ -140,7 +141,7 @@ const AddContact = (props) => { {!props?.isDisableTitle && ( <div className="text-[14px] font-[700]">{t("add-contact")}</div> )} - {isUserExist && ( + {isUserExist && props?.isAddYourSelfCheckbox && ( <div className="mb-[0.75rem] flex items-center mt-1"> <input type="checkbox" @@ -194,20 +195,63 @@ const AddContact = (props) => { className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs lowercase" /> </div> - <div className="mb-[0.75rem]"> - <label htmlFor="phone" className="text-[13px]"> - {t("phone")} - </label> - <input - type="text" - id="phone" - value={phone} - onChange={(e) => setPhone(e.target.value)} - disabled={addYourself} - className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" - placeholder={t("phone-optional")} - /> - </div> + {isOptionalDetails && ( + <> + <div className="mb-[0.75rem]"> + <label htmlFor="phone" className="text-[13px]"> + {t("phone")} + </label> + <input + type="text" + id="phone" + value={phone} + onChange={(e) => setPhone(e.target.value)} + // disabled={addYourself} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + placeholder={t("phone-optional")} + /> + </div> + <div className="mb-[0.75rem]"> + <label htmlFor="company" className="text-[13px]"> + {t("company")} + </label> + <input + type="text" + id="company" + value={company} + onChange={(e) => setCompany(e.target.value)} + // disabled={addYourself} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + placeholder={t("phone-optional")} + /> + </div> + <div className="mb-[0.75rem]"> + <label htmlFor="jobTitle" className="text-[13px]"> + {t("job-title")} + </label> + <input + type="text" + id="jobTitle" + value={jobTitle} + onChange={(e) => setJobTitle(e.target.value)} + // disabled={addYourself} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + placeholder={t("phone-optional")} + /> + </div> + </> + )} + <button + onClick={(e) => { + e.preventDefault(); + setIsOptionalDetails(!isOptionalDetails); + }} + className="op-link op-link-secondary no-underline hover:underline" + > + {isOptionalDetails + ? t("hide-optional-details") + : t("optional-details")} + </button> <div className="mt-6 flex justify-start gap-2"> <button type="submit" className="op-btn op-btn-primary"> diff --git a/apps/OpenSign/src/primitives/DeleteUserModal.jsx b/apps/OpenSign/src/primitives/DeleteUserModal.jsx new file mode 100644 index 0000000000..36a45d61ac --- /dev/null +++ b/apps/OpenSign/src/primitives/DeleteUserModal.jsx @@ -0,0 +1,127 @@ +import { useState, useEffect, useMemo, useRef } from "react"; +import ModalUi from "./ModalUi"; +import Loader from "./Loader"; +import { Trans, useTranslation } from "react-i18next"; + +const DeleteUserModal = ({ + isOpen, + userEmail, + deleting = false, + deleteRes, + onConfirm, + handleClose +}) => { + const { t } = useTranslation(); + const [confirmEmail, setConfirmEmail] = useState(""); + const [error, setError] = useState(null); + const inputRef = useRef(null); + + // Reset and focus when modal opens + useEffect(() => { + if (isOpen) { + setConfirmEmail(""); + setError(null); + // small timeout to ensure the modal is mounted before focusing + setTimeout(() => inputRef.current?.focus(), 50); + } + }, [isOpen]); + + // Adjust matching rule as needed (strict vs case-insensitive) + const isMatch = useMemo(() => { + const a = confirmEmail.trim().toLowerCase(); + const b = userEmail.trim().toLowerCase(); + return a.length > 0 && a === b; + }, [confirmEmail, userEmail]); + + const handleSubmit = async (e) => { + e?.preventDefault(); + e?.stopPropagation(); + setError(null); + if (!isMatch || deleting) return; + try { + await onConfirm(); + } catch (err) { + console.log("err ", err); + setError(err?.message || t("something-went-wron-mssg")); + } + }; + + return ( + <ModalUi + title={t("delete-account")} + isOpen={isOpen} + handleClose={() => !deleting && handleClose()} + > + {deleting ? ( + <div className="h-[100px] flex justify-center items-center"> + <Loader /> + </div> + ) : ( + <> + {deleteRes ? ( + <div className="h-[100px] flex justify-center items-center text-sm md:text-base"> + {deleteRes} + </div> + ) : ( + <form + className="px-6 mb-3 mt-2 text-base-content text-sm md:text-base" + onSubmit={(e) => handleSubmit(e)} + > + <p className="text-base-content"> + {t("delete-account-que-user")} + </p> + <label className="mt-2 mb-0"> + <p className="text-xs text-base-content cursor-text mb-1"> + <Trans + i18nKey={"please-type-to-confirm"} + values={{ userEmail }} + components={{ 1: <b /> }} + /> + </p> + <input + type="text" + value={confirmEmail} + onChange={(e) => setConfirmEmail(e.target.value?.trim())} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + aria-invalid={!isMatch && confirmEmail.length > 0} + required + /> + <div className="op-label h-5"> + {!isMatch && confirmEmail.length > 0 ? ( + <span className="op-label-text-alt text-error"> + {t("email-does-not-match")} + </span> + ) : ( + <span className="op-label-text-alt"> + {error ? error : <> </>} + </span> + )} + </div> + </label> + + <div className="mt-1"> + <button + type="submit" + className="op-btn op-btn-primary w-[100px]" + disabled={!isMatch || deleting} + aria-disabled={!isMatch || deleting} + title={!isMatch ? t("type-exact-email-delete") : t("delete")} + > + {t("delete")} + </button> + <button + className="op-btn op-btn-secondary ml-2 w-[100px]" + onClick={handleClose} + > + {t("cancel")} + </button> + </div> + </form> + )} + </> + )} + </ModalUi> + ); +}; + +export default DeleteUserModal; diff --git a/apps/OpenSign/src/primitives/DownloadPdfZip.jsx b/apps/OpenSign/src/primitives/DownloadPdfZip.jsx index f6e59d21e7..19199709e3 100644 --- a/apps/OpenSign/src/primitives/DownloadPdfZip.jsx +++ b/apps/OpenSign/src/primitives/DownloadPdfZip.jsx @@ -5,7 +5,7 @@ import { getSignedUrl, handleDownloadCertificate, handleDownloadPdf, - sanitizeFileName + fileNameWithUnderscore } from "../constant/Utils"; import Loader from "./Loader"; import JSZip from "jszip"; @@ -67,7 +67,7 @@ function DownloadPdfZip(props) { const pdf2Blob = await pdf2Response.blob(); // Add files to ZIP zip.file( - `${sanitizeFileName(pdfName)}_signed_by_${appName}.pdf`, + `${fileNameWithUnderscore(pdfName)}_signed_by_${appName}.pdf`, pdf1Blob ); zip.file(`Certificate_signed_by_${appName}.pdf`, pdf2Blob); @@ -75,13 +75,17 @@ function DownloadPdfZip(props) { const zipBlob = await zip.generateAsync({ type: "blob" }); saveAs( zipBlob, - `${sanitizeFileName(pdfName)}_signed_by_${appName}.zip` + `${fileNameWithUnderscore(pdfName)}_signed_by_${appName}.zip` ); setSelectType(1); props.setIsDownloadModal(false); setIsDownloading(""); } catch (error) { - console.error("Error creating ZIP file:", error); + alert(t("something-went-wrong-mssg")); + setSelectType(1); + props.setIsDownloadModal(false); + setIsDownloading(""); + console.log("Error creating ZIP file:", error); } } }; diff --git a/apps/OpenSign/src/primitives/GetReportDisplay.jsx b/apps/OpenSign/src/primitives/GetReportDisplay.jsx deleted file mode 100644 index ebc0d45be0..0000000000 --- a/apps/OpenSign/src/primitives/GetReportDisplay.jsx +++ /dev/null @@ -1,2607 +0,0 @@ -import React, { useState, useEffect, useRef } from "react"; -import pad from "../assets/images/pad.svg"; -import recreatedoc from "../assets/images/recreatedoc.png"; -import { Link, useLocation, useNavigate } from "react-router"; -import axios from "axios"; -import ModalUi from "./ModalUi"; -import AddSigner from "../components/AddSigner"; -import { - emailRegex, - iconColor, -} from "../constant/const"; -import Alert from "./Alert"; -import Tooltip from "./Tooltip"; -import ShareButton from "./ShareButton"; -import Tour from "../primitives/Tour"; -import Parse from "parse"; -import { - copytoData, - fetchUrl, - formatDate, - formatDateTime, - getSignedUrl, - getTenantDetails, - handleSignatureType, - replaceMailVaribles, - signatureTypes, - openInNewTab -} from "../constant/Utils"; -import EditorToolbar, { - module1, - formats -} from "../components/pdf/EditorToolbar"; -import ReactQuill from "react-quill-new"; -import "../styles/quill.css"; -import BulkSendUi from "../components/BulkSendUi"; -import Loader from "./Loader"; -import { serverUrl_fn } from "../constant/appinfo"; -import { useTranslation } from "react-i18next"; -import DownloadPdfZip from "./DownloadPdfZip"; -import * as XLSX from "xlsx"; -import EditContactForm from "../components/EditContactForm"; -import { useElSize } from "../hook/useElSize"; - -const ReportTable = (props) => { - const copyUrlRef = useRef(null); - const titleRef = useRef(null); - const titleElement = useElSize(titleRef); - const appName = - "OpenSign™"; - const drivename = appName === "OpenSign™" ? "OpenSign™" : ""; - const { t } = useTranslation(); - const navigate = useNavigate(); - const location = useLocation(); - const isDashboard = - location?.pathname === "/dashboard/35KBoSgoAK" ? true : false; - const [currentPage, setCurrentPage] = useState(1); - const [actLoader, setActLoader] = useState({}); - const [isContactform, setIsContactform] = useState(false); - const [isDeleteModal, setIsDeleteModal] = useState({}); - const [isRevoke, setIsRevoke] = useState({}); - const [isShare, setIsShare] = useState({}); - const [shareUrls, setShareUrls] = useState([]); - const [copied, setCopied] = useState(false); - const [isOption, setIsOption] = useState({}); - const [alertMsg, setAlertMsg] = useState({ type: "success", message: "" }); - const [isTour, setIsTour] = useState(false); - const [tourStatusArr, setTourStatusArr] = useState([]); - const [isResendMail, setIsResendMail] = useState({}); - const [mail, setMail] = useState({ subject: "", body: "" }); - const [userDetails, setUserDetails] = useState({}); - const [isNextStep, setIsNextStep] = useState({}); - const [isBulkSend, setIsBulkSend] = useState({}); - const [templateDeatils, setTemplateDetails] = useState({}); - const [placeholders, setPlaceholders] = useState([]); - const [isLoader, setIsLoader] = useState({}); - const [isShareWith, setIsShareWith] = useState({}); - const [selectedTeam, setSelectedTeam] = useState([]); - const [isViewShare, setIsViewShare] = useState({}); - const [isModal, setIsModal] = useState({}); - const [reason, setReason] = useState(""); - const [isDownloadModal, setIsDownloadModal] = useState(false); - const [signatureType, setSignatureType] = useState([]); - const [expiryDate, setExpiryDate] = useState(""); - const Extand_Class = localStorage.getItem("Extand_Class"); - const extClass = Extand_Class && JSON.parse(Extand_Class); - const [importedData, setImportedData] = useState([]); - const [currentImportPage, setCurrentImportPage] = useState(1); - const [isShowAllSigners, setIsShowAllSigners] = useState({}); - const [invalidRecords, setInvalidRecords] = useState(0); - const [renameDoc, setRenameDoc] = useState(""); - const [contact, setContact] = useState({ Name: "", Email: "", Phone: "" }); - const [isSuccess, setIsSuccess] = useState({}); - const [templateId, setTemplateId] = useState(""); - const [sortOrder, setSortOrder] = useState("asc"); - const isTemplateReport = props.ReportName === "Templates"; - const recordsPerPage = 5; - const startIndex = (currentPage - 1) * props.docPerPage; - const { isMoreDocs, setIsNextRecord } = props; - - useEffect(() => { - if (props.isSearchResult) { - setCurrentPage(1); - } - }, [props.isSearchResult]); - - const getPaginationRange = () => { - const totalPageNumbers = 7; // Adjust this value to show more/less page numbers - const pages = []; - const totalPages = Math.ceil(props.List.length / props.docPerPage); - if (totalPages <= totalPageNumbers) { - for (let i = 1; i <= totalPages; i++) { - pages.push(i); - } - } else { - const leftSiblingIndex = Math.max(currentPage - 1, 1); - const rightSiblingIndex = Math.min(currentPage + 1, totalPages); - - const showLeftDots = leftSiblingIndex > 2; - const showRightDots = rightSiblingIndex < totalPages - 2; - - const firstPageIndex = 1; - const lastPageIndex = totalPages; - - if (!showLeftDots && showRightDots) { - let leftItemCount = 3; - let leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1); - - pages.push(...leftRange); - pages.push("..."); - pages.push(totalPages); - } else if (showLeftDots && !showRightDots) { - let rightItemCount = 3; - let rightRange = Array.from( - { length: rightItemCount }, - (_, i) => totalPages - rightItemCount + i + 1 - ); - - pages.push(firstPageIndex); - pages.push("..."); - pages.push(...rightRange); - } else if (showLeftDots && showRightDots) { - let middleRange = Array.from( - { length: 3 }, - (_, i) => leftSiblingIndex + i - ); - - pages.push(firstPageIndex); - pages.push("..."); - pages.push(...middleRange); - pages.push("..."); - pages.push(lastPageIndex); - } - } - - return pages; - }; - const showAlert = (type, message, time = 1500) => { - setAlertMsg({ type: type, message: message }); - setTimeout(() => setAlertMsg({ type: "", message: "" }), time); - }; - const pageNumbers = getPaginationRange(); - // below useEffect reset currenpage to 1 if user change route - useEffect(() => { - checkTourStatus(); - fetchTeamList(); - return () => setCurrentPage(1); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - // `fetchTeamList` is used to fetch team list for share with functionality - const fetchTeamList = async () => { - if (isTemplateReport) { - try { - const extUser = JSON.parse(localStorage.getItem("Extand_Class"))?.[0]; - if (extUser?.OrganizationId?.objectId) { - const teamtRes = await Parse.Cloud.run("getteams", { active: true }); - if (teamtRes.length > 0) { - const _teamRes = JSON.parse(JSON.stringify(teamtRes)); - const selected = _teamRes.map( - (x) => - x.Name === "All Users" && { - label: x.Name, - value: x.objectId - } - ); - setSelectedTeam(selected); - } - } - } catch (err) { - console.log("Err in fetch top level teamlist", err); - } - } - }; - // `formatRow` is used to show data in poper manner like - // if data is of array type then it will join array items with "," - // if data is of object type then it Name values will be show in row - // if no data available it will show hyphen "-" - const formatRow = (row) => { - if (Array.isArray(row)) { - let updateArr = row.map((x) => x.Name); - return updateArr.join(", "); - } else if (typeof row === "object" && row !== null) { - return row?.Name || "-"; - } else { - return "-"; - } - }; - // below useEffect is used to render next record if IsMoreDoc is true - // second last value of pageNumber array is same as currentPage - useEffect(() => { - if (isMoreDocs && pageNumbers[pageNumbers.length - 1] === currentPage) { - setIsNextRecord(true); - } - }, [isMoreDocs, pageNumbers, currentPage, setIsNextRecord]); - - //function to fetch tenant Details - const fetchTenantDetails = async () => { - const user = JSON.parse( - localStorage.getItem( - `Parse/${localStorage.getItem("parseAppId")}/currentUser` - ) - ); - if (user) { - try { - const tenantDetails = await getTenantDetails(user?.objectId); - if (tenantDetails && tenantDetails === "user does not exist!") { - alert(t("user-not-exist")); - } else if (tenantDetails) { - const signatureType = tenantDetails?.SignatureType || []; - const filterSignTypes = signatureType?.filter( - (x) => x.enabled === true - ); - return filterSignTypes; - } - } catch (e) { - alert(t("user-not-exist")); - } - } else { - alert(t("user-not-exist")); - } - }; - - // `handleURL` is used to open microapp - const handleURL = async (item, act) => { - if (isTemplateReport) { - if (act.hoverLabel === "Edit") { - navigate(`/${act.redirectUrl}/${item.objectId}`); - } else { - setActLoader({ [`${item.objectId}_${act.btnId}`]: true }); - handleUseTemplate(item.objectId, act.redirectUrl); - } - } else { - navigate(`/${act.redirectUrl}?docId=${item?.objectId}`); - } - }; - - const handleUseTemplate = async (templateId, redirectUrl) => { - try { - const params = { templateId: templateId }; - const templateDeatils = await axios.post( - `${localStorage.getItem("baseUrl")}functions/getTemplate`, - params, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - sessionToken: localStorage.getItem("accesstoken") - } - } - ); - const templateData = templateDeatils.data && templateDeatils.data.result; - if (!templateData.error) { - const Doc = templateData; - - let signers = []; - if (Doc.Signers?.length > 0) { - Doc.Signers?.forEach((x) => { - if (x.objectId) { - signers.push({ - __type: "Pointer", - className: "contracts_Contactbook", - objectId: x.objectId - }); - } - }); - } - - let extUserId = Doc.ExtUserPtr.objectId; - let creatorId = Doc.CreatedBy.objectId; - if (extClass && extClass.length > 0) { - if (Doc.ExtUserPtr?.objectId !== extClass[0].objectId) { - const Extand_Class = localStorage.getItem("Extand_Class"); - const extClass = Extand_Class && JSON.parse(Extand_Class); - if (extClass && extClass.length > 0) { - extUserId = extClass[0].objectId; - creatorId = extClass[0]?.UserId.objectId; - } - } - } - const tenantSignTypes = await fetchTenantDetails(); - const docSignTypes = Doc?.SignatureType || signatureTypes; - const updatedSignatureType = await handleSignatureType( - tenantSignTypes, - docSignTypes - ); - const SignatureType = - updatedSignatureType.length > 0 - ? { SignatureType: updatedSignatureType } - : {}; - const NotifyOnSignatures = - Doc?.NotifyOnSignatures !== undefined - ? { NotifyOnSignatures: Doc.NotifyOnSignatures } - : {}; - const Bcc = Doc?.Bcc?.length > 0 ? { Bcc: Doc?.Bcc } : {}; - const RedirectUrl = Doc?.RedirectUrl - ? { RedirectUrl: Doc?.RedirectUrl } - : {}; - const TemplateId = Doc?.objectId - ? { - TemplateId: { - __type: "Pointer", - className: "contracts_Template", - objectId: Doc?.objectId - } - } - : {}; - let placeholdersArr = []; - if (Doc.Placeholders?.length > 0) { - placeholdersArr = Doc.Placeholders; - const data = { - Name: Doc.Name, - URL: Doc.URL, - SignedUrl: Doc.SignedUrl, - SentToOthers: Doc?.SentToOthers || false, - Description: Doc.Description, - Note: Doc.Note, - Placeholders: placeholdersArr, - ExtUserPtr: { - __type: "Pointer", - className: "contracts_Users", - objectId: extUserId - }, - CreatedBy: { - __type: "Pointer", - className: "_User", - objectId: creatorId - }, - Signers: signers, - SendinOrder: Doc?.SendinOrder || false, - AutomaticReminders: Doc?.AutomaticReminders || false, - RemindOnceInEvery: Doc?.RemindOnceInEvery || 5, - IsEnableOTP: Doc?.IsEnableOTP || false, - TimeToCompleteDays: parseInt(Doc?.TimeToCompleteDays) || 15, - AllowModifications: Doc?.AllowModifications || false, - ...SignatureType, - ...NotifyOnSignatures, - ...Bcc, - ...RedirectUrl, - ...TemplateId - }; - try { - const res = await axios.post( - `${localStorage.getItem("baseUrl")}classes/contracts_Document`, - data, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ); - if (res.data && res.data.objectId) { - setActLoader({}); - navigate(`/${redirectUrl}/${res.data.objectId}`, { - state: { title: "Use Template" } - }); - } - } catch (err) { - console.log("Err", err); - showAlert("danger", t("something-went-wrong-mssg")); - setActLoader({}); - } - } else { - setActLoader({}); - } - } else { - showAlert("danger", t("something-went-wrong-mssg")); - setActLoader({}); - } - } catch (err) { - console.log("err", err); - showAlert("danger", t("something-went-wrong-mssg")); - setActLoader({}); - } - }; - const handleActionBtn = async (act, item) => { - if (act.action === "redirect") { - handleURL(item, act); - } else if (act.action === "delete") { - setIsDeleteModal({ [item.objectId]: true }); - } else if (act.action === "share") { - handleShare(item); - } else if (act.action === "revoke") { - setIsRevoke({ [item.objectId]: true }); - } else if (act.action === "option") { - setIsOption({ [item.objectId]: !isOption[item.objectId] }); - } else if (act.action === "resend") { - setIsResendMail({ [item.objectId]: true }); - } else if (act.action === "bulksend") { - handleBulkSend(item); - } else if (act.action === "sharewithteam") { - if (item?.SharedWith && item?.SharedWith.length > 0) { - // below code is used to get existing sharewith teams and formated them as per react-select - const formatedList = item?.SharedWith.map((x) => ({ - label: x.Name, - value: x.objectId - })); - setSelectedTeam(formatedList); - } - setIsShareWith({ [item.objectId]: true }); - } - else if (act.action === "duplicate") { - setIsModal({ [`duplicate_${item.objectId}`]: true }); - } else if (act.action === "rename") { - setIsModal({ [`rename_${item.objectId}`]: true }); - } else if (act.action === "edit") { - setContact(item); - setIsModal({ [`edit_${item.objectId}`]: true }); - } else if (act.action === "saveastemplate") { - setIsModal({ [`saveastemplate_${item.objectId}`]: true }); - } else if (act.action === "recreatedocument") { - setIsModal({ [`recreatedocument_${item.objectId}`]: true }); - } else if (act.action === "extendexpiry") { - setIsModal({ [`extendexpiry_${item.objectId}`]: true }); - } - }; - // Get current list - const indexOfLastDoc = currentPage * props.docPerPage; - const indexOfFirstDoc = indexOfLastDoc - props.docPerPage; - const sortedList = React.useMemo(() => { - if (props.ReportName === "Contactbook") { - const contacts = [...props.List]; - contacts.sort((a, b) => { - const nameA = a?.Name?.toLowerCase() || ""; - const nameB = b?.Name?.toLowerCase() || ""; - if (nameA < nameB) return sortOrder === "asc" ? -1 : 1; - if (nameA > nameB) return sortOrder === "asc" ? 1 : -1; - return 0; - }); - return contacts; - } - return props.List; - }, [props.List, sortOrder, props.ReportName]); - - const currentList = sortedList?.slice(indexOfFirstDoc, indexOfLastDoc); - - // Change page - const paginateFront = () => { - const lastValue = pageNumbers?.[pageNumbers?.length - 1]; - if (currentPage < lastValue) { - setCurrentPage(currentPage + 1); - } - }; - - const paginateBack = () => { - if (startIndex > 0) { - setCurrentPage(currentPage - 1); - } - }; - - const handleContactFormModal = () => { - setIsContactform(!isContactform); - }; - - const toggleSortOrder = () => { - setSortOrder(sortOrder === "asc" ? "desc" : "asc"); - }; - - const handleUserData = (data) => { - props.setList((prevData) => [data, ...prevData]); - }; - - const handleDelete = async (item) => { - setIsDeleteModal({}); - setActLoader({ [`${item.objectId}`]: true }); - const clsObj = { - Contactbook: "contracts_Contactbook", - Templates: "contracts_Template" - }; - try { - const serverUrl = serverUrl_fn(); - const cls = clsObj[props.ReportName] || "contracts_Document"; - const url = serverUrl + `/classes/${cls}/`; - const body = - props.ReportName === "Contactbook" - ? { IsDeleted: true } - : { IsArchive: true }; - const res = await axios.put(url + item.objectId, body, { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - }); - if (res.data && res.data.updatedAt) { - setActLoader({}); - showAlert("success", t("record-delete-alert")); - const upldatedList = props.List.filter( - (x) => x.objectId !== item.objectId - ); - props.setList(upldatedList); - } - } catch (err) { - console.log("err", err); - showAlert("danger", t("something-went-wrong-mssg")); - setActLoader({}); - } - }; - const handleClose = ( - ) => { - setIsRevoke({}); - setIsDeleteModal({}); - setReason(""); - }; - const handleShare = (item) => { - setActLoader({ [item.objectId]: true }); - const host = window.location.origin; - const sendMail = item?.SendMail || false; - const getUrl = (x) => { - //encode this url value `${item.objectId}/${x.Email}/${x.objectId}` to base64 using `btoa` function - if (x?.signerObjId) { - const encodeBase64 = btoa( - `${item.objectId}/${x.signerPtr.Email}/${x.signerPtr.objectId}/${sendMail}` - ); - return `${host}/login/${encodeBase64}`; - } else { - const encodeBase64 = btoa(`${item.objectId}/${x.email}`); - return `${host}/login/${encodeBase64}`; - } - }; - const urls = item?.Placeholders?.map((x) => ({ - email: x.email ? x.email : x.signerPtr.Email, - url: getUrl(x) - })); - setShareUrls(urls); - setIsShare({ [item.objectId]: true }); - }; - - const copytoclipboard = (share) => { - copytoData(share.url); - if (copyUrlRef.current) { - copyUrlRef.current.textContent = share.url; // Update text safely - } - setCopied({ ...copied, [share.email]: true }); - }; - //function to handle revoke/decline docment - const handleRevoke = async (item) => { - const senderUser = localStorage.getItem( - `Parse/${localStorage.getItem("parseAppId")}/currentUser` - ); - const jsonSender = JSON.parse(senderUser); - setIsRevoke({}); - setActLoader({ [`${item.objectId}`]: true }); - const data = { - IsDeclined: true, - DeclineReason: reason, - DeclineBy: { - __type: "Pointer", - className: "_User", - objectId: jsonSender?.objectId - } - }; - await axios - .put( - `${localStorage.getItem("baseUrl")}classes/contracts_Document/${ - item.objectId - }`, - data, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - } - ) - .then(async (result) => { - const res = result.data; - if (res) { - setActLoader({}); - showAlert("success", t("record-revoke-alert")); - const upldatedList = props.List.filter( - (x) => x.objectId !== item.objectId - ); - props.setList(upldatedList); - } - setReason(""); - }) - .catch((err) => { - console.log("err", err); - setReason(""); - showAlert("danger", t("something-went-wrong-mssg")); - setActLoader({}); - }); - }; - - async function checkTourStatus() { - const cloudRes = await Parse.Cloud.run("getUserDetails"); - if (cloudRes) { - const extUser = JSON.parse(JSON.stringify(cloudRes)); - localStorage.setItem("Extand_Class", JSON.stringify([extUser])); - const tourStatus = extUser?.TourStatus || []; - setTourStatusArr(tourStatus); - const templateTour = tourStatus.find( - (obj) => obj.templateTour - )?.templateTour; - setIsTour(!templateTour); - } else { - setIsTour(true); - } - } - - const closeTour = async () => { - setIsTour(false); - if (props.isDontShow) { - const serverUrl = localStorage.getItem("baseUrl"); - const appId = localStorage.getItem("parseAppId"); - const json = JSON.parse(localStorage.getItem("Extand_Class")); - const extUserId = json && json.length > 0 && json[0].objectId; - let updatedTourStatus = []; - if (tourStatusArr.length > 0) { - updatedTourStatus = [...tourStatusArr]; - const templateTourIndex = tourStatusArr.findIndex( - (obj) => obj["templateTour"] === false || obj["templateTour"] === true - ); - if (templateTourIndex !== -1) { - updatedTourStatus[templateTourIndex] = { templateTour: true }; - } else { - updatedTourStatus.push({ templateTour: true }); - } - } else { - updatedTourStatus = [{ templateTour: true }]; - } - - await axios.put( - serverUrl + "classes/contracts_Users/" + extUserId, - { TourStatus: updatedTourStatus }, - { headers: { "X-Parse-Application-Id": appId } } - ); - } - }; - - // `handleDownload` is used to get valid doc url available in completed report - const handleDownload = async (item) => { - setActLoader({ [`${item.objectId}`]: true }); - const url = item?.SignedUrl || item?.URL || ""; - const pdfName = - item?.Name?.length > 100 - ? item?.Name?.slice(0, 100) - : item?.Name || "Document"; - const isCompleted = item?.IsCompleted || false; - const templateId = props?.ReportName === "Templates" && item.objectId; - const docId = props?.ReportName !== "Templates" && item.objectId; - if (url) { - try { - if (isCompleted) { - setIsDownloadModal({ [item.objectId]: true }); - } else { - const signedUrl = await getSignedUrl( - url, - docId, - templateId - ); - await fetchUrl(signedUrl, pdfName); - } - setActLoader({}); - } catch (err) { - console.log("err in getsignedurl", err); - alert(t("something-went-wrong-mssg")); - setActLoader({}); - } - } - }; - - // `handleSubjectChange` is used to add or change subject of resend mail - const handleSubjectChange = (subject, doc) => { - const encodeBase64 = userDetails?.objectId - ? btoa(`${doc.objectId}/${userDetails.Email}/${userDetails.objectId}`) - : btoa(`${doc.objectId}/${userDetails.Email}`); - const expireDate = doc.ExpiryDate.iso; - const newDate = new Date(expireDate); - const localExpireDate = newDate.toLocaleDateString("en-US", { - day: "numeric", - month: "long", - year: "numeric" - }); - const signPdf = `${window.location.origin}/login/${encodeBase64}`; - const variables = { - document_title: doc.Name, - note: doc?.Note || "", - sender_name: - doc.ExtUserPtr.Name, - sender_mail: - doc.ExtUserPtr.Email, - sender_phone: doc.ExtUserPtr?.Phone || "", - receiver_name: userDetails?.Name || "", - receiver_email: userDetails?.Email, - receiver_phone: userDetails?.Phone || "", - expiry_date: localExpireDate, - company_name: doc.ExtUserPtr.Company, - signing_url: signPdf - }; - const res = replaceMailVaribles(subject, "", variables); - setMail((prev) => ({ ...prev, subject: res.subject })); - }; - // `handlebodyChange` is used to add or change body of resend mail - const handlebodyChange = (body, doc) => { - const encodeBase64 = userDetails?.objectId - ? btoa(`${doc.objectId}/${userDetails.Email}/${userDetails.objectId}`) - : btoa(`${doc.objectId}/${userDetails.Email}`); - const expireDate = doc.ExpiryDate.iso; - const newDate = new Date(expireDate); - const localExpireDate = newDate.toLocaleDateString("en-US", { - day: "numeric", - month: "long", - year: "numeric" - }); - const signPdf = `${window.location.origin}/login/${encodeBase64}`; - const variables = { - document_title: doc.Name, - note: doc?.Note || "", - sender_name: - doc.ExtUserPtr.Name, - sender_mail: - doc.ExtUserPtr.Email, - sender_phone: doc.ExtUserPtr?.Phone || "", - receiver_name: userDetails?.Name || "", - receiver_email: userDetails?.Email || "", - receiver_phone: userDetails?.Phone || "", - expiry_date: localExpireDate, - company_name: doc.ExtUserPtr.Company, - signing_url: signPdf - }; - const res = replaceMailVaribles("", body, variables); - - if (body) { - setMail((prev) => ({ ...prev, body: res.body })); - } - }; - // `handleNextBtn` is used to open edit mail template screen in resend mail modal - // as well as replace variable with original one - const handleNextBtn = (user, doc) => { - const userdata = { - Name: user?.signerPtr?.Name, - Email: user.email ? user?.email : user.signerPtr?.Email, - Phone: user?.signerPtr?.Phone, - objectId: user?.signerPtr?.objectId - }; - setUserDetails(userdata); - const encodeBase64 = user.email - ? btoa(`${doc.objectId}/${user.email}`) - : btoa( - `${doc.objectId}/${user.signerPtr.Email}/${user.signerPtr.objectId}` - ); - const expireDate = doc.ExpiryDate.iso; - const newDate = new Date(expireDate); - const localExpireDate = newDate.toLocaleDateString("en-US", { - day: "numeric", - month: "long", - year: "numeric" - }); - const signPdf = `${window.location.origin}/login/${encodeBase64}`; - const variables = { - document_title: doc.Name, - note: doc?.Note || "", - sender_name: - doc.ExtUserPtr.Name, - sender_mail: - doc.ExtUserPtr.Email, - sender_phone: doc.ExtUserPtr?.Phone || "", - receiver_name: user?.signerPtr?.Name || "", - receiver_email: user?.email ? user?.email : user?.signerPtr?.Email, - receiver_phone: user?.signerPtr?.Phone || "", - expiry_date: localExpireDate, - company_name: doc?.ExtUserPtr?.Company || "", - signing_url: signPdf - }; - const subject = - doc?.RequestSubject || - doc?.ExtUserPtr?.TenantId?.RequestSubject || - `{{sender_name}} has requested you to sign "{{document_title}}"`; - const body = - doc?.RequestBody || - doc?.ExtUserPtr?.TenantId?.RequestBody || - `<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body><p>Hi {{receiver_name}},</p><br><p>We hope this email finds you well. {{sender_name}} has requested you to review and sign <b>"{{document_title}}"</b>.</p><p>Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.</p><br><p><a href='{{signing_url}}' rel='noopener noreferrer' target='_blank'>Sign here</a></p><br><br><p>If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.</p><br><p>Thanks</p><p> Team ${appName}</p><br></body> </html>`; - const res = replaceMailVaribles(subject, body, variables); - setMail((prev) => ({ ...prev, subject: res.subject, body: res.body })); - setIsNextStep({ [user.Id]: true }); - }; - const handleResendMail = async (e, doc, user) => { - e.preventDefault(); - setActLoader({ [user?.Id]: true }); - const url = `${localStorage.getItem("baseUrl")}functions/sendmailv3`; - const headers = { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - sessionToken: localStorage.getItem("accesstoken") - }; - let params = { - replyto: - doc?.ExtUserPtr?.Email || - "", - extUserId: doc?.ExtUserPtr?.objectId, - recipient: userDetails?.Email, - subject: mail.subject, - from: - doc?.ExtUserPtr?.Email, - html: mail.body - }; - try { - const res = await axios.post(url, params, { headers: headers }); - if (res?.data?.result?.status === "success") { - showAlert("success", t("mail-sent-alert")); - setIsResendMail({}); - } - else { - showAlert("danger", t("something-went-wrong-mssg")); - } - } catch (err) { - console.log("err in sendmail", err); - showAlert("danger", t("something-went-wrong-mssg")); - } finally { - setIsNextStep({}); - setUserDetails({}); - setActLoader({}); - } - }; - const fetchUserStatus = (user, doc) => { - const email = user.email ? user.email : user.signerPtr.Email; - const audit = doc?.AuditTrail?.find((x) => x.UserPtr.Email === email); - - return ( - <div className="flex flex-row gap-2 justify-center items-center"> - <div className="flex justify-center items-center bg-base-300 text-base-content shadow-md op-card w-[65px] h-[32px] cursor-default"> - {audit?.Activity ? audit?.Activity : "Awaited"} - </div> - - <button - onClick={() => handleNextBtn(user, doc)} - className={ - audit?.Activity !== "Signed" - ? "op-btn op-btn-primary op-btn-sm" - : " text-transparent cursor-default pointer-events-none" - } - disabled={audit?.Activity === "Signed"} - > - {audit?.Activity !== "Signed" && "Resend"} - </button> - </div> - ); - }; - // `handleQuickSendClose` is trigger when bulk send component trigger close event - const handleQuickSendClose = (status, count) => { - setIsBulkSend({}); - if (status === "success") { - showAlert("success", count + " " + t("document-sent-alert")); - } else { - showAlert("danger", t("something-went-wrong-mssg")); - } - }; - - // `handleBulkSend` is used to open modal as well as fetch template - // and show Ui on the basis template response - const handleBulkSend = async (template) => { - setIsBulkSend({ [template.objectId]: true }); - setIsLoader({ [template.objectId]: true }); - try { - const params = { - templateId: template.objectId, - include: ["Placeholders.signerPtr"] - }; - const axiosRes = await axios.post( - `${localStorage.getItem("baseUrl")}functions/getTemplate`, - params, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - sessionToken: localStorage.getItem("accesstoken") - } - } - ); - const templateRes = axiosRes.data && axiosRes.data.result; - const tenantSignTypes = await fetchTenantDetails(); - const docSignTypes = templateRes?.SignatureType || signatureTypes; - const updatedSignatureType = await handleSignatureType( - tenantSignTypes, - docSignTypes - ); - setSignatureType(updatedSignatureType); - setPlaceholders(templateRes?.Placeholders); - setTemplateDetails(templateRes); - setIsLoader({}); - } catch (err) { - console.log("err in fetch template in bulk modal", err); - setIsBulkSend({}); - showAlert("danger", t("something-went-wrong-mssg")); - } - }; - - const handleViewSigners = (item) => { - setIsViewShare({ [item.objectId]: true }); - }; - // `handleShareWith` is used to save teams in sharedWith field - const handleShareWith = async (e, template) => { - e.preventDefault(); - e.stopPropagation(); - setIsShareWith({}); - setActLoader({ [template.objectId]: true }); - try { - const templateCls = new Parse.Object("contracts_Template"); - templateCls.id = template.objectId; - const teamArr = selectedTeam.map((x) => ({ - __type: "Pointer", - className: "contracts_Teams", - objectId: x.value - })); - templateCls.set("SharedWith", teamArr); - const res = await templateCls.save(); - if (res) { - showAlert("success", t("template-share-alert")); - } - } catch (err) { - showAlert("danger", t("something-went-wrong-mssg")); - } finally { - setActLoader({}); - } - }; - const handleUpdateExpiry = async (e, item) => { - e.preventDefault(); - e.stopPropagation(); - if (expiryDate) { - const oldExpiryDate = new Date(item?.ExpiryDate?.iso); - const newExpiryDate = new Date(expiryDate); - if (newExpiryDate > oldExpiryDate) { - setActLoader({ [`${item.objectId}`]: true }); - const updateExpiryDate = new Date(expiryDate).toISOString(); - const expiryIsoFormat = { iso: updateExpiryDate, __type: "Date" }; - try { - const serverUrl = serverUrl_fn(); - const cls = "contracts_Document"; - const url = serverUrl + `/classes/${cls}/`; - const body = { ExpiryDate: expiryIsoFormat }; - const res = await axios.put(url + item.objectId, body, { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - "X-Parse-Session-Token": localStorage.getItem("accesstoken") - } - }); - if (res.data && res.data.updatedAt) { - showAlert( - "success", - t("expiry-date-updated", { - newexpirydate: new Date(expiryDate)?.toLocaleDateString() - }), - 2000 - ); - if (props.ReportName === "Expired Documents") { - const upldatedList = props.List.filter( - (x) => x.objectId !== item.objectId - ); - props.setList(upldatedList); - } - } - } catch (err) { - console.log("err", err); - showAlert("danger", t("something-went-wrong-mssg"), 2000); - } finally { - setActLoader({}); - setExpiryDate(); - setIsModal({}); - } - } else { - showAlert("danger", t("expiry-date-error"), 2000); - } - } else { - showAlert("danger", t("expiry-date-error"), 2000); - } - }; - // `formatStatusRow` is used to format status row - const formatStatusRow = (item) => { - const timezone = extClass?.[0]?.Timezone || ""; - const DateFormat = extClass?.[0]?.DateFormat || "MM/DD/YYYY"; - const Is12Hr = extClass?.[0]?.Is12HourTime || false; - const signers = item?.Placeholders?.map((x, i) => { - const audit = item?.AuditTrail?.find( - (audit) => audit?.UserPtr?.objectId === x.signerObjId - ); - const format = (date) => - date - ? formatDateTime(new Date(date), DateFormat, timezone, Is12Hr) - : "-"; - return { - id: i, - Email: x?.signerPtr?.Email || x?.email, - Activity: audit?.Activity?.toUpperCase() || "SENT", - SignedOn: format(audit?.SignedOn), - ViewedOn: format(audit?.ViewedOn) - }; - }); - // Decide how many signers to display based on `showAllSignes` state - const displaySigners = isShowAllSigners[item.objectId] - ? signers - : signers.slice(0, 3); - return ( - <> - {displaySigners?.map((x, i) => ( - <div - key={i} - className="text-sm font-medium flex flex-row gap-2 items-center" - > - <button - onClick={() => setIsModal({ [`${item.objectId}_${i}`]: true })} - className={`${ - x.Activity === "SIGNED" - ? "op-border-primary op-text-primary" - : x.Activity === "VIEWED" - ? "border-green-400 text-green-400" - : "border-base-content text-base-content" - } focus:outline-none border-2 w-[60px] h-[30px] text-[11px] rounded-full`} - > - {x?.Activity?.toUpperCase() || "-"} - </button> - <div className="py-2 font-bold text-[12px]">{x?.Email || "-"}</div> - {isModal[`${item.objectId}_${i}`] && ( - <ModalUi - isOpen - title={t("document-logs")} - handleClose={handleCloseModal} - > - <div className="pl-3 first:mt-2 border-t-[1px] border-gray-600 text-[12px] py-2"> - <p className="font-bold"> {x?.Email}</p> - <p>Viewed on: {x?.ViewedOn}</p> - <p>Signed on: {x?.SignedOn}</p> - </div> - </ModalUi> - )} - </div> - ))} - {/* Show More / Hide button */} - {signers?.length > 3 && ( - <button - onClick={() => - setIsShowAllSigners({ - [item.objectId]: !isShowAllSigners[item.objectId] - }) - } - className="ml-2 text-xs font-medium text-blue-500 underline focus:outline-none" - > - {isShowAllSigners[item.objectId] ? "Hide" : "Show More"} - </button> - )} - </> - ); - }; - - // `handleImportBtn` is trigger when user click on upload icon from contactbook - const handleImportBtn = () => { - setIsModal({ export: true }); - }; - - // `capitalize` is used to make word capitalize - const capitalize = (s) => - s && String(s[0]).toUpperCase() + String(s).slice(1); - - // `checkRequiredHeaders` is used to check required headers present or not in csv/excel file - const checkRequiredHeaders = (headers) => { - const requiredHeaders = ["Name", "Email"]; - // Normalize headers to lowercase once - const headersSet = new Set(headers.map((header) => header.toLowerCase())); - - // Check all required headers - const allPresent = requiredHeaders.every((requiredHeader) => - headersSet.has(requiredHeader.toLowerCase()) - ); - return allPresent; - }; - - const processCSVFile = async (file, event) => { - const reader = new FileReader(); - reader.onload = (e) => { - const text = e.target.result; - // Parse CSV data - const rows = text.split("\n").map((row) => row.trim()); - const headers = rows[0].split(",").map((header) => header.trim()); - if (checkRequiredHeaders(headers)) { - const records = rows.slice(1).reduce((acc, row) => { - const values = row?.split(",").map((value) => value.trim()) || []; - if (values.length > 1) { - acc.push( - headers.reduce( - (obj, header, index) => ({ - ...obj, - [capitalize(header)]: values[index] || "" - }), - {} - ) - ); - } - return acc; - }, []); - if (records.length <= 100) { - const validRecords = records.length - ? records.filter((x) => emailRegex.test(x.Email)) - : []; - const invalidItems = records?.length - validRecords?.length; - setInvalidRecords(invalidItems); - setImportedData(validRecords); - } else { - alert(t("100-records-only")); - event.target.value = ""; - setImportedData([]); - } - } else { - alert(t("invalid-data")); - event.target.value = ""; - } - }; - reader.readAsText(file); - }; - - const processExcelFile = (file, event) => { - if (file) { - const reader = new FileReader(); - reader.onload = (e) => { - const arrayBuffer = e.target.result; - const workbook = XLSX.read(new Uint8Array(arrayBuffer), { - type: "array" - }); - - // Get the first sheet - const sheetName = workbook.SheetNames[0]; - const sheet = workbook.Sheets[sheetName]; - - // Convert sheet to JSON - const sheetData = XLSX.utils.sheet_to_json(sheet); - if (sheetData.length <= 100) { - // Get all unique keys from the data to handle missing fields - const headers = [ - ...new Set(sheetData.flatMap((item) => Object.keys(item))) - ]; - - if (checkRequiredHeaders(headers)) { - const updateSheetData = sheetData.map((obj) => { - for (let key in obj) { - const capitalizedKey = capitalize(key); - if (capitalizedKey !== key) { - obj[capitalizedKey] = obj[key]; - delete obj[key]; // delete the old key to avoid duplicates - } - } - return obj; - }); - const validRecords = updateSheetData.length - ? updateSheetData.filter((x) => emailRegex.test(x.Email)) - : []; - const invalidItems = updateSheetData?.length - validRecords?.length; - setInvalidRecords(invalidItems); - setImportedData(validRecords); - } else { - alert(t("invalid-data")); - event.target.value = ""; - } - } else { - alert(t("100-records-only")); - event.target.value = ""; - setImportedData([]); - } - }; - - reader.readAsArrayBuffer(file); - } - }; - // `handleFileUpload` is trigger when user upload excel file from contactbook - const handleFileUpload = (event) => { - const file = event.target?.files?.[0]; - if (file) { - const fileName = file.name; - const fileNameExt = fileName - .substr(fileName.lastIndexOf(".") + 1) - .toLowerCase(); - const isValidExt = ["csv", "xlsx", "xls"].includes(fileNameExt); - if (isValidExt) { - setCurrentImportPage(1); - if (fileNameExt !== "csv") { - processExcelFile(file, event); - } else { - processCSVFile(file, event); - } - } else { - event.target.value = ""; - alert(t("csv-excel-support-only")); - } - } else { - setImportedData([]); - setCurrentImportPage(1); - setInvalidRecords(0); - } - }; - - // Get all unique keys from the data to handle missing fields - const allKeys = importedData?.length - ? [...new Set(importedData.flatMap((item) => Object.keys(item)))] - : []; - - // Pagination logic for import data table in modal - const totalImportPages = Math.ceil(importedData.length / recordsPerPage); - const currentRecords = importedData.slice( - (currentImportPage - 1) * recordsPerPage, - currentImportPage * recordsPerPage - ); - - // `handleNextPage` is used to importdata table in modal - const handleNextPage = (e) => { - e.preventDefault(); - if (currentImportPage < totalImportPages) { - setCurrentImportPage(currentImportPage + 1); - } - }; - - // `handlePreviousPage` is used to importdata table in modal - const handlePreviousPage = (e) => { - e.preventDefault(); - if (currentImportPage > 1) { - setCurrentImportPage(currentImportPage - 1); - } - }; - // `handleImportData` is used to create batch in contact - const handleImportData = async (e) => { - e.preventDefault(); - e.stopPropagation(); - setActLoader({ import: true }); - try { - const filterdata = importedData.map((x) => ({ - Name: x.Name, - Email: x.Email, - Phone: x.Phone, - TenantId: localStorage.getItem("TenantId") - })); - const contacts = JSON.stringify(filterdata); - const res = await Parse.Cloud.run("createbatchcontact", { contacts }); - if (res) { - showAlert( - "info", - t("contact-imported", { - imported: res?.success || 0, - failed: res?.failed || 0 - }) - ); - if (res?.success > 0) { - setTimeout(() => window.location.reload(), 1500); - } - } - } catch (err) { - console.log("err while creating batch contact", err); - showAlert("danger", t("something-went-wrong-mssg")); - } finally { - setActLoader({}); - setIsModal({}); - setImportedData([]); - setInvalidRecords(0); - } - }; - - // `handleCreateDuplicate` is used to create duplicate from current entry using objectId - const handleCreateDuplicate = async (item) => { - setActLoader({ [item.objectId]: true }); - setIsModal({}); - try { - const duplicateRes = await Parse.Cloud.run("createduplicate", { - templateId: item.objectId - }); - if (duplicateRes) { - const newTemplate = JSON.parse(JSON.stringify(duplicateRes)); - props.setList((prevData) => [newTemplate, ...prevData]); - showAlert("success", t("duplicate-template-created")); - } - } catch (err) { - showAlert("danger", t("something-went-wrong-mssg")); - console.log("Err while create duplicate template", err); - } finally { - setActLoader({}); - } - }; - // `handleRenameDoc` is used to update document name - const handleRenameDoc = async (item) => { - setActLoader({ [item.objectId]: true }); - setIsModal({}); - const className = isTemplateReport - ? "contracts_Template" - : "contracts_Document"; - try { - const query = new Parse.Query(className); - const docObj = await query.get(item.objectId); - docObj.set("Name", renameDoc); - await docObj.save(); - //update report list data - const updateList = props.List.map((x) => - x.objectId === item.objectId ? { ...x, Name: renameDoc } : x - ); - props.setList(updateList); - setActLoader({}); - showAlert("success", "Document updated", 2000); - } catch (err) { - showAlert("danger", t("something-went-wrong-mssg"), 2000); - setActLoader({}); - } - }; - const handleBtnVisibility = (act, item) => { - if (!act.restrictBtn) { - return true; - } else if ( - act.restrictBtn === true && - item.ExtUserPtr?.objectId === extClass?.[0]?.objectId - ) { - return true; - } - }; - - // `handleEditContact` is used to update contactas per old contact Id - const handleEditContact = async (updateContact) => { - const updateList = props.List.map((x) => - x.objectId === contact.objectId ? { ...x, ...updateContact } : x - ); - props.setList(updateList); - }; - const handleCloseModal = () => { - setIsModal({}); - }; - const handleSaveAsTemplate = async (doc) => { - try { - const params = { docId: doc?.objectId }; - const templateRes = await Parse.Cloud.run("saveastemplate", params); - setTemplateId(templateRes?.id); - setIsSuccess({ [doc.objectId]: true }); - } catch (err) { - console.log("Err in saveastemplate", err); - } finally { - setActLoader({}); - } - }; - const handleCloseTemplate = () => { - setTemplateId(""); - setIsSuccess({}); - handleCloseModal(); - setActLoader({}); - handleClose(); - }; - - // `handleBulkSend` is used to open modal as well as fetch template - // and show Ui on the basis template response - const handleBulkSendTemplate = async (templateId, docId) => { - setIsBulkSend({ [docId]: true }); - setIsLoader({ [docId]: true }); - try { - const params = { - templateId: templateId, - include: ["Placeholders.signerPtr"] - }; - const axiosRes = await axios.post( - `${localStorage.getItem("baseUrl")}functions/getTemplate`, - params, - { - headers: { - "Content-Type": "application/json", - "X-Parse-Application-Id": localStorage.getItem("parseAppId"), - sessionToken: localStorage.getItem("accesstoken") - } - } - ); - const templateRes = axiosRes.data && axiosRes.data.result; - const tenantSignTypes = await fetchTenantDetails(); - const docSignTypes = templateRes?.SignatureType || signatureTypes; - const updatedSignatureType = await handleSignatureType( - tenantSignTypes, - docSignTypes - ); - setSignatureType(updatedSignatureType); - setPlaceholders(templateRes?.Placeholders); - setTemplateDetails(templateRes); - setIsLoader({}); - } catch (err) { - console.log("err in fetch template in bulk modal", err); - setIsBulkSend({}); - showAlert("danger", t("something-went-wrong-mssg")); - } - }; - - const handleResendClose = () => { - setIsResendMail({}); - setIsNextStep({}); - setUserDetails({}); - }; - - const handleRecreateDoc = async (item) => { - setActLoader({ [item.objectId]: true }); - try { - const res = await Parse.Cloud.run("recreatedoc", { - docId: item.objectId - }); - if (res) { - openInNewTab(`/placeHolderSign/${res.objectId}`, "_self"); - } - } catch (err) { - handleCloseModal(); - showAlert("danger", err.message); - // showAlert("danger", t("something-went-wrong-mssg")); - console.log("Err while create duplicate template", err); - } finally { - setActLoader({}); - } - }; - - const restrictBtn = (item, act) => { - return item.IsSignyourself && act.action === "recreatedocument" - ? true - : false; - }; - return ( - <div className="relative"> - {Object.keys(actLoader)?.length > 0 && ( - <div className="absolute w-full h-full flex justify-center items-center bg-black bg-opacity-30 z-30"> - <Loader /> - </div> - )} - <div className="p-2 w-full bg-base-100 text-base-content op-card shadow-lg"> - {alertMsg.message && ( - <Alert type={alertMsg.type}>{alertMsg.message}</Alert> - )} - {props.tourData && isTemplateReport && ( - <> - <Tour - onRequestClose={closeTour} - steps={props.tourData} - isOpen={isTour} - rounded={5} - closeWithMask={false} - /> - </> - )} - <div - ref={titleRef} - className="flex flex-row items-center justify-between my-2 mx-3 text-[20px] md:text-[23px]" - > - <div className="font-light"> - {t(`report-name.${props.ReportName}`)}{" "} - {props.report_help && ( - <span className="text-xs md:text-[13px] font-normal"> - <Tooltip - id="report_help" - message={t(`report-help.${props.ReportName}`)} - /> - </span> - )} - </div> - <div className="flex flex-row justify-center items-center gap-3 mb-2"> - {/* Search input for report bigger in width */} - {titleElement?.width > 500 && ( - <div className="flex"> - <input - type="search" - value={props.searchTerm} - onChange={props.handleSearchChange} - placeholder={ - props.ReportName === "Contactbook" - ? t("search-contacts") - : isTemplateReport - ? t("search-templates") - : t("search-documents") - } - onPaste={props.handleSearchPaste} - className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-64 text-xs" - /> - </div> - )} - {/* contact import */} - {props.isImport && ( - <div - className="cursor-pointer flex" - onClick={() => handleImportBtn()} - > - <i className="fa-light fa-upload op-text-secondary text-[23px] md:text-[25px]"></i> - </div> - )} - {/* add contact form */} - {props.form && ( - <div - className="cursor-pointer flex" - onClick={() => handleContactFormModal()} - > - <i className="fa-light fa-square-plus text-accent text-[30px] md:text-[32px]"></i> - </div> - )} - {/* create template form */} - {isTemplateReport && ( - <div - data-tut="reactourFirst" - className="cursor-pointer flex" - onClick={() => navigate("/form/template")} - > - <i className="cursor-pointer fa-light fa-square-plus text-accent text-[30px] md:text-[32px]"></i> - </div> - )} - {/* search icon/magnifer icon */} - {titleElement?.width < 500 && ( - <button - className="flex justify-center items-center focus:outline-none rounded-md text-[18px]" - aria-label="Search" - onClick={() => - props.setMobileSearchOpen(!props.mobileSearchOpen) - } - > - <i - style={{ color: `${iconColor}` }} - className="fa-solid fa-magnifying-glass" - ></i> - </button> - )} - <ModalUi - isOpen={isModal?.export} - title={t("bulk-import")} - handleClose={() => { - setIsModal({}); - setImportedData([]); - setInvalidRecords(0); - }} - > - <div className="relative"> - {Object.keys(actLoader)?.length > 0 && ( - <div className="absolute w-full h-full flex justify-center items-center bg-black bg-opacity-30 z-30"> - <Loader /> - </div> - )} - <form onSubmit={handleImportData} className="p-[20px] h-full "> - <div className="text-xs"> - <label className="block ml-2"> - {t("contacts-file")} - <span className="text-red-500 text-[13px]"> *</span> - </label> - <input - type="file" - accept=".csv, .xlsx, .xls" - onChange={handleFileUpload} - required - className="op-file-input op-file-input-bordered op-file-input-sm focus:outline-none hover:border-base-content w-full text-xs" - /> - <p className="mt-1 ml-2 text-[11px] text-gray-600"> - {t("import-guideline")}{" "} - <a - href="/sample_contacts.csv" - target="_blank" - rel="noopener noreferrer" - className="text-primary underline" - > - {t("download-sample")} - </a> - </p> - </div> - <div className="text-md m-2"> - <div className="flex flex-col md:flex-row gap-1"> - <span>Total records found: {importedData.length} </span> - <span>Invalid records found: {invalidRecords}</span> - </div> - <div className="overflow-x-auto p-1"> - {importedData?.length > 0 && ( - <> - <table className="op-table op-table-zebra w-full"> - <thead> - <tr> - {allKeys.map((key, index) => ( - <th key={index}>{key}</th> - ))} - </tr> - </thead> - <tbody> - {currentRecords.map((row, rowIndex) => ( - <tr key={rowIndex}> - {allKeys.map((key, colIndex) => ( - <td key={colIndex}>{row[key] || "-"}</td> - ))} - </tr> - ))} - </tbody> - </table> - <div className="flex justify-between items-center mt-4"> - <button - className="op-btn op-btn-primary op-btn-sm" - disabled={currentImportPage === 1} - onClick={handlePreviousPage} - > - Previous - </button> - <span> - Page {currentImportPage} of {totalImportPages} - </span> - <button - className="op-btn op-btn-primary op-btn-sm" - disabled={currentImportPage === totalImportPages} - onClick={handleNextPage} - > - Next - </button> - </div> - </> - )} - </div> - </div> - <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> - <button type="submit" className="op-btn op-btn-primary"> - Import - </button> - </form> - </div> - </ModalUi> - </div> - </div> - {/* Search input for report smalle in width */} - {titleElement?.width < 500 && props.mobileSearchOpen && ( - <div className="top-full left-0 w-full bg-white px-3 pt-1 pb-3"> - <input - type="search" - value={props.searchTerm} - onChange={props.handleSearchChange} - placeholder={t("search-documents")} - onPaste={props.handleSearchPaste} - className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" - /> - </div> - )} - <div - className={`overflow-auto w-full border-b ${ - props.List?.length > 0 - ? isDashboard - ? "min-h-[317px]" - : currentList?.length === props.docPerPage - ? "h-fit" - : "h-screen" - : "" - }`} - > - <table className="op-table border-collapse w-full mb-4"> - <thead className="text-[14px] text-center"> - <tr className="border-y-[1px]"> - {props.heading?.map((item, index) => ( - <React.Fragment key={index}> - <th className="p-2"> - {t(`report-heading.${item}`)} - {props.ReportName === "Contactbook" && item === "Name" && ( - <button - type="button" - onClick={toggleSortOrder} - className="ml-1" - > - <i - className={ - sortOrder === "asc" - ? "fa-light fa-arrow-down-a-z" - : "fa-light fa-arrow-up-a-z" - } - ></i> - </button> - )} - </th> - </React.Fragment> - ))} - {props.actions?.length > 0 && ( - <th className="p-2 text-transparent pointer-events-none"> - {t("action")} - </th> - )} - </tr> - </thead> - <tbody className="text-[12px]"> - {props.List?.length > 0 && ( - <> - {currentList.map((item, index) => - props.ReportName === "Contactbook" ? ( - <tr className="border-y-[1px]" key={index}> - {props.heading.includes("Sr.No") && ( - <th className="p-2">{startIndex + index + 1}</th> - )} - <td className="px-4 py-2 font-semibold"> - {item?.Name}{" "} - </td> - <td className="p-2 text-center"> - {item?.Email || "-"} - </td> - <td className="p-2 text-center"> - {item?.Phone || "-"} - </td> - <td className="px-3 py-2"> - <div className="text-base-content min-w-max flex flex-row gap-x-2 gap-y-1 justify-start items-center"> - {props.actions?.length > 0 && - props.actions.map((act, index) => ( - <button - key={index} - onClick={() => handleActionBtn(act, item)} - title={t(`btnLabel.${act.hoverLabel}`)} - className={`${ - act?.btnColor ? act.btnColor : "" - } op-btn op-btn-sm`} - > - <i className={act.btnIcon}></i> - </button> - ))} - {isDeleteModal[item.objectId] && ( - <ModalUi - isOpen - title={"Delete Contact"} - handleClose={handleClose} - > - <div className="m-[20px]"> - <div className="text-lg font-normal text-base-content"> - {t("contact-delete-alert")} - </div> - <hr className="bg-[#ccc] mt-4 " /> - <div className="flex items-center mt-3 gap-2 text-white"> - <button - onClick={() => handleDelete(item)} - className="op-btn op-btn-primary" - > - {t("yes")} - </button> - <button - onClick={handleClose} - className="op-btn op-btn-secondary" - > - {t("no")} - </button> - </div> - </div> - </ModalUi> - )} - </div> - </td> - </tr> - ) : ( - <tr - className={`${ - currentList?.length === props.docPerPage - ? "last:border-none" - : "" - } border-y-[1px] `} - key={index} - > - {props.heading.includes("Sr.No") && ( - <th className="px-2 py-2"> - {startIndex + index + 1} - </th> - )} - <td className="p-2 min-w-56 max-w-56"> - <div className="font-semibold break-words"> - {item?.Name} - </div> - {item?.ExpiryDate?.iso && ( - <div className="text-gray-500"> - Expires {formatDate(item?.ExpiryDate?.iso)} - </div> - )} - </td> - {props?.heading?.includes("Reason") && ( - <td className="p-2 text-center"> - {item?.DeclineReason?.length > 25 - ? item?.DeclineReason?.slice(0, 25) + "..." - : item?.DeclineReason || "-"} - </td> - )} - {props.heading.includes("Note") && ( - <td className="p-2 text-center"> - <p className="truncate w-[100px]"> - {item?.Note || "-"} - </p> - </td> - )} - {props.heading.includes("Folder") && ( - <td className="p-2 text-center"> - {item?.Folder?.Name || - t("sidebar.OpenSign™ Drive", { - appName: drivename - })} - </td> - )} - <td className="p-2 text-center"> - <button - onClick={() => handleDownload(item)} - className="op-link op-link-primary" - title={t("download")} - > - {item?.URL ? t("download") : "-"} - </button> - </td> - {props.heading.includes("Owner") && ( - <td className="p-2 text-center"> - {formatRow(item?.ExtUserPtr)} - </td> - )} - {props.heading.includes("Signers") && - ["In-progress documents", "Need your sign"].includes( - props.ReportName - ) ? ( - <td className="px-1 py-2"> - {!item?.IsSignyourself && item?.Placeholders && ( - <>{formatStatusRow(item)}</> - )} - </td> - ) : ( - <td className="p-2 text-center"> - {!item?.IsSignyourself && item?.Placeholders ? ( - <button - onClick={() => handleViewSigners(item)} - className="op-link op-link-primary" - > - {t("view")} - </button> - ) : ( - "-" - )} - </td> - )} - <td className="px-2 py-2"> - <div className="text-base-content min-w-max flex flex-row gap-x-2 gap-y-1 justify-start items-center"> - {props.actions?.length > 0 && - props.actions.map((act, index) => - isTemplateReport ? ( - <React.Fragment key={index}> - {(item.ExtUserPtr?.objectId === - extClass?.[0]?.objectId || - act.btnLabel === "Use") && ( - <div - role="button" - data-tut={act?.selector} - key={index} - onClick={() => - handleActionBtn(act, item) - } - title={t(`btnLabel.${act.hoverLabel}`)} - className={ - act.action !== "option" - ? `${ - act?.btnColor || "" - } op-btn op-btn-sm mr-1` - : "text-base-content focus:outline-none text-lg mr-2 relative" - } - > - <i className={act.btnIcon}></i> - {act.btnLabel && ( - <span className="uppercase font-medium"> - { - `${t(`btnLabel.${act.btnLabel}`)}` - } - </span> - )} - {/* template report */} - {isOption[item.objectId] && - act.action === "option" && ( - <ul className="absolute -right-1 top-auto z-[70] w-52 op-dropdown-content op-menu op-menu-sm shadow-black/20 shadow bg-base-100 text-base-content rounded-box"> - {act.subaction?.map((subact) => ( - <li - key={subact.btnId} - onClick={() => - handleActionBtn( - subact, - item - ) - } - title={t( - `btnLabel.${subact.btnLabel}` - )} - > - <span className="flex items-center justify-between"> - <span className="text-[13px] capitalize font-medium"> - <i - className={`${subact.btnIcon} mr-2`} - ></i> - {subact.btnLabel && - t( - `btnLabel.${subact.btnLabel}` - )} - </span> - {subact.secIcon && ( - <i - className={`${subact.secIcon} ml-1.5`} - ></i> - )} - </span> - </li> - ))} - </ul> - )} - </div> - )} - <ModalUi - title={t("btnLabel.Duplicate")} - isOpen={ - isModal["duplicate_" + item.objectId] - } - handleClose={handleCloseModal} - > - <div className=" flex flex-col px-4 pb-3 pt-2 "> - <p className="text-base"> - {t("duplicate-template-alert")} - </p> - <div className="flex flex-row gap-2 pt-3 mt-3 border-t-[1.5px] border-gray-500"> - <button - className="w-[100px] op-btn op-btn-primary op-btn-md" - onClick={() => - handleCreateDuplicate(item) - } - > - {t("yes")} - </button> - <button - className="w-[100px] op-btn op-btn-secondary op-btn-md" - onClick={handleCloseModal} - > - {t("no")} - </button> - </div> - </div> - </ModalUi> - </React.Fragment> - ) : ( - <React.Fragment key={index}> - {handleBtnVisibility(act, item) && ( - <div - role="button" - data-tut={act?.selector} - onClick={() => - handleActionBtn(act, item) - } - title={t(`btnLabel.${act.hoverLabel}`)} - className={ - act.action !== "option" - ? `${act?.btnColor || ""} op-btn op-btn-sm mr-1` - : "text-base-content focus:outline-none text-lg mr-2 relative" - } - > - <i className={act.btnIcon}></i> - {act.btnLabel && ( - <span className="uppercase font-medium"> - {t(`btnLabel.${act.btnLabel}`)} - </span> - )} - {/* doc report */} - {isOption[item.objectId] && - act.action === "option" && ( - <ul className="absolute -right-1 top-auto z-[70] w-max op-dropdown-content op-menu op-menu-sm shadow-black/20 shadow bg-base-100 text-base-content rounded-box"> - {act.subaction?.map( - (subact) => - !restrictBtn( - item, - subact - ) && ( - <li - key={subact.btnId} - onClick={() => - handleActionBtn( - subact, - item - ) - } - title={t( - `btnLabel.${subact.hoverLabel}` - )} - > - <span> - <i - className={`${subact.btnIcon} mr-1.5`} - ></i> - {subact.btnLabel && ( - <span className="text-[13px] capitalize font-medium"> - {t( - `btnLabel.${subact.btnLabel}` - )} - </span> - )} - </span> - </li> - ) - )} - </ul> - )} - </div> - )} - </React.Fragment> - ) - )} - </div> - {isModal["recreatedocument_" + item.objectId] && ( - <ModalUi isOpen handleClose={handleCloseModal}> - {actLoader[item.objectId] && ( - <div className="absolute h-full w-full flex justify-center items-center rounded-box bg-black/30"> - <Loader /> - </div> - )} - <h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]"> - {t("fix-&-resend-document")} - </h3> - <div className="p-[15px] md:p-[20px]"> - <div className="text-lg font-normal text-center"> - <img - src={recreatedoc} - alt="recreate-doc" - className="mx-auto w-[200px] h-auto" - /> - <p className="text-sm md:text-base md:px-2 mt-2"> - {t("do-you-want-recreate-document?")} - </p> - </div> - <hr className="bg-[#ccc] mt-2.5" /> - <div className="flex items-center justify-center mt-[14px] md:mt-[16px] gap-2 text-white"> - <button - onClick={() => handleRecreateDoc(item)} - className="op-btn op-btn-primary focus:outline-none text-sm relative px-4" - > - {t("start-editing")} - </button> - <button - onClick={handleCloseModal} - className="op-btn op-btn-secondary focus:outline-none text-sm relative px-8" - > - {t("cancel")} - </button> - </div> - </div> - </ModalUi> - )} - {isModal["saveastemplate_" + item.objectId] && ( - <ModalUi - isOpen - title={ - isSuccess[item.objectId] - ? t("template-created") - : t("btnLabel.Save as template") - } - handleClose={handleCloseTemplate} - > - {isSuccess[item.objectId] ? ( - <div className="mx-[10px] my-[15px]"> - <p className="text-base text-center"> - {t("how-would-you-like-to-proceed?")} - </p> - <div className="flex flex-wrap gap-1 items-center justify-center mt-2"> - <button - className="op-btn-primary op-btn op-btn-sm focus:outline-none text-sm relative" - onClick={() => - handleUseTemplate( - templateId, - "placeHolderSign" - ) - } - > - <i className="fa-light fa-plus"></i>{" "} - {t("btnLabel.Use")} - </button> - <button - className="op-btn-secondary op-btn op-btn-sm focus:outline-none text-sm relative" - onClick={() => - handleBulkSendTemplate( - templateId, - item.objectId - ) - } - > - <i className="fa-light fa-plus"></i>{" "} - { - `${t(`btnLabel.Quick send`)}` - } - </button> - <button - className="op-btn-secondary op-btn op-btn-sm focus:outline-none text-sm relative" - onClick={() => - navigate(`/template/${templateId}`) - } - > - <i className="fa-light fa-pen"></i>{" "} - {t(`btnLabel.Edit`)} - </button> - </div> - <Link - to="/report/6TeaPr321t" - className="cursor-pointer underline text-sm w-full flex justify-center mt-2" - > - {t("go-to-manage-templates")} - </Link> - </div> - ) : ( - <div className="m-[20px]"> - <div className="text-lg font-normal text-base-content"> - {t("save-as-template-?")} - </div> - <hr className="bg-[#ccc] mt-3" /> - <div className="flex items-center mt-3 gap-2 text-white"> - <button - onClick={() => handleSaveAsTemplate(item)} - className="op-btn op-btn-primary w-[100px]" - > - {t("yes")} - </button> - <button - onClick={handleCloseTemplate} - className="op-btn op-btn-secondary w-[100px]" - > - {t("no")} - </button> - </div> - </div> - )} - </ModalUi> - )} - {isModal["extendexpiry_" + item.objectId] && ( - <ModalUi - isOpen - title={t("btnLabel.extend-expiry-date")} - reduceWidth={"md:max-w-[450px]"} - handleClose={handleCloseModal} - > - <form - className="px-4 py-2 flex flex-col" - onSubmit={(e) => handleUpdateExpiry(e, item)} - > - <label className="mr-2"> - {t("expiry-date")} {"(dd-mm-yyyy)"} - </label> - <input - type="date" - className="rounded-full mb-2 bg-base-300 w-full px-4 py-2 text-base-content border-2 hover:border-spacing-2" - defaultValue={ - item?.ExpiryDate?.iso?.split("T")?.[0] - } - onChange={(e) => { - setExpiryDate(e.target.value); - }} - /> - <div className="flex justify-start mb-1"> - <button - type="submit" - className="op-btn op-btn-primary" - > - {t("update")} - </button> - </div> - </form> - </ModalUi> - )} - {isShareWith[item.objectId] && ( - <div className="op-modal op-modal-open"> - <div className="max-h-90 bg-base-100 w-[95%] md:max-w-[500px] rounded-box relative"> - <h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]"> - {t("share-with")} - </h3> - <div - className="op-btn op-btn-sm op-btn-circle op-btn-ghost text-base-content absolute right-2 top-2 z-40" - onClick={() => setIsShareWith({})} - > - ✕ - </div> - <div className="px-2 mt-3 w-full h-full"> - <div className="op-input op-input-bordered op-input-sm w-full h-full text-[13px] break-all"> - {selectedTeam?.[0]?.label} - </div> - </div> - <button - onClick={(e) => - handleShareWith(e, item) - } - className="op-btn op-btn-primary ml-[10px] my-3" - > - {t("submit")} - </button> - </div> - </div> - )} - {isViewShare[item.objectId] && ( - <ModalUi - isOpen - showHeader={isTemplateReport} - title={t("signers")} - reduceWidth={"md:max-w-[450px]"} - handleClose={() => setIsViewShare({})} - > - {!isTemplateReport && ( - <div - className="op-btn op-btn-sm op-btn-circle op-btn-ghost text-base-content absolute right-2 top-1 z-40" - onClick={() => setIsViewShare({})} - > - ✕ - </div> - )} - <table className="op-table w-full overflow-auto"> - <thead className="h-[38px] sticky top-0 text-base-content text-sm pt-[15px] px-[20px]"> - <tr> - {isTemplateReport && ( - <th className="p-2 pl-3 w-[30%]"> - {t("roles")} - </th> - )} - <th className="pl-3 py-2"> - {isTemplateReport - ? t("email") - : t("signers")} - </th> - </tr> - </thead> - <tbody> - {item.Placeholders.map( - (x, i) => - x.Role !== "prefill" && ( - <tr - key={i} - className="text-sm font-medium" - > - {isTemplateReport && ( - <td className="text-[12px] p-2 pl-3 w-[30%]"> - {x.Role && x.Role} - </td> - )} - <td className="pl-3 text-[12px] py-2 break-all"> - {x.email - ? x.email - : x?.signerPtr?.Email || "-"} - </td> - </tr> - ) - )} - </tbody> - </table> - </ModalUi> - )} - {isDeleteModal[item.objectId] && ( - <ModalUi - isOpen - title={t("delete-document")} - handleClose={handleClose} - > - <div className="m-[20px]"> - <div className="text-lg font-normal text-base-content"> - {t("delete-document-alert")} - </div> - <hr className="bg-[#ccc] mt-4" /> - <div className="flex items-center mt-3 gap-2 text-white"> - <button - onClick={() => handleDelete(item)} - className="op-btn op-btn-primary" - > - {t("yes")} - </button> - <button - onClick={handleClose} - className="op-btn op-btn-secondary" - > - {t("no")} - </button> - </div> - </div> - </ModalUi> - )} - {isBulkSend[item.objectId] && ( - <ModalUi - isOpen - title={ - t("quick-send") - } - handleClose={() => setIsBulkSend({})} - > - {isLoader[item.objectId] ? ( - <div className="w-full h-[100px] flex justify-center items-center z-30"> - <Loader /> - </div> - ) : ( - <BulkSendUi - Placeholders={placeholders} - item={templateDeatils} - handleClose={handleQuickSendClose} - signatureType={signatureType} - /> - )} - </ModalUi> - )} - {isShare[item.objectId] && ( - <ModalUi - isOpen - title={t("copy-link")} - handleClose={() => { - setIsShare({}); - setActLoader({}); - setCopied(false); - }} - > - <div className="m-[20px]"> - {shareUrls.map((share, i) => ( - <div - key={i} - className="text-sm font-normal text-base-content flex my-2 justify-between items-center" - > - <span className="w-[150px] mr-[5px] md:mr-0 md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis text-sm font-semibold"> - {share.email} - </span> - <div className="flex items-center gap-2"> - <ShareButton - title={t("sign-url")} - text={t("sign-url")} - url={share.url} - className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm " - > - <i className="fa-light fa-share-from-square"></i> - {t("btnLabel.Share")} - </ShareButton> - <button - className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm" - onClick={() => copytoclipboard(share)} - > - <i className="fa-light fa-copy" /> - {copied[share.email] - ? t("copied") - : t("copy")} - </button> - </div> - </div> - ))} - <p - id="copyUrl" - ref={copyUrlRef} - className="hidden" - ></p> - </div> - </ModalUi> - )} - {isRevoke[item.objectId] && ( - <ModalUi - isOpen - title={t("revoke-document")} - handleClose={handleClose} - > - <div className="m-[20px]"> - <div className="text-sm md:text-lg font-normal text-base-content"> - {t("revoke-document-alert")} - </div> - <div className="mt-2"> - <textarea - rows={3} - placeholder="Reason (optional)" - className="px-4 op-textarea op-textarea-bordered text-base-content focus:outline-none hover:border-base-content w-full text-xs" - value={reason} - onChange={(e) => setReason(e.target.value)} - ></textarea> - </div> - <div className="flex items-center mt-3 gap-2"> - <button - onClick={() => handleRevoke(item)} - className="op-btn op-btn-primary px-6" - > - {t("yes")} - </button> - <button - onClick={handleClose} - className="op-btn op-btn-secondary px-6" - > - {t("no")} - </button> - </div> - </div> - </ModalUi> - )} - {isResendMail[item.objectId] && ( - <ModalUi - isOpen - title={ - t("resend-mail") - } - handleClose={handleResendClose} - > - <div className="overflow-y-auto max-h-[340px] md:max-h-[400px]"> - {item?.Placeholders?.map((user) => ( - <React.Fragment key={user.Id}> - {isNextStep[user.Id] && ( - <div className="relative "> - {actLoader[user.Id] && ( - <div className="absolute w-full h-full flex justify-center items-center bg-black bg-opacity-30 z-30"> - <Loader /> - </div> - )} - <form - onSubmit={(e) => - handleResendMail(e, item, user) - } - className="w-full flex flex-col gap-2 p-3 text-base-content relative" - > - <div className="absolute right-5 text-xs z-40"> - <Tooltip - id={`${user.Id}_help`} - message={t("resend-mail-help")} - /> - </div> - <div> - <label - className="text-xs ml-1" - htmlFor="mailsubject" - > - {t("subject")}{" "} - </label> - <input - id="mailsubject" - className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" - value={mail.subject} - onChange={(e) => - handleSubjectChange( - e.target.value, - item - ) - } - onInvalid={(e) => - e.target.setCustomValidity( - t("input-required") - ) - } - onInput={(e) => - e.target.setCustomValidity("") - } - required - /> - </div> - <div> - <label - className="text-xs ml-1" - htmlFor="mailbody" - > - {t("body")}{" "} - </label> - <EditorToolbar containerId="toolbar1" /> - <ReactQuill - id="mailbody" - theme="snow" - value={mail.body || ""} - placeholder="add body of email " - modules={module1} - formats={formats} - onChange={(value) => - handlebodyChange(value, item) - } - /> - </div> - <button - type="submit" - className="op-btn op-btn-primary" - > - {t("resend")} - </button> - </form> - </div> - )} - {Object?.keys(isNextStep) <= 0 && ( - <div className="flex justify-between items-center gap-2 my-2 px-3"> - <div className="text-base-content"> - {user?.signerPtr?.Name || "-"}{" "} - {`<${ - user?.email - ? user.email - : user.signerPtr.Email - }>`} - </div> - <>{fetchUserStatus(user, item)}</> - </div> - )} - </React.Fragment> - ))} - </div> - </ModalUi> - )} - <ModalUi - title={t("btnLabel.Rename")} - isOpen={isModal["rename_" + item.objectId]} - handleClose={handleCloseModal} - > - <div className="flex flex-col px-4 pb-3 pt-2"> - <div className="flex flex-col gap-2"> - <input - maxLength={200} - autoFocus={true} - type="text" - defaultValue={renameDoc || item.Name} - onChange={(e) => setRenameDoc(e.target.value)} - className="op-input op-input-bordered op-input-sm w-full focus:outline-none hover:border-base-content text-[10px]" - /> - </div> - <div className="flex flex-row gap-2 pt-3 mt-3 border-t-[1.5px] border-gray-500"> - <button - className="w-[100px] op-btn op-btn-primary op-btn-md" - onClick={() => handleRenameDoc(item)} - > - {t("save")} - </button> - <button - className="w-[100px] op-btn op-btn-secondary op-btn-md" - onClick={handleCloseModal} - > - {t("cancel")} - </button> - </div> - </div> - </ModalUi> - {isDownloadModal[item.objectId] && ( - <DownloadPdfZip - setIsDownloadModal={setIsDownloadModal} - isDownloadModal={isDownloadModal[item.objectId]} - pdfDetails={[item]} - isDocId={false} - /> - )} - </td> - </tr> - ) - )} - </> - )} - </tbody> - </table> - {props.List?.length <= 0 && ( - <div - className={`${ - isDashboard ? "h-[317px]" : "" - } flex flex-col items-center justify-center w-ful bg-base-100 text-base-content rounded-xl py-4`} - > - <div className="w-[60px] h-[60px] overflow-hidden"> - <img - className="w-full h-full object-contain" - src={pad} - alt="img" - /> - </div> - <div className="text-sm font-semibold"> - {t("no-data-avaliable")} - </div> - </div> - )} - </div> - <div className="op-join flex flex-wrap items-center p-2"> - {props.List.length > props.docPerPage && ( - <button - onClick={() => paginateBack()} - className="op-join-item op-btn op-btn-sm" - > - {t("prev")} - </button> - )} - {pageNumbers.map((x, i) => ( - <button - key={i} - onClick={() => setCurrentPage(x)} - disabled={x === "..."} - className={`${ - x === currentPage ? "op-btn-active" : "" - } op-join-item op-btn op-btn-sm`} - > - {x} - </button> - ))} - {props.List.length > props.docPerPage && ( - <button - onClick={() => paginateFront()} - className="op-join-item op-btn op-btn-sm" - > - {t("next")} - </button> - )} - </div> - <ModalUi - title={t("add-contact")} - isOpen={isContactform} - handleClose={handleContactFormModal} - > - <AddSigner - handleUserData={handleUserData} - closePopup={handleContactFormModal} - /> - </ModalUi> - {isModal?.["edit_" + contact.objectId] && ( - <ModalUi - isOpen - title={t("edit-contact")} - handleClose={handleCloseModal} - > - <EditContactForm - contact={contact} - handleClose={handleCloseModal} - handleEditContact={handleEditContact} - /> - </ModalUi> - )} - </div> - </div> - ); -}; - -export default ReportTable; diff --git a/apps/OpenSign/src/primitives/LinkUserModal.jsx b/apps/OpenSign/src/primitives/LinkUserModal.jsx index c5bcd7152a..b2702b636f 100644 --- a/apps/OpenSign/src/primitives/LinkUserModal.jsx +++ b/apps/OpenSign/src/primitives/LinkUserModal.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import SelectSigners from "../components/shared/fields/SelectSigners"; import AddContact from "./AddContact"; import ModalUi from "./ModalUi"; @@ -26,7 +26,6 @@ const LinkUserModal = (props) => { > <SelectSigners {...props} - closePopup={props.closePopup} isContact={isContact} setIsContact={setIsContact} isExistSigner={isExistSigner} @@ -36,10 +35,7 @@ const LinkUserModal = (props) => { <div className="op-divider text-base-content mx-[25%] my-1"> {t("or")} </div> - <AddContact - details={props.handleAddUser} - closePopup={props.closePopup} - /> + <AddContact {...props} details={props.handleAddUser} /> </> )} </ModalUi> diff --git a/apps/OpenSign/src/primitives/LoaderWithMsg.jsx b/apps/OpenSign/src/primitives/LoaderWithMsg.jsx index 37c1010e8f..5b2d3028d2 100644 --- a/apps/OpenSign/src/primitives/LoaderWithMsg.jsx +++ b/apps/OpenSign/src/primitives/LoaderWithMsg.jsx @@ -5,7 +5,7 @@ function LoaderWithMsg({ isLoading }) { return ( <div className="flex flex-col justify-center items-center h-[100vh]"> <Loader /> - <span className="text-[13px] text-base-cotent">{isLoading.message}</span> + <span className="text-[13px] text-base-content">{isLoading.message}</span> </div> ); } diff --git a/apps/OpenSign/src/primitives/Modal.jsx b/apps/OpenSign/src/primitives/Modal.jsx deleted file mode 100644 index 333b15dfc7..0000000000 --- a/apps/OpenSign/src/primitives/Modal.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import React, { useState } from "react"; - -const Modal = ({ children, Title }) => { - const [isOpen, SetIsOpen] = useState(false); - return ( - <> - {children && ( - <div - className={`fixed top-20 left-1/2 transform -translate-x-1/2 border-[1px] text-sm bg-white rounded `} - > - <div className="flex justify-between items-center py-[.75rem] px-[1.25rem] "> - <div className="font-semibold text-xl text-black">{Title}</div> - <div - onClick={() => SetIsOpen()} - className="px-2 py-1 bg-gray-400 rounded cursor-pointer" - > - <i className="fa-light fa-xmark"></i> - </div> - </div> - <hr /> - {isOpen && <div>{children}</div>} - </div> - )} - </> - ); -}; - -export default Modal; diff --git a/apps/OpenSign/src/primitives/ModalUi.jsx b/apps/OpenSign/src/primitives/ModalUi.jsx index 6c70e8ee7e..a34ae1489d 100644 --- a/apps/OpenSign/src/primitives/ModalUi.jsx +++ b/apps/OpenSign/src/primitives/ModalUi.jsx @@ -12,13 +12,17 @@ const ModalUi = ({ position }) => { const width = reduceWidth; - const isBottom = position === "bottom" ? "items-end pb-2" : ""; + const isBottom = position === "bottom" ? "items-end pb-2 !bg-black/10" : ""; return ( <> {isOpen && ( <dialog id="selectSignerModal" className={`${isBottom} op-modal op-modal-open`} + style={{ + overlay: { zIndex: 1000 }, + content: { zIndex: 1001, overflow: "visible" } // Ensure modal doesn’t clip content + }} > <div className={`${ @@ -28,7 +32,7 @@ const ModalUi = ({ {showHeader && ( <> {title && ( - <h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]"> + <h3 className="text-base-content text-left font-bold text-lg pt-[15px] px-[20px]"> {title} </h3> )} diff --git a/apps/OpenSign/src/primitives/PdfDeclineModal.jsx b/apps/OpenSign/src/primitives/PdfDeclineModal.jsx index 1200581dda..fbf0538862 100644 --- a/apps/OpenSign/src/primitives/PdfDeclineModal.jsx +++ b/apps/OpenSign/src/primitives/PdfDeclineModal.jsx @@ -34,7 +34,7 @@ function CustomModal(props) { <dialog className="op-modal op-modal-open absolute z-[448]"> <div className="w-[95%] md:w-[60%] lg:w-[40%] op-modal-box p-0 overflow-y-auto hide-scrollbar text-sm"> {props?.isLoader && ( - <div className="absolute h-full w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2] bg-opacity-80"> + <div className="absolute h-full w-full flex flex-col justify-center items-center z-[999] bg-[#e6f2f2]/80"> <Loader /> </div> )} @@ -43,7 +43,9 @@ function CustomModal(props) { </h3> {!isExtendExpiry && ( <div className="p-[10px] px-[20px]"> - <p className="text-[15px] text-base-content">{props.bodyMssg && props.bodyMssg}</p> + <p className="text-[15px] text-base-content"> + {props.bodyMssg && props.bodyMssg} + </p> </div> )} {!isExtendExpiry && ( @@ -68,7 +70,7 @@ function CustomModal(props) { )} {props.footerMessage && ( <> - <div className="mx-3 text-base-content"> + <div className="mx-3 text-base-content"> <textarea rows={3} placeholder="Reason (optional)" @@ -103,12 +105,17 @@ function CustomModal(props) { )} {isExtendExpiry && ( <form className="mx-3 mb-3" onSubmit={handleUpdateExpiry}> - <label className="ml-2 mt-2"> + <label + htmlFor="expiryDate" + className="ml-2 mt-2 text-base-content" + > {t("expiry-date")} {"(dd-mm-yyyy)"} </label> <input + id="expiryDate" type="date" - className="rounded-full bg-base-300 w-full px-4 py-2 text-base-content border-2 hover:border-spacing-2" + onClick={(e) => e?.currentTarget?.showPicker?.()} + className="rounded-full w-full px-4 op-input op-input-bordered op-input-md text-base-content focus:outline-none hover:border-base-content" defaultValue={props?.doc?.ExpiryDate?.iso?.split("T")?.[0]} onChange={(e) => setExpiryDate(e.target.value)} /> diff --git a/apps/OpenSign/src/primitives/RenderReportCell.jsx b/apps/OpenSign/src/primitives/RenderReportCell.jsx new file mode 100644 index 0000000000..d80272c7d1 --- /dev/null +++ b/apps/OpenSign/src/primitives/RenderReportCell.jsx @@ -0,0 +1,165 @@ +import { useTranslation } from "react-i18next"; +import { formatDate } from "../constant/Utils"; +import SignerCell from "./SignerCell"; + +function isValidDateString(str) { + const date = new Date(str); + return !isNaN(date.getTime()); +} +// `formatRow` is used to show data in poper manner like +// if data is of array type then it will join array items with "," +// if data is of object type then it Name values will be show in row +// if no data available it will show hyphen "-" +const formatRow = (row) => { + if (Array.isArray(row)) { + return row.map((x) => x.Name).join(", "); + } else if (typeof row === "object" && row !== null) { + return row?.iso ? formatDate(row?.iso) : row?.Name || "-"; + } else if (typeof row === "boolean" && row !== null) { + return row ? row?.toString() : "false"; + } else if (isValidDateString(row) && row !== null) { + // handle createdAt and updatedAt + return formatDate(row) || "-"; + } else { + return row || "-"; + } +}; +// Renders a report cell based on the report's heading position +export const RenderReportCell = ({ + col, + rowData, + rowIndex, + startIndex, + handleDownload, + handleRemovePrefill, + reportName +}) => { + const { t } = useTranslation(); + const appName = + "OpenSign™"; + const drivename = appName === "OpenSign™" ? "OpenSign™" : ""; + switch (col) { + case "Sr.No": + return ( + <th key={col} className="px-2 py-2"> + {startIndex + rowIndex + 1} + </th> + ); + case "Name": + case "Title": + return ( + <td key={col} className="p-2 min-w-56 max-w-56"> + <div className="font-semibold break-words">{rowData?.Name}</div> + {rowData?.ExpiryDate?.iso && ( + <div className="text-gray-500"> + {t("expires")} {formatDate(rowData?.ExpiryDate?.iso)} + </div> + )} + </td> + ); + case "Reason": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.DeclineReason?.length > 25 + ? rowData?.DeclineReason?.slice(0, 25) + "..." + : rowData?.DeclineReason || "-"} + </td> + ); + case "Note": + return ( + <td key={col} className="p-2 text-center"> + <p className="truncate w-[100px]">{rowData?.Note || "-"}</p> + </td> + ); + case "Folder": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.Folder?.Name || + t("sidebar.OpenSign™ Drive", { appName: drivename })} + </td> + ); + case "File": + return ( + <td key={col} className="p-2 text-center"> + <button + onClick={() => handleDownload(rowData)} + className="op-link op-link-primary" + title={t("download")} + > + {rowData?.URL ? t("download") : "-"} + </button> + </td> + ); + case "Owner": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.ExtUserPtr?.Name || "-"} + </td> + ); + case "Time to complete (Days)": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.TimeToCompleteDays || "-"} + </td> + ); + case "Notify on signatures": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.NotifyOnSignatures?.toString() || "-"} + </td> + ); + case "Enable Tour": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.IsTourEnabled?.toString() || "-"} + </td> + ); + case "Redirect url": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.RedirectUrl?.toString() || "-"} + </td> + ); + case "Created Date": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.createdAt ? formatDate(rowData?.createdAt) : "-"} + </td> + ); + case "Updated Date": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.updatedAt ? formatDate(rowData?.updatedAt) : "-"} + </td> + ); + case "Expiry Date": + return ( + <td key={col} className="p-2 text-center"> + {rowData?.ExpiryDate ? formatDate(rowData?.ExpiryDate?.iso) : "-"} + </td> + ); + case "Signers": + return ( + <SignerCell + key={col} + reportName={reportName} + item={rowData} + handleRemovePrefill={handleRemovePrefill} + /> + ); + default: + return ( + <td key={col} className="p-2 text-center"> + {Array.isArray(rowData[col]) ? ( + <div className="flex flex-row flex-wrap gap-1 justify-center"> + {rowData[col].map((x, i) => ( + <span key={i}>{formatRow(x)}</span> + ))} + </div> + ) : ( + formatRow(rowData[col]) + )} + </td> + ); + } +}; diff --git a/apps/OpenSign/src/primitives/ShareButton.jsx b/apps/OpenSign/src/primitives/ShareButton.jsx index aadb05a1d2..bcc2d9225f 100644 --- a/apps/OpenSign/src/primitives/ShareButton.jsx +++ b/apps/OpenSign/src/primitives/ShareButton.jsx @@ -69,7 +69,7 @@ export default function ShareButton({ title, text, url, className, children }) { isOpen title={ <> - <i class="fa-solid fa-share-from-square"></i> Share + <i className="fa-solid fa-share-from-square"></i> Share </> } handleClose={() => setPopupOpen(false)} diff --git a/apps/OpenSign/src/primitives/SignerCell.jsx b/apps/OpenSign/src/primitives/SignerCell.jsx new file mode 100644 index 0000000000..b1a9da1168 --- /dev/null +++ b/apps/OpenSign/src/primitives/SignerCell.jsx @@ -0,0 +1,184 @@ +import { useTranslation } from "react-i18next"; +import { formatDateTime, getSignerEmail } from "../constant/Utils"; +import { useState } from "react"; +import ModalUi from "./ModalUi"; + +// Signer is used in report to show signer list conditionally +const SignerCell = ({ reportName, item, handleRemovePrefill }) => { + const { t } = useTranslation(); + const Extand_Class = localStorage.getItem("Extand_Class"); + const extClass = Extand_Class && JSON.parse(Extand_Class); + const isTemplateReport = reportName === "Templates"; + const isCompletedReport = reportName === "Completed Documents"; + const [isShowAllSigners, setIsShowAllSigners] = useState({}); + const [isModal, setIsModal] = useState(false); + const shouldShowSigner = [ + "In-progress documents", + "Need your sign", + "Completed Documents" + ].includes(reportName); + const shouldRender = + !item?.IsSignyourself && handleRemovePrefill(item?.Placeholders); + + const handleCloseModal = () => { + setIsModal({}); + }; + const handleViewSigners = (item) => { + setIsModal({ ["view_" + item.objectId]: true }); + }; + // `formatStatusRow` is used to format status row + const formatStatusRow = (item) => { + const timezone = extClass?.[0]?.Timezone || ""; + const DateFormat = extClass?.[0]?.DateFormat || "MM/DD/YYYY"; + const Is12Hr = extClass?.[0]?.Is12HourTime || false; + const removePrefill = item?.Placeholders.filter( + (data) => data?.Role !== "prefill" + ); + const signers = removePrefill?.map((x, i) => { + const audit = item?.AuditTrail?.find( + (audit) => audit?.UserPtr?.objectId === x.signerObjId + ); + const format = (date) => + date + ? formatDateTime(new Date(date), DateFormat, timezone, Is12Hr) + : "-"; + return { + id: i, + Email: getSignerEmail(x, item?.Signers) || x?.email || "-", + Activity: audit?.Activity?.toUpperCase() || "SENT", + SignedOn: format(audit?.SignedOn), + ViewedOn: format(audit?.ViewedOn) + }; + }); + // Decide how many signers to display based on `showAllSignes` state + const displaySigners = isShowAllSigners[item.objectId] + ? signers + : signers.slice(0, 3); + return ( + <> + {displaySigners?.map((x, i) => ( + <div + key={i} + className={`text-sm flex flex-row gap-2 items-center ${ + i !== displaySigners.length - 1 ? "mb-2" : "" + }`} + > + {!isCompletedReport && ( + <button + onClick={() => setIsModal({ [`${item.objectId}_${i}`]: true })} + className={`${ + x.Activity === "SIGNED" + ? "op-border-primary op-text-primary" + : x.Activity === "VIEWED" + ? "border-green-400 text-green-400" + : "border-base-content text-base-content" + } focus:outline-none border-2 w-[60px] h-[30px] text-[11px] rounded-full`} + > + {x?.Activity?.toUpperCase() || "-"} + </button> + )} + <div className="text-[12px]">{x?.Email || "-"}</div> + {!isCompletedReport && isModal[`${item.objectId}_${i}`] && ( + <ModalUi + isOpen + title={t("document-logs")} + handleClose={handleCloseModal} + > + <div className="pl-3 first:mt-2 border-t-[1px] border-gray-600 text-[12px] py-2"> + <p className="font-bold"> {x?.Email}</p> + <p>{t("viewed-on", { ViewedOn: x?.ViewedOn })}</p> + <p>{t("signed-on", { SignedOn: x?.SignedOn })}</p> + </div> + </ModalUi> + )} + </div> + ))} + {/* Show More / Hide button */} + {signers?.length > 3 && ( + <button + onClick={() => + setIsShowAllSigners({ + [item.objectId]: !isShowAllSigners[item.objectId] + }) + } + className="ml-2 mt-1 text-xs font-medium text-blue-500 underline focus:outline-none" + > + {isShowAllSigners[item.objectId] ? t("hide") : t("show-more")} + </button> + )} + </> + ); + }; + + if (shouldShowSigner) { + return ( + <td className="px-1 py-2"> + {shouldRender ? <>{formatStatusRow(item)}</> : <>-</>} + </td> + ); + } + + return ( + <td className="p-2 text-center"> + {shouldRender ? ( + <button + onClick={() => handleViewSigners(item)} + className="op-link op-link-primary" + > + {t("view")} + </button> + ) : ( + "-" + )} + {isModal["view_" + item.objectId] && ( + <ModalUi + isOpen + showHeader={isTemplateReport} + title={t("signers")} + reduceWidth={"md:max-w-[450px]"} + handleClose={() => handleCloseModal()} + > + {!isTemplateReport && ( + <div + className="op-btn op-btn-sm op-btn-circle op-btn-ghost text-base-content absolute right-2 top-1 z-40" + onClick={() => handleCloseModal()} + > + ✕ + </div> + )} + <table className="op-table w-full overflow-auto"> + <thead className="h-[38px] sticky top-0 text-base-content text-sm pt-[15px] px-[20px]"> + <tr> + {isTemplateReport && ( + <th className="p-2 pl-3 w-[30%]">{t("roles")}</th> + )} + <th className="pl-3 py-2"> + {isTemplateReport ? t("email") : t("signers")} + </th> + </tr> + </thead> + <tbody> + {item.Placeholders.map( + (x, i) => + x.Role !== "prefill" && ( + <tr key={i} className="text-sm font-medium"> + {isTemplateReport && ( + <td className="text-[12px] p-2 pl-3 w-[30%]"> + {x.Role && x.Role} + </td> + )} + <td className="pl-3 text-[12px] py-2 break-all"> + {x?.email || getSignerEmail(x, item?.Signers) || "-"} + </td> + </tr> + ) + )} + </tbody> + </table> + </ModalUi> + )} + </td> + ); +}; + +export default SignerCell; diff --git a/apps/OpenSign/src/primitives/Tour.jsx b/apps/OpenSign/src/primitives/Tour.jsx index 0612c10733..aee64201c1 100644 --- a/apps/OpenSign/src/primitives/Tour.jsx +++ b/apps/OpenSign/src/primitives/Tour.jsx @@ -6,7 +6,7 @@ export default function Tour({ rounded, className, showNumber, - closeWithMask, + closeWithMask = false, onRequestClose, showNavigation, showCloseButton, diff --git a/apps/OpenSign/src/primitives/TourContentWithBtn.jsx b/apps/OpenSign/src/primitives/TourContentWithBtn.jsx index ada3768a9d..afa54ba07e 100644 --- a/apps/OpenSign/src/primitives/TourContentWithBtn.jsx +++ b/apps/OpenSign/src/primitives/TourContentWithBtn.jsx @@ -1,8 +1,13 @@ import React, { useState } from "react"; import { useTranslation } from "react-i18next"; -export default function TourContentWithBtn({ message, isChecked, video }) { +export default function TourContentWithBtn({ + message, + isChecked, + video, + isDontShowCheckbox = true +}) { const { t } = useTranslation(); - const [isCheck, setIsCheck] = useState(false); + const [isCheck, setIsCheck] = useState(true); const handleCheck = () => { setIsCheck(!isCheck); @@ -24,15 +29,17 @@ export default function TourContentWithBtn({ message, isChecked, video }) { ></iframe> </div> )} - <label className="flex items-center justify-center mt-3 mb-0"> - <input - type="checkbox" - className="op-checkbox op-checkbox-xs mr-1" - checked={isCheck} - onChange={handleCheck} - /> - <span className="#787878 text-[12px]">{t("tour-content")}</span> - </label> + {isDontShowCheckbox && ( + <label className="flex items-center justify-center mt-3 mb-0"> + <input + type="checkbox" + className="op-checkbox op-checkbox-xs mr-1" + checked={isCheck} + onChange={handleCheck} + /> + <span className="#787878 text-[12px]">{t("tour-content")}</span> + </label> + )} </div> ); } diff --git a/apps/OpenSign/src/primitives/ValidateRoute.jsx b/apps/OpenSign/src/primitives/ValidateRoute.jsx index 5f5fdc4253..6714468deb 100644 --- a/apps/OpenSign/src/primitives/ValidateRoute.jsx +++ b/apps/OpenSign/src/primitives/ValidateRoute.jsx @@ -32,6 +32,7 @@ const ValidateRoute = () => { let PageLanding = localStorage.getItem("PageLanding"); let baseUrl = localStorage.getItem("baseUrl"); let appid = localStorage.getItem("parseAppId"); + let favicon = localStorage.getItem("favicon"); localStorage.clear(); saveLanguageInLocal(i18n); @@ -42,8 +43,9 @@ const ValidateRoute = () => { localStorage.setItem("userSettings", appdata); localStorage.setItem("baseUrl", baseUrl); localStorage.setItem("parseAppId", appid); + localStorage.setItem("favicon", favicon); }; - return <div>{<Outlet />}</div>; + return <>{<Outlet />}</>; }; export default ValidateRoute; diff --git a/apps/OpenSign/src/primitives/ValidateSession.jsx b/apps/OpenSign/src/primitives/ValidateSession.jsx index d1dc59f7c2..2c80b4928c 100644 --- a/apps/OpenSign/src/primitives/ValidateSession.jsx +++ b/apps/OpenSign/src/primitives/ValidateSession.jsx @@ -23,7 +23,7 @@ const ValidateSession = ({ children }) => { ) : ( <ModalUi showHeader={false} isOpen={true} showClose={false}> <div className="flex flex-col justify-center items-center py-4 md:py-5 gap-5"> - <p className="text-xl font-medium">Your session has expired.</p> + <p className="text-xl font-medium">{t("session-expired")}</p> <button onClick={handleLoginBtn} className="op-btn op-btn-neutral"> {t("login")} </button> diff --git a/apps/OpenSign/src/redux/reducers/ShowTenant.js b/apps/OpenSign/src/redux/reducers/ShowTenant.js index 5bb1090d53..5a31e20250 100644 --- a/apps/OpenSign/src/redux/reducers/ShowTenant.js +++ b/apps/OpenSign/src/redux/reducers/ShowTenant.js @@ -6,9 +6,9 @@ const showTenantSlice = createSlice({ reducers: { showTenant: (state, action) => { return action.payload; - }, - }, + } + } }); export const { showTenant } = showTenantSlice.actions; -export default showTenantSlice.reducer; \ No newline at end of file +export default showTenantSlice.reducer; diff --git a/apps/OpenSign/src/redux/reducers/showHeader.js b/apps/OpenSign/src/redux/reducers/showHeader.js deleted file mode 100644 index 9a98203f28..0000000000 --- a/apps/OpenSign/src/redux/reducers/showHeader.js +++ /dev/null @@ -1,14 +0,0 @@ -import { createSlice } from "@reduxjs/toolkit"; - -const showHeaderSlice = createSlice({ - name: "showTenant", - initialState: "", - reducers: { - showHeader: (state, action) => { - return action.payload; - } - } -}); - -export const { showHeader } = showHeaderSlice.actions; -export default showHeaderSlice.reducer; diff --git a/apps/OpenSign/src/redux/reducers/sidebarReducer.js b/apps/OpenSign/src/redux/reducers/sidebarReducer.js new file mode 100644 index 0000000000..4d3f4bfb7a --- /dev/null +++ b/apps/OpenSign/src/redux/reducers/sidebarReducer.js @@ -0,0 +1,20 @@ +import { createSlice } from "@reduxjs/toolkit"; + +const sidebarSlice = createSlice({ + name: "sidebar", + initialState: { isOpen: true }, + reducers: { + toggleSidebar: (state, action) => { + if (typeof action.payload === "undefined") { + // no payload provided → just toggle + state.isOpen = !state.isOpen; + } else { + // payload provided → use it directly + state.isOpen = action.payload; + } + } + } +}); + +export const { toggleSidebar } = sidebarSlice.actions; +export default sidebarSlice.reducer; diff --git a/apps/OpenSign/src/redux/reducers/widgetSlice.js b/apps/OpenSign/src/redux/reducers/widgetSlice.js index 4705aa4398..d005a0cb6f 100644 --- a/apps/OpenSign/src/redux/reducers/widgetSlice.js +++ b/apps/OpenSign/src/redux/reducers/widgetSlice.js @@ -10,7 +10,10 @@ const initialState = { signatureTypes: null, defaultSignImg: null, myInitial: null, - lastIndex: "" + lastIndex: "", + scrollTriggerId: "", + prefillImg: [], + prefillImgLoad: {} }; const widgetSlice = createSlice({ @@ -35,6 +38,27 @@ const widgetSlice = createSlice({ setLastIndex: (state, action) => { state.lastIndex = action.payload; }, + setScrollTriggerId: (state, action) => { + state.scrollTriggerId = action.payload; + }, + setPrefillImg: (state, action) => { + const existingIndex = state.prefillImg.findIndex( + (img) => img.id === action.payload.id + ); + if (existingIndex !== -1) { + // Replace the existing object with updated URL + state.prefillImg[existingIndex] = { + ...state.prefillImg[existingIndex], + ...action.payload + }; + } else { + // Add new object + state.prefillImg.push(action.payload); + } + }, + setPrefillImgLoad: (state, action) => { + state.prefillImgLoad = action.payload; + }, resetWidgetState: () => initialState } }); @@ -46,7 +70,10 @@ export const { setMyInitial, resetWidgetState, setDefaultSignImg, - setLastIndex + setLastIndex, + setScrollTriggerId, + setPrefillImg, + setPrefillImgLoad } = widgetSlice.actions; export default widgetSlice.reducer; diff --git a/apps/OpenSign/src/redux/store.js b/apps/OpenSign/src/redux/store.js index 17b54c229e..0d2f9863d8 100644 --- a/apps/OpenSign/src/redux/store.js +++ b/apps/OpenSign/src/redux/store.js @@ -2,15 +2,15 @@ import { configureStore } from "@reduxjs/toolkit"; import infoReducer from "./reducers/infoReducer"; import ShowTenant from "./reducers/ShowTenant"; import TourStepsReducer from "./reducers/TourStepsReducer"; -import showHeader from "./reducers/showHeader"; import widgetReducer from "./reducers/widgetSlice"; +import sidebarReducer from "./reducers/sidebarReducer"; export const store = configureStore({ reducer: { appInfo: infoReducer, TourSteps: TourStepsReducer, ShowTenant, - showHeader, - widget: widgetReducer + widget: widgetReducer, + sidebar: sidebarReducer } }); diff --git a/apps/OpenSign/src/reports/contact/Contactbook.jsx b/apps/OpenSign/src/reports/contact/Contactbook.jsx new file mode 100644 index 0000000000..8594ee5997 --- /dev/null +++ b/apps/OpenSign/src/reports/contact/Contactbook.jsx @@ -0,0 +1,505 @@ +import React, { useState, useEffect, useRef } from "react"; +import pad from "../../assets/images/pad.svg"; +import axios from "axios"; +import { useTranslation } from "react-i18next"; +import EditContactForm from "./EditContactForm"; +import ModalUi from "../../primitives/ModalUi"; +import Alert from "../../primitives/Alert"; +import Tooltip from "../../primitives/Tooltip"; +import Loader from "../../primitives/Loader"; +import { serverUrl_fn } from "../../constant/appinfo"; +import { useElSize } from "../../hook/useElSize"; +import ImportContact from "./ImportContact"; +import AddContact from "../../primitives/AddContact"; + +const Contactbook = (props) => { + const titleRef = useRef(null); + const titleElement = useElSize(titleRef); + const { t } = useTranslation(); + const [currentPage, setCurrentPage] = useState(1); + const [actLoader, setActLoader] = useState({}); + const [isContactform, setIsContactform] = useState(false); + const [isDeleteModal, setIsDeleteModal] = useState({}); + const [isOption, setIsOption] = useState({}); + const [alertMsg, setAlertMsg] = useState({ type: "success", message: "" }); + const [isModal, setIsModal] = useState({}); + const [contact, setContact] = useState({ + Name: "", + Email: "", + Phone: "", + JobTitle: "", + Company: "" + }); + const [sortOrder, setSortOrder] = useState("asc"); + const startIndex = (currentPage - 1) * props.docPerPage; + const { isMoreDocs, setIsNextRecord } = props; + + useEffect(() => { + if (props.isSearchResult) { + setCurrentPage(1); + } + }, [props.isSearchResult]); + + const getPaginationRange = () => { + const totalPageNumbers = 7; // Adjust this value to show more/less page numbers + const pages = []; + const totalPages = Math.ceil(props.List.length / props.docPerPage); + if (totalPages <= totalPageNumbers) { + for (let i = 1; i <= totalPages; i++) { + pages.push(i); + } + } else { + const leftSiblingIndex = Math.max(currentPage - 1, 1); + const rightSiblingIndex = Math.min(currentPage + 1, totalPages); + + const showLeftDots = leftSiblingIndex > 2; + const showRightDots = rightSiblingIndex < totalPages - 2; + + const firstPageIndex = 1; + const lastPageIndex = totalPages; + + if (!showLeftDots && showRightDots) { + let leftItemCount = 3; + let leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1); + + pages.push(...leftRange); + pages.push("..."); + pages.push(totalPages); + } else if (showLeftDots && !showRightDots) { + let rightItemCount = 3; + let rightRange = Array.from( + { length: rightItemCount }, + (_, i) => totalPages - rightItemCount + i + 1 + ); + + pages.push(firstPageIndex); + pages.push("..."); + pages.push(...rightRange); + } else if (showLeftDots && showRightDots) { + let middleRange = Array.from( + { length: 3 }, + (_, i) => leftSiblingIndex + i + ); + + pages.push(firstPageIndex); + pages.push("..."); + pages.push(...middleRange); + pages.push("..."); + pages.push(lastPageIndex); + } + } + + return pages; + }; + const showAlert = (type, message, time = 1500) => { + setAlertMsg({ type: type, message: message }); + setTimeout(() => setAlertMsg({ type: "", message: "" }), time); + }; + const pageNumbers = getPaginationRange(); + // below useEffect reset currenpage to 1 if user change route + useEffect(() => { + return () => setCurrentPage(1); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // below useEffect is used to render next record if IsMoreDoc is true + // second last value of pageNumber array is same as currentPage + useEffect(() => { + if (isMoreDocs && pageNumbers[pageNumbers.length - 1] === currentPage) { + setIsNextRecord(true); + } + }, [isMoreDocs, pageNumbers, currentPage, setIsNextRecord]); + + const handleActionBtn = async (act, item) => { + if (act.action === "delete") { + setIsDeleteModal({ [item.objectId]: true }); + } else if (act.action === "option") { + setIsOption({ [item.objectId]: !isOption[item.objectId] }); + } else if (act.action === "edit") { + setContact(item); + setIsModal({ [`edit_${item.objectId}`]: true }); + } + }; + // Get current list + const indexOfLastDoc = currentPage * props.docPerPage; + const indexOfFirstDoc = indexOfLastDoc - props.docPerPage; + const sortedList = React.useMemo(() => { + const contacts = [...props.List]; + contacts.sort((a, b) => { + const nameA = a?.Name?.toLowerCase() || ""; + const nameB = b?.Name?.toLowerCase() || ""; + if (nameA < nameB) return sortOrder === "asc" ? -1 : 1; + if (nameA > nameB) return sortOrder === "asc" ? 1 : -1; + return 0; + }); + return contacts; + }, [props.List, sortOrder]); + + const currentList = sortedList?.slice(indexOfFirstDoc, indexOfLastDoc); + + // Change page + const paginateFront = () => { + const lastValue = pageNumbers?.[pageNumbers?.length - 1]; + if (currentPage < lastValue) { + setCurrentPage(currentPage + 1); + } + }; + + const paginateBack = () => { + if (startIndex > 0) { + setCurrentPage(currentPage - 1); + } + }; + + const handleContactFormModal = () => { + setIsContactform(!isContactform); + }; + + const toggleSortOrder = () => { + setSortOrder(sortOrder === "asc" ? "desc" : "asc"); + }; + + const handleUserData = (data) => { + props.setList((prevData) => [data, ...prevData]); + }; + + const handleDelete = async (item) => { + setIsDeleteModal({}); + setActLoader({ [`${item.objectId}`]: true }); + try { + const serverUrl = serverUrl_fn(); + const cls = "contracts_Contactbook"; + const url = serverUrl + `/classes/${cls}/`; + const body = { IsDeleted: true }; + const res = await axios.put(url + item.objectId, body, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + }); + if (res.data && res.data.updatedAt) { + setActLoader({}); + showAlert("success", t("record-delete-alert")); + const upldatedList = props.List.filter( + (x) => x.objectId !== item.objectId + ); + props.setList(upldatedList); + } + } catch (err) { + console.log("err", err); + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + } + }; + const handleClose = () => { + setIsDeleteModal({}); + }; + + // `handleImportBtn` is trigger when user click on upload icon from contactbook + const handleImportBtn = () => { + setIsModal({ export: true }); + }; + + // `handleEditContact` is used to update contactas per old contact Id + const handleEditContact = async (updateContact) => { + const updateList = props.List.map((x) => + x.objectId === contact.objectId ? { ...x, ...updateContact } : x + ); + props.setList(updateList); + }; + const handleCloseModal = () => { + setActLoader({}); + setIsModal({}); + }; + return ( + <div className="relative"> + {Object.keys(actLoader)?.length > 0 && ( + <div className="absolute w-full h-full flex justify-center items-center bg-black/30 rounded-box z-30"> + <Loader /> + </div> + )} + <div className="p-2 w-full bg-base-100 text-base-content op-card shadow-lg"> + {alertMsg.message && ( + <Alert type={alertMsg.type}>{alertMsg.message}</Alert> + )} + <div + ref={titleRef} + className="flex flex-row items-center justify-between my-2 mx-3 text-[20px] md:text-[23px]" + > + <div className="font-light"> + {t(`report-name.Contactbook`)}{" "} + {props.report_help && ( + <span className="text-xs md:text-[13px] font-normal"> + <Tooltip + id="report_help" + message="t(`report-help.Contactbook`)" + /> + </span> + )} + </div> + <div className="flex flex-row justify-center items-center gap-3 mb-2"> + {/* Search input for report bigger in width */} + {titleElement?.width > 500 && ( + <div className="flex"> + <input + type="search" + value={props.searchTerm} + onChange={props.handleSearchChange} + placeholder={t("search-contacts")} + onPaste={props.handleSearchPaste} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-64 text-xs" + /> + </div> + )} + {/* import contact icon */} + <div + className="cursor-pointer flex" + onClick={() => handleImportBtn()} + > + <i className="fa-light fa-upload text-[23px] md:text-[25px]"></i> + </div> + {/* add contact icon*/} + <div + className="cursor-pointer flex" + onClick={() => handleContactFormModal()} + > + <i className="fa-light fa-square-plus text-accent text-[30px] md:text-[32px]"></i> + </div> + {/* search icon/magnifer icon */} + {titleElement?.width < 500 && ( + <button + className="flex justify-center items-center focus:outline-none rounded-md text-[18px]" + aria-label="Search" + onClick={() => + props.setMobileSearchOpen(!props.mobileSearchOpen) + } + > + <i className="fa-light fa-magnifying-glass"></i> + </button> + )} + </div> + </div> + {/* Search input for report smalle in width */} + {titleElement?.width < 500 && props.mobileSearchOpen && ( + <div className="top-full left-0 w-full px-3 pt-1 pb-3"> + <input + type="search" + value={props.searchTerm} + onChange={props.handleSearchChange} + placeholder={t("search-documents")} + onPaste={props.handleSearchPaste} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + /> + </div> + )} + <div + className={`overflow-auto w-full border-b ${ + props.List?.length > 0 + ? "min-h-[317px]" + : currentList?.length === props.docPerPage + ? "h-fit" + : "h-screen" + }`} + > + <table className="op-table border-collapse w-full mb-4"> + <thead className="text-[14px] text-center"> + <tr className="border-y-[1px]"> + {props.heading?.map((item, index) => ( + <React.Fragment key={index}> + <th className="text-left p-2"> + {t(`report-heading.${item}`)} + {item === "Name" && ( + <button + type="button" + onClick={toggleSortOrder} + className="ml-1" + > + <i + className={ + sortOrder === "asc" + ? "fa-light fa-arrow-down-a-z" + : "fa-light fa-arrow-up-a-z" + } + ></i> + </button> + )} + </th> + </React.Fragment> + ))} + {props.actions?.length > 0 && ( + <th className="p-2 text-transparent pointer-events-none"> + {t("action")} + </th> + )} + </tr> + </thead> + <tbody className="text-[12px]"> + {props.List?.length > 0 && + currentList.map((item, index) => ( + <tr className="last:border-none border-y-[1px]" key={index}> + {props.heading.includes("Sr.No") && ( + <td className="p-2 text-left font-semibold"> + {startIndex + index + 1} + </td> + )} + {props.heading.includes("Name") && ( + <td className="p-2 text-left font-semibold"> + {item?.Name} + </td> + )} + {props.heading.includes("Email") && ( + <td className="p-2 text-left">{item?.Email ?? "-"}</td> + )} + {props.heading.includes("Phone") && ( + <td className="p-2 text-left">{item?.Phone ?? "-"}</td> + )} + {props.heading.includes("Company") && ( + <td className="p-2 text-left">{item?.Company ?? "-"}</td> + )} + {props.heading.includes("JobTitle") && ( + <td className="p-2 text-left">{item?.JobTitle ?? "-"}</td> + )} + <td className="px-3 py-2"> + <div className="text-base-content min-w-max flex flex-row gap-x-2 gap-y-1 justify-start items-center"> + {props.actions?.length > 0 && + props.actions.map((act, index) => ( + <button + key={index} + onClick={() => handleActionBtn(act, item)} + title={t(`btnLabel.${act.hoverLabel}`)} + className={`${ + act?.btnColor ? act.btnColor : "" + } op-btn op-btn-sm`} + > + <i className={act.btnIcon}></i> + </button> + ))} + {isDeleteModal[item.objectId] && ( + <ModalUi + isOpen + title={t("delete-contact")} + handleClose={handleClose} + > + <div className="m-[20px]"> + <div className="text-lg font-normal text-base-content"> + {t("contact-delete-alert")} + </div> + <hr className="bg-[#ccc] mt-3" /> + <div className="flex items-center mt-3 gap-2 text-white"> + <button + onClick={() => handleDelete(item)} + className="w-[100px] op-btn op-btn-primary" + > + {t("yes")} + </button> + <button + onClick={handleClose} + className="w-[100px] op-btn op-btn-secondary" + > + {t("no")} + </button> + </div> + </div> + </ModalUi> + )} + </div> + </td> + </tr> + ))} + </tbody> + </table> + {props.List?.length <= 0 && ( + <div className="flex flex-col items-center justify-center w-ful bg-base-100 text-base-content rounded-xl py-4"> + <div className="w-[60px] h-[60px] overflow-hidden"> + <img + className="w-full h-full object-contain" + src={pad} + alt={t("no-data-avaliable")} + /> + </div> + <div className="text-sm font-semibold"> + {t("no-data-avaliable")} + </div> + </div> + )} + </div> + <div className="op-join flex flex-wrap items-center p-2"> + {props.List.length > props.docPerPage && ( + <button + onClick={() => paginateBack()} + className="op-join-item op-btn op-btn-sm" + > + {t("prev")} + </button> + )} + {pageNumbers.map((x, i) => ( + <button + key={i} + onClick={() => setCurrentPage(x)} + disabled={x === "..."} + className={`${ + x === currentPage ? "op-btn-active" : "" + } op-join-item op-btn op-btn-sm`} + > + {x} + </button> + ))} + {props.List.length > props.docPerPage && ( + <button + onClick={() => paginateFront()} + className="op-join-item op-btn op-btn-sm" + > + {t("next")} + </button> + )} + </div> + <ModalUi + title={t("add-contact")} + isOpen={isContactform} + handleClose={handleContactFormModal} + > + <AddContact + isDisableTitle + isAddYourSelfCheckbox + details={handleUserData} + closePopup={handleContactFormModal} + /> + </ModalUi> + {isModal?.["edit_" + contact.objectId] && ( + <ModalUi + isOpen + title={t("edit-contact")} + handleClose={handleCloseModal} + > + <EditContactForm + contact={contact} + handleClose={handleCloseModal} + handleEditContact={handleEditContact} + /> + </ModalUi> + )} + <ModalUi + isOpen={isModal?.export} + title={t("bulk-import")} + handleClose={handleCloseModal} + > + <div className="relative"> + {Object.keys(actLoader)?.length > 0 && ( + <div className="absolute w-full h-full flex justify-center items-center bg-black bg-opacity-30 z-30"> + <Loader /> + </div> + )} + <ImportContact + setLoader={setActLoader} + onImport={handleCloseModal} + showAlert={showAlert} + /> + </div> + </ModalUi> + </div> + </div> + ); +}; + +export default Contactbook; diff --git a/apps/OpenSign/src/components/EditContactForm.jsx b/apps/OpenSign/src/reports/contact/EditContactForm.jsx similarity index 72% rename from apps/OpenSign/src/components/EditContactForm.jsx rename to apps/OpenSign/src/reports/contact/EditContactForm.jsx index f1e1df4250..f960767af6 100644 --- a/apps/OpenSign/src/components/EditContactForm.jsx +++ b/apps/OpenSign/src/reports/contact/EditContactForm.jsx @@ -1,11 +1,17 @@ -import React, { useEffect, useState } from "react"; -import Loader from "../primitives/Loader"; +import { useEffect, useState } from "react"; +import Loader from "../../primitives/Loader"; import { useTranslation } from "react-i18next"; import Parse from "parse"; const EditContactForm = (props) => { const { t } = useTranslation(); const [isLoader, setIsLoader] = useState(false); - const [formData, setFormData] = useState({ Name: "", Email: "", Phone: "" }); + const [formData, setFormData] = useState({ + Name: "", + Email: "", + Phone: "", + Company: "", + JobTitle: "" + }); useEffect(() => { if (props.contact?.Email) { setFormData((prev) => ({ ...prev, ...props.contact })); @@ -31,7 +37,9 @@ const EditContactForm = (props) => { contactId: props.contact.objectId, name: formData.Name, email: formData.Email, - phone: formData.Phone, + phone: formData?.Phone, + company: formData?.Company, + jobTitle: formData?.JobTitle, tenantId: localStorage.getItem("TenantId") }; const res = await Parse.Cloud.run("editcontact", params); @@ -39,7 +47,9 @@ const EditContactForm = (props) => { ...res, Name: formData.Name, Email: formData.Email, - Phone: formData.Phone + Phone: formData?.Phone, + Company: formData?.Company, + JobTitle: formData?.JobTitle }; props.handleEditContact(updateContact); } catch (err) { @@ -112,6 +122,34 @@ const EditContactForm = (props) => { placeholder={t("phone-optional")} /> </div> + <div className="mb-3"> + <label htmlFor="Company" className="block text-xs font-semibold"> + {t("company")} + </label> + <input + type="text" + id="Company" + name="Company" + value={formData.Company} + onChange={(e) => handleChange(e)} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + placeholder={t("phone-optional")} + /> + </div> + <div className="mb-3"> + <label htmlFor="JobTitle" className="block text-xs font-semibold"> + {t("job-title")} + </label> + <input + type="text" + id="JobTitle" + name="JobTitle" + value={formData.JobTitle} + onChange={(e) => handleChange(e)} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + placeholder={t("phone-optional")} + /> + </div> <div className="mt-4 flex gap-x-2 justify-start"> <button type="submit" className="op-btn op-btn-primary"> {t("submit")} diff --git a/apps/OpenSign/src/reports/contact/ImportContact.jsx b/apps/OpenSign/src/reports/contact/ImportContact.jsx new file mode 100644 index 0000000000..76c3e8a88c --- /dev/null +++ b/apps/OpenSign/src/reports/contact/ImportContact.jsx @@ -0,0 +1,310 @@ +import { useState, useEffect, useRef } from "react"; +import { useTranslation } from "react-i18next"; +import * as XLSX from "xlsx"; +import Parse from "parse"; +import { emailRegex } from "../../constant/const"; + +const ImportContact = ({ setLoader, onImport, showAlert }) => { + const { t } = useTranslation(); + const [currentImportPage, setCurrentImportPage] = useState(1); + const [importedData, setImportedData] = useState([]); + const [invalidRecords, setInvalidRecords] = useState(0); + const recordsPerPage = 5; + + // `capitalize` is used to make word capitalize + const capitalize = (s) => + s && String(s[0]).toUpperCase() + String(s).slice(1); + + // `checkRequiredHeaders` is used to check required headers present or not in csv/excel file + const checkRequiredHeaders = (headers) => { + const requiredHeaders = ["Name", "Email"]; + // Normalize headers to lowercase once + const headersSet = new Set(headers.map((header) => header.toLowerCase())); + + // Check all required headers + const allPresent = requiredHeaders.every((requiredHeader) => + headersSet.has(requiredHeader.toLowerCase()) + ); + return allPresent; + }; + const processCSVFile = async (file, event) => { + const reader = new FileReader(); + reader.onload = (e) => { + const text = e.target.result; + // Parse CSV data + const rows = text.split("\n").map((row) => row.trim()); + const headers = rows[0].split(",").map((header) => header.trim()); + if (checkRequiredHeaders(headers)) { + const records = rows.slice(1).reduce((acc, row) => { + const values = row?.split(",").map((value) => value.trim()) || []; + if (values.length > 1) { + acc.push( + headers.reduce( + (obj, header, index) => ({ + ...obj, + [capitalize(header)]: values[index] || "" + }), + {} + ) + ); + } + return acc; + }, []); + if (records.length <= 100) { + const validRecords = records.length + ? records.filter((x) => emailRegex.test(x.Email)) + : []; + const invalidItems = records?.length - validRecords?.length; + setInvalidRecords(invalidItems); + setImportedData(validRecords); + } else { + alert(t("100-records-only")); + event.target.value = ""; + setImportedData([]); + } + } else { + alert(t("invalid-data")); + event.target.value = ""; + } + }; + reader.readAsText(file); + }; + + const processExcelFile = (file, event) => { + if (file) { + const reader = new FileReader(); + reader.onload = (e) => { + const arrayBuffer = e.target.result; + const workbook = XLSX.read(new Uint8Array(arrayBuffer), { + type: "array" + }); + + // Get the first sheet + const sheetName = workbook.SheetNames[0]; + const sheet = workbook.Sheets[sheetName]; + + // Convert sheet to JSON + const sheetData = XLSX.utils.sheet_to_json(sheet); + if (sheetData.length <= 100) { + // Get all unique keys from the data to handle missing fields + const headers = [ + ...new Set(sheetData.flatMap((item) => Object.keys(item))) + ]; + + if (checkRequiredHeaders(headers)) { + const updateSheetData = sheetData.map((obj) => { + for (let key in obj) { + const capitalizedKey = capitalize(key); + if (capitalizedKey !== key) { + obj[capitalizedKey] = obj[key]; + delete obj[key]; // delete the old key to avoid duplicates + } + } + return obj; + }); + const validRecords = updateSheetData.length + ? updateSheetData.filter((x) => emailRegex.test(x.Email)) + : []; + const invalidItems = updateSheetData?.length - validRecords?.length; + setInvalidRecords(invalidItems); + setImportedData(validRecords); + } else { + alert(t("invalid-data")); + event.target.value = ""; + } + } else { + alert(t("100-records-only")); + event.target.value = ""; + setImportedData([]); + } + }; + + reader.readAsArrayBuffer(file); + } + }; + + // Get all unique keys from the data to handle missing fields + const allKeys = importedData?.length + ? [...new Set(importedData.flatMap((item) => Object.keys(item)))] + : []; + + // Pagination logic for import data table in modal + const totalImportPages = Math.ceil(importedData.length / recordsPerPage); + const currentRecords = importedData.slice( + (currentImportPage - 1) * recordsPerPage, + currentImportPage * recordsPerPage + ); + + // `handleFileUpload` is trigger when user upload excel file from contactbook + const handleFileUpload = (event) => { + const file = event.target?.files?.[0]; + if (file) { + const fileName = file.name; + const fileNameExt = fileName + .substr(fileName.lastIndexOf(".") + 1) + .toLowerCase(); + const isValidExt = ["csv", "xlsx", "xls"].includes(fileNameExt); + if (isValidExt) { + setCurrentImportPage(1); + if (fileNameExt !== "csv") { + processExcelFile(file, event); + } else { + processCSVFile(file, event); + } + } else { + event.target.value = ""; + alert(t("csv-excel-support-only")); + } + } else { + setImportedData([]); + setCurrentImportPage(1); + setInvalidRecords(0); + } + }; + + // `handleNextPage` is used to importdata table in modal + const handleNextPage = (e) => { + e.preventDefault(); + if (currentImportPage < totalImportPages) { + setCurrentImportPage(currentImportPage + 1); + } + }; + + // `handlePreviousPage` is used to importdata table in modal + const handlePreviousPage = (e) => { + e.preventDefault(); + if (currentImportPage > 1) { + setCurrentImportPage(currentImportPage - 1); + } + }; + // `handleImportData` is used to create batch in contact + const handleImportData = async (e) => { + e.preventDefault(); + e.stopPropagation(); + setLoader(true); + try { + const filterdata = importedData.map((x) => ({ + Name: x.Name, + Email: x.Email, + Phone: x.Phone, + Company: x.Company, + JobTitle: x.JobTitle, + TenantId: localStorage.getItem("TenantId") + })); + const contacts = JSON.stringify(filterdata); + const res = await Parse.Cloud.run("createbatchcontact", { contacts }); + if (res) { + showAlert( + "info", + t("contact-imported", { + imported: res?.success || 0, + failed: res?.failed || 0 + }) + ); + if (res?.success > 0) { + setTimeout(() => window.location.reload(), 1500); + } + } + } catch (err) { + console.log("err while creating batch contact", err); + showAlert("danger", t("something-went-wrong-mssg")); + } finally { + onImport && onImport(); + setImportedData([]); + setInvalidRecords(0); + } + }; + + return ( + <form onSubmit={handleImportData} className="p-[20px] h-full "> + <div className="text-xs"> + <label className="block ml-2"> + {t("contacts-file")} + <span className="text-red-500 text-[13px]"> *</span> + </label> + <input + type="file" + accept=".csv, .xlsx, .xls" + onChange={handleFileUpload} + required + className="op-file-input op-file-input-bordered op-file-input-sm focus:outline-none hover:border-base-content w-full text-xs" + /> + <p className="mt-1 ml-2 text-[11px] text-gray-600"> + {t("import-guideline")}{" "} + <a + href="/sample_contacts.csv" + target="_blank" + rel="noopener noreferrer" + className="text-primary underline cursor-pointer" + > + {t("download-sample")} + </a> + </p> + </div> + <div className="text-md m-2"> + <div className="flex flex-col md:flex-row gap-1"> + <span> + {t("total-records-found", { + count: importedData.length + })} + </span> + <span> + {t("Invalid-records-found", { + records: invalidRecords + })} + </span> + </div> + {importedData?.length > 0 && ( + <div className="overflow-x-auto p-1"> + <table className="op-table op-table-zebra w-full"> + <thead> + <tr> + {allKeys.map((key, index) => ( + <th key={index}>{key}</th> + ))} + </tr> + </thead> + <tbody> + {currentRecords.map((row, rowIndex) => ( + <tr key={rowIndex}> + {allKeys.map((key, colIndex) => ( + <td key={colIndex}>{row[key] || "-"}</td> + ))} + </tr> + ))} + </tbody> + </table> + <div className="flex justify-between items-center mt-4"> + <button + className="op-btn op-btn-primary op-btn-sm" + disabled={currentImportPage === 1} + onClick={handlePreviousPage} + > + {t("previous")} + </button> + <span> + {t("page-n-of-n", { + currentPage: currentImportPage, + totalPages: totalImportPages + })} + </span> + <button + className="op-btn op-btn-primary op-btn-sm" + disabled={currentImportPage === totalImportPages} + onClick={handleNextPage} + > + {t("next")} + </button> + </div> + </div> + )} + </div> + <div className="h-[1px] w-full my-[15px] bg-[#9f9f9f]"></div> + <button type="submit" className="op-btn op-btn-primary"> + {t("import")} + </button> + </form> + ); +}; + +export default ImportContact; diff --git a/apps/OpenSign/src/reports/document/DocumentsReport.jsx b/apps/OpenSign/src/reports/document/DocumentsReport.jsx new file mode 100644 index 0000000000..f49bfa717a --- /dev/null +++ b/apps/OpenSign/src/reports/document/DocumentsReport.jsx @@ -0,0 +1,1841 @@ +import React, { useState, useEffect, useRef } from "react"; +import pad from "../../assets/images/pad.svg"; +import recreatedoc from "../../assets/images/recreatedoc.png"; +import { Link, useLocation, useNavigate } from "react-router"; +import axios from "axios"; +import ModalUi from "../../primitives/ModalUi"; +import Alert from "../../primitives/Alert"; +import Tooltip from "../../primitives/Tooltip"; +import ShareButton from "../../primitives/ShareButton"; +import Parse from "parse"; +import { + copytoData, + fetchUrl, + formatDate, + getSignedUrl, + getTenantDetails, + handleSignatureType, + replaceMailVaribles, + signatureTypes, + openInNewTab, + createDocument, + getSignerEmail, + defaultMailBody, + defaultMailSubject +} from "../../constant/Utils"; +import EditorToolbar, { + module1, + formats +} from "../../components/pdf/EditorToolbar"; +import ReactQuill from "react-quill-new"; +import "../../styles/quill.css"; +import BulkSendUi from "../../components/BulkSendUi"; +import Loader from "../../primitives/Loader"; +import { serverUrl_fn } from "../../constant/appinfo"; +import { useTranslation } from "react-i18next"; +import DownloadPdfZip from "../../primitives/DownloadPdfZip"; +import { useElSize } from "../../hook/useElSize"; +import PrefillWidgetModal from "../../components/pdf/PrefillWidgetsModal"; +import LottieWithLoader from "../../primitives/DotLottieReact"; +import * as utils from "../../utils"; +import { RenderReportCell } from "../../primitives/RenderReportCell"; +import CustomizeMail from "../../components/pdf/CustomizeMail"; +import { useSelector } from "react-redux"; + +const DocumentsReport = (props) => { + const copyUrlRef = useRef(null); + const titleRef = useRef(null); + const titleElement = useElSize(titleRef); + const journey = "Use Template"; + const appName = + "OpenSign™"; + const { t } = useTranslation(); + const navigate = useNavigate(); + const location = useLocation(); + const prefillImg = useSelector((state) => state.widget.prefillImg); + const isDashboard = + location?.pathname === "/dashboard/35KBoSgoAK" ? true : false; + const [currentPage, setCurrentPage] = useState(1); + const [actLoader, setActLoader] = useState({}); + const [isDeleteModal, setIsDeleteModal] = useState({}); + const [isRevoke, setIsRevoke] = useState({}); + const [isShare, setIsShare] = useState({}); + const [shareUrls, setShareUrls] = useState([]); + const [copied, setCopied] = useState(false); + const [isOption, setIsOption] = useState({}); + const [alertMsg, setAlertMsg] = useState({ type: "success", message: "" }); + const [isResendMail, setIsResendMail] = useState({}); + const [mail, setMail] = useState({ subject: "", body: "" }); + const [userDetails, setUserDetails] = useState({}); + const [isNextStep, setIsNextStep] = useState({}); + const [isBulkSend, setIsBulkSend] = useState({}); + const [templateDeatils, setTemplateDetails] = useState({}); + const [placeholders, setPlaceholders] = useState([]); + const [isLoader, setIsLoader] = useState({}); + const [isModal, setIsModal] = useState({}); + const [reason, setReason] = useState(""); + const [isDownloadModal, setIsDownloadModal] = useState(false); + const [signatureType, setSignatureType] = useState([]); + const [expiryDate, setExpiryDate] = useState(""); + const Extand_Class = localStorage.getItem("Extand_Class"); + const extClass = Extand_Class && JSON.parse(Extand_Class); + const [renameDoc, setRenameDoc] = useState(""); + const [isSuccess, setIsSuccess] = useState({}); + const [templateId, setTemplateId] = useState(""); + const [forms, setForms] = useState([]); + const [xyPosition, setXyPosition] = useState([]); + const [signerList, setSignerList] = useState([]); + const [mailStatus, setMailStatus] = useState(""); + const [isSend, setIsSend] = useState(false); + const [documentId, setDocumentId] = useState(""); + const [isNewContact, setIsNewContact] = useState({ status: false, id: "" }); + const [isPrefillModal, setIsPrefillModal] = useState({}); + const [error, setError] = useState(""); + const [isMailModal, setIsMailModal] = useState(false); + const [customizeMail, setCustomizeMail] = useState({ body: "", subject: "" }); + const [defaultMail, setDefaultMail] = useState({ body: "", subject: "" }); + const [currUserId, setCurrUserId] = useState(false); + const [documentDetails, setDocumentDetails] = useState(); + const startIndex = (currentPage - 1) * props.docPerPage; + const { isMoreDocs, setIsNextRecord } = props; + + useEffect(() => { + if (props.isSearchResult) { + setCurrentPage(1); + } + }, [props.isSearchResult]); + + const getPaginationRange = () => { + const totalPageNumbers = 7; // Adjust this value to show more/less page numbers + const pages = []; + const totalPages = Math.ceil(props.List.length / props.docPerPage); + if (totalPages <= totalPageNumbers) { + for (let i = 1; i <= totalPages; i++) { + pages.push(i); + } + } else { + const leftSiblingIndex = Math.max(currentPage - 1, 1); + const rightSiblingIndex = Math.min(currentPage + 1, totalPages); + + const showLeftDots = leftSiblingIndex > 2; + const showRightDots = rightSiblingIndex < totalPages - 2; + + const firstPageIndex = 1; + const lastPageIndex = totalPages; + + if (!showLeftDots && showRightDots) { + let leftItemCount = 3; + let leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1); + + pages.push(...leftRange); + pages.push("..."); + pages.push(totalPages); + } else if (showLeftDots && !showRightDots) { + let rightItemCount = 3; + let rightRange = Array.from( + { length: rightItemCount }, + (_, i) => totalPages - rightItemCount + i + 1 + ); + + pages.push(firstPageIndex); + pages.push("..."); + pages.push(...rightRange); + } else if (showLeftDots && showRightDots) { + let middleRange = Array.from( + { length: 3 }, + (_, i) => leftSiblingIndex + i + ); + + pages.push(firstPageIndex); + pages.push("..."); + pages.push(...middleRange); + pages.push("..."); + pages.push(lastPageIndex); + } + } + + return pages; + }; + const showAlert = (type, message, time = 1500) => { + setAlertMsg({ type: type, message: message }); + setTimeout(() => setAlertMsg({ type: "", message: "" }), time); + }; + const pageNumbers = getPaginationRange(); + // below useEffect reset currenpage to 1 if user change route + useEffect(() => { + return () => setCurrentPage(1); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // below useEffect is used to render next record if IsMoreDoc is true + // second last value of pageNumber array is same as currentPage + useEffect(() => { + if (isMoreDocs && pageNumbers[pageNumbers.length - 1] === currentPage) { + setIsNextRecord(true); + } + }, [isMoreDocs, pageNumbers, currentPage, setIsNextRecord]); + + //function to fetch tenant Details + const fetchTenantDetails = async () => { + const user = JSON.parse( + localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ) + ); + if (user) { + try { + const tenantDetails = await getTenantDetails(user?.objectId); + if (tenantDetails && tenantDetails === "user does not exist!") { + alert(t("user-not-exist")); + } else if (tenantDetails) { + const signatureType = tenantDetails?.SignatureType || []; + const filterSignTypes = signatureType?.filter( + (x) => x.enabled === true + ); + //condition to check tenant have some already set any email template + if (tenantDetails?.RequestBody) { + //customize mail state is handle to when user want to customize already set tenant email format then use that format + setCustomizeMail({ + subject: tenantDetails?.RequestSubject, + body: tenantDetails?.RequestBody + }); + setDefaultMail({ + subject: tenantDetails?.RequestSubject, + body: tenantDetails?.RequestBody + }); + } else { + const defaultRequestBody = defaultMailBody; + const defaultSubject = defaultMailSubject; + setCustomizeMail({ + subject: defaultSubject, + body: defaultRequestBody + }); + setDefaultMail({ + subject: defaultSubject, + body: defaultRequestBody + }); + } + return filterSignTypes; + } + } catch (e) { + alert(t("user-not-exist")); + } + } else { + alert(t("user-not-exist")); + } + }; + + // `handleURL` is used to open microapp + const handleURL = async (item, act) => { + navigate(`/${act.redirectUrl}?docId=${item?.objectId}`); + }; + + const fetchTemplate = async (templateId) => { + try { + const params = { + templateId: templateId, + include: ["Placeholders.signerPtr"] + }; + const axiosRes = await axios.post( + `${localStorage.getItem("baseUrl")}functions/getTemplate`, + params, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + } + } + ); + if (axiosRes) { + return axiosRes; + } + } catch (e) { + console.log("Error to fetch template in report", e); + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + console.log("Error to fetch template in report", e); + } + }; + //function is called when there ther no any prefill role widget exist then create direct document and navigate + const navigatePageToDoc = async (templateRes, placeholder, signer) => { + setIsPrefillModal({}); + const res = await createDocument( + [templateRes || templateDeatils], + placeholder || xyPosition, + signer || signerList, + templateRes?.URL || templateDeatils?.URL + ); + if (res.status === "success") { + navigate(`/placeHolderSign/${res.id}`, { + state: { title: "Use Template" } + }); + } else { + alert(t("something-went-wrong-mssg")); + } + }; + const handleUseTemplate = async (templateId, item) => { + try { + const templateDeatils = await fetchTemplate(templateId); + const templateData = templateDeatils.data && templateDeatils.data.result; + if (!templateData.error) { + setTemplateDetails(templateData); + setXyPosition(templateData?.Placeholders); + const signer = utils.handleSignersList(templateData); + setSignerList(signer); + + //this function is used to open modal to show signers list + await utils?.handleDisplaySignerList( + templateData?.Placeholders, + templateData?.Signers, + setForms + ); + setIsModal({}); + setIsPrefillModal({ [item.objectId]: true }); + } else { + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + } + } catch (err) { + console.log("err", err); + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + } + }; + const handleActionBtn = async (act, item) => { + if (act.action === "redirect") { + handleURL(item, act); + } else if (act.action === "delete") { + setIsDeleteModal({ [item.objectId]: true }); + } else if (act.action === "share") { + handleShare(item); + } else if (act.action === "revoke") { + setIsRevoke({ [item.objectId]: true }); + } else if (act.action === "option") { + setIsOption({ [item.objectId]: !isOption[item.objectId] }); + } else if (act.action === "resend") { + setIsResendMail({ [item.objectId]: true }); + } else if (act.action === "rename") { + setIsModal({ [`rename_${item.objectId}`]: true }); + } else if (act.action === "edit") { + setIsModal({ [`edit_${item.objectId}`]: true }); + } else if (act.action === "saveastemplate") { + setIsModal({ [`saveastemplate_${item.objectId}`]: true }); + } else if (act.action === "recreatedocument") { + const isPrefill = item?.Placeholders?.some((p) => p.Role === "prefill"); + setError(isPrefill ? t("fix-resend-error") : ""); + setIsModal({ [`recreatedocument_${item.objectId}`]: true }); + } else if (act.action === "extendexpiry") { + setIsModal({ [`extendexpiry_${item.objectId}`]: true }); + } + }; + // Get current list + const indexOfLastDoc = currentPage * props.docPerPage; + const indexOfFirstDoc = indexOfLastDoc - props.docPerPage; + const sortedList = props.List; + const currentList = sortedList?.slice(indexOfFirstDoc, indexOfLastDoc); + + // Change page + const paginateFront = () => { + const lastValue = pageNumbers?.[pageNumbers?.length - 1]; + if (currentPage < lastValue) { + setCurrentPage(currentPage + 1); + } + }; + + const paginateBack = () => { + if (startIndex > 0) { + setCurrentPage(currentPage - 1); + } + }; + + const handleDelete = async (item) => { + setIsDeleteModal({}); + setActLoader({ [`${item.objectId}`]: true }); + try { + const serverUrl = serverUrl_fn(); + const cls = "contracts_Document"; + const url = serverUrl + `/classes/${cls}/`; + const body = { IsArchive: true }; + const res = await axios.put(url + item.objectId, body, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + }); + if (res.data && res.data.updatedAt) { + setActLoader({}); + showAlert("success", t("record-delete-alert")); + const upldatedList = props.List.filter( + (x) => x.objectId !== item.objectId + ); + props.setList(upldatedList); + } + } catch (err) { + console.log("err", err); + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + } + }; + const handleClose = () => { + setIsRevoke({}); + setIsDeleteModal({}); + setReason(""); + }; + const handleShare = (item) => { + setActLoader({ [item.objectId]: true }); + const host = window.location.origin; + const sendMail = item?.SendMail || false; + const getUrl = (x) => { + //encode this url value `${item.objectId}/${x.Email}/${x.objectId}` to base64 using `btoa` function + if (x?.signerObjId) { + const encodeBase64 = btoa( + `${item.objectId}/${getSignerEmail(x, item?.Signers)}/${x?.signerObjId}/${sendMail}` + ); + return `${host}/login/${encodeBase64}`; + } else { + const encodeBase64 = btoa(`${item.objectId}/${x.email}`); + return `${host}/login/${encodeBase64}`; + } + }; + const removePrefill = item?.Placeholders.filter( + (data) => data?.Role !== "prefill" + ); + const urls = removePrefill?.map((x) => ({ + email: getSignerEmail(x, item?.Signers) || x.email || "-", + url: getUrl(x) + })); + setShareUrls(urls); + setIsShare({ [item.objectId]: true }); + }; + + const copytoclipboard = (text) => { + copytoData(text); + if (copyUrlRef.current) { + copyUrlRef.current.textContent = text; // Update text safely + } + setCopied(true); + setTimeout(() => setCopied(false), 1500); // Reset copied state after 1.5 seconds + }; + const copybtn = (text, email) => { + copytoData(text); + if (copyUrlRef.current) { + copyUrlRef.current.textContent = text; // Update text safely + } + setCopied({ [email]: true }); + }; + //function to handle revoke/decline docment + const handleRevoke = async (item) => { + const senderUser = localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ); + const jsonSender = JSON.parse(senderUser); + setIsRevoke({}); + setActLoader({ [`${item.objectId}`]: true }); + const data = { + IsDeclined: true, + DeclineReason: reason, + DeclineBy: { + __type: "Pointer", + className: "_User", + objectId: jsonSender?.objectId + } + }; + await axios + .put( + `${localStorage.getItem("baseUrl")}classes/contracts_Document/${ + item.objectId + }`, + data, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + } + ) + .then(async (result) => { + const res = result.data; + if (res) { + setActLoader({}); + showAlert("success", t("record-revoke-alert")); + const upldatedList = props.List.filter( + (x) => x.objectId !== item.objectId + ); + props.setList(upldatedList); + } + setReason(""); + }) + .catch((err) => { + console.log("err", err); + setReason(""); + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + }); + }; + + // `handleDownload` is used to get valid doc url available in completed report + const handleDownload = async (item) => { + setActLoader({ [`${item.objectId}`]: true }); + const url = item?.SignedUrl || item?.URL || ""; + const pdfName = + item?.Name?.length > 100 + ? item?.Name?.slice(0, 100) + : item?.Name || "Document"; + const isCompleted = item?.IsCompleted || false; + const formatId = item?.ExtUserPtr?.DownloadFilenameFormat; + const docName = utils.buildDownloadFilename(formatId, { + docName: pdfName, + email: item?.ExtUserPtr?.Email, + isSigned: isCompleted + }); + const templateId = props?.ReportName === "Templates" && item.objectId; + const docId = props?.ReportName !== "Templates" && item.objectId; + if (url) { + try { + if (isCompleted) { + setIsDownloadModal({ [item.objectId]: true }); + } else { + const signedUrl = await getSignedUrl( + url, + docId, + templateId + ); + await fetchUrl(signedUrl, docName); + } + setActLoader({}); + } catch (err) { + console.log("err in getsignedurl", err); + alert(t("something-went-wrong-mssg")); + setActLoader({}); + } + } + }; + + // `handleSubjectChange` is used to add or change subject of resend mail + const handleSubjectChange = (subject, doc) => { + const encodeBase64 = userDetails?.objectId + ? btoa(`${doc.objectId}/${userDetails.Email}/${userDetails.objectId}`) + : btoa(`${doc.objectId}/${userDetails.Email}`); + const expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + const signPdf = `${window.location.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + note: doc?.Note || "", + sender_name: + doc.ExtUserPtr.Name, + sender_mail: + doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr?.Phone || "", + receiver_name: userDetails?.Name || "", + receiver_email: userDetails?.Email, + receiver_phone: userDetails?.Phone || "", + expiry_date: localExpireDate, + company_name: doc.ExtUserPtr.Company, + signing_url: signPdf + }; + const res = replaceMailVaribles(subject, "", variables); + setMail((prev) => ({ ...prev, subject: res.subject })); + }; + + // `handlebodyChange` is used to add or change body of resend mail + const handlebodyChange = (body, doc) => { + const encodeBase64 = userDetails?.objectId + ? btoa(`${doc.objectId}/${userDetails.Email}/${userDetails.objectId}`) + : btoa(`${doc.objectId}/${userDetails.Email}`); + const expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + const signPdf = `${window.location.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + note: doc?.Note || "", + sender_name: + doc.ExtUserPtr.Name, + sender_mail: + doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr?.Phone || "", + receiver_name: userDetails?.Name || "", + receiver_email: userDetails?.Email || "", + receiver_phone: userDetails?.Phone || "", + expiry_date: localExpireDate, + company_name: doc.ExtUserPtr.Company, + signing_url: signPdf + }; + const res = replaceMailVaribles("", body, variables); + + if (body) { + setMail((prev) => ({ ...prev, body: res.body })); + } + }; + // `handleNextBtn` is used to open edit mail template screen in resend mail modal + // as well as replace variable with original one + const handleNextBtn = (user, doc) => { + const userdata = { + Name: user?.signerPtr?.Name, + Email: user.email ? user?.email : user.signerPtr?.Email, + Phone: user?.signerPtr?.Phone, + objectId: user?.signerPtr?.objectId + }; + setUserDetails(userdata); + const encodeBase64 = user.email + ? btoa(`${doc.objectId}/${user.email}`) + : btoa( + `${doc.objectId}/${user.signerPtr.Email}/${user.signerPtr.objectId}` + ); + const expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + const signPdf = `${window.location.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + note: doc?.Note || "", + sender_name: + doc.ExtUserPtr.Name, + sender_mail: + doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr?.Phone || "", + receiver_name: user?.signerPtr?.Name || "", + receiver_email: user?.email ? user?.email : user?.signerPtr?.Email, + receiver_phone: user?.signerPtr?.Phone || "", + expiry_date: localExpireDate, + company_name: doc?.ExtUserPtr?.Company || "", + signing_url: signPdf + }; + const subject = + doc?.RequestSubject || + doc?.ExtUserPtr?.TenantId?.RequestSubject || + `{{sender_name}} has requested you to sign "{{document_title}}"`; + const body = + doc?.RequestBody || + doc?.ExtUserPtr?.TenantId?.RequestBody || + `<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body><p>Hi {{receiver_name}},</p><br><p>We hope this email finds you well. {{sender_name}} has requested you to review and sign <b>"{{document_title}}"</b>.</p><p>Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.</p><br><p><a href='{{signing_url}}' rel='noopener noreferrer' target='_blank'>Sign here</a></p><br><br><p>If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.</p><br><p>Thanks</p><p> Team ${appName}</p><br></body> </html>`; + const res = replaceMailVaribles(subject, body, variables); + setMail((prev) => ({ ...prev, subject: res.subject, body: res.body })); + setIsNextStep({ [user.Id]: true }); + }; + const handleResendMail = async (e, doc, user) => { + e.preventDefault(); + setActLoader({ [user?.Id]: true }); + const url = `${localStorage.getItem("baseUrl")}functions/sendmailv3`; + const headers = { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + }; + let params = { + replyto: + doc?.ExtUserPtr?.Email || + "", + extUserId: doc?.ExtUserPtr?.objectId, + recipient: userDetails?.Email, + subject: mail.subject, + from: + doc?.ExtUserPtr?.Email, + html: mail.body + }; + try { + const res = await axios.post(url, params, { headers: headers }); + if (res?.data?.result?.status === "success") { + showAlert("success", t("mail-sent-alert")); + setIsResendMail({}); + } + else { + showAlert("danger", t("something-went-wrong-mssg")); + } + } catch (err) { + console.log("err in sendmail", err); + showAlert("danger", t("something-went-wrong-mssg")); + } finally { + setIsNextStep({}); + setUserDetails({}); + setActLoader({}); + } + }; + const fetchUserStatus = (user, doc) => { + const email = user.email ? user.email : user.signerPtr.Email; + const audit = doc?.AuditTrail?.find((x) => x.UserPtr.Email === email); + + return ( + <div className="flex flex-row gap-2 justify-center items-center"> + <div className="flex justify-center items-center bg-base-300 text-base-content shadow-md op-card w-[65px] h-[32px] cursor-default"> + {audit?.Activity ? audit?.Activity : "Awaited"} + </div> + + <button + onClick={() => handleNextBtn(user, doc)} + className={ + audit?.Activity !== "Signed" + ? "op-btn op-btn-primary op-btn-sm" + : " text-transparent cursor-default pointer-events-none" + } + disabled={audit?.Activity === "Signed"} + > + {audit?.Activity !== "Signed" && "Resend"} + </button> + </div> + ); + }; + // `handleQuickSendClose` is trigger when bulk send component trigger close event + const handleQuickSendClose = (status, count) => { + setIsBulkSend({}); + if (status === "success") { + showAlert("success", count + " " + t("document-sent-alert")); + } else { + showAlert("danger", t("something-went-wrong-mssg")); + } + }; + + const handleUpdateExpiry = async (e, item) => { + e.preventDefault(); + e.stopPropagation(); + if (expiryDate) { + const oldExpiryDate = new Date(item?.ExpiryDate?.iso); + const newExpiryDate = new Date(expiryDate); + if (newExpiryDate > oldExpiryDate) { + setActLoader({ [`${item.objectId}`]: true }); + const updateExpiryDate = new Date(expiryDate).toISOString(); + const expiryIsoFormat = { iso: updateExpiryDate, __type: "Date" }; + try { + const serverUrl = serverUrl_fn(); + const cls = "contracts_Document"; + const url = serverUrl + `/classes/${cls}/`; + const body = { ExpiryDate: expiryIsoFormat }; + const res = await axios.put(url + item.objectId, body, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + }); + if (res.data && res.data.updatedAt) { + showAlert( + "success", + t("expiry-date-updated", { + newexpirydate: new Date(expiryDate)?.toLocaleDateString() + }), + 2000 + ); + if (props.ReportName === "Expired Documents") { + const upldatedList = props.List.filter( + (x) => x.objectId !== item.objectId + ); + props.setList(upldatedList); + } + } + } catch (err) { + console.log("err", err); + showAlert("danger", t("something-went-wrong-mssg"), 2000); + } finally { + setActLoader({}); + setExpiryDate(); + setIsModal({}); + } + } else { + showAlert("danger", t("expiry-date-error"), 2000); + } + } else { + showAlert("danger", t("expiry-date-error"), 2000); + } + }; + + // `handleRenameDoc` is used to update document name + const handleRenameDoc = async (item) => { + setActLoader({ [item.objectId]: true }); + setIsModal({}); + const className = "contracts_Document"; + try { + const query = new Parse.Query(className); + const docObj = await query.get(item.objectId); + docObj.set("Name", renameDoc); + await docObj.save(); + //update report list data + const updateList = props.List.map((x) => + x.objectId === item.objectId ? { ...x, Name: renameDoc } : x + ); + props.setList(updateList); + setActLoader({}); + showAlert("success", "Document updated", 2000); + } catch (err) { + showAlert("danger", t("something-went-wrong-mssg"), 2000); + setActLoader({}); + } + }; + const handleBtnVisibility = (act, item) => { + if (!act.restrictBtn) { + return true; + } else if ( + act.restrictBtn === true && + item.ExtUserPtr?.objectId === extClass?.[0]?.objectId + ) { + return true; + } + }; + + const handleCloseModal = () => { + setIsModal({}); + }; + const handleSaveAsTemplate = async (doc) => { + try { + const params = { docId: doc?.objectId }; + const templateRes = await Parse.Cloud.run("saveastemplate", params); + setTemplateId(templateRes?.id); + setIsSuccess({ [doc.objectId]: true }); + } catch (err) { + console.log("Err in saveastemplate", err); + } finally { + setActLoader({}); + } + }; + const handleCloseTemplate = () => { + setTemplateId(""); + setIsSuccess({}); + handleCloseModal(); + setActLoader({}); + handleClose(); + }; + + // `handleBulkSendTemplate` is used to open modal as well as fetch template + // and show Ui on the basis template response + const handleBulkSendTemplate = async (templateId, docId) => { + setIsBulkSend({ [docId]: true }); + setIsLoader({ [docId]: true }); + try { + const axiosRes = await fetchTemplate(templateId); + const templateRes = axiosRes.data && axiosRes.data.result; + const isPrefillExist = templateRes?.Placeholders.some( + (x) => x.Role === "prefill" + ); + if (isPrefillExist) { + setIsBulkSend({}); + setIsLoader({}); + showAlert("danger", t("prefill-bulk-error")); + } else { + const tenantSignTypes = await fetchTenantDetails(); + const docSignTypes = templateRes?.SignatureType || signatureTypes; + const updatedSignatureType = await handleSignatureType( + tenantSignTypes, + docSignTypes + ); + setSignatureType(updatedSignatureType); + setPlaceholders(templateRes?.Placeholders); + setTemplateDetails(templateRes); + setIsLoader({}); + } + } catch (err) { + console.log("err in fetch template in bulk modal", err); + setIsBulkSend({}); + showAlert("danger", t("something-went-wrong-mssg")); + } + }; + + const handleResendClose = () => { + setIsResendMail({}); + setIsNextStep({}); + setUserDetails({}); + }; + + const handleRecreateDoc = async (item) => { + setActLoader({ [item.objectId]: true }); + try { + const res = await Parse.Cloud.run("recreatedoc", { + docId: item.objectId + }); + if (res) { + openInNewTab(`/placeHolderSign/${res.objectId}`, "_self"); + } + } catch (err) { + handleCloseModal(); + showAlert("danger", err.message); + // showAlert("danger", t("something-went-wrong-mssg")); + console.log("Err while create duplicate template", err); + } finally { + setActLoader({}); + } + }; + + const restrictBtn = (item, act) => { + return item.IsSignyourself && act.action === "recreatedocument" + ? true + : false; + }; + // `handleAddUser` is used to adduserAdd commentMore actions + const handleAddUser = (data, id) => { + const signerPtr = { + __type: "Pointer", + className: "contracts_Contactbook", + objectId: data.objectId + }; + const updatePlaceHolder = xyPosition.map((x) => { + if (x.signerObjId === id || x.Id === id) { + return { ...x, signerPtr: signerPtr, signerObjId: data.objectId }; + } + return { ...x }; + }); + setXyPosition(updatePlaceHolder); + const updateSigner = signerList.map((y) => { + //condition is used to updated signer's email + if (y.objectId === id) { + return data; + } + //condition is used to add new signer's mail to role + else if (y.Id === id) { + return { ...y, ...data, className: "contracts_Contactbook" }; + } + return { ...y }; + }); + setSignerList(updateSigner); + + //condition when there are any new signer add then save that signer in dropdown option + if (isNewContact.status) { + let newForm = [...forms]; + const label = `${data.Name}<${data.Email}>`; + const index = newForm.findIndex((x) => x.value === id); + newForm[index].label = label; + newForm[index].value = id; + setForms(newForm); + } + }; + const handleClosePrefillModal = () => { + setIsPrefillModal(false); + setActLoader({}); + setForms([]); + setXyPosition([]); + }; + //`handlePrefillWidgetCreateDoc` is used to embed prefill all widgets on document, create document, and send document + const handlePrefillWidgetCreateDoc = async () => { + const scale = 1; + const key = Object.keys(isPrefillModal)[0]; + setActLoader({ [key]: true }); + const res = await utils?.handleCheckPrefillCreateDoc( + xyPosition, + signerList, + setIsPrefillModal, + scale, + templateDeatils?.URL, + [templateDeatils], + prefillImg, + extClass?.[0]?.UserId?.objectId, + ); + if (res?.status === "unfilled") { + const emptyWidget = res?.emptyResponseObjects + .map((item) => `[ ${item.options.name}]`) + .join(", "); + const timeInMiliSec = 6000; + showAlert( + "danger", + t("prefill-unfilled-widget", { emptyWidget: emptyWidget }), + timeInMiliSec + ); + } else if (res?.status === "unattach signer") { + showAlert("danger", "please attach all role to signer"); + } else if (res?.status === "success") { + setDocumentId(res.id); + setActLoader({}); + setIsMailModal(true); + + try { + await fetchTenantDetails(); + } catch (e) { + console.log("error in fetchTenantDetails", e); + alert(t("user-not-exist")); + } + } + setActLoader({}); + }; + const handleRecipientSign = (documentId, currentId) => { + if (currentId) { + navigate(`/recipientSignPdf/${documentId}/${currentId}`); + } else { + navigate(`/recipientSignPdf/${documentId}`); + } + }; + //function show signer list and share link to share signUrl + const handleShareList = () => { + const shareLinkList = []; + let signerMail = signerList; + for (let i = 0; i < signerMail.length; i++) { + const objectId = signerMail[i].objectId; + const hostUrl = window.location.origin; + const sendMail = false; + //encode this url value `${documentId}/${signerMail[i].Email}/${objectId}` to base64 using `btoa` function + const encodeBase64 = btoa( + `${documentId}/${signerMail[i].Email}/${objectId}/${sendMail}` + ); + let signPdf = `${hostUrl}/login/${encodeBase64}`; + shareLinkList.push({ signerEmail: signerMail[i].Email, url: signPdf }); + } + return shareLinkList.map((data, ind) => { + return ( + <div + className="flex flex-row justify-between items-center mb-1" + key={ind} + > + {copied && <Alert type="success">{t("copied")}</Alert>} + <span className="w-[220px] md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis "> + {data.signerEmail} + </span> + <div className="flex flex-row items-center gap-3 "> + <button + onClick={() => copytoclipboard(data.url)} + type="button" + className="flex flex-row items-center op-link op-link-primary" + > + <i className="fa-light fa-copy" /> + <span className=" hidden md:block ml-1 ">{t("copy-link")}</span> + </button> + <ShareButton + title={t("sign-url")} + text={t("sign-url")} + url={data.url} + > + <i className="fa-light fa-share-from-square op-link op-link-secondary no-underline"></i> + </ShareButton> + </div> + </div> + ); + }); + }; + const handleRemovePrefill = (placeholders) => { + const removePrefill = placeholders?.filter( + (data) => data?.Role !== "prefill" + ); + return removePrefill; + }; + const handleCloseMail = () => { + handleRecipientSign(documentId); + }; + //function is used to show warning message when use save as template + const handleWarning = (item) => { + const isPrefill = item?.Placeholders?.some((x) => x?.Role === "prefill"); + if (isPrefill) { + return ( + <span className="flex text-sm mt-3 text-red-500"> + {t("save-as-temp-warn")} + </span> + ); + } + }; + return ( + <div className="relative"> + {Object.keys(actLoader)?.length > 0 && ( + <div className="absolute w-full h-full flex justify-center items-center bg-black/30 rounded-box z-30"> + <Loader /> + </div> + )} + <div className="p-2 w-full bg-base-100 text-base-content op-card shadow-lg"> + {alertMsg.message && ( + <Alert type={alertMsg.type}>{alertMsg.message}</Alert> + )} + <div + ref={titleRef} + className="flex flex-row items-center justify-between my-2 mx-3 text-[20px] md:text-[23px]" + > + <div className="font-light"> + {t(`report-name.${props.ReportName}`)}{" "} + {props.report_help && ( + <span className="text-xs md:text-[13px] font-normal"> + <Tooltip + id="report_help" + message={t(`report-help.${props.ReportName}`)} + /> + </span> + )} + </div> + <div className="flex flex-row justify-center items-center gap-3 mb-2"> + {/* Search input for report bigger in width */} + {titleElement?.width > 500 && ( + <div className="flex"> + <input + type="search" + value={props.searchTerm} + onChange={props.handleSearchChange} + placeholder={t("search-documents")} + onPaste={props.handleSearchPaste} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-64 text-xs" + /> + </div> + )} + {/* search icon/magnifer icon */} + {titleElement?.width < 500 && ( + <button + className="flex justify-center items-center focus:outline-none rounded-md text-[18px]" + aria-label="Search" + onClick={() => + props.setMobileSearchOpen(!props.mobileSearchOpen) + } + > + <i className="fa-light fa-magnifying-glass"></i> + </button> + )} + {props.openColumnModal && ( + <button + className="flex justify-center items-center focus:outline-none rounded-md text-[18px]" + aria-label="Columns" + onClick={props.openColumnModal} + > + <i className="fa-light fa-table-columns"></i> + </button> + )} + </div> + </div> + {/* Search input for report smalle in width */} + {titleElement?.width < 500 && props.mobileSearchOpen && ( + <div className="top-full left-0 w-full px-3 pt-1 pb-3"> + <input + type="search" + value={props.searchTerm} + onChange={props.handleSearchChange} + placeholder={t("search-documents")} + onPaste={props.handleSearchPaste} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + /> + </div> + )} + <div + className={`overflow-auto w-full border-b ${ + props.List?.length > 0 + ? isDashboard + ? "min-h-[317px]" + : currentList?.length === props.docPerPage + ? "h-fit" + : "h-screen" + : "" + }`} + > + <table className="op-table border-collapse w-full mb-4"> + <thead className="text-[14px] text-center"> + <tr className="border-y-[1px]"> + {props.heading?.map((item, i) => ( + <th key={i} className="p-2"> + {props.columnLabels?.[item] || + t(`report-heading.${item}`, { defaultValue: item })} + </th> + ))} + {props.actions?.length > 0 && ( + <th className="p-2 text-transparent pointer-events-none"> + {t("action")} + </th> + )} + </tr> + </thead> + <tbody className="text-[12px]"> + {props.List?.length > 0 && + currentList.map((item, index) => ( + <tr + className={`${ + currentList?.length === props.docPerPage + ? "last:border-none" + : "" + } border-y-[1px] `} + key={index} + > + {props?.heading?.map((col) => ( + <RenderReportCell + key={col} + col={col} + rowData={item} + rowIndex={index} + startIndex={startIndex} + handleDownload={handleDownload} + handleRemovePrefill={handleRemovePrefill} + reportName={props.ReportName} + /> + ))} + {/* actions */} + <td className="px-2 py-2"> + <div className="text-base-content min-w-max flex flex-row gap-x-2 gap-y-1 justify-start items-center"> + {props.actions?.length > 0 && + props.actions.map((act, index) => ( + <React.Fragment key={index}> + {handleBtnVisibility(act, item) && ( + <div + role="button" + data-tut={act?.selector} + onClick={() => handleActionBtn(act, item)} + title={t(`btnLabel.${act.hoverLabel}`)} + className={ + act.action !== "option" + ? `${act?.btnColor || ""} op-btn op-btn-sm mr-1` + : "text-base-content focus:outline-none text-lg mr-2 relative" + } + > + <i className={act.btnIcon}></i> + {act.btnLabel && ( + <span className="uppercase font-medium"> + {t(`btnLabel.${act.btnLabel}`)} + </span> + )} + {/* doc report */} + {isOption[item.objectId] && + act.action === "option" && ( + <ul className="absolute -right-1 top-auto z-[70] w-max op-dropdown-content op-menu op-menu-sm shadow-black/20 shadow bg-base-100 text-base-content rounded-box"> + {act.subaction?.map( + (subact) => + !restrictBtn(item, subact) && ( + <li + key={subact.btnId} + onClick={() => + handleActionBtn(subact, item) + } + title={t( + `btnLabel.${subact.hoverLabel}` + )} + > + <span> + <i + className={`${subact.btnIcon} mr-1.5`} + ></i> + {subact.btnLabel && ( + <span className="text-[13px] capitalize font-medium"> + {t( + `btnLabel.${subact.btnLabel}` + )} + </span> + )} + </span> + </li> + ) + )} + </ul> + )} + </div> + )} + </React.Fragment> + ))} + </div> + {isModal["recreatedocument_" + item.objectId] && ( + <ModalUi isOpen handleClose={handleCloseModal}> + {actLoader[item.objectId] && ( + <div className="absolute h-full w-full flex justify-center items-center rounded-box bg-black/30"> + <Loader /> + </div> + )} + <h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]"> + {t("fix-&-resend-document")} + </h3> + {error ? ( + <div className="p-[15px] md:p-[20px]">{error}</div> + ) : ( + <div className="p-[15px] md:p-[20px]"> + <div className="text-lg font-normal text-center"> + <img + src={recreatedoc} + alt="recreate-doc" + className="mx-auto w-[200px] h-auto" + /> + <p className="text-sm md:text-base md:px-2 mt-2"> + {t("do-you-want-recreate-document?")} + </p> + </div> + <hr className="bg-[#ccc] mt-2.5" /> + <div className="flex items-center justify-center mt-[14px] md:mt-[16px] gap-2 text-white"> + <button + onClick={() => handleRecreateDoc(item)} + className="op-btn op-btn-primary focus:outline-none text-sm relative px-4" + > + {t("start-editing")} + </button> + <button + onClick={handleCloseModal} + className="op-btn op-btn-secondary focus:outline-none text-sm relative px-8" + > + {t("cancel")} + </button> + </div> + </div> + )} + </ModalUi> + )} + {isModal["saveastemplate_" + item.objectId] && ( + <ModalUi + isOpen + title={ + isSuccess[item.objectId] + ? t("template-created") + : t("btnLabel.Save as template") + } + handleClose={handleCloseTemplate} + > + {isSuccess[item.objectId] ? ( + <div className="mx-[10px] my-[15px]"> + <p className="text-base text-center"> + {t("how-would-you-like-to-proceed?")} + </p> + <div className="flex flex-wrap gap-1 items-center justify-center mt-2"> + <button + className="op-btn-primary op-btn op-btn-sm focus:outline-none text-sm relative" + onClick={() => + handleUseTemplate(templateId, item) + } + > + <i className="fa-light fa-plus"></i>{" "} + {t("btnLabel.Use")} + </button> + <button + className="op-btn-secondary op-btn op-btn-sm focus:outline-none text-sm relative" + onClick={() => + handleBulkSendTemplate( + templateId, + item.objectId + ) + } + > + <i className="fa-light fa-plus"></i>{" "} + { + `${t(`btnLabel.Quick send`)}` + } + </button> + <button + className="op-btn-secondary op-btn op-btn-sm focus:outline-none text-sm relative" + onClick={() => + navigate(`/template/${templateId}`) + } + > + <i className="fa-light fa-pen"></i>{" "} + {t(`btnLabel.Edit`)} + </button> + </div> + <Link + to="/report/6TeaPr321t" + className="cursor-pointer underline text-sm w-full flex justify-center mt-2" + > + {t("go-to-manage-templates")} + </Link> + </div> + ) : ( + <div className="m-[20px]"> + {error ? ( + <>{error}</> + ) : ( + <> + <div className="text-lg font-normal text-base-content"> + {t("save-as-template-?")} + {handleWarning(item)} + </div> + <hr className="bg-[#ccc] mt-3" /> + <div className="flex items-center mt-3 gap-2 text-white"> + <button + onClick={() => handleSaveAsTemplate(item)} + className="op-btn op-btn-primary w-[100px]" + > + {t("yes")} + </button> + <button + onClick={handleCloseTemplate} + className="op-btn op-btn-secondary w-[100px]" + > + {t("no")} + </button> + </div> + </> + )} + </div> + )} + </ModalUi> + )} + {isPrefillModal[item.objectId] && ( + <PrefillWidgetModal + isPrefillModal={isPrefillModal[item.objectId]} + prefillData={xyPosition.find( + (x) => x.Role === "prefill" + )} + forms={forms} + setForms={setForms} + xyPosition={xyPosition} + setXyPosition={setXyPosition} + handleCreateDocument={handlePrefillWidgetCreateDoc} + handleClosePrefillModal={handleClosePrefillModal} + handleAddUser={handleAddUser} + navigatePageToDoc={navigatePageToDoc} + setIsNewContact={setIsNewContact} + isNewContact={isNewContact} + docId={item.objectId} + /> + )} + {isModal["extendexpiry_" + item.objectId] && ( + <ModalUi + isOpen + title={t("btnLabel.extend-expiry-date")} + reduceWidth={"md:max-w-[450px]"} + handleClose={handleCloseModal} + > + <form + className="px-4 py-2 flex flex-col" + onSubmit={(e) => handleUpdateExpiry(e, item)} + > + <label className="mr-2"> + {t("expiry-date")} {"(dd-mm-yyyy)"} + </label> + <input + type="date" + className="rounded-full mb-2 bg-base-300 w-full px-4 py-2 text-base-content border-2 hover:border-spacing-2" + defaultValue={ + item?.ExpiryDate?.iso?.split("T")?.[0] + } + onChange={(e) => { + setExpiryDate(e.target.value); + }} + /> + <div className="flex justify-start mb-1"> + <button + type="submit" + className="op-btn op-btn-primary" + > + {t("update")} + </button> + </div> + </form> + </ModalUi> + )} + {isDeleteModal[item.objectId] && ( + <ModalUi + isOpen + title={t("delete-document")} + handleClose={handleClose} + > + <div className="m-[20px]"> + <div className="text-lg font-normal text-base-content"> + {t("delete-document-alert")} + </div> + <hr className="bg-[#ccc] mt-4" /> + <div className="flex items-center mt-3 gap-2 text-white"> + <button + onClick={() => handleDelete(item)} + className="op-btn op-btn-primary" + > + {t("yes")} + </button> + <button + onClick={handleClose} + className="op-btn op-btn-secondary" + > + {t("no")} + </button> + </div> + </div> + </ModalUi> + )} + {isBulkSend[item.objectId] && ( + <ModalUi + isOpen + title={ + t("quick-send") + } + handleClose={() => setIsBulkSend({})} + > + {isLoader[item.objectId] ? ( + <div className="w-full h-[100px] flex justify-center items-center z-30"> + <Loader /> + </div> + ) : ( + <BulkSendUi + Placeholders={placeholders} + item={templateDeatils} + handleClose={handleQuickSendClose} + signatureType={signatureType} + /> + )} + </ModalUi> + )} + {isShare[item.objectId] && ( + <ModalUi + isOpen + title={t("copy-link")} + handleClose={() => { + setIsShare({}); + setActLoader({}); + setCopied(false); + }} + > + <div className="m-[20px]"> + {shareUrls.map((share, i) => ( + <div + key={i} + className="text-sm font-normal text-base-content flex my-2 justify-between items-center" + > + <span className="w-[150px] mr-[5px] md:mr-0 md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis text-sm font-semibold"> + {share.email} + </span> + <div className="flex items-center gap-2"> + <ShareButton + title={t("sign-url")} + text={t("sign-url")} + url={share.url} + className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm " + > + <i className="fa-light fa-share-from-square"></i> + {t("btnLabel.Share")} + </ShareButton> + <button + className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm" + onClick={() => + copybtn(share.url, share.email) + } + > + <i className="fa-light fa-copy" /> + {copied[share.email] + ? t("copied") + : t("copy")} + </button> + </div> + </div> + ))} + <p ref={copyUrlRef} className="hidden"></p> + </div> + </ModalUi> + )} + {isRevoke[item.objectId] && ( + <ModalUi + isOpen + title={t("revoke-document")} + handleClose={handleClose} + > + <div className="m-[20px]"> + <div className="text-sm md:text-lg font-normal text-base-content"> + {t("revoke-document-alert")} + </div> + <div className="mt-2"> + <textarea + rows={3} + placeholder="Reason (optional)" + className="px-4 op-textarea op-textarea-bordered text-base-content focus:outline-none hover:border-base-content w-full text-xs" + value={reason} + onChange={(e) => setReason(e.target.value)} + ></textarea> + </div> + <div className="flex items-center mt-3 gap-2"> + <button + onClick={() => handleRevoke(item)} + className="op-btn op-btn-primary px-6" + > + {t("yes")} + </button> + <button + onClick={handleClose} + className="op-btn op-btn-secondary px-6" + > + {t("no")} + </button> + </div> + </div> + </ModalUi> + )} + {isResendMail[item.objectId] && ( + <ModalUi + isOpen + title={ + t("resend-mail") + } + handleClose={handleResendClose} + > + <div className="overflow-y-auto max-h-[340px] md:max-h-[400px]"> + {item?.Placeholders?.filter( + (user) => user?.Role !== "prefill" + )?.map((user) => ( + <React.Fragment key={user.Id}> + {isNextStep[user.Id] && ( + <div className="relative "> + {actLoader[user.Id] && ( + <div className="absolute w-full h-full flex justify-center items-center bg-black bg-opacity-30 z-30"> + <Loader /> + </div> + )} + <form + onSubmit={(e) => + handleResendMail(e, item, user) + } + className="w-full flex flex-col gap-2 p-3 text-base-content relative" + > + <div className="absolute right-5 text-xs z-40"> + <Tooltip + id={`${user.Id}_help`} + message={t("resend-mail-help")} + /> + </div> + <div> + <label + className="text-xs ml-1" + htmlFor="mailsubject" + > + {t("subject")}{" "} + </label> + <input + id="mailsubject" + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + value={mail.subject} + onChange={(e) => + handleSubjectChange( + e.target.value, + item + ) + } + onInvalid={(e) => + e.target.setCustomValidity( + t("input-required") + ) + } + onInput={(e) => + e.target.setCustomValidity("") + } + required + /> + </div> + <div> + <label + className="text-xs ml-1" + htmlFor="mailbody" + > + {t("body")}{" "} + </label> + <EditorToolbar containerId="toolbar1" /> + <ReactQuill + id="mailbody" + theme="snow" + value={mail.body || ""} + placeholder="add body of email " + modules={module1} + formats={formats} + onChange={(value) => + handlebodyChange(value, item) + } + /> + </div> + <button + type="submit" + className="op-btn op-btn-primary" + > + {t("resend")} + </button> + </form> + </div> + )} + {Object?.keys(isNextStep) <= 0 && ( + <div className="flex justify-between items-center gap-2 my-2 px-3"> + <div className="text-base-content"> + {user?.signerPtr?.Name || "-"}{" "} + {`<${ + user?.email + ? user.email + : user.signerPtr.Email + }>`} + </div> + <>{fetchUserStatus(user, item)}</> + </div> + )} + </React.Fragment> + ))} + </div> + </ModalUi> + )} + <ModalUi + title={t("btnLabel.Rename")} + isOpen={isModal["rename_" + item.objectId]} + handleClose={handleCloseModal} + > + <div className="flex flex-col px-4 pb-3 pt-2"> + <div className="flex flex-col gap-2"> + <input + maxLength={200} + autoFocus={true} + type="text" + defaultValue={renameDoc || item.Name} + onChange={(e) => setRenameDoc(e.target.value)} + className="op-input op-input-bordered op-input-sm w-full focus:outline-none hover:border-base-content text-[10px]" + /> + </div> + <div className="flex flex-row gap-2 pt-3 mt-3 border-t-[1.5px] border-gray-500"> + <button + className="w-[100px] op-btn op-btn-primary op-btn-md" + onClick={() => handleRenameDoc(item)} + > + {t("save")} + </button> + <button + className="w-[100px] op-btn op-btn-secondary op-btn-md" + onClick={handleCloseModal} + > + {t("cancel")} + </button> + </div> + </div> + </ModalUi> + {isDownloadModal[item.objectId] && ( + <DownloadPdfZip + setIsDownloadModal={setIsDownloadModal} + isDownloadModal={isDownloadModal[item.objectId]} + pdfDetails={[item]} + isDocId={false} + /> + )} + </td> + </tr> + ))} + </tbody> + </table> + {props.List?.length <= 0 && ( + <div + className={`${ + isDashboard ? "h-[317px]" : "" + } flex flex-col items-center justify-center w-ful bg-base-100 text-base-content rounded-xl py-4`} + > + <div className="w-[60px] h-[60px] overflow-hidden"> + <img + className="w-full h-full object-contain" + src={pad} + alt="img" + /> + </div> + <div className="text-sm font-semibold"> + {t("no-data-avaliable")} + </div> + </div> + )} + </div> + <div className="op-join flex flex-wrap items-center p-2"> + {props.List.length > props.docPerPage && ( + <button + onClick={() => paginateBack()} + className="op-join-item op-btn op-btn-sm" + > + {t("prev")} + </button> + )} + {pageNumbers.map((x, i) => ( + <button + key={i} + onClick={() => setCurrentPage(x)} + disabled={x === "..."} + className={`${ + x === currentPage ? "op-btn-active" : "" + } op-join-item op-btn op-btn-sm`} + > + {x} + </button> + ))} + {props.List.length > props.docPerPage && ( + <button + onClick={() => paginateFront()} + className="op-join-item op-btn op-btn-sm" + > + {t("next")} + </button> + )} + </div> + <CustomizeMail + setIsMailModal={setIsMailModal} + setCustomizeMail={setCustomizeMail} + documentId={documentId} + signerList={signerList} + setIsSend={setIsSend} + setMailStatus={setMailStatus} + customizeMail={customizeMail} + defaultMail={defaultMail} + isMailModal={isMailModal} + setCurrUserId={setCurrUserId} + handleShareList={handleShareList} + setDocumentDetails={setDocumentDetails} + handleClose={handleCloseMail} + /> + <ModalUi + isOpen={isSend} + title={ + mailStatus === "success" + ? t("mails-sent") + : mailStatus === "quotareached" + ? t("quota-mail-head") + : t("mail-not-delivered") + } + handleClose={() => { + setIsSend(false); + navigate("/report/1MwEuxLEkF"); + }} + > + <div className="h-[100%] p-[20px] text-base-content"> + {mailStatus === "success" ? ( + <div className="text-center mb-[10px]"> + <LottieWithLoader /> + {documentDetails?.SendinOrder ? ( + <p> + {currUserId + ? t("placeholder-mail-alert-you") + : t("placeholder-mail-alert", { + name: signerList[0]?.Name + })} + </p> + ) : ( + <p>{t("placeholder-alert-4")}</p> + )} + {currUserId && <p>{t("placeholder-alert-5")}</p>} + </div> + ) : mailStatus === "quotareached" ? ( + <div className="flex flex-col gap-y-3"> + <div className="my-3">{handleShareList()}</div> + </div> + ) : ( + <div className="mb-[10px]"> + {mailStatus === "dailyquotareached" ? ( + <p>{t("daily-quota-reached")}</p> + ) : ( + <p>{t("placeholder-alert-6")}</p> + )} + {currUserId && ( + <p className="mt-1">{t("placeholder-alert-5")}</p> + )} + </div> + )} + {!mailStatus && ( + <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> + )} + {mailStatus !== "quotareached" && ( + <div + className={ + mailStatus === "success" ? "flex justify-center mt-1" : "" + } + > + {currUserId && ( + <button + onClick={() => + handleRecipientSign(documentDetails?.objectId, currUserId) + } + type="button" + className="op-btn op-btn-primary mr-1" + > + {t("yes")} + </button> + )} + <button + onClick={() => { + handleRecipientSign(documentDetails?.objectId, currUserId); + }} + type="button" + className="op-btn op-btn-ghost text-base-content" + > + {currUserId ? t("no") : t("close")} + </button> + </div> + )} + </div> + </ModalUi> + </div> + </div> + ); +}; + +export default DocumentsReport; diff --git a/apps/OpenSign/src/reports/template/TemplatesReport.jsx b/apps/OpenSign/src/reports/template/TemplatesReport.jsx new file mode 100644 index 0000000000..76c233bde7 --- /dev/null +++ b/apps/OpenSign/src/reports/template/TemplatesReport.jsx @@ -0,0 +1,1677 @@ +import React, { useState, useEffect, useRef } from "react"; +import pad from "../../assets/images/pad.svg"; +import { useLocation, useNavigate } from "react-router"; +import axios from "axios"; +import ModalUi from "../../primitives/ModalUi"; +import Alert from "../../primitives/Alert"; +import Tooltip from "../../primitives/Tooltip"; +import ShareButton from "../../primitives/ShareButton"; +import Tour from "../../primitives/Tour"; +import Parse from "parse"; +import { + copytoData, + fetchUrl, + getSignedUrl, + getTenantDetails, + handleSignatureType, + replaceMailVaribles, + signatureTypes, + openInNewTab, + createDocument, + defaultMailBody, + defaultMailSubject +} from "../../constant/Utils"; +import EditorToolbar, { + module1, + formats +} from "../../components/pdf/EditorToolbar"; +import ReactQuill from "react-quill-new"; +import "../../styles/quill.css"; +import BulkSendUi from "../../components/BulkSendUi"; +import Loader from "../../primitives/Loader"; +import { serverUrl_fn } from "../../constant/appinfo"; +import { useTranslation } from "react-i18next"; +import { useElSize } from "../../hook/useElSize"; +import LottieWithLoader from "../../primitives/DotLottieReact"; +import PrefillWidgetModal from "../../components/pdf/PrefillWidgetsModal"; +import * as utils from "../../utils"; +import { useSelector } from "react-redux"; +import { RenderReportCell } from "../../primitives/RenderReportCell"; +import CustomizeMail from "../../components/pdf/CustomizeMail"; + +const TemplatesReport = (props) => { + const copyUrlRef = useRef(null); + const titleRef = useRef(null); + const journey = "Use Template"; + const titleElement = useElSize(titleRef); + const prefillImg = useSelector((state) => state.widget.prefillImg); + const appName = + "OpenSign™"; + const { t } = useTranslation(); + const navigate = useNavigate(); + const location = useLocation(); + const isDashboard = + location?.pathname === "/dashboard/35KBoSgoAK" ? true : false; + const [currentPage, setCurrentPage] = useState(1); + const [actLoader, setActLoader] = useState({}); + const [isDeleteModal, setIsDeleteModal] = useState({}); + const [isShare, setIsShare] = useState({}); + const [shareUrls, setShareUrls] = useState([]); + const [copied, setCopied] = useState(false); + const [isOption, setIsOption] = useState({}); + const [alertMsg, setAlertMsg] = useState({ type: "success", message: "" }); + const [isTour, setIsTour] = useState(false); + const [tourStatusArr, setTourStatusArr] = useState([]); + const [isResendMail, setIsResendMail] = useState({}); + const [mail, setMail] = useState({ subject: "", body: "" }); + const [userDetails, setUserDetails] = useState({}); + const [isNextStep, setIsNextStep] = useState({}); + const [isBulkSend, setIsBulkSend] = useState({}); + const [templateDeatils, setTemplateDetails] = useState({}); + const [placeholders, setPlaceholders] = useState([]); + const [isLoader, setIsLoader] = useState({}); + const [isShareWith, setIsShareWith] = useState({}); + const [selectedTeam, setSelectedTeam] = useState([]); + const [isModal, setIsModal] = useState({}); + const [signatureType, setSignatureType] = useState([]); + const Extand_Class = localStorage.getItem("Extand_Class"); + const extClass = Extand_Class && JSON.parse(Extand_Class); + const [renameDoc, setRenameDoc] = useState(""); + const [forms, setForms] = useState([]); + const [xyPosition, setXyPosition] = useState([]); + const [signerList, setSignerList] = useState([]); + const [mailStatus, setMailStatus] = useState(""); + const [isSend, setIsSend] = useState(false); + const [documentId, setDocumentId] = useState(""); + const [isNewContact, setIsNewContact] = useState({ status: false, id: "" }); + const [isPrefillModal, setIsPrefillModal] = useState({}); + const startIndex = (currentPage - 1) * props.docPerPage; + const { isMoreDocs, setIsNextRecord } = props; + const [isMailModal, setIsMailModal] = useState(false); + const [customizeMail, setCustomizeMail] = useState({ body: "", subject: "" }); + const [defaultMail, setDefaultMail] = useState({ body: "", subject: "" }); + const [currUserId, setCurrUserId] = useState(false); + const [documentDetails, setDocumentDetails] = useState(); + const [error, setError] = useState(""); + + useEffect(() => { + if (props.isSearchResult) { + setCurrentPage(1); + } + }, [props.isSearchResult]); + + const getPaginationRange = () => { + const totalPageNumbers = 7; // Adjust this value to show more/less page numbers + const pages = []; + const totalPages = Math.ceil(props.List.length / props.docPerPage); + if (totalPages <= totalPageNumbers) { + for (let i = 1; i <= totalPages; i++) { + pages.push(i); + } + } else { + const leftSiblingIndex = Math.max(currentPage - 1, 1); + const rightSiblingIndex = Math.min(currentPage + 1, totalPages); + + const showLeftDots = leftSiblingIndex > 2; + const showRightDots = rightSiblingIndex < totalPages - 2; + + const firstPageIndex = 1; + const lastPageIndex = totalPages; + + if (!showLeftDots && showRightDots) { + let leftItemCount = 3; + let leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1); + + pages.push(...leftRange); + pages.push("..."); + pages.push(totalPages); + } else if (showLeftDots && !showRightDots) { + let rightItemCount = 3; + let rightRange = Array.from( + { length: rightItemCount }, + (_, i) => totalPages - rightItemCount + i + 1 + ); + + pages.push(firstPageIndex); + pages.push("..."); + pages.push(...rightRange); + } else if (showLeftDots && showRightDots) { + let middleRange = Array.from( + { length: 3 }, + (_, i) => leftSiblingIndex + i + ); + + pages.push(firstPageIndex); + pages.push("..."); + pages.push(...middleRange); + pages.push("..."); + pages.push(lastPageIndex); + } + } + + return pages; + }; + const showAlert = (type, message, time = 1500) => { + setAlertMsg({ type: type, message: message }); + setTimeout(() => setAlertMsg({ type: "", message: "" }), time); + }; + const pageNumbers = getPaginationRange(); + // below useEffect reset currenpage to 1 if user change route + useEffect(() => { + checkTourStatus(); + fetchTeamList(); + return () => setCurrentPage(1); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // `fetchTeamList` is used to fetch team list for share with functionality + const fetchTeamList = async () => { + try { + const extUser = JSON.parse(localStorage.getItem("Extand_Class"))?.[0]; + if (extUser?.OrganizationId?.objectId) { + const teamtRes = await Parse.Cloud.run("getteams", { active: true }); + if (teamtRes.length > 0) { + const _teamRes = JSON.parse(JSON.stringify(teamtRes)); + const selected = _teamRes.map( + (x) => + x.Name === "All Users" && { + label: x.Name, + value: x.objectId + } + ); + setSelectedTeam(selected); + } + } + } catch (err) { + console.log("Err in fetch top level teamlist", err); + } + }; + // below useEffect is used to render next record if IsMoreDoc is true + // second last value of pageNumber array is same as currentPage + useEffect(() => { + if (isMoreDocs && pageNumbers[pageNumbers.length - 1] === currentPage) { + setIsNextRecord(true); + } + }, [isMoreDocs, pageNumbers, currentPage, setIsNextRecord]); + + //function to fetch tenant Details + const fetchTenantDetails = async () => { + const user = JSON.parse( + localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ) + ); + if (user) { + try { + const tenantDetails = await getTenantDetails(user?.objectId); + if (tenantDetails && tenantDetails === "user does not exist!") { + alert(t("user-not-exist")); + } else if (tenantDetails) { + const signatureType = tenantDetails?.SignatureType || []; + const filterSignTypes = signatureType?.filter( + (x) => x.enabled === true + ); + return filterSignTypes; + } + } catch (e) { + alert(t("user-not-exist")); + } + } else { + alert(t("user-not-exist")); + } + }; + + // `handleURL` is used to open microapp + const handleURL = async (item, act) => { + if (act.hoverLabel === "Edit") { + navigate(`/${act.redirectUrl}/${item.objectId}`); + } else { + // handle Use template + const placeholder = item?.Placeholders; + const isRoleExist = placeholder.filter((x) => x.Role !== "prefill"); + //condition to check atleast one role is present for use template + if (isRoleExist && isRoleExist?.length > 0) { + const checkIsSignatureExist = isRoleExist?.every((placeholderObj) => + placeholderObj?.placeHolder?.some((holder) => + holder?.pos?.some((posItem) => posItem?.type === "signature") + ) + ); + if (checkIsSignatureExist) { + setActLoader({ [`${item.objectId}_${act.btnId}`]: true }); + const templateDeatils = await fetchTemplate(item.objectId); + const templateData = + templateDeatils.data && templateDeatils.data.result; + if (!templateData.error) { + setXyPosition(templateData?.Placeholders); + const signer = utils.handleSignersList(templateData); + setSignerList(signer); + setTemplateDetails(templateData); + //this function is used to open modal to show signers list + await utils?.handleDisplaySignerList( + item?.Placeholders, + item?.Signers, + setForms + ); + setIsPrefillModal({ [item.objectId]: true }); + } else { + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + } + } else { + showAlert("danger", t("quick-send-alert-2")); + } + } else { + showAlert("danger", t("add-role-alert")); + } + } + }; + + const fetchTemplate = async (templateId) => { + try { + const params = { + templateId: templateId, + include: ["Placeholders.signerPtr"] + }; + const axiosRes = await axios.post( + `${localStorage.getItem("baseUrl")}functions/getTemplate`, + params, + { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + } + } + ); + if (axiosRes) { + return axiosRes; + } + } catch (e) { + console.log("Error to fetch template in report", e); + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + } + }; + //function is called when there ther no any prefill role widget exist then create direct document and navigate + const navigatePageToDoc = async (templateRes, placeholder, signer) => { + setIsPrefillModal({}); + const res = await createDocument( + [templateRes || templateDeatils], + placeholder || xyPosition, + signer || signerList, + templateRes?.URL || templateDeatils?.URL + ); + if (res.status === "success") { + navigate(`/placeHolderSign/${res.id}`, { + state: { title: "Use Template" } + }); + } else { + alert(t("something-went-wrong-mssg")); + } + }; + + const handleActionBtn = async (act, item) => { + setIsTour(false); + if (act.action === "redirect") { + handleURL(item, act); + } else if (act.action === "delete") { + setIsDeleteModal({ [item.objectId]: true }); + } else if (act.action === "share") { + handleShare(item); + } else if (act.action === "option") { + setIsOption({ [item.objectId]: !isOption[item.objectId] }); + } else if (act.action === "resend") { + setIsResendMail({ [item.objectId]: true }); + } else if (act.action === "bulksend") { + handleBulkSend(item); + } else if (act.action === "sharewithteam") { + if (item?.SharedWith && item?.SharedWith.length > 0) { + // below code is used to get existing sharewith teams and formated them as per react-select + const formatedList = item?.SharedWith.map((x) => ({ + label: x.Name, + value: x.objectId + })); + setSelectedTeam(formatedList); + } + setIsShareWith({ [item.objectId]: true }); + } + else if (act.action === "duplicate") { + const isPrefill = item?.Placeholders?.some((p) => p?.Role === "prefill"); + setError(isPrefill ? t("duplicate-template-error") : ""); + setIsModal({ [`duplicate_${item.objectId}`]: true }); + } else if (act.action === "rename") { + setIsModal({ [`rename_${item.objectId}`]: true }); + } else if (act.action === "edit") { + setIsModal({ [`edit_${item.objectId}`]: true }); + } else if (act.action === "saveastemplate") { + setIsModal({ [`saveastemplate_${item.objectId}`]: true }); + } else if (act.action === "extendexpiry") { + setIsModal({ [`extendexpiry_${item.objectId}`]: true }); + } + }; + // Get current list + const indexOfLastDoc = currentPage * props.docPerPage; + const indexOfFirstDoc = indexOfLastDoc - props.docPerPage; + const sortedList = props.List; + const currentList = sortedList?.slice(indexOfFirstDoc, indexOfLastDoc); + + // Change page + const paginateFront = () => { + const lastValue = pageNumbers?.[pageNumbers?.length - 1]; + if (currentPage < lastValue) { + setCurrentPage(currentPage + 1); + } + }; + + const paginateBack = () => { + if (startIndex > 0) { + setCurrentPage(currentPage - 1); + } + }; + + const handleDelete = async (item) => { + setIsDeleteModal({}); + setActLoader({ [`${item.objectId}`]: true }); + try { + const serverUrl = serverUrl_fn(); + const cls = "contracts_Template"; + const url = serverUrl + `/classes/${cls}/`; + const body = { IsArchive: true }; + const res = await axios.put(url + item.objectId, body, { + headers: { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + "X-Parse-Session-Token": localStorage.getItem("accesstoken") + } + }); + if (res.data && res.data.updatedAt) { + setActLoader({}); + showAlert("success", t("record-delete-alert")); + const upldatedList = props.List.filter( + (x) => x.objectId !== item.objectId + ); + props.setList(upldatedList); + } + } catch (err) { + console.log("err", err); + showAlert("danger", t("something-went-wrong-mssg")); + setActLoader({}); + } + }; + const handleClose = ( + ) => { + setIsDeleteModal({}); + }; + const handleShare = (item) => { + setActLoader({ [item.objectId]: true }); + const host = window.location.origin; + const sendMail = item?.SendMail || false; + const getUrl = (x) => { + //encode this url value `${item.objectId}/${x.Email}/${x.objectId}` to base64 using `btoa` function + if (x?.signerObjId) { + const encodeBase64 = btoa( + `${item.objectId}/${x.signerPtr.Email}/${x.signerPtr.objectId}/${sendMail}` + ); + return `${host}/login/${encodeBase64}`; + } else { + const encodeBase64 = btoa(`${item.objectId}/${x.email}`); + return `${host}/login/${encodeBase64}`; + } + }; + const removePrefill = item?.Placeholders.filter( + (data) => data?.Role !== "prefill" + ); + const urls = removePrefill?.map((x) => ({ + email: x.email ? x.email : x.signerPtr.Email, + url: getUrl(x) + })); + setShareUrls(urls); + setIsShare({ [item.objectId]: true }); + }; + + const copytoclipboard = (text) => { + copytoData(text); + if (copyUrlRef.current) { + copyUrlRef.current.textContent = text; // Update text safely + } + setCopied(true); + setTimeout(() => setCopied(false), 1500); // Reset copied state after 1.5 seconds + }; + const copybtn = (text, email) => { + copytoData(text); + if (copyUrlRef.current) { + copyUrlRef.current.textContent = text; // Update text safely + } + setCopied({ [email]: true }); + }; + + async function checkTourStatus() { + const cloudRes = await Parse.Cloud.run("getUserDetails"); + if (cloudRes) { + const extUser = JSON.parse(JSON.stringify(cloudRes)); + localStorage.setItem("Extand_Class", JSON.stringify([extUser])); + const tourStatus = extUser?.TourStatus || []; + setTourStatusArr(tourStatus); + const tour = + tourStatus?.find((obj) => obj.templateReport)?.templateReport || false; + setIsTour(!tour); + } else { + setIsTour(true); + } + } + + const closeTour = async () => { + setIsTour(false); + const isTourSaved = + tourStatusArr?.some((obj) => obj.templateReport) || false; + if (!isTourSaved) { + const serverUrl = localStorage.getItem("baseUrl"); + const appId = localStorage.getItem("parseAppId"); + const json = JSON.parse(localStorage.getItem("Extand_Class")); + const extUserId = json && json.length > 0 && json[0].objectId; + let updatedTourStatus = []; + if (tourStatusArr.length > 0) { + updatedTourStatus = [...tourStatusArr]; + const templateReportIndex = tourStatusArr.findIndex( + (obj) => + obj["templateReport"] === false || obj["templateReport"] === true + ); + if (templateReportIndex !== -1) { + updatedTourStatus[templateReportIndex] = { templateReport: true }; + } else { + updatedTourStatus.push({ templateReport: true }); + } + } else { + updatedTourStatus = [{ templateReport: true }]; + } + + await axios.put( + serverUrl + "classes/contracts_Users/" + extUserId, + { TourStatus: updatedTourStatus }, + { headers: { "X-Parse-Application-Id": appId } } + ); + } + }; + + // `handleDownload` is used to get valid doc url available in completed report + const handleDownload = async (item) => { + setActLoader({ [`${item.objectId}`]: true }); + const url = item?.SignedUrl || item?.URL || ""; + const pdfName = + item?.Name?.length > 100 + ? item?.Name?.slice(0, 100) + : item?.Name || "template"; + const templateId = item.objectId; + const isCompleted = item?.IsCompleted || false; + const formatId = item?.ExtUserPtr?.DownloadFilenameFormat; + const docName = utils?.buildDownloadFilename(formatId, { + docName: pdfName, + email: item?.ExtUserPtr?.Email, + isSigned: isCompleted + }); + if (url) { + try { + const signedUrl = await getSignedUrl( + url, + "", //docId + templateId + ); + await fetchUrl(signedUrl, docName); + + setActLoader({}); + } catch (err) { + console.log("err in getsignedurl", err); + alert(t("something-went-wrong-mssg")); + setActLoader({}); + } + } + }; + + // `handleSubjectChange` is used to add or change subject of resend mail + const handleSubjectChange = (subject, doc) => { + const encodeBase64 = userDetails?.objectId + ? btoa(`${doc.objectId}/${userDetails.Email}/${userDetails.objectId}`) + : btoa(`${doc.objectId}/${userDetails.Email}`); + const expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + const signPdf = `${window.location.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + note: doc?.Note || "", + sender_name: + doc.ExtUserPtr.Name, + sender_mail: + doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr?.Phone || "", + receiver_name: userDetails?.Name || "", + receiver_email: userDetails?.Email, + receiver_phone: userDetails?.Phone || "", + expiry_date: localExpireDate, + company_name: doc.ExtUserPtr.Company, + signing_url: signPdf + }; + const res = replaceMailVaribles(subject, "", variables); + setMail((prev) => ({ ...prev, subject: res.subject })); + }; + // `handlebodyChange` is used to add or change body of resend mail + const handlebodyChange = (body, doc) => { + const encodeBase64 = userDetails?.objectId + ? btoa(`${doc.objectId}/${userDetails.Email}/${userDetails.objectId}`) + : btoa(`${doc.objectId}/${userDetails.Email}`); + const expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + const signPdf = `${window.location.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + note: doc?.Note || "", + sender_name: + doc.ExtUserPtr.Name, + sender_mail: + doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr?.Phone || "", + receiver_name: userDetails?.Name || "", + receiver_email: userDetails?.Email || "", + receiver_phone: userDetails?.Phone || "", + expiry_date: localExpireDate, + company_name: doc.ExtUserPtr.Company, + signing_url: signPdf + }; + const res = replaceMailVaribles("", body, variables); + + if (body) { + setMail((prev) => ({ ...prev, body: res.body })); + } + }; + // `handleNextBtn` is used to open edit mail template screen in resend mail modal + // as well as replace variable with original one + const handleNextBtn = (user, doc) => { + const userdata = { + Name: user?.signerPtr?.Name, + Email: user.email ? user?.email : user.signerPtr?.Email, + Phone: user?.signerPtr?.Phone, + objectId: user?.signerPtr?.objectId + }; + setUserDetails(userdata); + const encodeBase64 = user.email + ? btoa(`${doc.objectId}/${user.email}`) + : btoa( + `${doc.objectId}/${user.signerPtr.Email}/${user.signerPtr.objectId}` + ); + const expireDate = doc.ExpiryDate.iso; + const newDate = new Date(expireDate); + const localExpireDate = newDate.toLocaleDateString("en-US", { + day: "numeric", + month: "long", + year: "numeric" + }); + const signPdf = `${window.location.origin}/login/${encodeBase64}`; + const variables = { + document_title: doc.Name, + note: doc?.Note || "", + sender_name: + doc.ExtUserPtr.Name, + sender_mail: + doc.ExtUserPtr.Email, + sender_phone: doc.ExtUserPtr?.Phone || "", + receiver_name: user?.signerPtr?.Name || "", + receiver_email: user?.email ? user?.email : user?.signerPtr?.Email, + receiver_phone: user?.signerPtr?.Phone || "", + expiry_date: localExpireDate, + company_name: doc?.ExtUserPtr?.Company || "", + signing_url: signPdf + }; + const subject = + doc?.RequestSubject || + doc?.ExtUserPtr?.TenantId?.RequestSubject || + `{{sender_name}} has requested you to sign "{{document_title}}"`; + const body = + doc?.RequestBody || + doc?.ExtUserPtr?.TenantId?.RequestBody || + `<html><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head><body><p>Hi {{receiver_name}},</p><br><p>We hope this email finds you well. {{sender_name}} has requested you to review and sign <b>"{{document_title}}"</b>.</p><p>Your signature is crucial to proceed with the next steps as it signifies your agreement and authorization.</p><br><p><a href='{{signing_url}}' rel='noopener noreferrer' target='_blank'>Sign here</a></p><br><br><p>If you have any questions or need further clarification regarding the document or the signing process, please contact the sender.</p><br><p>Thanks</p><p> Team ${appName}</p><br></body> </html>`; + const res = replaceMailVaribles(subject, body, variables); + setMail((prev) => ({ ...prev, subject: res.subject, body: res.body })); + setIsNextStep({ [user.Id]: true }); + }; + const handleResendMail = async (e, doc, user) => { + e.preventDefault(); + setActLoader({ [user?.Id]: true }); + const url = `${localStorage.getItem("baseUrl")}functions/sendmailv3`; + const headers = { + "Content-Type": "application/json", + "X-Parse-Application-Id": localStorage.getItem("parseAppId"), + sessionToken: localStorage.getItem("accesstoken") + }; + let params = { + replyto: + doc?.ExtUserPtr?.Email || + "", + extUserId: doc?.ExtUserPtr?.objectId, + recipient: userDetails?.Email, + subject: mail.subject, + from: + doc?.ExtUserPtr?.Email, + html: mail.body + }; + try { + const res = await axios.post(url, params, { headers: headers }); + if (res?.data?.result?.status === "success") { + showAlert("success", t("mail-sent-alert")); + setIsResendMail({}); + } + else { + showAlert("danger", t("something-went-wrong-mssg")); + } + } catch (err) { + console.log("err in sendmail", err); + showAlert("danger", t("something-went-wrong-mssg")); + } finally { + setIsNextStep({}); + setUserDetails({}); + setActLoader({}); + } + }; + const fetchUserStatus = (user, doc) => { + const email = user.email ? user.email : user.signerPtr.Email; + const audit = doc?.AuditTrail?.find((x) => x.UserPtr.Email === email); + + return ( + <div className="flex flex-row gap-2 justify-center items-center"> + <div className="flex justify-center items-center bg-base-300 text-base-content shadow-md op-card w-[65px] h-[32px] cursor-default"> + {audit?.Activity ? audit?.Activity : "Awaited"} + </div> + + <button + onClick={() => handleNextBtn(user, doc)} + className={ + audit?.Activity !== "Signed" + ? "op-btn op-btn-primary op-btn-sm" + : " text-transparent cursor-default pointer-events-none" + } + disabled={audit?.Activity === "Signed"} + > + {audit?.Activity !== "Signed" && "Resend"} + </button> + </div> + ); + }; + // `handleQuickSendClose` is trigger when bulk send component trigger close event + const handleQuickSendClose = (status, count) => { + setIsBulkSend({}); + if (status === "success") { + showAlert("success", count + " " + t("document-sent-alert")); + } else { + showAlert("danger", t("something-went-wrong-mssg")); + } + }; + + // `handleBulkSend` is used to open modal as well as fetch template + // and show Ui on the basis template response handleBulkSendTemplate + const handleBulkSend = async (template) => { + const isPrefillExist = template?.Placeholders.some( + (x) => x.Role === "prefill" + ); + if (isPrefillExist) { + showAlert("danger", t("prefill-bulk-error")); + } else { + setIsBulkSend({ [template.objectId]: true }); + setIsLoader({ [template.objectId]: true }); + try { + const axiosRes = await fetchTemplate(template.objectId); + const templateRes = axiosRes.data && axiosRes.data.result; + const tenantSignTypes = await fetchTenantDetails(); + const docSignTypes = templateRes?.SignatureType || signatureTypes; + const updatedSignatureType = await handleSignatureType( + tenantSignTypes, + docSignTypes + ); + setSignatureType(updatedSignatureType); + setPlaceholders(templateRes?.Placeholders); + setTemplateDetails(templateRes); + setIsLoader({}); + } catch (err) { + console.log("err in fetch template in bulk modal", err); + setIsBulkSend({}); + showAlert("danger", t("something-went-wrong-mssg")); + } + } + }; + + // `handleShareWith` is used to save teams in sharedWith field + const handleShareWith = async (e, template) => { + e.preventDefault(); + e.stopPropagation(); + setIsShareWith({}); + setActLoader({ [template.objectId]: true }); + try { + const templateCls = new Parse.Object("contracts_Template"); + templateCls.id = template.objectId; + const teamArr = selectedTeam.map((x) => ({ + __type: "Pointer", + className: "contracts_Teams", + objectId: x.value + })); + templateCls.set("SharedWith", teamArr); + const res = await templateCls.save(); + if (res) { + showAlert("success", t("template-share-alert")); + } + } catch (err) { + showAlert("danger", t("something-went-wrong-mssg")); + } finally { + setActLoader({}); + } + }; + + // `handleCreateDuplicate` is used to create duplicate from current entry using objectId + const handleCreateDuplicate = async (item) => { + setActLoader({ [item.objectId]: true }); + setIsModal({}); + try { + const duplicateRes = await Parse.Cloud.run("createduplicate", { + templateId: item.objectId + }); + if (duplicateRes) { + const newTemplate = JSON.parse(JSON.stringify(duplicateRes)); + props.setList((prevData) => [newTemplate, ...prevData]); + showAlert("success", t("duplicate-template-created")); + } + } catch (err) { + showAlert("danger", t("something-went-wrong-mssg")); + console.log("Err while create duplicate template", err); + } finally { + setActLoader({}); + } + }; + // `handleRenameDoc` is used to update document name + const handleRenameDoc = async (item) => { + setActLoader({ [item.objectId]: true }); + setIsModal({}); + const className = "contracts_Template"; + + try { + const query = new Parse.Query(className); + const docObj = await query.get(item.objectId); + docObj.set("Name", renameDoc); + await docObj.save(); + //update report list data + const updateList = props.List.map((x) => + x.objectId === item.objectId ? { ...x, Name: renameDoc } : x + ); + props.setList(updateList); + setActLoader({}); + showAlert("success", "Document updated", 2000); + } catch (err) { + showAlert("danger", t("something-went-wrong-mssg"), 2000); + setActLoader({}); + } + }; + + const handleCloseModal = () => { + setIsModal({}); + }; + + const handleResendClose = () => { + setIsResendMail({}); + setIsNextStep({}); + setUserDetails({}); + }; + + // `handleAddUser` is used to adduserAdd commentMore actions + const handleAddUser = (data, id) => { + const signerPtr = { + __type: "Pointer", + className: "contracts_Contactbook", + objectId: data.objectId + }; + const updatePlaceHolder = xyPosition.map((x) => { + if (x.signerObjId === id || x.Id === id) { + return { ...x, signerPtr: signerPtr, signerObjId: data.objectId }; + } + return { ...x }; + }); + setXyPosition(updatePlaceHolder); + const updateSigner = signerList.map((y) => { + //condition is used to updated signer's email + if (y.objectId === id) { + return data; + } + //condition is used to add new signer's mail to role + else if (y.Id === id) { + return { ...y, ...data, className: "contracts_Contactbook" }; + } + return { ...y }; + }); + setSignerList(updateSigner); + + //condition when there are any new signer add then save that signer in dropdown option + if (isNewContact.status) { + let newForm = [...forms]; + const label = `${data.Name}<${data.Email}>`; + const index = newForm.findIndex((x) => x.value === id); + newForm[index].label = label; + newForm[index].value = id; + setForms(newForm); + } + }; + const handleClosePrefillModal = () => { + setIsPrefillModal(false); + setActLoader({}); + setForms([]); + setXyPosition([]); + }; + //`handlePrefillWidgetCreateDoc` is used to embed prefill all widgets on document, create document, and send document + const handlePrefillWidgetCreateDoc = async () => { + const scale = 1; + const res = await utils?.handleCheckPrefillCreateDoc( + xyPosition, + signerList, + setIsPrefillModal, + scale, + templateDeatils?.URL, + [templateDeatils], + prefillImg, + extClass?.[0]?.UserId?.objectId, + ); + if (res?.status === "unfilled") { + const emptyWidget = res?.emptyResponseObjects + .map((item) => `[ ${item.options.name}]`) + .join(", "); + const timeInMiliSec = 6000; + showAlert( + "danger", + t("prefill-unfilled-widget", { emptyWidget: emptyWidget }), + timeInMiliSec + ); + } else if (res?.status === "unattach signer") { + showAlert("danger", "please attach all role to signer"); + } else if (res?.status === "success") { + setDocumentId(res.id); + setActLoader({}); + setIsMailModal(true); + const user = JSON.parse( + localStorage.getItem( + `Parse/${localStorage.getItem("parseAppId")}/currentUser` + ) + ); + if (user) { + try { + const tenantDetails = await getTenantDetails(user?.objectId); + if (tenantDetails && tenantDetails === "user does not exist!") { + alert(t("user-not-exist")); + } else if (tenantDetails) { + //condition to check tenant have some already set any email template + if (tenantDetails?.RequestBody) { + //customize mail state is handle to when user want to customize already set tenant email format then use that format + setCustomizeMail({ + subject: tenantDetails?.RequestSubject, + body: tenantDetails?.RequestBody + }); + setDefaultMail({ + subject: tenantDetails?.RequestSubject, + body: tenantDetails?.RequestBody + }); + } else { + const defaultRequestBody = defaultMailBody; + const defaultSubject = defaultMailSubject; + setCustomizeMail({ + subject: defaultSubject, + body: defaultRequestBody + }); + setDefaultMail({ + subject: defaultSubject, + body: defaultRequestBody + }); + } + } + } catch (e) { + alert(t("user-not-exist")); + } + } else { + alert(t("user-not-exist")); + } + } + }; + //function show signer list and share link to share signUrl + const handleShareList = () => { + const shareLinkList = []; + let signerMail = signerList; + for (let i = 0; i < signerMail.length; i++) { + const objectId = signerMail[i].objectId; + const hostUrl = window.location.origin; + const sendMail = false; + //encode this url value `${documentId}/${signerMail[i].Email}/${objectId}` to base64 using `btoa` function + const encodeBase64 = btoa( + `${documentId}/${signerMail[i].Email}/${objectId}/${sendMail}` + ); + let signPdf = `${hostUrl}/login/${encodeBase64}`; + shareLinkList.push({ signerEmail: signerMail[i].Email, url: signPdf }); + } + return shareLinkList.map((data, ind) => { + return ( + <div + className="flex flex-row justify-between items-center mb-1" + key={ind} + > + {copied && <Alert type="success">{t("copied")}</Alert>} + <span className="w-[220px] md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis "> + {data.signerEmail} + </span> + <div className="flex flex-row items-center gap-3 "> + <button + onClick={() => copytoclipboard(data.url)} + type="button" + className="flex flex-row items-center op-link op-link-primary" + > + <i className="fa-light fa-copy" /> + <span className=" hidden md:block ml-1 ">{t("copy-link")}</span> + </button> + <ShareButton + title={t("sign-url")} + text={t("sign-url")} + url={data.url} + > + <i className="fa-light fa-share-from-square op-link op-link-secondary no-underline"></i> + </ShareButton> + </div> + </div> + ); + }); + }; + const handleRemovePrefill = (placeholders) => { + const removePrefill = placeholders?.filter( + (data) => data?.Role !== "prefill" + ); + return removePrefill; + }; + const handleRecipientSign = (docId, currUserId) => { + if (currUserId) { + navigate(`/recipientSignPdf/${docId}/${currUserId}`); + } else { + navigate(`/recipientSignPdf/${docId}`); + } + }; + return ( + <div className="relative"> + {Object.keys(actLoader)?.length > 0 && ( + <div className="absolute w-full h-full flex justify-center items-center bg-black/30 rounded-box z-30"> + <Loader /> + </div> + )} + <div className="p-2 w-full bg-base-100 text-base-content op-card shadow-lg"> + {alertMsg.message && ( + <Alert type={alertMsg.type}>{alertMsg.message}</Alert> + )} + {props.tourData && ( + <> + <Tour + onRequestClose={closeTour} + steps={props.tourData} + isOpen={isTour} + /> + </> + )} + <div + ref={titleRef} + className="flex flex-row items-center justify-between my-2 mx-3 text-[20px] md:text-[23px]" + > + <div className="font-light"> + {t(`report-name.${props.ReportName}`)}{" "} + <sup className="cursor-pointer" onClick={() => setIsTour(true)}> + <i className="border-[#33bbff] text-[#33bbff] fa-light fa-question rounded-full border-[1px] py-[1.5px] px-[4px] text-[13px]"></i> + </sup> + </div> + <div className="flex flex-row justify-center items-center gap-3 mb-2"> + {/* Search input for report bigger in width */} + {titleElement?.width > 500 && ( + <div className="flex"> + <input + type="search" + value={props.searchTerm} + onChange={props.handleSearchChange} + placeholder={t("search-templates")} + onPaste={props.handleSearchPaste} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-64 text-xs" + /> + </div> + )} + {/* create template form */} + <div + data-tut="reactourFirst" + className="cursor-pointer flex" + onClick={() => navigate("/form/template")} + > + <i className="cursor-pointer fa-light fa-square-plus text-accent text-[30px] md:text-[32px]"></i> + </div> + {/* search icon/magnifer icon */} + {titleElement?.width < 500 && ( + <button + className="flex justify-center items-center focus:outline-none rounded-md text-[18px]" + aria-label="Search" + onClick={() => + props.setMobileSearchOpen(!props.mobileSearchOpen) + } + > + <i className="fa-light fa-magnifying-glass"></i> + </button> + )} + {props.openColumnModal && ( + <button + className="flex justify-center items-center focus:outline-none rounded-md text-[18px]" + aria-label="Columns" + onClick={props.openColumnModal} + > + <i className="fa-light fa-table-columns"></i> + </button> + )} + </div> + </div> + {/* Search input for report smalle in width */} + {titleElement?.width < 500 && props.mobileSearchOpen && ( + <div className="top-full left-0 w-full px-3 pt-1 pb-3"> + <input + type="search" + value={props.searchTerm} + onChange={props.handleSearchChange} + placeholder={t("search-documents")} + onPaste={props.handleSearchPaste} + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + /> + </div> + )} + <div + className={`overflow-auto w-full border-b ${ + props.List?.length > 0 + ? isDashboard + ? "min-h-[317px]" + : currentList?.length === props.docPerPage + ? "h-fit" + : "h-screen" + : "" + }`} + > + <table className="op-table border-collapse w-full mb-4"> + <thead className="text-[14px] text-center"> + <tr className="border-y-[1px]"> + {props.heading?.map((item, i) => ( + <th key={i} className="p-2"> + {props.columnLabels?.[item] || + t(`report-heading.${item}`, { defaultValue: item })} + </th> + ))} + {props.actions?.length > 0 && ( + <th className="p-2 text-transparent pointer-events-none"> + {t("action")} + </th> + )} + </tr> + </thead> + <tbody className="text-[12px]"> + {props.List?.length > 0 && + currentList.map((item, index) => ( + <tr + className={`${ + currentList?.length === props.docPerPage + ? "last:border-none" + : "" + } border-y-[1px] `} + key={index} + > + {props?.heading?.map((col) => ( + <RenderReportCell + key={col} + col={col} + rowData={item} + rowIndex={index} + startIndex={startIndex} + handleDownload={handleDownload} + handleRemovePrefill={handleRemovePrefill} + reportName={props.ReportName} + /> + ))} + <td className="px-2 py-2"> + <div className="text-base-content min-w-max flex flex-row gap-x-2 gap-y-1 justify-start items-center"> + {props.actions?.length > 0 && + props.actions.map((act, index) => ( + <React.Fragment key={index}> + {(item.ExtUserPtr?.objectId === + extClass?.[0]?.objectId || + act.btnLabel === "Use") && ( + <div + role="button" + data-tut={act?.selector} + key={index} + onClick={() => handleActionBtn(act, item)} + title={t(`btnLabel.${act.hoverLabel}`)} + className={ + act.action !== "option" + ? `${ + act?.btnColor || "" + } op-btn op-btn-sm mr-1` + : "text-base-content focus:outline-none text-lg mr-2 relative" + } + > + <i className={act.btnIcon}></i> + {act.btnLabel && ( + <span className="uppercase font-medium"> + { + `${t(`btnLabel.${act.btnLabel}`)}` + } + </span> + )} + {/* template report */} + {isOption[item.objectId] && + act.action === "option" && ( + <ul className="absolute -right-1 top-auto z-[70] w-52 op-dropdown-content op-menu op-menu-sm shadow-black/20 shadow bg-base-100 text-base-content rounded-box"> + {act.subaction?.map((subact) => ( + <li + key={subact.btnId} + onClick={() => + handleActionBtn(subact, item) + } + title={t( + `btnLabel.${subact.btnLabel}` + )} + > + <span className="flex items-center justify-between"> + <span className="text-[13px] capitalize font-medium"> + <i + className={`${subact.btnIcon} mr-2`} + ></i> + {subact.btnLabel && + t( + `btnLabel.${subact.btnLabel}` + )} + </span> + {subact.secIcon && ( + <i + className={`${subact.secIcon} ml-1.5`} + ></i> + )} + </span> + </li> + ))} + </ul> + )} + </div> + )} + <ModalUi + title={t("btnLabel.Duplicate")} + isOpen={isModal["duplicate_" + item.objectId]} + handleClose={handleCloseModal} + > + <div className="flex flex-col px-4 pb-3 pt-2"> + {error ? ( + <>{error}</> + ) : ( + <> + <p className="text-base"> + {t("duplicate-template-alert")} + </p> + <div className="flex flex-row gap-2 pt-3 mt-3 border-t-[1.5px] border-gray-500"> + <button + className="w-[100px] op-btn op-btn-primary op-btn-md" + onClick={() => + handleCreateDuplicate(item) + } + > + {t("yes")} + </button> + <button + className="w-[100px] op-btn op-btn-secondary op-btn-md" + onClick={handleCloseModal} + > + {t("no")} + </button> + </div> + </> + )} + </div> + </ModalUi> + </React.Fragment> + ))} + </div> + {isPrefillModal[item.objectId] && ( + <PrefillWidgetModal + isPrefillModal={isPrefillModal[item.objectId]} + prefillData={xyPosition.find( + (x) => x.Role === "prefill" + )} + forms={forms} + setForms={setForms} + xyPosition={xyPosition} + setXyPosition={setXyPosition} + handleCreateDocument={handlePrefillWidgetCreateDoc} + handleClosePrefillModal={handleClosePrefillModal} + handleAddUser={handleAddUser} + navigatePageToDoc={navigatePageToDoc} + setIsNewContact={setIsNewContact} + isNewContact={isNewContact} + docId={item.objectId} + /> + )} + {isShareWith[item.objectId] && ( + <div className="op-modal op-modal-open"> + <div className="max-h-90 bg-base-100 w-[95%] md:max-w-[500px] rounded-box relative"> + <h3 className="text-base-content font-bold text-lg pt-[15px] px-[20px]"> + {t("share-with")} + </h3> + <div + className="op-btn op-btn-sm op-btn-circle op-btn-ghost text-base-content absolute right-2 top-2 z-40" + onClick={() => setIsShareWith({})} + > + ✕ + </div> + <div className="px-2 mt-3 w-full h-full"> + <div className="op-input op-input-bordered op-input-sm w-full h-full text-[13px] break-all"> + {selectedTeam?.[0]?.label} + </div> + </div> + <button + onClick={(e) => handleShareWith(e, item)} + className="op-btn op-btn-primary ml-[10px] my-3" + > + {t("submit")} + </button> + </div> + </div> + )} + {isDeleteModal[item.objectId] && ( + <ModalUi + isOpen + title={t("delete-document")} + handleClose={handleClose} + > + <div className="m-[20px]"> + <div className="text-lg font-normal text-base-content"> + {t("delete-document-alert")} + </div> + <hr className="bg-[#ccc] mt-4" /> + <div className="flex items-center mt-3 gap-2 text-white"> + <button + onClick={() => handleDelete(item)} + className="op-btn op-btn-primary" + > + {t("yes")} + </button> + <button + onClick={handleClose} + className="op-btn op-btn-secondary" + > + {t("no")} + </button> + </div> + </div> + </ModalUi> + )} + {isBulkSend[item.objectId] && ( + <ModalUi + isOpen + title={ + t("quick-send") + } + handleClose={() => setIsBulkSend({})} + > + {isLoader[item.objectId] ? ( + <div className="w-full h-[100px] flex justify-center items-center z-30"> + <Loader /> + </div> + ) : ( + <BulkSendUi + Placeholders={placeholders} + item={templateDeatils} + handleClose={handleQuickSendClose} + signatureType={signatureType} + /> + )} + </ModalUi> + )} + {isShare[item.objectId] && ( + <ModalUi + isOpen + title={t("copy-link")} + handleClose={() => { + setIsShare({}); + setActLoader({}); + setCopied(false); + }} + > + <div className="m-[20px]"> + {shareUrls.map((share, i) => ( + <div + key={i} + className="text-sm font-normal text-base-content flex my-2 justify-between items-center" + > + <span className="w-[150px] mr-[5px] md:mr-0 md:w-[300px] whitespace-nowrap overflow-hidden text-ellipsis text-sm font-semibold"> + {share.email} + </span> + <div className="flex items-center gap-2"> + <ShareButton + title={t("sign-url")} + text={t("sign-url")} + url={share.url} + className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm " + > + <i className="fa-light fa-share-from-square"></i> + {t("btnLabel.Share")} + </ShareButton> + <button + className="op-btn op-btn-primary op-btn-outline op-btn-xs md:op-btn-sm" + onClick={() => + copybtn(share.url, share.email) + } + > + <i className="fa-light fa-copy" /> + {copied[share.email] + ? t("copied") + : t("copy")} + </button> + </div> + </div> + ))} + <p ref={copyUrlRef} className="hidden"></p> + </div> + </ModalUi> + )} + {isResendMail[item.objectId] && ( + <ModalUi + isOpen + title={ + t("resend-mail") + } + handleClose={handleResendClose} + > + <div className="overflow-y-auto max-h-[340px] md:max-h-[400px]"> + {item?.Placeholders?.filter( + (user) => user?.Role !== "prefill" + )?.map((user) => ( + <React.Fragment key={user.Id}> + {isNextStep[user.Id] && ( + <div className="relative "> + {actLoader[user.Id] && ( + <div className="absolute w-full h-full flex justify-center items-center bg-black bg-opacity-30 z-30"> + <Loader /> + </div> + )} + <form + onSubmit={(e) => + handleResendMail(e, item, user) + } + className="w-full flex flex-col gap-2 p-3 text-base-content relative" + > + <div className="absolute right-5 text-xs z-40"> + <Tooltip + id={`${user.Id}_help`} + message={t("resend-mail-help")} + /> + </div> + <div> + <label + className="text-xs ml-1" + htmlFor="mailsubject" + > + {t("subject")}{" "} + </label> + <input + id="mailsubject" + className="op-input op-input-bordered op-input-sm focus:outline-none hover:border-base-content w-full text-xs" + value={mail.subject} + onChange={(e) => + handleSubjectChange( + e.target.value, + item + ) + } + onInvalid={(e) => + e.target.setCustomValidity( + t("input-required") + ) + } + onInput={(e) => + e.target.setCustomValidity("") + } + required + /> + </div> + <div> + <label + className="text-xs ml-1" + htmlFor="mailbody" + > + {t("body")}{" "} + </label> + <EditorToolbar containerId="toolbar1" /> + <ReactQuill + id="mailbody" + theme="snow" + value={mail.body || ""} + placeholder="add body of email " + modules={module1} + formats={formats} + onChange={(value) => + handlebodyChange(value, item) + } + /> + </div> + <button + type="submit" + className="op-btn op-btn-primary" + > + {t("resend")} + </button> + </form> + </div> + )} + {Object?.keys(isNextStep) <= 0 && ( + <div className="flex justify-between items-center gap-2 my-2 px-3"> + <div className="text-base-content"> + {user?.signerPtr?.Name || "-"}{" "} + {`<${ + user?.email + ? user.email + : user.signerPtr.Email + }>`} + </div> + <>{fetchUserStatus(user, item)}</> + </div> + )} + </React.Fragment> + ))} + </div> + </ModalUi> + )} + <ModalUi + title={t("btnLabel.Rename")} + isOpen={isModal["rename_" + item.objectId]} + handleClose={handleCloseModal} + > + <div className="flex flex-col px-4 pb-3 pt-2"> + <div className="flex flex-col gap-2"> + <input + maxLength={200} + autoFocus={true} + type="text" + defaultValue={renameDoc || item.Name} + onChange={(e) => setRenameDoc(e.target.value)} + className="op-input op-input-bordered op-input-sm w-full focus:outline-none hover:border-base-content text-[10px]" + /> + </div> + <div className="flex flex-row gap-2 pt-3 mt-3 border-t-[1.5px] border-gray-500"> + <button + className="w-[100px] op-btn op-btn-primary op-btn-md" + onClick={() => handleRenameDoc(item)} + > + {t("save")} + </button> + <button + className="w-[100px] op-btn op-btn-secondary op-btn-md" + onClick={handleCloseModal} + > + {t("cancel")} + </button> + </div> + </div> + </ModalUi> + </td> + </tr> + ))} + </tbody> + </table> + {props.List?.length <= 0 && ( + <div + className={`${ + isDashboard ? "h-[317px]" : "" + } flex flex-col items-center justify-center w-ful bg-base-100 text-base-content rounded-xl py-4`} + > + <div className="w-[60px] h-[60px] overflow-hidden"> + <img + className="w-full h-full object-contain" + src={pad} + alt="img" + /> + </div> + <div className="text-sm font-semibold"> + {t("no-data-avaliable")} + </div> + </div> + )} + </div> + <div className="op-join flex flex-wrap items-center p-2"> + {props.List.length > props.docPerPage && ( + <button + onClick={() => paginateBack()} + className="op-join-item op-btn op-btn-sm" + > + {t("prev")} + </button> + )} + {pageNumbers.map((x, i) => ( + <button + key={i} + onClick={() => setCurrentPage(x)} + disabled={x === "..."} + className={`${ + x === currentPage ? "op-btn-active" : "" + } op-join-item op-btn op-btn-sm`} + > + {x} + </button> + ))} + {props.List.length > props.docPerPage && ( + <button + onClick={() => paginateFront()} + className="op-join-item op-btn op-btn-sm" + > + {t("next")} + </button> + )} + </div> + <CustomizeMail + setIsMailModal={setIsMailModal} + setCustomizeMail={setCustomizeMail} + documentId={documentId} + signerList={signerList} + setIsSend={setIsSend} + setMailStatus={setMailStatus} + customizeMail={customizeMail} + defaultMail={defaultMail} + isMailModal={isMailModal} + setCurrUserId={setCurrUserId} + handleShareList={handleShareList} + setDocumentDetails={setDocumentDetails} + /> + <ModalUi + isOpen={isSend} + title={ + mailStatus === "success" + ? t("mails-sent") + : mailStatus === "quotareached" + ? t("quota-mail-head") + : t("mail-not-delivered") + } + handleClose={() => { + setIsSend(false); + navigate("/report/1MwEuxLEkF"); + }} + > + <div className="h-[100%] p-[20px] text-base-content"> + {mailStatus === "success" ? ( + <div className="text-center mb-[10px]"> + <LottieWithLoader /> + {documentDetails.SendinOrder ? ( + <p> + {currUserId + ? t("placeholder-mail-alert-you") + : t("placeholder-mail-alert", { + name: signerList[0]?.Name + })} + </p> + ) : ( + <p>{t("placeholder-alert-4")}</p> + )} + {currUserId && <p>{t("placeholder-alert-5")}</p>} + </div> + ) : mailStatus === "quotareached" ? ( + <div className="flex flex-col gap-y-3"> + <div className="my-3">{handleShareList()}</div> + </div> + ) : ( + <div className="mb-[10px]"> + {mailStatus === "dailyquotareached" ? ( + <p>{t("daily-quota-reached")}</p> + ) : ( + <p>{t("placeholder-alert-6")}</p> + )} + {currUserId && ( + <p className="mt-1">{t("placeholder-alert-5")}</p> + )} + </div> + )} + {!mailStatus && ( + <div className="w-full h-[1px] bg-[#9f9f9f] my-[15px]"></div> + )} + {mailStatus !== "quotareached" && ( + <div + className={ + mailStatus === "success" ? "flex justify-center mt-1" : "" + } + > + {currUserId && ( + <button + onClick={() => + handleRecipientSign(documentDetails?.objectId, currUserId) + } + type="button" + className="op-btn op-btn-primary mr-1" + > + {t("yes")} + </button> + )} + <button + onClick={() => { + navigate("/report/1MwEuxLEkF"); + }} + type="button" + className="op-btn op-btn-ghost text-base-content" + > + {currUserId ? t("no") : t("close")} + </button> + </div> + )} + </div> + </ModalUi> + </div> + </div> + ); +}; + +export default TemplatesReport; diff --git a/apps/OpenSign/src/styles/signature.css b/apps/OpenSign/src/styles/signature.css index 2365a2a9de..a028b65176 100644 --- a/apps/OpenSign/src/styles/signature.css +++ b/apps/OpenSign/src/styles/signature.css @@ -6,18 +6,21 @@ .react-datepicker__input-container { position: initial !important; } + .select-none-cls { -webkit-user-select: none; /* Disable text selection in WebKit browsers */ -moz-user-select: none; user-select: none; } + .widgets { -webkit-user-select: none; /* Disable text selection in WebKit browsers */ -moz-user-select: none; user-select: none; } + .radioButton { width: 100%; height: 100%; @@ -33,12 +36,18 @@ width: 440px; height: 167px; } + .tabWidth { border: 1px solid #f3f4f6; background-color: #f3f4f6; width: 440px; } +.mysignatureCanvas { + width: 456px; + height: 180px; +} + [data-theme="opensigndark"] .tabWidth { border: 1px solid #1f2937 !important; background-color: #1f2937 !important; @@ -48,6 +57,7 @@ width: 150px; height: 150px; } + .checked-radio::after { content: ""; position: absolute; @@ -56,14 +66,15 @@ width: 50%; height: 50%; border-radius: 9999px; - background-color: #111111; /* blue-500 */ + background-color: #111111; + /* blue-500 */ } .intialSignature { border: 2px solid #888; background-color: rgb(255, 255, 255); - width: 183px; - height: 183px; + width: 180px; + height: 180px; } /* Dark mode support for initials box in /managesign */ @@ -100,6 +111,12 @@ border-color: #4b5563 !important; } +/* Also support signature canvas for consistency */ +[data-theme="opensigndark"] .mysignatureCanvas { + background-color: #1f2937 !important; + border-color: #4b5563 !important; +} + .penContainerDefault { width: 460px; } @@ -115,6 +132,7 @@ .ScrollbarsCustom-TrackY { width: 4px !important; } + .ScrollbarsCustom-TrackX { height: 4px !important; } @@ -143,6 +161,7 @@ overflow: hidden !important; text-overflow: ellipsis; } + .disabled { opacity: 0.5; /* Example: reduce opacity to visually indicate disabled state */ @@ -431,7 +450,7 @@ option { to prevent sudden quick movement (as the navigation bar gets a new position at the top of the page (position:fixed and top:0) */ - .stickyHead + .content { + .stickyHead+.content { padding-top: 60px; } } @@ -441,6 +460,12 @@ option { width: 300px; height: 120px; } + + .mysignatureCanvas { + width: 300px; + height: 118px; + } + .tabWidth { width: 300px; } @@ -462,11 +487,18 @@ option { .scroll-hide::-webkit-scrollbar { display: none; } + @media screen and (max-width: 350px) and (min-width: 311px) { .signatureCanvas { width: 280px; height: 112px; } + + .mysignatureCanvas { + width: 280px; + height: 111px; + } + .tabWidth { width: 280px; } @@ -491,6 +523,12 @@ option { width: 230px; height: 92px; } + + .mysignatureCanvas { + width: 230px; + height: 91px; + } + .tabWidth { width: 230px; } @@ -507,4 +545,4 @@ option { .uploadImgLogo { font-size: 20px; } -} +} \ No newline at end of file diff --git a/apps/OpenSign/src/utils/fileUtils.js b/apps/OpenSign/src/utils/fileUtils.js new file mode 100644 index 0000000000..93b359db3a --- /dev/null +++ b/apps/OpenSign/src/utils/fileUtils.js @@ -0,0 +1,125 @@ +import { SaveFileSize } from "../constant/saveFileSize"; +import { getSecureUrl } from "../constant/Utils"; +import Parse from "parse"; +import i18n from "../i18n"; + +export const uploadFile = async (file, userId) => { + try { + const parseFile = new Parse.File(file.name, file); + const response = await parseFile.save(); + if (response?.url()) { + const fileRes = await getSecureUrl(response.url()); + if (fileRes.url) { + const tenantId = localStorage.getItem("TenantId"); + SaveFileSize(file.size, fileRes.url, tenantId, userId); + return fileRes?.url; + } else { + alert(i18n.t("something-went-wrong-mssg")); + return false; + } + } else { + alert(i18n.t("something-went-wrong-mssg")); + return false; + } + } catch (err) { + console.log("sign upload err", err); + alert(`${err.message}`); + return false; + } +}; + +export function base64StringtoFile(base64String, filename) { + let arr = base64String.split(","), + // type of uploaded image + mime = arr[0].match(/:(.*?);/)[1], + // decode base64 + bstr = atob(arr[1]), + n = bstr.length, + u8arr = new Uint8Array(n); + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + const ext = mime.split("/").pop(); + const name = `${filename}.${ext}`; + return new File([u8arr], name, { type: mime }); +} + +function formatFixedDate(date = new Date()) { + const dd = String(date.getDate()).padStart(2, "0"); + const months = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ]; + const mmm = months[date.getMonth()]; + const yyyy = String(date.getFullYear()); + let h = date.getHours(); + const ampm = h >= 12 ? "PM" : "AM"; + h = h % 12; + if (h === 0) h = 12; + const HH12 = String(h).padStart(2, "0"); + const MM = String(date.getMinutes()).padStart(2, "0"); + return `${dd}-${mmm}-${yyyy} ${HH12}:${MM} ${ampm}`; +} + +/** + * Remove characters not allowed in file names for major OSes. + */ +function sanitizeDownloadFilename(name) { + return name + .replace(/[\\/:*?"<>|\u0000-\u001F]/g, " ") // reserved + control + .replace(/\s+/g, " ") // collapse spaces + .trim(); +} + +/** + * Build filename using the selected format ID and runtime values. + * @param {string} formatId - One of FILENAME_FORMATS ids + * @param {object} ctx - { docName, email, date, ext, isSigned, datePattern } + * @returns {string} + */ +export function buildDownloadFilename(formatId, ctx) { + const { + docName = "Document", + email = "user@example.com", + date = new Date(), + ext = "pdf", + isSigned = false + } = ctx || {}; + + const base = sanitizeDownloadFilename(String(docName) || "Document"); + const safeEmail = sanitizeDownloadFilename( + String(email) || "user@example.com" + ); + const dateStr = formatFixedDate(date); + + let stem; + switch (formatId) { + case "DOCNAME": + stem = base; + break; + case "DOCNAME_SIGNED": + stem = isSigned ? `${base} - Signed` : base; // if not signed, fallback to base + break; + case "DOCNAME_EMAIL": + stem = `${base} - ${safeEmail}`; + break; + case "DOCNAME_EMAIL_DATE": + stem = `${base} - ${safeEmail} - ${dateStr}`; + break; + default: + stem = base; // safe default + } + + const safeExt = ext.replace(/\.+/g, "").toLowerCase() || "pdf"; + return `${stem}.${safeExt}`; +} diff --git a/apps/OpenSign/src/utils/index.js b/apps/OpenSign/src/utils/index.js new file mode 100644 index 0000000000..94b4682886 --- /dev/null +++ b/apps/OpenSign/src/utils/index.js @@ -0,0 +1,6 @@ +export * from "./fileUtils"; +export * from "./prefillUtils"; +export * from "./sanitizeFileName"; +export * from "./lazyWithRetry"; +export * from "./upgradeProgress"; +export * from "./widgetUtils"; diff --git a/apps/OpenSign/src/utils/lazyWithRetry.js b/apps/OpenSign/src/utils/lazyWithRetry.js new file mode 100644 index 0000000000..9f9116248b --- /dev/null +++ b/apps/OpenSign/src/utils/lazyWithRetry.js @@ -0,0 +1,19 @@ +import React from "react"; +import { showUpgradeProgress } from "./upgradeProgress"; + +export function lazyWithRetry(factory) { + return React.lazy(() => + factory().catch((error) => { + if ( + error && + error.message && + /Failed to fetch dynamically imported module/.test(error.message) + ) { + localStorage.setItem("showUpgradeProgress", "1"); + showUpgradeProgress(); + setTimeout(() => window.location.reload(), 100); + } + throw error; + }) + ); +} diff --git a/apps/OpenSign/src/utils/prefillUtils.js b/apps/OpenSign/src/utils/prefillUtils.js new file mode 100644 index 0000000000..f788513ec3 --- /dev/null +++ b/apps/OpenSign/src/utils/prefillUtils.js @@ -0,0 +1,223 @@ +import { SaveFileSize } from "../constant/saveFileSize"; +import { + convertBase64ToFile, + convertPdfArrayBuffer, + createDocument, + generatePdfName, + embedWidgetsToDoc, + randomId, + getBase64FromUrl +} from "../constant/Utils"; +import { PDFDocument } from "pdf-lib"; + +export const prefillBlockColor = "transparent"; +export const prefillObj = (id) => { + const obj = { + Id: id || randomId(), + Role: "prefill", + Name: "Prefill by owner", + blockColor: prefillBlockColor + }; + + return obj; +}; +//funtion to use embed prefill details in documentAdd commentMore actions +export const handleEmbedPrefillToDoc = async ( + prefillDetails, + scale, + pdfArrayBuffer, + prefillImg, + userId +) => { + try { + const placeholder = prefillDetails?.placeHolder; + const existingPdfBytes = pdfArrayBuffer; + const pdfDoc = await PDFDocument.load(existingPdfBytes, { + ignoreEncryption: true + }); + const isSignYourSelfFlow = false; + try { + const pdfBase64 = await embedWidgetsToDoc( + placeholder, + pdfDoc, + isSignYourSelfFlow, + scale, + prefillImg + ); + const pdfName = generatePdfName(16); + const pdfUrl = await convertBase64ToFile(pdfName, pdfBase64); + const tenantId = localStorage.getItem("TenantId"); + const buffer = atob(pdfBase64); + SaveFileSize(buffer.length, pdfUrl, tenantId, userId); + return pdfUrl; + } catch (err) { + console.log("error to convertBase64ToFile in placeholder flow", err); + alert(err?.message); + } + } catch (err) { + console.log("error in handleEmbedPrefillToDoc function", err); + } +}; +//this function is used to open modal to show signers list +export const handleDisplaySignerList = async ( + xyPosition, + signers, + setForms, + isHideSigner +) => { + //'isHideSigner' is used to check should signer attach dropdown display or not + if (!isHideSigner) { + // if any role does not attach signer then show signers list attach to role in modal + const filterPrefill = xyPosition?.filter((x) => x.Role !== "prefill"); + let users = []; + filterPrefill?.forEach((element) => { + let label = ""; + const signerData = signers?.find( + (x) => element.signerObjId && element.signerObjId === x.objectId + ); + if (signerData) { + label = `${signerData.Name}<${signerData.Email}>`; + } + users = [ + ...users, + { + value: element?.signerObjId || element?.Id, + label: label || "", + role: element.Role + } + ]; + }); + setForms(users); + } +}; + +export const isValidPrefill = (prefillData) => { + const getPlaceholder = prefillData?.placeHolder; + if (getPlaceholder) { + // Find objects with empty response of prefill widgets + const emptyResponseObjects = getPlaceholder.flatMap((page) => + page.pos.filter( + (item) => + item?.type !== "checkbox" && + !item?.options?.defaultValue && + !item?.options?.response + ) + ); + if (emptyResponseObjects.length > 0) { + const res = { + status: "unfilled", + emptyResponseObjects: emptyResponseObjects + }; + return res; + } + } +}; +//function to use create document from templateAdd commentMore actions +export const handleCheckPrefillCreateDoc = async ( + xyPosition, + signers, + setIsPrefillModal, + scale, + updatedPdfUrl, + pdfDetails, + prefillImg, + userId +) => { + const pdfArrayBuffer = await convertPdfArrayBuffer(updatedPdfUrl); + const prefillData = xyPosition.find((x) => x.Role === "prefill"); + if (prefillData) { + const res = isValidPrefill(prefillData); + if (res) { + return res; + } + } + const removePrefill = xyPosition.filter((data) => data.Role !== "prefill"); + const isAllAttachSigner = + removePrefill.length > 0 && removePrefill.every((x) => x?.signerObjId); + if (isAllAttachSigner) { + setIsPrefillModal(false); + const prefillDetails = xyPosition.find((data) => data.Role === "prefill"); + let signedUrl; + //condition to check prefill widgets exit or not if exist then embed prefill widgets value in template + //and then create document + if (prefillDetails) { + signedUrl = await handleEmbedPrefillToDoc( + prefillDetails, + scale, + pdfArrayBuffer, + prefillImg, + userId + ); + } else { + signedUrl = pdfDetails[0]?.URL; + } + const isSendDoc = true; + const res = await createDocument( + pdfDetails, + xyPosition, + signers, + signedUrl || updatedPdfUrl, + isSendDoc + ); + if (res.status === "success") { + return res; + } + } else { + const res = { status: "unattach signer" }; + return res; + } +}; + +//function is used to save prefill image base64 in local to display on document/template +export const savePrefillImg = async (Placeholders) => { + const prefillData = Placeholders?.find((x) => x.Role === "prefill"); + if (prefillData) { + const allImageFields = prefillData?.placeHolder.flatMap((p) => + p.pos.filter((item) => item.type === "image") + ); + const hasImageType = allImageFields.some((p) => p.type === "image"); + if (hasImageType) { + const imgArr = []; + for (const ph of prefillData?.placeHolder || []) { + for (const pos of ph?.pos || []) { + if (pos?.type === "image" && pos?.SignUrl) { + const addSuffix = true; + const base64 = await getBase64FromUrl(pos?.SignUrl, addSuffix); + imgArr.push({ + id: pos?.key, + base64: base64 + }); + } else if (pos?.type === "image") { + imgArr.push({ + id: pos?.key, + base64: "" + }); + } + } + } + + return imgArr; + } + } +}; + +//function is used to get signers list for showing in modal +export const handleSignersList = (item) => { + const removePrefill = item?.Placeholders?.filter((x) => x.Role !== "prefill"); + let updatedSigners = removePrefill.map((x) => { + let matchingSigner = item?.Signers?.find( + (y) => x.signerObjId && x.signerObjId === y.objectId + ); + if (matchingSigner) { + return { + ...matchingSigner, + Role: x.Role ? x.Role : matchingSigner.Role, + Id: x.Id, + blockColor: x.blockColor + }; + } else { + return { Role: x.Role, Id: x.Id, blockColor: x.blockColor }; + } + }); + return updatedSigners; +}; diff --git a/apps/OpenSign/src/primitives/sanitizeFileName.js b/apps/OpenSign/src/utils/sanitizeFileName.js similarity index 74% rename from apps/OpenSign/src/primitives/sanitizeFileName.js rename to apps/OpenSign/src/utils/sanitizeFileName.js index bf796913fb..e7faeaf737 100644 --- a/apps/OpenSign/src/primitives/sanitizeFileName.js +++ b/apps/OpenSign/src/utils/sanitizeFileName.js @@ -1,7 +1,6 @@ -function sanitizeFileName(fileName) { +export function sanitizeFileName(fileName) { // Remove spaces and invalid characters const file = fileName?.replace(/[^a-zA-Z0-9._-]/g, ""); const removedot = file?.replace(/\.(?=.*\.)/g, ""); return removedot?.replace(/[^a-zA-Z0-9._-]/g, ""); } -export default sanitizeFileName; diff --git a/apps/OpenSign/src/utils/upgradeProgress.js b/apps/OpenSign/src/utils/upgradeProgress.js new file mode 100644 index 0000000000..5974184bd6 --- /dev/null +++ b/apps/OpenSign/src/utils/upgradeProgress.js @@ -0,0 +1,49 @@ +let intervalId; + +export function showUpgradeProgress() { + if (document.getElementById("upgrade-progress")) return; + + const overlay = document.createElement("div"); + overlay.id = "upgrade-progress"; + Object.assign(overlay.style, { + position: "fixed", + top: 0, + left: 0, + width: "100%", + height: "100%", + background: "rgba(255,255,255,0.9)", + display: "flex", + flexDirection: "column", + justifyContent: "center", + alignItems: "center", + zIndex: 9999 + }); + + const text = document.createElement("div"); + text.textContent = "Applying update..."; + text.style.marginBottom = "0.5rem"; + + const progress = document.createElement("progress"); + progress.max = 100; + progress.value = 0; + progress.style.width = "60%"; + + overlay.appendChild(text); + overlay.appendChild(progress); + document.body.appendChild(overlay); + + intervalId = setInterval(() => { + progress.value = (progress.value + 5) % 100; + }, 100); +} + +export function hideUpgradeProgress() { + if (intervalId) { + clearInterval(intervalId); + intervalId = null; + } + const overlay = document.getElementById("upgrade-progress"); + if (overlay) { + overlay.remove(); + } +} diff --git a/apps/OpenSign/src/utils/widgetUtils.js b/apps/OpenSign/src/utils/widgetUtils.js new file mode 100644 index 0000000000..e90d7dc7bb --- /dev/null +++ b/apps/OpenSign/src/utils/widgetUtils.js @@ -0,0 +1,43 @@ +import { generateTitleFromFilename, getBase64FromUrl } from "../constant/Utils"; +import { base64StringtoFile, uploadFile } from "./fileUtils"; +import { sanitizeFileName } from "./sanitizeFileName"; +import Parse from "parse"; +// `handlesavesign` is used to save signature, initials, stamp as a default +export const saveToMySign = async (widget) => { + const base64 = widget?.base64; + if (base64) { + try { + const User = Parse?.User?.current(); + const sanitizename = generateTitleFromFilename(User?.get("name")); + const replaceSpace = sanitizeFileName(sanitizename); + const fileName = + widget?.type === "signature" + ? `${replaceSpace}__sign` + : `${replaceSpace}__initials`; + const file = base64StringtoFile(base64, fileName); + const fileUrl = await uploadFile(file, User?.id); + // below code is used to save or update default signature, initials, stamp + const signCls = new Parse.Object("contracts_Signature"); + if (widget?.defaultSignId) { + signCls.id = widget.defaultSignId; + } + if (widget?.type === "initials") { + signCls.set("Initials", fileUrl); + } else if (widget?.type === "signature") { + signCls.set("ImageURL", fileUrl); + } + signCls.set("UserId", Parse.User.createWithoutData(User.id)); + const signRes = await signCls.save(); + return { base64File: base64, id: signRes?.id }; + } catch (err) { + console.log("Err while saving signature", err); + return url; + } + } +}; + +// helper: does this signer already have any signature widget? +export const hasSignatureWidget = (s) => + (s.placeHolder ?? []).some((ph) => + (ph?.pos ?? []).some((p) => p?.type === "signature") + ); diff --git a/apps/OpenSign/vite.config.js b/apps/OpenSign/vite.config.js index 73567adeb2..bd1a837834 100644 --- a/apps/OpenSign/vite.config.js +++ b/apps/OpenSign/vite.config.js @@ -1,35 +1,27 @@ -import { defineConfig, splitVendorChunkPlugin } from "vite"; +import { defineConfig, loadEnv } from "vite"; import react from "@vitejs/plugin-react"; import svgr from "vite-plugin-svgr"; import { resolve } from "path"; -import dotenv from "dotenv"; - -// Load env file based on mode -dotenv.config(); // https://vitejs.dev/config/ -export default defineConfig(({ command, mode }) => { +export default defineConfig(({ mode }) => { + // Load ALL env vars (no prefix filter) + const env = loadEnv(mode, process.cwd(), ""); + return { plugins: [ react(), - svgr(), // Transform SVGs into React components - splitVendorChunkPlugin() + svgr() // Transform SVGs into React components ], - resolve: { - alias: { - // Add any path aliases here if needed - } - }, + resolve: { alias: {} }, // Add any necessary aliases here define: { // Replace process.env.REACT_APP_* with import.meta.env.VITE_* - "process.env": { - ...Object.keys(process.env).reduce((env, key) => { - if (key.startsWith("REACT_APP_")) { - env[key] = process.env[key]; - } - return env; - }, {}) - } + "process.env": Object.entries(env).reduce((acc, [key, value]) => { + if (key.startsWith("REACT_APP_")) { + acc[key] = value; + } + return acc; + }, {}) }, build: { outDir: "build", // Keep the same output directory as CRA for compatibility @@ -41,7 +33,7 @@ export default defineConfig(({ command, mode }) => { } }, server: { - port: process.env.PORT || 3000, // Same port as CRA + port: env.PORT || 3000, // Same port as CRA open: true }, test: { diff --git a/apps/OpenSignServer/Utils.js b/apps/OpenSignServer/Utils.js index 1da57a1936..9e2d015a2e 100644 --- a/apps/OpenSignServer/Utils.js +++ b/apps/OpenSignServer/Utils.js @@ -1,15 +1,23 @@ import dotenv from 'dotenv'; import { format, toZonedTime } from 'date-fns-tz'; -import { getSignedLocalUrl } from './cloud/parsefunction/getSignedUrl.js'; -import { PDFDocument } from 'pdf-lib'; +import getPresignedUrl, { getSignedLocalUrl } from './cloud/parsefunction/getSignedUrl.js'; import crypto from 'node:crypto'; -import axios from 'axios'; -dotenv.config(); +import { PDFDocument, rgb } from 'pdf-lib'; + +dotenv.config({ quiet: true }); export const cloudServerUrl = 'http://localhost:8080/app'; export const serverAppId = process.env.APP_ID || 'opensign'; export const appName = 'OpenSign™'; - +export const prefillDraftDocWidget = ['date', 'textbox', 'checkbox', 'radio button', 'image']; +export const prefillDraftTemWidget = [ + 'date', + 'textbox', + 'checkbox', + 'radio button', + 'image', + 'dropdown', +]; export const MAX_NAME_LENGTH = 250; export const MAX_NOTE_LENGTH = 200; export const MAX_DESCRIPTION_LENGTH = 500; @@ -28,6 +36,7 @@ export const color = [ '#ffffcc', ]; +export const prefillBlockColor = 'transparent'; export function replaceMailVaribles(subject, body, variables) { let replacedSubject = subject; let replacedBody = body; @@ -49,12 +58,9 @@ export const saveFileUsage = async (size, fileUrl, userId) => { //checking server url and save file's size try { if (userId) { + const userPtr = { __type: 'Pointer', className: '_User', objectId: userId }; const tenantQuery = new Parse.Query('partners_Tenant'); - tenantQuery.equalTo('UserId', { - __type: 'Pointer', - className: '_User', - objectId: userId, - }); + tenantQuery.equalTo('UserId', userPtr); const tenant = await tenantQuery.first({ useMasterKey: true }); if (tenant) { const tenantPtr = { __type: 'Pointer', className: 'partners_Tenant', objectId: tenant.id }; @@ -78,7 +84,7 @@ export const saveFileUsage = async (size, fileUrl, userId) => { } catch (err) { console.log('err in save usage', err); } - saveDataFile(size, fileUrl, tenantPtr); + saveDataFile(size, fileUrl, tenantPtr, userPtr); } } } catch (err) { @@ -87,12 +93,13 @@ export const saveFileUsage = async (size, fileUrl, userId) => { }; //function for save fileUrl and file size in particular client db class partners_DataFiles -const saveDataFile = async (size, fileUrl, tenantPtr) => { +const saveDataFile = async (size, fileUrl, tenantPtr, UserId) => { try { const newDataFiles = new Parse.Object('partners_DataFiles'); newDataFiles.set('FileUrl', fileUrl); newDataFiles.set('FileSize', size); newDataFiles.set('TenantPtr', tenantPtr); + newDataFiles.set('UserId', UserId); await newDataFiles.save(null, { useMasterKey: true }); } catch (err) { console.log('error in save usage ', err); @@ -225,6 +232,7 @@ export const flattenPdf = async pdfFile => { const flatPdf = await pdfDoc.save({ useObjectStreams: false }); return flatPdf; } catch (err) { + console.log('err ', err); throw new Error('error in pdf'); } }; @@ -303,39 +311,81 @@ export function formatDateTime(date, dateFormat, timeZone, is12Hour) { ? format(zonedDate, `${selectFormat(dateFormat)}, ${timeFormat} 'GMT' XXX`, { timeZone }) : formatTimeInTimezone(date, timeZone); } +export const randomId = () => { + const randomBytes = crypto.getRandomValues(new Uint16Array(1)); + const randomValue = randomBytes[0]; + const randomDigit = 1000 + (randomValue % 9000); + return randomDigit; +}; -// Utility: Convert base64 to buffer -export const base64ToBuffer = base64 => Buffer.from(base64, 'base64'); - -// Utility: Generate SHA-256 hash from PDF page metadata -const getPdfMetadataHash = async pdfBytes => { - const pdfDoc = await PDFDocument.load(pdfBytes); - const metaString = pdfDoc - .getPages() - .map((page, index) => { - const { width, height } = page.getSize(); - return `${index + 1}:${Math.round(width)}x${Math.round(height)}`; - }) - .join('|'); +export const handleValidImage = async Placeholder => { + const updatedPlaceholders = []; - return crypto.createHash('sha256').update(metaString).digest('hex'); -}; -// Utility: Validate if uploaded file matches original template PDF -export const handleReplaceFileValidation = async (baseFileUrl, newFileBase64) => { - try { - const { data } = await axios.get(baseFileUrl, { responseType: 'arraybuffer' }); - const basePdfBytes = Buffer.from(data); - const uploadedPdfBytes = base64ToBuffer(newFileBase64); + for (const placeholder of Placeholder || []) { + //Clean and format signerPtr + let signerPtr = placeholder.signerPtr; + // Check if signerPtr exists and has an id + if (signerPtr?.id) { + // Case 1: If signerPtr is a Parse Object instance + if (signerPtr instanceof Parse.Object) { + // If signerPtr has no attributes, it’s a plain pointer already + if (!signerPtr.attributes || Object.keys(signerPtr.attributes).length === 0) { + // Convert to a clean pointer using Parse’s built-in method + signerPtr = signerPtr.toPointer(); + } else { + // If it has attributes, manually construct the pointer object + signerPtr = { + __type: 'Pointer', + className: signerPtr.className, + objectId: signerPtr.id, + }; + } + // Case 2: If signerPtr is already a plain JS object resembling a pointer + } else if (typeof signerPtr === 'object' && signerPtr.className && signerPtr.objectId) { + // Normalize it to a valid Parse pointer object + signerPtr = { + __type: 'Pointer', + className: signerPtr.className, + objectId: signerPtr.objectId, + }; + } + } - const baseHash = await getPdfMetadataHash(basePdfBytes); - const uploadedHash = await getPdfMetadataHash(uploadedPdfBytes); + //Process placeHolder if Role is 'prefill' + if (placeholder?.Role === 'prefill') { + const updatedRole = []; + for (const item of placeholder.placeHolder || []) { + const updatedPos = []; + for (const posItem of item.pos || []) { + if (posItem?.type === 'image' && posItem?.SignUrl) { + const validUrl = await getPresignedUrl(posItem?.SignUrl); + updatedPos.push({ + ...posItem, + SignUrl: validUrl, + options: { ...posItem.options, response: validUrl }, + }); + } else { + updatedPos.push(posItem); + } + } + updatedRole.push({ + ...item, + pos: updatedPos, + }); + } - if (baseHash === uploadedHash) { - return { base64: newFileBase64 }; + updatedPlaceholders.push({ + ...placeholder, + signerPtr, + placeHolder: updatedRole, + }); + } else { + // Not prefill role, just push as-is + updatedPlaceholders.push({ + ...placeholder, + signerPtr, + }); } - return { error: 'PDFs do NOT match based on page number, width, and height' }; - } catch (err) { - console.error('Validation Error:', err.message); - return { error: err.message }; } + return updatedPlaceholders; }; diff --git a/apps/OpenSignServer/auth/authadapter.js b/apps/OpenSignServer/auth/authadapter.js index f47a2097df..a55af81e5e 100644 --- a/apps/OpenSignServer/auth/authadapter.js +++ b/apps/OpenSignServer/auth/authadapter.js @@ -1,6 +1,6 @@ import axios from 'axios'; import dotenv from 'dotenv'; -dotenv.config(); +dotenv.config({ quiet: true }); const ssoApiUrl = process.env.SSO_API_URL || 'https://sso.opensignlabs.com/api'; //'https://osl-jacksonv2.vercel.app/api'; export const SSOAuth = { // Returns a promise that fulfills if this user mail is valid. diff --git a/apps/OpenSignServer/cloud/customRoute/customApp.js b/apps/OpenSignServer/cloud/customRoute/customApp.js index 2fdb0a21e9..8c0b8c15ad 100644 --- a/apps/OpenSignServer/cloud/customRoute/customApp.js +++ b/apps/OpenSignServer/cloud/customRoute/customApp.js @@ -4,10 +4,11 @@ import dotenv from 'dotenv'; import uploadFile from './uploadFile.js'; import docxtopdf, { upload as docxUpload } from './docxtopdf.js'; import decryptpdf, { upload as decryptUpload } from './decryptpdf.js'; +import { deleteUserByAdmin, deleteUserGet, deleteUserPost } from './deleteUser.js'; export const app = express(); -dotenv.config(); +dotenv.config({ quiet: true }); app.use(cors()); app.use(express.json({ limit: '50mb' })); app.use(express.urlencoded({ limit: '50mb', extended: true })); @@ -15,3 +16,6 @@ app.use(express.urlencoded({ limit: '50mb', extended: true })); app.post('/file_upload', uploadFile); app.post('/docxtopdf', docxUpload.single('file'), docxtopdf); app.post('/decryptpdf', decryptUpload.single('file'), decryptpdf); +app.get('/delete-account/:userId', deleteUserGet); +app.post('/delete-account/:userId', deleteUserPost); +app.post('/deleteuser/:userId', deleteUserByAdmin); diff --git a/apps/OpenSignServer/cloud/customRoute/deleteFileUrl.js b/apps/OpenSignServer/cloud/customRoute/deleteFileUrl.js new file mode 100644 index 0000000000..eb2cf0fe0b --- /dev/null +++ b/apps/OpenSignServer/cloud/customRoute/deleteFileUrl.js @@ -0,0 +1,192 @@ +import { S3Client, DeleteObjectCommand } from '@aws-sdk/client-s3'; +import fs from 'node:fs/promises'; +import pLimit from 'p-limit'; +import { serverAppId } from '../../Utils.js'; + +// === Configuration === +const serverHost = new URL(process.env.SERVER_URL).hostname; +const LOCAL_HOSTS = ['localhost', '127.0.0.1', serverHost]; +const CONCURRENCY_LIMIT = 5; + +// === S3 Client Setup === +function createS3Client({ region, accessKeyId, secretAccessKey, endpoint = null }) { + const config = { + region, + credentials: { + accessKeyId, + secretAccessKey, + }, + }; + + // Only set custom endpoint if not using AWS + if (endpoint && !endpoint.includes('amazonaws.com')) { + config.endpoint = `https://${endpoint}`; + } + + return new S3Client(config); +} + +const s3 = createS3Client({ + region: process.env.DO_REGION, + endpoint: process.env.DO_ENDPOINT, + accessKeyId: process.env.DO_ACCESS_KEY_ID, + secretAccessKey: process.env.DO_SECRET_ACCESS_KEY, +}); + +// === Helpers === +function getS3ParamsFromUrl(fileUrl) { + try { + const url = new URL(fileUrl); + const Bucket = url.hostname.split('.')[0]; + const Key = decodeURIComponent(url.pathname.slice(1)); + return { Bucket, Key }; + } catch { + return null; + } +} + +async function deleteS3File(fileUrl) { + const params = getS3ParamsFromUrl(fileUrl); + if (!params) return; + + try { + await s3.send(new DeleteObjectCommand(params)); + // console.log(`✅ Deleted from S3: ${params.Key}`); + } catch (err) { + console.error(`❌ S3 delete failed: ${params.Key}:`, err.message); + } +} + +async function deleteLocalFile(fileUrl) { + try { + const url = new URL(fileUrl); + const filePath = decodeURIComponent(url.pathname); + if (!filePath.includes('files')) return; + + const localPath = url?.pathname?.split(`/files/${serverAppId}/`)?.pop(); + + if (localPath) { + await fs.unlink(`./files/files/${localPath}`); + } + // console.log(`🗑️ Deleted local file: ${localPath}`); + } catch (err) { + if (err.code === 'ENOENT') { + console.warn('⚠️ Local file not found:', fileUrl); + } else { + console.error('❌ Local delete failed:', err.message); + } + } +} + +async function deleteFileByUrl(fileUrl) { + if (!fileUrl) return; + try { + const url = new URL(fileUrl); + if (LOCAL_HOSTS.includes(url.hostname)) { + return deleteLocalFile(fileUrl); + } else { + return deleteS3File(fileUrl); + } + } catch { + console.warn('⚠️ Invalid URL, skipping:', fileUrl); + } +} + +// === Main Batch Deletion Function === +export async function deleteInBatches(className, userPointer) { + let hasMore = true; + const limit = 1000; + const limiter = pLimit(CONCURRENCY_LIMIT); + + while (hasMore) { + const query = new Parse.Query(className); + query.equalTo('CreatedBy', userPointer); + query.limit(limit); + query.ascending('objectId'); + + const results = await query.find({ useMasterKey: true }); + + // Step 1: Concurrent file deletions with controlled concurrency + const fileDeletePromises = []; + + for (const obj of results) { + const urls = ['URL', 'SignedUrl', 'certificateUrl'] + .map(field => obj.get(field)) + .filter(Boolean); + + for (const fileUrl of urls) { + fileDeletePromises.push(limiter(() => deleteFileByUrl(fileUrl))); + } + } + + await Promise.all(fileDeletePromises); + + // Step 2: Delete Parse objects + if (results.length > 0) { + await Parse.Object.destroyAll(results, { useMasterKey: true }); + console.log(`🧹 Deleted ${results.length} Parse objects from ${className}`); + } + + hasMore = results.length === limit; + } + + console.log(`✅ Finished deletion from ${className} for user: ${userPointer.objectId}`); +} + +export async function deleteDataFiles(className, userPointer) { + let hasMore = true; + const limit = 1000; + const limiter = pLimit(CONCURRENCY_LIMIT); + + while (hasMore) { + const query = new Parse.Query(className); + query.equalTo('UserId', userPointer); + query.limit(limit); + query.ascending('objectId'); + + const results = await query.find({ useMasterKey: true }); + + // Step 1: Concurrent file deletions with controlled concurrency + const fileDeletePromises = []; + + for (const obj of results) { + const urls = ['FileUrl'].map(field => obj.get(field)).filter(Boolean); + for (const fileUrl of urls) { + fileDeletePromises.push(limiter(() => deleteFileByUrl(fileUrl))); + } + } + + await Promise.all(fileDeletePromises); + + // Step 2: Delete Parse objects + if (results.length > 0) { + await Parse.Object.destroyAll(results, { useMasterKey: true }); + console.log(`🧹 Deleted ${results.length} Parse objects from ${className}`); + } + + hasMore = results.length === limit; + } + + console.log(`✅ Finished deletion from ${className} for user: ${userPointer.objectId}`); +} + +export async function deleteContactsInBatch(className, userPointer) { + let hasMore = true; + const limit = 1000; + + while (hasMore) { + const query = new Parse.Query(className); + query.equalTo('CreatedBy', userPointer); + query.limit(limit); + query.ascending('objectId'); + const results = await query.find({ useMasterKey: true }); + if (results?.length > 0) { + await Parse.Object.destroyAll(results, { useMasterKey: true }); + console.log(`🧹 Deleted ${results.length} Parse objects from ${className}`); + } + + hasMore = results.length === limit; + } + + console.log(`✅ Finished deletion from ${className} for user: ${userPointer.objectId}`); +} diff --git a/apps/OpenSignServer/cloud/customRoute/deleteUser.js b/apps/OpenSignServer/cloud/customRoute/deleteUser.js new file mode 100644 index 0000000000..f40417cf3f --- /dev/null +++ b/apps/OpenSignServer/cloud/customRoute/deleteUser.js @@ -0,0 +1,464 @@ +import axios from 'axios'; +import { cloudServerUrl, generateId, serverAppId } from '../../Utils.js'; +import sendmailtoSupport from './sendMailToSupport.js'; +import { deleteContactsInBatch, deleteDataFiles, deleteInBatches } from './deleteFileUrl.js'; +const serverUrl = cloudServerUrl; +const appId = serverAppId; + +const deleteSessionsAndUser = async (userPointer, userId) => { + const Session = Parse.Object.extend('_Session'); + const sessionQuery = new Parse.Query(Session); + sessionQuery.equalTo('user', userPointer); + const sessions = await sessionQuery.find({ useMasterKey: true }); + if (sessions?.length > 0) await Parse.Object.destroyAll(sessions, { useMasterKey: true }); + + const userObj = await new Parse.Query(Parse.User).get(userId, { useMasterKey: true }); + if (userObj) await userObj.destroy({ useMasterKey: true }); +}; + +const resetPasswordAndDeleteSession = async userId => { + const password = generateId(16); + const user = await new Parse.Query(Parse.User).get(userId, { useMasterKey: true }); + user.set('password', password); + user.set('emailVerified', false); + user.unset('ProfilePic'); + await user.save(null, { useMasterKey: true }); + + // Optional: revoke all existing sessions (forces logout everywhere) + const sessionQuery = new Parse.Query('_Session'); + sessionQuery.equalTo('user', user); + const sessions = await sessionQuery.find({ useMasterKey: true }); + if (sessions.length) { + await Parse.Object.destroyAll(sessions, { useMasterKey: true }); + } +}; +export async function deleteUser(userId, adminId) { + const userPointer = { __type: 'Pointer', className: '_User', objectId: userId }; + let userDetails = { + UserRole: 'not found', + Name: 'not found', + Email: 'not found', + UserId: userId || 'not found', + objectId: 'not found', + TenantId: 'not found', + }; + try { + // STEP 1: contracts_Users lookup + const Users = Parse.Object.extend('contracts_Users'); + const userQuery = new Parse.Query(Users); + userQuery.equalTo('UserId', userPointer); + if (adminId) { + userQuery.equalTo('CreatedBy', { __type: 'Pointer', className: '_User', objectId: adminId }); + } + const userResult = await userQuery.first({ useMasterKey: true }); + userDetails = { ...userDetails, UserId: userId }; + if (!userResult) { + const errorMessage = 'User not found.'; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + const contractsUserId = userResult.id; + const tenantId = userResult.get('TenantId')?.id; + const teamIds = userResult.get('TeamIds') || []; + const organizationId = userResult.get('OrganizationId')?.id; + const isAdmin = userResult?.get('UserRole') === 'contracts_Admin' ? true : false; + userDetails = { + ...userDetails, + UserRole: userResult?.get('UserRole'), + Name: userResult?.get('Name'), + Email: userResult?.get('Email'), + UserId: userResult?.get('UserId')?.id, + objectId: userResult?.id, + TenantId: userResult?.get('TenantId')?.id, + }; + if (adminId && isAdmin) { + const errorMessage = 'An error occurred while deleting your account.'; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + // STEP 2: contracts_Document & contracts_Template + try { + for (const className of ['contracts_Document', 'contracts_Template']) { + await deleteInBatches(className, userPointer); + } + } catch (err) { + console.error('Failed during contracts_Template cleanup:', err); + const errorMessage = 'Failed during contracts_Template cleanup:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + // STEP 3: delete Contacts created by user from contactbook class + try { + await deleteContactsInBatch('contracts_Contactbook', userPointer); + } catch (err) { + console.error('Failed during contactbook cleanup:', err); + const errorMessage = 'Failed during contactbook cleanup:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + try { + // Check if any rows remain for this UserId + const Contactbook = Parse.Object.extend('contracts_Contactbook'); + const remainingCount = await new Parse.Query(Contactbook) + .equalTo('UserId', userPointer) + .count({ useMasterKey: true }); + + // If no record remains delete from _User class + if (remainingCount === 0) { + await deleteSessionsAndUser(userPointer, userId); + } else { + await resetPasswordAndDeleteSession(userId); + } + } catch (err) { + console.error('Failed during contactbook current user cleanup:', err); + const errorMessage = + 'Failed during contactbook current user cleanup: ' + (err?.message || err); + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + // STEP 4: appToken + try { + const AppToken = Parse.Object.extend('appToken'); + const query = new Parse.Query(AppToken); + query.equalTo('UserId', userPointer); + const tokens = await query.find({ useMasterKey: true }); + if (tokens?.length) await Parse.Object.destroyAll(tokens, { useMasterKey: true }); + } catch (err) { + console.error('Failed to delete appToken entries:', err); + const errorMessage = 'Failed to delete appToken entries:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + // STEP 5: partner_DataFiles + try { + await deleteDataFiles('partners_DataFiles', userPointer); + } catch (err) { + console.error('Failed during partners_DataFiles cleanup:', err); + const errorMessage = 'Failed during partners_DataFiles cleanup:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + if (isAdmin) { + // STEP 6: contracts_Organizations + try { + if (organizationId) { + const Org = Parse.Object.extend('contracts_Organizations'); + const query = new Parse.Query(Org); + const object = await query.get(organizationId, { useMasterKey: true }); + await object.destroy({ useMasterKey: true }); + } + } catch (err) { + console.error('Failed to delete contracts_Organizations entry:', err); + const errorMessage = 'Failed to delete contracts_Organizations entry:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + // STEP 7: Delete each entry in contracts_Teams by objectId from teamIds + try { + if (teamIds.length > 0) { + const Teams = Parse.Object.extend('contracts_Teams'); + for (const team of teamIds) { + try { + const teamObj = await new Parse.Query(Teams).get(team.id, { useMasterKey: true }); + if (teamObj) await teamObj.destroy({ useMasterKey: true }); + } catch (teamErr) { + console.error(`Failed to delete team with ID ${team.id}:`, teamErr); + const errorMessage = `Failed to delete team with ID ${team.id}` + teamErr?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + } + } + } catch (err) { + console.error('Failed during contracts_Teams deletion loop:', err); + const errorMessage = 'Failed during contracts_Teams deletion loop:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + // STEP 8 : partners_Tenant cleanup + try { + if (tenantId) { + const Tenant = Parse.Object.extend('partners_Tenant'); + const query = new Parse.Query(Tenant); + const tenantObj = await query.get(tenantId, { useMasterKey: true }); + await tenantObj.destroy({ useMasterKey: true }); + } + } catch (err) { + const msg = `Failed during partners_Tenant ${'cleanup:'} `; + console.error(msg, err); + const errorMessage = msg + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + // STEP 9: partners_TenantCredits cleanup + try { + if (tenantId) { + const tenantCredits = Parse.Object.extend('partners_TenantCredits'); + const subsByTenant = new Parse.Query(tenantCredits); + subsByTenant.equalTo('PartnersTenant', { + __type: 'Pointer', + className: 'partners_Tenant', + objectId: tenantId, + }); + const subs = await subsByTenant.find({ useMasterKey: true }); + await Parse.Object.destroyAll(subs, { useMasterKey: true }); + } + } catch (err) { + console.error('Failed during partners_TenantCredits cleanup:', err); + const errorMessage = 'Failed during partners_TenantCredits cleanup:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + } + // STEP 10: contracts_Signature + try { + const Signature = Parse.Object.extend('contracts_Signature'); + const sigQuery = new Parse.Query(Signature); + sigQuery.equalTo('UserId', userPointer); + const sigResults = await sigQuery.find({ useMasterKey: true }); + if (sigResults?.length > 0) await Parse.Object.destroyAll(sigResults, { useMasterKey: true }); + } catch (err) { + console.error('Failed during contracts_Signature cleanup:', err); + const errorMessage = 'Failed during contracts_Signature cleanup:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + + // STEP 11: contracts_Users + try { + await userResult.destroy({ useMasterKey: true }); + } catch (err) { + console.error('Failed to delete contracts_Users entry:', err); + const errorMessage = 'Failed to delete contracts_Users entry:' + err?.message; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } + return { code: 200, message: 'User and all associated data deleted successfully.' }; + } catch (error) { + console.error('User deletion process failed:', error); + const errorMessage = `User deletion failed: ${error.message || error}`; + sendmailtoSupport(userDetails, errorMessage); + return { code: 400, message: errorMessage }; + } +} + +// 1. HTML Password Prompt Page +export const deleteUserGet = async (req, res) => { + const { userId } = req.params; + + const extUserQuery = new Parse.Query('Contracts_Users'); + extUserQuery.equalTo('userId', { __type: 'Pointer', className: '_User', objectId: userId }); + const extUser = await extUserQuery.first({ useMasterKey: true }); + if (!extUser) { + const errorMessage = 'User not found.'; + return res.send(errorMessage); + } + const routePath = process?.env?.SERVER_URL?.includes?.('api') ? '/api' : ''; + const htmlForm = ` +<html> +<head> + <title>Delete Account + + + +
+

Confirm Account Deletion

+

This action is irreversible. Please confirm by entering your password.

+
+ + + +
+
+ + + `; + res.send(htmlForm); +}; + +// 2. Handle Password Verification and Deletion +export const deleteUserPost = async (req, res) => { + const { userId } = req.params; + const routePath = process?.env?.SERVER_URL?.includes?.('api') ? '/api' : ''; + const { password } = req.body; + let userDetails = { + UserRole: 'not found', + Name: 'not found', + Email: 'not found', + UserId: userId || 'not found', + objectId: 'not found', + TenantId: 'not found', + }; + if (!userId) return res.status(404).send('Missing userId parameter.'); + + try { + // 1. Get the user + const userQuery = new Parse.Query(Parse.User); + userQuery.equalTo('objectId', userId); + const user = await userQuery.first({ useMasterKey: true }); + if (!user) { + const errorMessage = 'User not found.'; + // sendmailtoSupport(userDetails, errorMessage); + // return res.status(404).send(errorMessage); + return res.send(errorMessage); + } + const extUserQuery = new Parse.Query('Contracts_Users'); + extUserQuery.equalTo('userId', { __type: 'Pointer', className: '_User', objectId: userId }); + const extUser = await extUserQuery.first({ useMasterKey: true }); + if (!extUser) { + const errorMessage = 'User not found.'; + return res.send(errorMessage); + } + // 2. Attempt login to verify password + const username = user.get('username'); // assuming 'username' is used for login + try { + // await Parse.User.logIn(username, password); // Will throw if password invalid + // Use REST login to avoid mutating the global Parse current user + // Will throw if password invalid + const res = await axios.get(serverUrl + '/login', { + params: { username, password }, + headers: { 'X-Parse-Application-Id': appId }, + }); + console.log('Res ', res?.data); + } catch (err) { + console.log('err while validating password: ', err?.response?.data || err); + const errorMessage = `Invalid password. Try again`; + sendmailtoSupport(userDetails, errorMessage); + return res.status(401).send(errorMessage); + } + + const response = await deleteUser(userId); + const code = response?.code || 500; + const message = response?.message || 'An error occurred while deleting your account.'; + return res.status(code).send(message); + } catch (error) { + console.error('Account deletion error:', error); + const errorMessage = error?.message || 'An error occurred while deleting your account.'; + sendmailtoSupport(userDetails, errorMessage); + return res.status(500).send(errorMessage); + } +}; + +// 2. Handle Password Verification and Deletion +export const deleteUserByAdmin = async (req, res) => { + const sessiontoken = req.headers.sessiontoken; + const userId = req.params.userId; + let userDetails = { + UserRole: 'not found', + Name: 'not found', + Email: 'not found', + UserId: userId || 'not found', + objectId: 'not found', + TenantId: 'not found', + }; + if (!sessiontoken) return res.status(400).json({ message: 'unauthorized.' }); + if (!userId || userId === ':userId') { + return res.status(400).json({ message: 'Missing userId parameter.' }); + } + try { + const axiosRes = await axios.get(serverUrl + '/users/me', { + headers: { + 'X-Parse-Application-Id': appId, + 'X-Parse-Session-Token': sessiontoken, + }, + }); + const adminId = axiosRes?.data && axiosRes.data?.objectId; + + if (!adminId) { + return res.status(400).json({ message: 'Unauthorized.' }); + } + // 1. Get the user + const userQuery = new Parse.Query(Parse.User); + userQuery.equalTo('objectId', userId); + const user = await userQuery.first({ useMasterKey: true }); + if (!user) { + const errorMessage = 'User not found.'; + sendmailtoSupport(userDetails, errorMessage); + return res.status(400).json({ message: errorMessage }); + } + const response = await deleteUser(userId, adminId); + const code = response?.code || 400; + const message = response?.message || 'An error occurred while deleting your account.'; + return res.status(code).json({ message: message }); + } catch (error) { + const code = error?.response?.data?.code || 400; + const errorMessage = + error?.response?.data?.error || + error?.message || + 'An error occurred while deleting your account.'; + console.error(`Account deletion error:`, errorMessage); + sendmailtoSupport(userDetails, errorMessage); + return res.status(code).json({ message: errorMessage }); + } +}; diff --git a/apps/OpenSignServer/cloud/customRoute/docxtopdf.js b/apps/OpenSignServer/cloud/customRoute/docxtopdf.js index 0476d83d3d..49ea400f10 100644 --- a/apps/OpenSignServer/cloud/customRoute/docxtopdf.js +++ b/apps/OpenSignServer/cloud/customRoute/docxtopdf.js @@ -141,6 +141,11 @@ export default async function docxtopdf(req, res) { className: 'partners_Tenant', objectId: tenantId, }, + UserId: { + __type: 'Pointer', + className: '_User', + objectId: userRes.data.objectId, + }, }, { headers: { diff --git a/apps/OpenSignServer/cloud/customRoute/sendMailToSupport.js b/apps/OpenSignServer/cloud/customRoute/sendMailToSupport.js new file mode 100644 index 0000000000..b80941c4d5 --- /dev/null +++ b/apps/OpenSignServer/cloud/customRoute/sendMailToSupport.js @@ -0,0 +1,83 @@ +import { appName, smtpenable } from '../../Utils.js'; + +export default async function sendmailtoSupport(userDetails, errorMessage) { + const mailsender = smtpenable ? process.env.SMTP_USER_EMAIL : process.env.MAILGUN_SENDER; + // Render a simple HTML form. In production, consider using a templating engine. + try { + await Parse.Cloud.sendEmail({ + sender: appName + ' <' + mailsender + '>', + recipient: 'support@opensignlabs.com', + subject: `Error while deleting account – ${appName}`, + text: `Error while deleting account – ${appName}`, + html: ` + + + + +
+

Error: ${errorMessage}

+ +

User Details

+
+

UserRole: ${userDetails?.UserRole}

+

Name: ${userDetails?.Name}

+

Email: ${userDetails?.Email}

+

UserId: ${userDetails?.UserId}

+

ExtUserId: ${userDetails?.objectId}

+

TenantId: ${userDetails?.TenantId}

+
+
+ +`, + }); + } catch (err) { + console.log('err while sending mail to support', err); + } +} diff --git a/apps/OpenSignServer/cloud/customRoute/uploadFile.js b/apps/OpenSignServer/cloud/customRoute/uploadFile.js index 5eee3a4b67..100ee3c493 100644 --- a/apps/OpenSignServer/cloud/customRoute/uploadFile.js +++ b/apps/OpenSignServer/cloud/customRoute/uploadFile.js @@ -4,7 +4,7 @@ import multerS3 from 'multer-s3'; import aws from 'aws-sdk'; import dotenv from 'dotenv'; import { cloudServerUrl, serverAppId, useLocal } from '../../Utils.js'; -dotenv.config(); +dotenv.config({ quiet: true }); function sanitizeFileName(fileName) { // Remove spaces and invalid characters diff --git a/apps/OpenSignServer/cloud/main.js b/apps/OpenSignServer/cloud/main.js index 6dc8b976b1..0d5244a591 100644 --- a/apps/OpenSignServer/cloud/main.js +++ b/apps/OpenSignServer/cloud/main.js @@ -55,6 +55,7 @@ import recreateDocument from './parsefunction/recreateDocument.js'; import loginUser from './parsefunction/loginUser.js'; import addUser from './parsefunction/addUser.js'; import filterDocs from './parsefunction/filterDocs.js'; +import sendDeleteUserMail from './parsefunction/sendDeleteUserMail.js'; // This afterSave function triggers after an object is added or updated in the specified class, allowing for post-processing logic. Parse.Cloud.afterSave('contracts_Document', DocumentAftersave); @@ -120,3 +121,4 @@ Parse.Cloud.define('recreatedoc', recreateDocument); Parse.Cloud.define('loginuser', loginUser); Parse.Cloud.define('adduser', addUser); Parse.Cloud.define('filterdocs', filterDocs); +Parse.Cloud.define('senddeleterequest', sendDeleteUserMail); diff --git a/apps/OpenSignServer/cloud/parsefunction/DocumentAfterFind.js b/apps/OpenSignServer/cloud/parsefunction/DocumentAfterFind.js index 16f7bf2af8..e39adf3115 100644 --- a/apps/OpenSignServer/cloud/parsefunction/DocumentAfterFind.js +++ b/apps/OpenSignServer/cloud/parsefunction/DocumentAfterFind.js @@ -1,45 +1,35 @@ -import { useLocal } from '../../Utils.js'; +import { handleValidImage, useLocal } from '../../Utils.js'; import getPresignedUrl, { presignedlocalUrl } from './getSignedUrl.js'; async function DocumentAfterFind(request) { if (request.objects.length === 1) { if (request.objects) { const obj = request.objects[0]; - if ( - useLocal !== 'true' - ) { - const SignedUrl = obj?.get('SignedUrl') && obj?.get('SignedUrl'); - const Url = obj?.get('URL') && obj?.get('URL'); - const certificateUrl = obj.get('CertificateUrl') && obj.get('CertificateUrl'); + const SignedUrl = obj?.get('SignedUrl') && obj?.get('SignedUrl'); + const Url = obj?.get('URL') && obj?.get('URL'); + const certificateUrl = obj.get('CertificateUrl') && obj.get('CertificateUrl'); + const isPrefillExist = obj?.get('Placeholders')?.some(x => x.Role === 'prefill'); + const Placeholder = obj?.get('Placeholders') || []; + if (useLocal !== 'true') { + if (isPrefillExist) { + const updatedPlaceHolder = await handleValidImage(Placeholder); + obj.set('Placeholders', updatedPlaceHolder); + } if (SignedUrl) { - obj.set( - 'SignedUrl', - getPresignedUrl( - SignedUrl, - ) - ); + obj.set('SignedUrl', getPresignedUrl(SignedUrl)); } if (Url) { - obj.set( - 'URL', - getPresignedUrl( - Url, - ) - ); + obj.set('URL', getPresignedUrl(Url)); } if (certificateUrl) { - obj.set( - 'CertificateUrl', - getPresignedUrl( - certificateUrl, - ) - ); + obj.set('CertificateUrl', getPresignedUrl(certificateUrl)); } return [obj]; } else if (useLocal == 'true') { - const SignedUrl = obj?.get('SignedUrl') && obj?.get('SignedUrl'); - const Url = obj?.get('URL') && obj?.get('URL'); - const certificateUrl = obj.get('CertificateUrl') && obj.get('CertificateUrl'); + if (isPrefillExist) { + const updatedPlaceHolder = await handleValidImage(Placeholder); + obj.set('Placeholders', updatedPlaceHolder); + } if (SignedUrl) { obj.set('SignedUrl', presignedlocalUrl(SignedUrl)); } diff --git a/apps/OpenSignServer/cloud/parsefunction/ForwardDoc.js b/apps/OpenSignServer/cloud/parsefunction/ForwardDoc.js index 24d95a39f6..17378de497 100644 --- a/apps/OpenSignServer/cloud/parsefunction/ForwardDoc.js +++ b/apps/OpenSignServer/cloud/parsefunction/ForwardDoc.js @@ -26,7 +26,6 @@ export default async function forwardDoc(request) { } const _docRes = docRes?.toJSON(); const docName = _docRes.Name; - const fileAdapterId = _docRes?.FileAdapterId || ''; const extUserId = _docRes?.ExtUserPtr?.objectId; const TenantAppName = appName; const from = _docRes?.ExtUserPtr?.Email; diff --git a/apps/OpenSignServer/cloud/parsefunction/TemplateAfterFind.js b/apps/OpenSignServer/cloud/parsefunction/TemplateAfterFind.js index 32c8084c96..9953685b6b 100644 --- a/apps/OpenSignServer/cloud/parsefunction/TemplateAfterFind.js +++ b/apps/OpenSignServer/cloud/parsefunction/TemplateAfterFind.js @@ -1,45 +1,35 @@ -import { useLocal } from '../../Utils.js'; +import { handleValidImage, useLocal } from '../../Utils.js'; import getPresignedUrl, { presignedlocalUrl } from './getSignedUrl.js'; async function TemplateAfterFind(request) { if (request.objects.length === 1) { if (request.objects) { const obj = request.objects[0]; - if ( - useLocal !== 'true' - ) { - const SignedUrl = obj?.get('SignedUrl') && obj?.get('SignedUrl'); - const Url = obj?.get('URL') && obj?.get('URL'); - const certificateUrl = obj.get('CertificateUrl') && obj.get('CertificateUrl'); + const SignedUrl = obj?.get('SignedUrl') && obj?.get('SignedUrl'); + const Url = obj?.get('URL') && obj?.get('URL'); + const certificateUrl = obj.get('CertificateUrl') && obj?.get('CertificateUrl'); + const isPrefillExist = obj?.get('Placeholders')?.some(x => x.Role === 'prefill'); + const Placeholder = obj?.get('Placeholders') || []; + if (useLocal !== 'true') { + if (isPrefillExist) { + const updatedPlaceHolder = await handleValidImage(Placeholder); + obj.set('Placeholders', updatedPlaceHolder); + } if (SignedUrl) { - obj.set( - 'SignedUrl', - getPresignedUrl( - SignedUrl, - ) - ); + obj.set('SignedUrl', getPresignedUrl(SignedUrl)); } if (Url) { - obj.set( - 'URL', - getPresignedUrl( - Url, - ) - ); + obj.set('URL', getPresignedUrl(Url)); } if (certificateUrl) { - obj.set( - 'CertificateUrl', - getPresignedUrl( - certificateUrl, - ) - ); + obj.set('CertificateUrl', getPresignedUrl(certificateUrl)); } return [obj]; } else if (useLocal == 'true') { - const SignedUrl = obj?.get('SignedUrl') && obj?.get('SignedUrl'); - const Url = obj?.get('URL') && obj?.get('URL'); - const certificateUrl = obj.get('CertificateUrl') && obj.get('CertificateUrl'); + if (isPrefillExist) { + const updatedPlaceHolder = await handleValidImage(Placeholder); + obj.set('Placeholders', updatedPlaceHolder); + } if (SignedUrl) { obj.set('SignedUrl', presignedlocalUrl(SignedUrl)); } diff --git a/apps/OpenSignServer/cloud/parsefunction/createBatchContact.js b/apps/OpenSignServer/cloud/parsefunction/createBatchContact.js index fa4e14536a..0ccdbd1519 100644 --- a/apps/OpenSignServer/cloud/parsefunction/createBatchContact.js +++ b/apps/OpenSignServer/cloud/parsefunction/createBatchContact.js @@ -20,8 +20,10 @@ export default async function createBatchContact(req) { UserRole: 'contracts_Guest', TenantId: { __type: 'Pointer', className: 'partners_Tenant', objectId: x.TenantId }, CreatedBy: { __type: 'Pointer', className: '_User', objectId: req.user.id }, - Name: x.Name, + Name: x.Name?.trim(), Email: x.Email?.toLowerCase()?.replace(/\s/g, ''), + Company: x?.Company?.trim(), + JobTitle: x?.JobTitle?.trim(), IsDeleted: false, IsImported: true, ...(x?.Phone ? { Phone: `${x?.Phone}` } : {}), diff --git a/apps/OpenSignServer/cloud/parsefunction/editContact.js b/apps/OpenSignServer/cloud/parsefunction/editContact.js index 2bd396d0d9..a57d1059e2 100644 --- a/apps/OpenSignServer/cloud/parsefunction/editContact.js +++ b/apps/OpenSignServer/cloud/parsefunction/editContact.js @@ -1,5 +1,7 @@ export default async function editContact(request) { const { contactId, name, email, phone, tenantId } = request.params; + const company = request.params?.company; + const jobTitle = request.params?.jobTitle; if (!request?.user) { throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); } @@ -25,6 +27,12 @@ export default async function editContact(request) { if (phone) { contactQuery.set('Phone', phone); } + if (company) { + contactQuery.set('Company', company); + } + if (jobTitle) { + contactQuery.set('JobTitle', jobTitle); + } contactQuery.set('Email', email?.toLowerCase()?.replace(/\s/g, '')); contactQuery.set('UserRole', 'contracts_Guest'); contactQuery.set('IsDeleted', false); @@ -55,7 +63,7 @@ export default async function editContact(request) { acl.setWriteAccess(createdBy.objectId, true); contactQuery.setACL(acl); - const res = await contactQuery.save(); + const res = await contactQuery.save(null, { useMasterKey: true }); const parseData = JSON.parse(JSON.stringify(res)); return parseData; } @@ -76,7 +84,7 @@ export default async function editContact(request) { acl.setReadAccess(createdBy.objectId, true); acl.setWriteAccess(createdBy.objectId, true); contactQuery.setACL(acl); - const res = await contactQuery.save(); + const res = await contactQuery.save(null, { useMasterKey: true }); const parseData = JSON.parse(JSON.stringify(res)); return parseData; } diff --git a/apps/OpenSignServer/cloud/parsefunction/generateCertificatebydocId.js b/apps/OpenSignServer/cloud/parsefunction/generateCertificatebydocId.js index 5c322ae460..d502a4c5d4 100644 --- a/apps/OpenSignServer/cloud/parsefunction/generateCertificatebydocId.js +++ b/apps/OpenSignServer/cloud/parsefunction/generateCertificatebydocId.js @@ -7,7 +7,7 @@ import fs from 'node:fs'; import dotenv from 'dotenv'; import GenerateCertificate from './pdf/GenerateCertificate.js'; import { getSecureUrl } from '../../Utils.js'; -dotenv.config(); +dotenv.config({ quiet: true }); const eSignName = 'OpenSign'; const eSigncontact = 'hello@opensignlabs.com'; diff --git a/apps/OpenSignServer/cloud/parsefunction/getDocument.js b/apps/OpenSignServer/cloud/parsefunction/getDocument.js index d64ffbecca..0bd3c7c94e 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getDocument.js +++ b/apps/OpenSignServer/cloud/parsefunction/getDocument.js @@ -3,6 +3,7 @@ import { cloudServerUrl, serverAppId } from '../../Utils.js'; export default async function getDocument(request) { const serverUrl = cloudServerUrl; //process.env.SERVER_URL; const docId = request.params.docId; + const include = request?.params?.include || ''; const sessiontoken = request?.headers?.sessiontoken || ''; try { if (docId) { @@ -17,6 +18,9 @@ export default async function getDocument(request) { query.include('Placeholders'); query.include('DeclineBy'); query.notEqualTo('IsArchive', true); + if (include) { + query?.include(include); + } const res = await query.first({ useMasterKey: true }); if (res) { const IsEnableOTP = res?.get('IsEnableOTP') || false; diff --git a/apps/OpenSignServer/cloud/parsefunction/getSignedUrl.js b/apps/OpenSignServer/cloud/parsefunction/getSignedUrl.js index 1a595f2d13..a2d3f14470 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getSignedUrl.js +++ b/apps/OpenSignServer/cloud/parsefunction/getSignedUrl.js @@ -2,27 +2,21 @@ import AWS from 'aws-sdk'; import { useLocal } from '../../Utils.js'; import jwt from 'jsonwebtoken'; import dotenv from 'dotenv'; -dotenv.config(); +dotenv.config({ quiet: true }); -export default function getPresignedUrl( - url, -) { +export default function getPresignedUrl(url) { if (url?.includes('files')) { return presignedlocalUrl(url); } else { const credentials = { - accessKeyId: - process.env.DO_ACCESS_KEY_ID, - secretAccessKey: - process.env.DO_SECRET_ACCESS_KEY, + accessKeyId: process.env.DO_ACCESS_KEY_ID, + secretAccessKey: process.env.DO_SECRET_ACCESS_KEY, }; AWS.config.update({ credentials: credentials, - region: - process.env.DO_REGION, + region: process.env.DO_REGION, }); - const spacesEndpoint = - new AWS.Endpoint(process.env.DO_ENDPOINT); + const spacesEndpoint = new AWS.Endpoint(process.env.DO_ENDPOINT); const s3 = new AWS.S3({ endpoint: spacesEndpoint, signatureVersion: 'v4' }); @@ -35,8 +29,7 @@ export default function getPresignedUrl( // presignedGETURL return presignedUrl with expires time const presignedGETURL = s3.getSignedUrl('getObject', { - Bucket: - process.env.DO_SPACE, + Bucket: process.env.DO_SPACE, Key: filename, //filename Expires: 160, //time to expire in seconds }); @@ -53,35 +46,22 @@ export async function getSignedUrl(request) { try { if (url?.includes('files')) { return presignedlocalUrl(url); - } else if ( - useLocal !== 'true' - ) { + } else if (useLocal !== 'true') { const query = new Parse.Query(docId ? 'contracts_Document' : 'contracts_Template'); query.equalTo('objectId', docId ? docId : templateId); query.include('ExtUserPtr.TenantId'); query.notEqualTo('IsArchive', true); const res = await query.first({ useMasterKey: true }); - if (res) { - const _resDoc = JSON.parse(JSON.stringify(res)); - if (_resDoc?.IsEnableOTP) { - if (!request?.user) { - throw new Parse.Error( - Parse.Error.INVALID_SESSION_TOKEN, - 'User is not authenticated.' - ); - } else { - const presignedUrl = getPresignedUrl( - url, - ); - return presignedUrl; - } - } else { - const presignedUrl = getPresignedUrl( - url, - ); - return presignedUrl; - } + if (!res) return url; + + const _resDoc = res?.toJSON(); + // Ensure user is authenticated if OTP is required + if (_resDoc?.IsEnableOTP && !request?.user) { + throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); } + + const presignedUrl = getPresignedUrl(url); + return presignedUrl; } else { return url; } diff --git a/apps/OpenSignServer/cloud/parsefunction/getSigners.js b/apps/OpenSignServer/cloud/parsefunction/getSigners.js index 7d41726e0a..48bde122ad 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getSigners.js +++ b/apps/OpenSignServer/cloud/parsefunction/getSigners.js @@ -35,8 +35,7 @@ export default async function getSigners(request) { searchObj.CreatedBy = { __type: 'Pointer', className: '_User', objectId: request?.user?.id }; searchObj.sessionToken = request.user.getSessionToken(); return await getContacts(searchObj); - } - else { + } else { throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'Invalid session token'); } } catch (err) { diff --git a/apps/OpenSignServer/cloud/parsefunction/getTenant.js b/apps/OpenSignServer/cloud/parsefunction/getTenant.js index 1c98aa7e10..4dd17711b7 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getTenant.js +++ b/apps/OpenSignServer/cloud/parsefunction/getTenant.js @@ -1,4 +1,3 @@ - async function getTenantByUserId(userId, contactId) { try { if (contactId) { @@ -53,8 +52,7 @@ export default async function getTenant(request) { if (userId || contactId) { return await getTenantByUserId(userId, contactId); - } - else { + } else { return {}; } } diff --git a/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js b/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js index 6e1127e7e9..5feb7e16c0 100644 --- a/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js +++ b/apps/OpenSignServer/cloud/parsefunction/getUserDetails.js @@ -36,8 +36,7 @@ async function getUserDetails(request) { const msg = err?.message || 'Something went wrong.'; throw new Parse.Error(code, msg); } - } - else { + } else { throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); } } diff --git a/apps/OpenSignServer/cloud/parsefunction/isUserInContactBook.js b/apps/OpenSignServer/cloud/parsefunction/isUserInContactBook.js index 7e452dedf0..f34654e127 100644 --- a/apps/OpenSignServer/cloud/parsefunction/isUserInContactBook.js +++ b/apps/OpenSignServer/cloud/parsefunction/isUserInContactBook.js @@ -1,4 +1,3 @@ - export default async function isUserInContactBook(request) { try { if (request.user) { diff --git a/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js b/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js index 4e4d10cbec..592c3511e5 100644 --- a/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js +++ b/apps/OpenSignServer/cloud/parsefunction/linkContactToDoc.js @@ -6,6 +6,12 @@ const saveRoleContact = async contact => { if (contact?.Phone) { contactQuery.set('Phone', contact.Phone); } + if (contact?.JobTitle) { + contactQuery.set('JobTitle', contact.JobTitle); + } + if (contact?.Company) { + contactQuery.set('Company', contact.Company); + } contactQuery.set('CreatedBy', contact.CreatedBy); contactQuery.set('UserId', contact.UserId); contactQuery.set('UserRole', 'contracts_Guest'); @@ -23,7 +29,7 @@ const saveRoleContact = async contact => { acl.setReadAccess(contact.UserId.objectId, true); acl.setWriteAccess(contact.UserId.objectId, true); contactQuery.setACL(acl); - const contactRes = await contactQuery.save(); + const contactRes = await contactQuery.save(null, { useMasterKey: true }); if (contactRes) { return contactRes; } @@ -37,6 +43,8 @@ export default async function linkContactToDoc(req) { const docId = req.params.docId; const name = req.params.name; const phone = req.params.phone; + const jobTitle = req.params.jobTitle; + const company = req.params.company; try { if (docId) { // Execute the query to get the document with the specified 'docId' @@ -110,6 +118,8 @@ export default async function linkContactToDoc(req) { UserId: _extUser.UserId, Name: _extUser.Name, Email: email, + JobTitle: _extUser?.JobTitle || '', + Company: _extUser?.Company || '', Phone: _extUser?.Phone ? _extUser.Phone : '', CreatedBy: _docRes.CreatedBy, TenantId: _docRes.ExtUserPtr?.TenantId?.objectId, @@ -163,6 +173,8 @@ export default async function linkContactToDoc(req) { Name: name, Email: email, Phone: phone, + JobTitle: jobTitle, + Company: company, CreatedBy: _docRes.CreatedBy, TenantId: _docRes.ExtUserPtr?.TenantId?.objectId, }; @@ -220,6 +232,8 @@ export default async function linkContactToDoc(req) { Name: name, Email: email, Phone: phone, + JobTitle: jobTitle, + Company: company, CreatedBy: _docRes.CreatedBy, TenantId: _docRes.ExtUserPtr?.TenantId?.objectId, }; diff --git a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js index c8f5436caf..bee391f58e 100644 --- a/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js +++ b/apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js @@ -14,6 +14,7 @@ import { pdflibAddPlaceholder } from '@signpdf/placeholder-pdf-lib'; import { Placeholder } from './Placeholder.js'; import { SignPdf } from '@signpdf/signpdf'; import { P12Signer } from '@signpdf/signer-p12'; +import { buildDownloadFilename } from '../../../utils/fileUtils.js'; const serverUrl = cloudServerUrl; // process.env.SERVER_URL; const APPID = serverAppId; @@ -79,7 +80,10 @@ async function updateDoc(docId, url, userId, ipAddress, data, className, sign) { const auditTrail = updateAuditTrail.filter(x => x.Activity === 'Signed'); let isCompleted = false; if (data.Signers && data.Signers.length > 0) { - if (auditTrail.length === data.Placeholders.length) { + //'removePrefill' is used to remove prefill role from placeholders filed then compare length to change status of document + const removePrefill = + data.Placeholders.length > 0 && data.Placeholders.filter(x => x.Role !== 'prefill'); + if (auditTrail.length === removePrefill?.length) { isCompleted = true; } } else { @@ -108,9 +112,11 @@ async function sendNotifyMail(doc, signUser, mailProvider, publicUrl) { ""; const opurl = ` here`; const auditTrailCount = doc?.AuditTrail?.filter(x => x.Activity === 'Signed')?.length || 0; - const signersCount = doc?.Placeholders?.length; - const remaingsign = signersCount - auditTrailCount; - if (remaingsign > 1 && doc?.NotifyOnSignatures) { + const removePrefill = + doc?.Placeholders?.length > 0 && doc?.Placeholders?.filter(x => x?.Role !== 'prefill'); + const signersCount = removePrefill?.length; + const remainingSign = signersCount - auditTrailCount; + if (remainingSign > 1 && doc?.NotifyOnSignatures) { const sender = doc.ExtUserPtr; const pdfName = doc.Name; const creatorName = doc.ExtUserPtr.Name; @@ -227,6 +233,13 @@ async function sendCompletedMail(obj) { } const Bcc = doc?.Bcc?.length > 0 ? doc.Bcc.map(x => x.Email) : []; const updatedBcc = doc?.SenderMail ? [...Bcc, doc?.SenderMail] : Bcc; + const formatId = doc?.ExtUserPtr?.DownloadFilenameFormat; + const filename = pdfName?.length > 100 ? pdfName?.slice(0, 100) : pdfName; + const docName = buildDownloadFilename(formatId, { + docName: filename, + email: doc?.ExtUserPtr?.Email, + isSigned: true, + }); const params = { extUserId: sender.objectId, url: url, @@ -239,7 +252,7 @@ async function sendCompletedMail(obj) { mailProvider: obj.mailProvider, bcc: updatedBcc?.length > 0 ? updatedBcc : '', certificatePath: `./exports/signed_certificate_${doc.objectId}.pdf`, - filename: obj?.filename, + filename: docName, }; try { const res = await axios.post(serverUrl + '/functions/sendmailv3', params, { diff --git a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js index 2a2e796510..110347b6b5 100644 --- a/apps/OpenSignServer/cloud/parsefunction/reportsJson.js +++ b/apps/OpenSignServer/cloud/parsefunction/reportsJson.js @@ -1,15 +1,41 @@ -export default function reportJson(id, userId) { - const currentUserId = userId; +export default function reportJson(id, currentUserId) { const commanKeys = [ + 'IsSignyourself', 'URL', 'Name', + 'Note', + 'SignedUrl', + 'AuditTrail', + 'Folder.Name', 'ExtUserPtr.Name', + 'ExtUserPtr.Email', + 'ExtUserPtr.DownloadFilenameFormat', 'Signers.Name', 'Signers.Email', 'Signers.Phone', 'Placeholders', 'TemplateId', + 'ExpiryDate', ]; + const inProgressKeys = [ + ...commanKeys, + 'AuditTrail.UserPtr', + 'SendMail', + 'RequestBody', + 'RequestSubject', + 'ExtUserPtr.TenantId.RequestBody', + 'ExtUserPtr.TenantId.RequestSubject', + ]; + const filterKeys = [ + 'TimeToCompleteDays', + 'AllowModifications', + 'IsEnableOTP', + 'IsTourEnabled', + 'NotifyOnSignatures', + 'RedirectUrl', + 'SendinOrder', + ]; + const needYourSignKeys = [...commanKeys, 'Signers.UserId']; switch (id) { // draft documents report case 'ByHuevtCFY': @@ -23,7 +49,7 @@ export default function reportJson(id, userId) { SignedUrl: { $exists: false }, CreatedBy: { __type: 'Pointer', className: '_User', objectId: currentUserId }, }, - keys: [...commanKeys, 'Note', 'Folder.Name', 'IsSignyourself'], + keys: [...commanKeys, ...filterKeys], }; // Need your sign report case '4Hhwbp482K': @@ -44,16 +70,7 @@ export default function reportJson(id, userId) { }, }, }, - keys: [ - ...commanKeys, - 'Note', - 'Folder.Name', - 'ExtUserPtr.Email', - 'Signers.UserId', - 'AuditTrail', - 'SignedUrl', - 'ExpiryDate', - ], + keys: [...needYourSignKeys, ...filterKeys], }; // In progress report case '1MwEuxLEkF': @@ -69,21 +86,7 @@ export default function reportJson(id, userId) { CreatedBy: { __type: 'Pointer', className: '_User', objectId: currentUserId }, ExpiryDate: { $gt: { __type: 'Date', iso: new Date().toISOString() } }, }, - keys: [ - ...commanKeys, - 'Note', - 'Folder.Name', - 'ExtUserPtr.Email', - 'AuditTrail', - 'AuditTrail.UserPtr', - 'ExpiryDate', - 'SendMail', - 'SignedUrl', - 'RequestBody', - 'RequestSubject', - 'ExtUserPtr.TenantId.RequestBody', - 'ExtUserPtr.TenantId.RequestSubject', - ], + keys: [...inProgressKeys, ...filterKeys], }; // completed documents report case 'kQUoW4hUXz': @@ -115,17 +118,7 @@ export default function reportJson(id, userId) { }, ], }, - keys: [ - ...commanKeys, - 'Note', - 'Folder.Name', - 'SignedUrl', - 'TimeToCompleteDays', - 'IsSignyourself', - 'IsCompleted', - 'ExpiryDate', - 'IsSignyourself', - ], + keys: [...commanKeys, ...filterKeys, 'IsCompleted'], }; // declined documents report case 'UPr2Fm5WY3': @@ -137,7 +130,7 @@ export default function reportJson(id, userId) { IsDeclined: true, CreatedBy: { __type: 'Pointer', className: '_User', objectId: currentUserId }, }, - keys: [...commanKeys, 'Note', 'Folder.Name', 'DeclineReason', 'SignedUrl'], + keys: [...commanKeys, 'DeclineReason'], }; // Expired Documents report case 'zNqBHXHsYH': @@ -152,7 +145,7 @@ export default function reportJson(id, userId) { ExpiryDate: { $lt: { __type: 'Date', iso: new Date().toISOString() } }, CreatedBy: { __type: 'Pointer', className: '_User', objectId: currentUserId }, }, - keys: [...commanKeys, 'Note', 'Folder.Name', 'SignedUrl', 'ExpiryDate'], + keys: [...commanKeys, ...filterKeys], }; // Recently sent for signatures report show on dashboard case 'd9k3UfYHBc': @@ -168,19 +161,7 @@ export default function reportJson(id, userId) { CreatedBy: { __type: 'Pointer', className: '_User', objectId: currentUserId }, ExpiryDate: { $gt: { __type: 'Date', iso: new Date().toISOString() } }, }, - keys: [ - ...commanKeys, - 'Folder.Name', - 'ExtUserPtr.Email', - 'AuditTrail', - 'AuditTrail.UserPtr', - 'ExpiryDate', - 'SignedUrl', - 'RequestBody', - 'RequestSubject', - 'ExtUserPtr.TenantId.RequestBody', - 'ExtUserPtr.TenantId.RequestSubject', - ], + keys: inProgressKeys, }; // Recent signature requests report show on dashboard case '5Go51Q7T8r': @@ -201,14 +182,7 @@ export default function reportJson(id, userId) { }, }, }, - keys: [ - ...commanKeys, - 'ExtUserPtr.Email', - 'Signers.UserId', - 'AuditTrail', - 'SignedUrl', - 'ExpiryDate', - ], + keys: needYourSignKeys, }; // Drafts report show on dashboard case 'kC5mfynCi4': @@ -222,7 +196,7 @@ export default function reportJson(id, userId) { SignedUrl: { $exists: false }, CreatedBy: { __type: 'Pointer', className: '_User', objectId: currentUserId }, }, - keys: [...commanKeys, 'Note', 'Folder.Name'], + keys: commanKeys, }; // contact book report case 'contacts': @@ -233,7 +207,7 @@ export default function reportJson(id, userId) { CreatedBy: { __type: 'Pointer', className: '_User', objectId: currentUserId }, IsDeleted: { $ne: true }, }, - keys: ['Name', 'Email', 'Phone'], + keys: ['Name', 'Email', 'Phone', 'JobTitle', 'Company'], }; // Templates report case '6TeaPr321t': @@ -243,8 +217,7 @@ export default function reportJson(id, userId) { params: { Type: { $ne: 'Folder' }, IsArchive: { $ne: true } }, keys: [ ...commanKeys, - 'Note', - 'Folder.Name', + ...filterKeys, 'IsPublic', 'SharedWith.Name', 'SendinOrder', diff --git a/apps/OpenSignServer/cloud/parsefunction/saveAsTemplate.js b/apps/OpenSignServer/cloud/parsefunction/saveAsTemplate.js index b7ecbd2c75..dd51382786 100644 --- a/apps/OpenSignServer/cloud/parsefunction/saveAsTemplate.js +++ b/apps/OpenSignServer/cloud/parsefunction/saveAsTemplate.js @@ -32,7 +32,6 @@ export default async function saveAsTemplate(request) { templateCls.set('EmailSenderName', _docRes?.EmailSenderName); templateCls.set('SenderName', _docRes?.SenderName); templateCls.set('SenderMail', _docRes?.SenderMail); - templateCls.set('FileAdapterId', _docRes?.FileAdapterId); templateCls.set('RequestBody', _docRes?.RequestBody); templateCls.set('RequestSubject', _docRes?.RequestSubject); templateCls.set('NextReminderDate', _docRes?.NextReminderDate); @@ -56,6 +55,7 @@ export default async function saveAsTemplate(request) { ...pageItem, pos: pageItem.pos.map(p => ({ ...p, + type: p.type === 'text' ? 'text input' : p.type, options: { ...p.options, status: 'required', @@ -74,14 +74,14 @@ export default async function saveAsTemplate(request) { }; templateCls.set('Placeholders', [placeHolders]); } else { - const placeHolders = _docRes?.Placeholders.map((signer, signerIndex) => ({ + const removePrefill = _docRes?.Placeholders?.filter(x => x.Role !== 'prefill'); + const placeHolders = removePrefill.map((signer, signerIndex) => ({ // copy everything else, then overwrite these fields: ...signer, signerObjId: '', signerPtr: {}, - Role: `Role ${signerIndex + 1}`, + Role: signer?.Role ? signer.Role : `Role ${signerIndex + 1}`, email: '', - // rebuild placeHolder/pages placeHolder: (signer.placeHolder || []).map(page => ({ ...page, diff --git a/apps/OpenSignServer/cloud/parsefunction/saveFile.js b/apps/OpenSignServer/cloud/parsefunction/saveFile.js index 5b1ee71b6f..14a32f5ba1 100644 --- a/apps/OpenSignServer/cloud/parsefunction/saveFile.js +++ b/apps/OpenSignServer/cloud/parsefunction/saveFile.js @@ -1,7 +1,4 @@ -import { - flattenPdf, - getSecureUrl, -} from '../../Utils.js'; +import { flattenPdf, getSecureUrl } from '../../Utils.js'; export default async function saveFile(request) { if (!request.params.fileBase64) { throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Please provide file.'); @@ -16,29 +13,28 @@ export default async function saveFile(request) { const resExt = await extCls.first({ useMasterKey: true }); if (resExt) { const _resExt = JSON.parse(JSON.stringify(resExt)); - const fileName = request.params.fileName; - const ext = request.params.fileName?.split('.')?.pop(); - let mimeType; - let file; - if (ext === 'pdf') { - mimeType = 'application/pdf'; - const flatPdf = await flattenPdf(fileBase64); - file = [...flatPdf]; - } else if (ext === 'png' || ext === 'jpeg' || ext === 'jpg') { - mimeType = `image/${ext}`; - file = { base64: fileBase64 }; - } - const pdfFile = new Parse.File(fileName, file, mimeType); - // Save the Parse File if needed - const pdfData = await pdfFile.save({ useMasterKey: true }); - const presignedUrl = pdfData.url(); - const fileRes = getSecureUrl(presignedUrl); - return { url: fileRes.url }; + const fileName = request.params.fileName; + const ext = request.params.fileName?.split('.')?.pop(); + let mimeType; + let file; + if (ext === 'pdf') { + mimeType = 'application/pdf'; + const flatPdf = await flattenPdf(fileBase64); + file = [...flatPdf]; + } else if (ext === 'png' || ext === 'jpeg' || ext === 'jpg') { + mimeType = `image/${ext}`; + file = { base64: fileBase64 }; + } + const pdfFile = new Parse.File(fileName, file, mimeType); + // Save the Parse File if needed + const pdfData = await pdfFile.save({ useMasterKey: true }); + const presignedUrl = pdfData.url(); + const fileRes = getSecureUrl(presignedUrl); + return { url: fileRes.url }; } else { throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'User not found.'); } - } - else { + } else { throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); } } catch (err) { diff --git a/apps/OpenSignServer/cloud/parsefunction/savecontact.js b/apps/OpenSignServer/cloud/parsefunction/savecontact.js index 6cbfaac637..8bf497bf87 100644 --- a/apps/OpenSignServer/cloud/parsefunction/savecontact.js +++ b/apps/OpenSignServer/cloud/parsefunction/savecontact.js @@ -4,6 +4,8 @@ export default async function savecontact(request) { const requestemail = request.params?.email; const email = requestemail?.toLowerCase()?.replace(/\s/g, ''); const tenantId = request.params.tenantId; + const company = request.params?.company; + const jobTitle = request.params?.jobTitle; if (request.user) { const currentUser = request?.user; @@ -16,12 +18,18 @@ export default async function savecontact(request) { if (!res) { const contactQuery = new Parse.Object('contracts_Contactbook'); contactQuery.set('Name', name); - if (phone) { - contactQuery.set('Phone', phone); - } contactQuery.set('Email', email); contactQuery.set('UserRole', 'contracts_Guest'); contactQuery.set('IsDeleted', false); + if (phone) { + contactQuery.set('Phone', phone); + } + if (company) { + contactQuery.set('Company', company); + } + if (jobTitle) { + contactQuery.set('JobTitle', jobTitle); + } if (tenantId) { contactQuery.set('TenantId', { __type: 'Pointer', @@ -29,7 +37,6 @@ export default async function savecontact(request) { objectId: tenantId, }); } - try { const _users = Parse.Object.extend('User'); const _user = new _users(); @@ -40,7 +47,6 @@ export default async function savecontact(request) { if (phone) { _user.set('phone', phone); } - const user = await _user.save(); if (user) { contactQuery.set('CreatedBy', currentUserPtr); @@ -52,7 +58,7 @@ export default async function savecontact(request) { acl.setWriteAccess(currentUser.id, true); contactQuery.setACL(acl); - const res = await contactQuery.save(); + const res = await contactQuery.save(null, { useMasterKey: true }); const parseData = JSON.parse(JSON.stringify(res)); return parseData; } @@ -73,7 +79,7 @@ export default async function savecontact(request) { acl.setReadAccess(currentUser.id, true); acl.setWriteAccess(currentUser.id, true); contactQuery.setACL(acl); - const res = await contactQuery.save(); + const res = await contactQuery.save(null, { useMasterKey: true }); const parseData = JSON.parse(JSON.stringify(res)); return parseData; } diff --git a/apps/OpenSignServer/cloud/parsefunction/sendDeleteUserMail.js b/apps/OpenSignServer/cloud/parsefunction/sendDeleteUserMail.js new file mode 100644 index 0000000000..86a33222cd --- /dev/null +++ b/apps/OpenSignServer/cloud/parsefunction/sendDeleteUserMail.js @@ -0,0 +1,103 @@ +import { appName, smtpenable } from '../../Utils.js'; + +export const errHtml = err => { + return `Reset Password +

${err}

`; +}; +const sendDeleteUserMail = async req => { + const app = req.params.app || appName; + if (!req.user) { + throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); + } + try { + const { userId } = req.params; + if (!userId) { + throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Missing userId parameter.'); + } + + const userPointer = { __type: 'Pointer', className: '_User', objectId: userId }; + + const createdByPointer = { __type: 'Pointer', className: '_User', objectId: req.user.id }; + + const userCondition = new Parse.Query('contracts_Users'); + userCondition.equalTo('UserId', userPointer); + + const userAndCreatorCondition = new Parse.Query('contracts_Users'); + userAndCreatorCondition.equalTo('UserId', userPointer); + userAndCreatorCondition.equalTo('CreatedBy', createdByPointer); + + const mainQuery = Parse.Query.or(userCondition, userAndCreatorCondition); + + const result = await mainQuery.first({ useMasterKey: true }); + const username = result.get('Email')?.toLowerCase()?.replace(/\s/g, ''); + const name = result?.get('Name') ? `${result?.get('Name')}` : ''; + const isAdmin = result?.get('UserRole') === 'contracts_Admin'; + if (!isAdmin) { + throw new Parse.Error( + Parse.Error.SCRIPT_FAILED, + 'This action is not permitted. Kindly contact your administrator to request account deletion.' + ); + } + + const serverUrl = process.env?.SERVER_URL?.replace(/\/app\/?$/, '/'); + const deleteUrl = `${serverUrl}delete-account/${userId}`; + const mailsender = smtpenable ? process.env.SMTP_USER_EMAIL : process.env.MAILGUN_SENDER; + // Render a simple HTML form. In production, consider using a templating engine. + + await Parse.Cloud.sendEmail({ + sender: app + ' <' + mailsender + '>', + recipient: username, + subject: `Account Deletion Request for ${username} – ${app}`, + text: `Account Deletion Request for ${username} – ${app}`, + html: ` + + + Account Deletion Request - ${app} + + +
+

Request to Delete Your Account

+

+ Hello ${name}, +

+

+ We have received a request to permanently delete your ${app} account associated with ${username}. +

+

+ If you did not make this request, please ignore this email. Otherwise, click the button below to proceed + with the deletion. +

+

+ + Confirm Account Deletion + +

+

+ If the button above doesn't work, please copy and open the following link with your browser. +

+

+ ${deleteUrl} +

+

+ Note: This action is irreversible and all your data will be permanently removed from our systems. +

+
+

+ If you have any questions or need assistance, please contact our support team. +

+

+ © ${new Date().getFullYear()} ${app}. All rights reserved. +

+
+ +`, + }); + return 'mail sent.'; + } catch (err) { + console.log('Err in sending delete user email ', err); + throw new Parse.Error(Parse.Error.SCRIPT_FAILED, err.message); + } +}; +export default sendDeleteUserMail; diff --git a/apps/OpenSignServer/cloud/parsefunction/updatePreferences.js b/apps/OpenSignServer/cloud/parsefunction/updatePreferences.js index fc90c02fb8..2712728791 100644 --- a/apps/OpenSignServer/cloud/parsefunction/updatePreferences.js +++ b/apps/OpenSignServer/cloud/parsefunction/updatePreferences.js @@ -57,6 +57,9 @@ export default async function updatePreferences(request) { if (request.params.IsLTVEnabled !== undefined) { newOrg.set('IsLTVEnabled', request.params.IsLTVEnabled); } + if (request.params.DownloadFilenameFormat) { + newOrg.set('DownloadFilenameFormat', request.params.DownloadFilenameFormat); + } const updateUserRes = await newOrg.save(null, { useMasterKey: true }); if (updateUserRes) { const _updateUserRes = JSON.parse(JSON.stringify(updateUserRes)); diff --git a/apps/OpenSignServer/cloud/parsefunction/updateTourStatus.js b/apps/OpenSignServer/cloud/parsefunction/updateTourStatus.js index fea5f2afb5..ba76dc58a5 100644 --- a/apps/OpenSignServer/cloud/parsefunction/updateTourStatus.js +++ b/apps/OpenSignServer/cloud/parsefunction/updateTourStatus.js @@ -15,8 +15,7 @@ export default async function updateTourStatus(request) { const msg = err?.message || 'Something went wrong.'; throw new Parse.Error(code, msg); } - } - else { + } else { throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'User is not authenticated.'); } } diff --git a/apps/OpenSignServer/cloud/parsefunction/usersignup.js b/apps/OpenSignServer/cloud/parsefunction/usersignup.js index 118f76ef37..b5c4a20228 100644 --- a/apps/OpenSignServer/cloud/parsefunction/usersignup.js +++ b/apps/OpenSignServer/cloud/parsefunction/usersignup.js @@ -43,9 +43,9 @@ async function saveUser(userDetails) { } export default async function usersignup(request) { const userDetails = request.params.userDetails; - const user = await saveUser(userDetails); try { + const user = await saveUser(userDetails); const extClass = userDetails.role.split('_')[0]; const extQuery = new Parse.Query(extClass + '_Users'); diff --git a/apps/OpenSignServer/databases/migrations/20250621215000-add_creditalertlevel_field.cjs b/apps/OpenSignServer/databases/migrations/20250621215000-add_creditalertlevel_field.cjs deleted file mode 100644 index ba9d6c75ea..0000000000 --- a/apps/OpenSignServer/databases/migrations/20250621215000-add_creditalertlevel_field.cjs +++ /dev/null @@ -1,19 +0,0 @@ -/** - * - * @param {Parse} Parse - */ -exports.up = async Parse => { - const schema = new Parse.Schema('contracts_Subscriptions'); - schema.addNumber('CreditAlertLevel'); - return schema.update(); -}; - -/** - * - * @param {Parse} Parse - */ -exports.down = async Parse => { - const schema = new Parse.Schema('contracts_Subscriptions'); - schema.deleteField('CreditAlertLevel'); - return schema.update(); -}; diff --git a/apps/OpenSignServer/databases/migrations/20250801113339-add_contact_field.cjs b/apps/OpenSignServer/databases/migrations/20250801113339-add_contact_field.cjs new file mode 100644 index 0000000000..03b4c01691 --- /dev/null +++ b/apps/OpenSignServer/databases/migrations/20250801113339-add_contact_field.cjs @@ -0,0 +1,19 @@ +/** + * + * @param {Parse} Parse + */ +exports.up = async Parse => { + const schema = new Parse.Schema('contracts_Contactbook'); + schema.addString('Company').addString('JobTitle'); + return schema.update(); +}; + +/** + * + * @param {Parse} Parse + */ +exports.down = async Parse => { + const schema = new Parse.Schema('contracts_Contactbook'); + schema.deleteField('Company').deleteField('JobTitle'); + return schema.update(); +}; diff --git a/apps/OpenSignServer/databases/migrations/20250811191810-add_datafiles_field.cjs b/apps/OpenSignServer/databases/migrations/20250811191810-add_datafiles_field.cjs new file mode 100644 index 0000000000..14c046c465 --- /dev/null +++ b/apps/OpenSignServer/databases/migrations/20250811191810-add_datafiles_field.cjs @@ -0,0 +1,19 @@ +/** + * + * @param {Parse} Parse + */ +exports.up = async Parse => { + const schema = new Parse.Schema('partners_DataFiles'); + schema.addPointer('UserId', '_User'); + return schema.update(); +}; + +/** + * + * @param {Parse} Parse + */ +exports.down = async Parse => { + const schema = new Parse.Schema('partners_DataFiles'); + schema.deleteField('UserId'); + return schema.update(); +}; diff --git a/apps/OpenSignServer/index.js b/apps/OpenSignServer/index.js index 41cd8995c0..5fdf081d48 100644 --- a/apps/OpenSignServer/index.js +++ b/apps/OpenSignServer/index.js @@ -1,5 +1,5 @@ import dotenv from 'dotenv'; -dotenv.config(); +dotenv.config({ quiet: true }); import express from 'express'; import cors from 'cors'; import { ParseServer } from 'parse-server'; diff --git a/apps/OpenSignServer/logo.png b/apps/OpenSignServer/logo.png index 8db5381242..b7241b8a80 100644 Binary files a/apps/OpenSignServer/logo.png and b/apps/OpenSignServer/logo.png differ diff --git a/apps/OpenSignServer/migrationdb/createContactIndex.js b/apps/OpenSignServer/migrationdb/createContactIndex.js index 2c199ebdb4..b117d2a9ad 100644 --- a/apps/OpenSignServer/migrationdb/createContactIndex.js +++ b/apps/OpenSignServer/migrationdb/createContactIndex.js @@ -1,7 +1,7 @@ import dotenv from 'dotenv'; import { MongoClient } from 'mongodb'; import { generateId } from '../Utils.js'; -dotenv.config(); +dotenv.config({ quiet: true }); export default async function createContactIndex() { // Provide the complete MongoDB connection URL with the database name diff --git a/apps/OpenSignServer/package-lock.json b/apps/OpenSignServer/package-lock.json index 07892ac2c2..cf145b3737 100644 --- a/apps/OpenSignServer/package-lock.json +++ b/apps/OpenSignServer/package-lock.json @@ -1,16 +1,16 @@ { "name": "open_sign_server", - "version": "2.21.1", + "version": "2.26.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "open_sign_server", - "version": "2.21.1", + "version": "2.26.0", "license": "MIT", "dependencies": { - "@aws-sdk/client-s3": "^3.840.0", - "@aws-sdk/s3-request-presigner": "^3.840.0", + "@aws-sdk/client-s3": "^3.879.0", + "@aws-sdk/s3-request-presigner": "^3.879.0", "@parse/fs-files-adapter": "^3.0.0", "@parse/s3-files-adapter": "^4.2.0", "@pdf-lib/fontkit": "^1.1.1", @@ -18,37 +18,39 @@ "@signpdf/signer-p12": "^3.2.4", "@signpdf/signpdf": "^3.2.5", "aws-sdk": "^2.1692.0", - "axios": "^1.10.0", + "axios": "^1.11.0", "coherentpdf": "^2.5.5", "cors": "^2.8.5", "date-fns-tz": "^3.2.0", - "dotenv": "^16.6.1", + "dotenv": "^17.2.1", "express": "^5.1.0", - "form-data": "^4.0.3", + "form-data": "^4.0.4", "generate-api-key": "^1.0.2", - "googleapis": "^150.0.1", + "googleapis": "^159.0.0", "libreoffice-convert": "^1.6.1", "mailgun.js": "^12.0.3", - "mongodb": "^6.17.0", - "multer": "^2.0.1", + "mongodb": "^6.19.0", + "multer": "^2.0.2", "multer-s3": "^3.0.1", "node-forge": "^1.3.1", - "nodemailer": "^7.0.4", + "nodemailer": "^7.0.6", + "p-limit": "^7.1.1", "parse": "^6.1.1", "parse-dbtool": "^1.2.0", - "parse-server": "^8.2.1", + "parse-server": "^8.2.4", "parse-server-api-mail-adapter": "^4.1.0", "pdf-lib": "^1.17.1", - "posthog-node": "^5.1.1", + "posthog-node": "^5.8.1", "qrcode": "^1.5.4", - "rate-limiter-flexible": "^7.1.1", + "rate-limiter-flexible": "^7.2.0", + "sharp": "^0.34.3", "speakeasy": "^2.0.0", "ws": "^8.18.3" }, "devDependencies": { - "@babel/eslint-parser": "^7.27.5", - "eslint": "^9.29.0", - "jasmine": "^5.8.0", + "@babel/eslint-parser": "^7.28.0", + "eslint": "^9.34.0", + "jasmine": "^5.10.0", "mongodb-runner": "^5.9.2", "nodemon": "^3.1.10", "nyc": "^17.1.0", @@ -105,9 +107,9 @@ } }, "node_modules/@apollo/server": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.12.0.tgz", - "integrity": "sha512-Z5RNTCnIia+dFsP5HW2ugQMrIOWgyNWyKP+jMVXthp/ECjYyyRYPC41ukCDwxHQY4vNZ3rgbgqroWVQUGFt2gA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@apollo/server/-/server-4.12.1.tgz", + "integrity": "sha512-jceK1LK6l074in4mWu8XkwzDjvxdSzkmk8M7YpVLOGjQ6PmlaChcGRJ9BUwB46r22MxdPCXdC/6U5Vi8gzYbvQ==", "license": "MIT", "dependencies": { "@apollo/cache-control-types": "^1.0.3", @@ -811,66 +813,66 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.840.0.tgz", - "integrity": "sha512-dRuo03EqGBbl9+PTogpwY9bYmGWIjn8nB82HN5Qj20otgjUvhLOdEkkip9mroYsrvqNoKbMedWdCudIcB/YY1w==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.879.0.tgz", + "integrity": "sha512-1bD2Do/OdCIzl72ncHKYamDhPijUErLYpuLvciyYD4Ywt4cVLHjWtVIqb22XOOHYYHE3NqHMd4uRhvXMlsBRoQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.840.0", - "@aws-sdk/credential-provider-node": "3.840.0", - "@aws-sdk/middleware-bucket-endpoint": "3.840.0", - "@aws-sdk/middleware-expect-continue": "3.840.0", - "@aws-sdk/middleware-flexible-checksums": "3.840.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-location-constraint": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-sdk-s3": "3.840.0", - "@aws-sdk/middleware-ssec": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.840.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/signature-v4-multi-region": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.840.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.840.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.6.0", - "@smithy/eventstream-serde-browser": "^4.0.4", - "@smithy/eventstream-serde-config-resolver": "^4.1.2", - "@smithy/eventstream-serde-node": "^4.0.4", - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/hash-blob-browser": "^4.0.4", - "@smithy/hash-node": "^4.0.4", - "@smithy/hash-stream-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/md5-js": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-retry": "^4.1.14", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/credential-provider-node": "3.879.0", + "@aws-sdk/middleware-bucket-endpoint": "3.873.0", + "@aws-sdk/middleware-expect-continue": "3.873.0", + "@aws-sdk/middleware-flexible-checksums": "3.879.0", + "@aws-sdk/middleware-host-header": "3.873.0", + "@aws-sdk/middleware-location-constraint": "3.873.0", + "@aws-sdk/middleware-logger": "3.876.0", + "@aws-sdk/middleware-recursion-detection": "3.873.0", + "@aws-sdk/middleware-sdk-s3": "3.879.0", + "@aws-sdk/middleware-ssec": "3.873.0", + "@aws-sdk/middleware-user-agent": "3.879.0", + "@aws-sdk/region-config-resolver": "3.873.0", + "@aws-sdk/signature-v4-multi-region": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@aws-sdk/util-user-agent-browser": "3.873.0", + "@aws-sdk/util-user-agent-node": "3.879.0", + "@aws-sdk/xml-builder": "3.873.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.9.0", + "@smithy/eventstream-serde-browser": "^4.0.5", + "@smithy/eventstream-serde-config-resolver": "^4.1.3", + "@smithy/eventstream-serde-node": "^4.0.5", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-blob-browser": "^4.0.5", + "@smithy/hash-node": "^4.0.5", + "@smithy/hash-stream-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/md5-js": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-retry": "^4.1.20", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.21", - "@smithy/util-defaults-mode-node": "^4.0.21", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-defaults-mode-browser": "^4.0.27", + "@smithy/util-defaults-mode-node": "^4.0.27", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "@smithy/util-waiter": "^4.0.6", + "@smithy/util-waiter": "^4.0.7", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" @@ -880,16 +882,16 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.840.0.tgz", - "integrity": "sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.873.0.tgz", + "integrity": "sha512-b4bvr0QdADeTUs+lPc9Z48kXzbKHXQKgTvxx/jXDgSW9tv4KmYPO1gIj6Z9dcrBkRWQuUtSW3Tu2S5n6pe+zeg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-arn-parser": "3.873.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", "tslib": "^2.6.2" }, @@ -898,14 +900,14 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.840.0.tgz", - "integrity": "sha512-iJg2r6FKsKKvdiU4oCOuCf7Ro/YE0Q2BT/QyEZN3/Rt8Nr4SAZiQOlcBXOCpGvuIKOEAhvDOUnW3aDHL01PdVw==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.873.0.tgz", + "integrity": "sha512-GIqoc8WgRcf/opBOZXFLmplJQKwOMjiOMmDz9gQkaJ8FiVJoAp8EGVmK2TOWZMQUYsavvHYsHaor5R2xwPoGVg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -913,14 +915,14 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", - "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.873.0.tgz", + "integrity": "sha512-KZ/W1uruWtMOs7D5j3KquOxzCnV79KQW9MjJFZM/M0l6KI8J6V3718MXxFHsTjUE4fpdV6SeCNLV1lwGygsjJA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -928,13 +930,13 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.840.0.tgz", - "integrity": "sha512-KVLD0u0YMF3aQkVF8bdyHAGWSUY6N1Du89htTLgqCcIhSxxAJ9qifrosVZ9jkAzqRW99hcufyt2LylcVU2yoKQ==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.873.0.tgz", + "integrity": "sha512-r+hIaORsW/8rq6wieDordXnA/eAu7xAPLue2InhoEX6ML7irP52BgiibHLpt9R0psiCzIHhju8qqKa4pJOrmiw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -942,13 +944,13 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-logger": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", - "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.876.0.tgz", + "integrity": "sha512-cpWJhOuMSyz9oV25Z/CMHCBTgafDCbv7fHR80nlRrPdPZ8ETNsahwRgltXP1QJJ8r3X/c1kwpOR7tc+RabVzNA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -956,14 +958,14 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", - "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.873.0.tgz", + "integrity": "sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -971,13 +973,13 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-ssec": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.840.0.tgz", - "integrity": "sha512-CBZP9t1QbjDFGOrtnUEHL1oAvmnCUUm7p0aPNbIdSzNtH42TNKjPRN3TuEIJDGjkrqpL3MXyDSmNayDcw/XW7Q==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.873.0.tgz", + "integrity": "sha512-AF55J94BoiuzN7g3hahy0dXTVZahVi8XxRBLgzNp6yQf0KTng+hb/V9UQZVYY1GZaDczvvvnqC54RGe9OZZ9zQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -985,16 +987,16 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", - "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.873.0.tgz", + "integrity": "sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -1002,12 +1004,24 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.873.0.tgz", + "integrity": "sha512-qag+VTqnJWDn8zTAXX4wiVioa0hZDQMtbZcGRERVnLar4/3/VIKBhxX2XibNQXFu1ufgcRn4YntT/XEPecFWcg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { @@ -1015,24 +1029,37 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", - "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.873.0.tgz", + "integrity": "sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/xml-builder": { + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.873.0.tgz", + "integrity": "sha512-kLO7k7cGJ6KaHiExSJWojZurF7SnGMDHXRuQunFnEoD0n1yB6Lqy/S/zHiQ7oJnBhPr9q0TW9qFkrsZb1Uc54w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1040,34 +1067,36 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -1088,18 +1117,18 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -1107,13 +1136,13 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1121,12 +1150,12 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1134,14 +1163,14 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1149,15 +1178,15 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1165,12 +1194,12 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1178,12 +1207,12 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1191,12 +1220,12 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -1205,12 +1234,12 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1218,12 +1247,12 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1231,17 +1260,17 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -1249,9 +1278,9 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1261,13 +1290,13 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1326,12 +1355,12 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1339,14 +1368,14 @@ } }, "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -1383,47 +1412,47 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.840.0.tgz", - "integrity": "sha512-3Zp+FWN2hhmKdpS0Ragi5V2ZPsZNScE3jlbgoJjzjI/roHZqO+e3/+XFN4TlM0DsPKYJNp+1TAjmhxN6rOnfYA==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.879.0.tgz", + "integrity": "sha512-+Pc3OYFpRYpKLKRreovPM63FPPud1/SF9vemwIJfz6KwsBCJdvg7vYD1xLSIp5DVZLeetgf4reCyAA5ImBfZuw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.840.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.840.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.840.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.840.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.6.0", - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-retry": "^4.1.14", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/middleware-host-header": "3.873.0", + "@aws-sdk/middleware-logger": "3.876.0", + "@aws-sdk/middleware-recursion-detection": "3.873.0", + "@aws-sdk/middleware-user-agent": "3.879.0", + "@aws-sdk/region-config-resolver": "3.873.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@aws-sdk/util-user-agent-browser": "3.873.0", + "@aws-sdk/util-user-agent-node": "3.879.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.9.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-retry": "^4.1.20", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.21", - "@smithy/util-defaults-mode-node": "^4.0.21", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "@smithy/util-defaults-mode-browser": "^4.0.27", + "@smithy/util-defaults-mode-node": "^4.0.27", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -1432,14 +1461,14 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", - "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.873.0.tgz", + "integrity": "sha512-KZ/W1uruWtMOs7D5j3KquOxzCnV79KQW9MjJFZM/M0l6KI8J6V3718MXxFHsTjUE4fpdV6SeCNLV1lwGygsjJA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1447,13 +1476,13 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/middleware-logger": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", - "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.876.0.tgz", + "integrity": "sha512-cpWJhOuMSyz9oV25Z/CMHCBTgafDCbv7fHR80nlRrPdPZ8ETNsahwRgltXP1QJJ8r3X/c1kwpOR7tc+RabVzNA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1461,14 +1490,14 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", - "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.873.0.tgz", + "integrity": "sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1476,16 +1505,16 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", - "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.873.0.tgz", + "integrity": "sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -1493,12 +1522,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1506,24 +1535,24 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", - "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.873.0.tgz", + "integrity": "sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1531,34 +1560,36 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -1579,18 +1610,18 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -1598,13 +1629,13 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1612,12 +1643,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1625,14 +1656,14 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1640,15 +1671,15 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1656,12 +1687,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1669,12 +1700,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1682,12 +1713,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -1696,12 +1727,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1709,12 +1740,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1722,17 +1753,17 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -1740,9 +1771,9 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1752,13 +1783,13 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1817,12 +1848,12 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1830,14 +1861,14 @@ } }, "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -1874,25 +1905,25 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.840.0.tgz", - "integrity": "sha512-x3Zgb39tF1h2XpU+yA4OAAQlW6LVEfXNlSedSYJ7HGKXqA/E9h3rWQVpYfhXXVVsLdYXdNw5KBUkoAoruoZSZA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/core": "^3.6.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.879.0.tgz", + "integrity": "sha512-AhNmLCrx980LsK+SfPXGh7YqTyZxsK0Qmy18mWmkfY0TSq7WLaSDB5zdQbgbnQCACCHy8DUYXbi4KsjlIhv3PA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.862.0", + "@aws-sdk/xml-builder": "3.873.0", + "@smithy/core": "^3.9.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/signature-v4": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "@smithy/util-utf8": "^4.0.0", - "fast-xml-parser": "4.4.1", + "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { @@ -1900,12 +1931,25 @@ } }, "node_modules/@aws-sdk/core/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core/node_modules/@aws-sdk/xml-builder": { + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.873.0.tgz", + "integrity": "sha512-kLO7k7cGJ6KaHiExSJWojZurF7SnGMDHXRuQunFnEoD0n1yB6Lqy/S/zHiQ7oJnBhPr9q0TW9qFkrsZb1Uc54w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1913,12 +1957,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -1926,34 +1970,36 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/core/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -1974,18 +2020,18 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -1993,13 +2039,13 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2007,12 +2053,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2020,14 +2066,14 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2035,15 +2081,15 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2051,12 +2097,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2064,12 +2110,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2077,12 +2123,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -2091,12 +2137,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2104,12 +2150,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2117,17 +2163,17 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -2135,9 +2181,9 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2147,13 +2193,13 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2212,12 +2258,12 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2225,14 +2271,14 @@ } }, "node_modules/@aws-sdk/core/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -2268,16 +2314,46 @@ "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/core/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/core/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.840.0.tgz", - "integrity": "sha512-EzF6VcJK7XvQ/G15AVEfJzN2mNXU8fcVpXo4bRyr1S6t2q5zx6UPH/XjDbn18xyUmOq01t+r8gG+TmHEVo18fA==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.879.0.tgz", + "integrity": "sha512-JgG7A8SSbr5IiCYL8kk39Y9chdSB5GPwBorDW8V8mr19G9L+qd6ohED4fAocoNFaDnYJ5wGAHhCfSJjzcsPBVQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2285,12 +2361,12 @@ } }, "node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2298,12 +2374,12 @@ } }, "node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2311,9 +2387,9 @@ } }, "node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2323,20 +2399,20 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.840.0.tgz", - "integrity": "sha512-wbnUiPGLVea6mXbUh04fu+VJmGkQvmToPeTYdHE8eRZq3NRDi3t3WltT+jArLBKD/4NppRpMjf2ju4coMCz91g==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.879.0.tgz", + "integrity": "sha512-2hM5ByLpyK+qORUexjtYyDZsgxVCCUiJQZRMGkNXFEGz6zTpbjfTIWoh3zRgWHEBiqyPIyfEy50eIF69WshcuA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -2344,12 +2420,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2357,12 +2433,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2370,34 +2446,36 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -2418,18 +2496,18 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -2437,13 +2515,13 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2451,12 +2529,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2464,14 +2542,14 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2479,15 +2557,15 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2495,12 +2573,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2508,12 +2586,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2521,12 +2599,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -2535,12 +2613,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2548,12 +2626,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2561,17 +2639,17 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -2579,9 +2657,9 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2591,13 +2669,13 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2656,12 +2734,12 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2669,14 +2747,14 @@ } }, "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -2713,23 +2791,23 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.840.0.tgz", - "integrity": "sha512-7F290BsWydShHb+7InXd+IjJc3mlEIm9I0R57F/Pjl1xZB69MdkhVGCnuETWoBt4g53ktJd6NEjzm/iAhFXFmw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/credential-provider-env": "3.840.0", - "@aws-sdk/credential-provider-http": "3.840.0", - "@aws-sdk/credential-provider-process": "3.840.0", - "@aws-sdk/credential-provider-sso": "3.840.0", - "@aws-sdk/credential-provider-web-identity": "3.840.0", - "@aws-sdk/nested-clients": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.879.0.tgz", + "integrity": "sha512-07M8zfb73KmMBqVO5/V3Ea9kqDspMX0fO0kaI1bsjWI6ngnMye8jCE0/sIhmkVAI0aU709VA0g+Bzlopnw9EoQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.879.0", + "@aws-sdk/credential-provider-env": "3.879.0", + "@aws-sdk/credential-provider-http": "3.879.0", + "@aws-sdk/credential-provider-process": "3.879.0", + "@aws-sdk/credential-provider-sso": "3.879.0", + "@aws-sdk/credential-provider-web-identity": "3.879.0", + "@aws-sdk/nested-clients": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2737,12 +2815,12 @@ } }, "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2750,12 +2828,12 @@ } }, "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2763,12 +2841,12 @@ } }, "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2776,9 +2854,9 @@ } }, "node_modules/@aws-sdk/credential-provider-ini/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2788,22 +2866,22 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.840.0.tgz", - "integrity": "sha512-KufP8JnxA31wxklLm63evUPSFApGcH8X86z3mv9SRbpCm5ycgWIGVCTXpTOdgq6rPZrwT9pftzv2/b4mV/9clg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.840.0", - "@aws-sdk/credential-provider-http": "3.840.0", - "@aws-sdk/credential-provider-ini": "3.840.0", - "@aws-sdk/credential-provider-process": "3.840.0", - "@aws-sdk/credential-provider-sso": "3.840.0", - "@aws-sdk/credential-provider-web-identity": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.879.0.tgz", + "integrity": "sha512-FYaAqJbnSTrVL2iZkNDj2hj5087yMv2RN2GA8DJhe7iOJjzhzRojrtlfpWeJg6IhK0sBKDH+YXbdeexCzUJvtA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.879.0", + "@aws-sdk/credential-provider-http": "3.879.0", + "@aws-sdk/credential-provider-ini": "3.879.0", + "@aws-sdk/credential-provider-process": "3.879.0", + "@aws-sdk/credential-provider-sso": "3.879.0", + "@aws-sdk/credential-provider-web-identity": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2811,12 +2889,12 @@ } }, "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2824,12 +2902,12 @@ } }, "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2837,12 +2915,12 @@ } }, "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2850,9 +2928,9 @@ } }, "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2862,16 +2940,16 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.840.0.tgz", - "integrity": "sha512-HkDQWHy8tCI4A0Ps2NVtuVYMv9cB4y/IuD/TdOsqeRIAT12h8jDb98BwQPNLAImAOwOWzZJ8Cu0xtSpX7CQhMw==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.879.0.tgz", + "integrity": "sha512-7r360x1VyEt35Sm1JFOzww2WpnfJNBbvvnzoyLt7WRfK0S/AfsuWhu5ltJ80QvJ0R3AiSNbG+q/btG2IHhDYPQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2879,12 +2957,12 @@ } }, "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2892,12 +2970,12 @@ } }, "node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2905,12 +2983,12 @@ } }, "node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2918,9 +2996,9 @@ } }, "node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -2930,18 +3008,18 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.840.0.tgz", - "integrity": "sha512-2qgdtdd6R0Z1y0KL8gzzwFUGmhBHSUx4zy85L2XV1CXhpRNwV71SVWJqLDVV5RVWVf9mg50Pm3AWrUC0xb0pcA==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.879.0.tgz", + "integrity": "sha512-gd27B0NsgtKlaPNARj4IX7F7US5NuU691rGm0EUSkDsM7TctvJULighKoHzPxDQlrDbVI11PW4WtKS/Zg5zPlQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.840.0", - "@aws-sdk/core": "3.840.0", - "@aws-sdk/token-providers": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/client-sso": "3.879.0", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/token-providers": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2949,12 +3027,12 @@ } }, "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2962,12 +3040,12 @@ } }, "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2975,12 +3053,12 @@ } }, "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -2988,9 +3066,9 @@ } }, "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3000,16 +3078,16 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.840.0.tgz", - "integrity": "sha512-dpEeVXG8uNZSmVXReE4WP0lwoioX2gstk4RnUgrdUE3YaPq8A+hJiVAyc3h+cjDeIqfbsQbZm9qFetKC2LF9dQ==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.879.0.tgz", + "integrity": "sha512-Jy4uPFfGzHk1Mxy+/Wr43vuw9yXsE2yiF4e4598vc3aJfO0YtA2nSfbKD3PNKRORwXbeKqWPfph9SCKQpWoxEg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/nested-clients": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/nested-clients": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3017,12 +3095,12 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3030,12 +3108,12 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3043,9 +3121,9 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3216,22 +3294,22 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.840.0.tgz", - "integrity": "sha512-Kg/o2G6o72sdoRH0J+avdcf668gM1bp6O4VeEXpXwUj/urQnV5qiB2q1EYT110INHUKWOLXPND3sQAqh6sTqHw==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.879.0.tgz", + "integrity": "sha512-U1rcWToy2rlQPQLsx5h73uTC1XYo/JpnlJGCc3Iw7b1qrK8Mke4+rgMPKCfnXELD5TTazGrbT03frxH4Y1Ycvw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", "@smithy/is-array-buffer": "^4.0.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -3240,12 +3318,12 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3253,12 +3331,12 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3266,14 +3344,14 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -3294,14 +3372,14 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3309,15 +3387,15 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3325,12 +3403,12 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3338,12 +3416,12 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3351,12 +3429,12 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -3365,12 +3443,12 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3378,9 +3456,9 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3429,12 +3507,12 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3442,14 +3520,14 @@ } }, "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -3618,23 +3696,23 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.840.0.tgz", - "integrity": "sha512-rOUji7CayWN3O09zvvgLzDVQe0HiJdZkxoTS6vzOS3WbbdT7joGdVtAJHtn+x776QT3hHzbKU5gnfhel0o6gQA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@smithy/core": "^3.6.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.879.0.tgz", + "integrity": "sha512-ZTpLr2AbZcCsEzu18YCtB8Tp8tjAWHT0ccfwy3HiL6g9ncuSMW+7BVi1hDYmBidFwpPbnnIMtM0db3pDMR6/WA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-arn-parser": "3.873.0", + "@smithy/core": "^3.9.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/signature-v4": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -3643,12 +3721,24 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.873.0.tgz", + "integrity": "sha512-qag+VTqnJWDn8zTAXX4wiVioa0hZDQMtbZcGRERVnLar4/3/VIKBhxX2XibNQXFu1ufgcRn4YntT/XEPecFWcg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { @@ -3656,12 +3746,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3669,34 +3759,36 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -3717,18 +3809,18 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -3736,13 +3828,13 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3750,12 +3842,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3763,14 +3855,14 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3778,15 +3870,15 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3794,12 +3886,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3807,12 +3899,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3820,12 +3912,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -3834,12 +3926,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3847,12 +3939,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3860,17 +3952,17 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -3878,9 +3970,9 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -3890,13 +3982,13 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3955,12 +4047,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -3968,14 +4060,14 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -4038,17 +4130,17 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.840.0.tgz", - "integrity": "sha512-hiiMf7BP5ZkAFAvWRcK67Mw/g55ar7OCrvrynC92hunx/xhMkrgSLM0EXIZ1oTn3uql9kH/qqGF0nqsK6K555A==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.879.0.tgz", + "integrity": "sha512-DDSV8228lQxeMAFKnigkd0fHzzn5aauZMYC3CSj6e5/qE7+9OwpkUcjHfb7HZ9KWG6L2/70aKZXHqiJ4xKhOZw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.840.0", - "@smithy/core": "^3.6.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@smithy/core": "^3.9.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4056,12 +4148,12 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4069,12 +4161,12 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4082,34 +4174,36 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -4130,13 +4224,13 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4144,15 +4238,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4160,12 +4254,12 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4173,12 +4267,12 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -4187,9 +4281,9 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4250,12 +4344,12 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4263,14 +4357,14 @@ } }, "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -4307,47 +4401,47 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.840.0.tgz", - "integrity": "sha512-LXYYo9+n4hRqnRSIMXLBb+BLz+cEmjMtTudwK1BF6Bn2RfdDv29KuyeDRrPCS3TwKl7ZKmXUmE9n5UuHAPfBpA==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.879.0.tgz", + "integrity": "sha512-7+n9NpIz9QtKYnxmw1fHi9C8o0GrX8LbBR4D50c7bH6Iq5+XdSuL5AFOWWQ5cMD0JhqYYJhK/fJsVau3nUtC4g==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.840.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.840.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.840.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.840.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.6.0", - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-retry": "^4.1.14", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/middleware-host-header": "3.873.0", + "@aws-sdk/middleware-logger": "3.876.0", + "@aws-sdk/middleware-recursion-detection": "3.873.0", + "@aws-sdk/middleware-user-agent": "3.879.0", + "@aws-sdk/region-config-resolver": "3.873.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-endpoints": "3.879.0", + "@aws-sdk/util-user-agent-browser": "3.873.0", + "@aws-sdk/util-user-agent-node": "3.879.0", + "@smithy/config-resolver": "^4.1.5", + "@smithy/core": "^3.9.0", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/hash-node": "^4.0.5", + "@smithy/invalid-dependency": "^4.0.5", + "@smithy/middleware-content-length": "^4.0.5", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-retry": "^4.1.20", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.21", - "@smithy/util-defaults-mode-node": "^4.0.21", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "@smithy/util-defaults-mode-browser": "^4.0.27", + "@smithy/util-defaults-mode-node": "^4.0.27", + "@smithy/util-endpoints": "^3.0.7", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -4356,14 +4450,14 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", - "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.873.0.tgz", + "integrity": "sha512-KZ/W1uruWtMOs7D5j3KquOxzCnV79KQW9MjJFZM/M0l6KI8J6V3718MXxFHsTjUE4fpdV6SeCNLV1lwGygsjJA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4371,13 +4465,13 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-logger": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", - "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "version": "3.876.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.876.0.tgz", + "integrity": "sha512-cpWJhOuMSyz9oV25Z/CMHCBTgafDCbv7fHR80nlRrPdPZ8ETNsahwRgltXP1QJJ8r3X/c1kwpOR7tc+RabVzNA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4385,14 +4479,14 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", - "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.873.0.tgz", + "integrity": "sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4400,16 +4494,16 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", - "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.873.0.tgz", + "integrity": "sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -4417,12 +4511,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4430,24 +4524,24 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", - "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.873.0.tgz", + "integrity": "sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4455,34 +4549,36 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -4503,18 +4599,18 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -4522,13 +4618,13 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4536,12 +4632,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4549,14 +4645,14 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4564,15 +4660,15 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4580,12 +4676,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4593,12 +4689,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4606,12 +4702,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -4620,12 +4716,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4633,12 +4729,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4646,17 +4742,17 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -4664,9 +4760,9 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4676,13 +4772,13 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4741,12 +4837,12 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4754,14 +4850,14 @@ } }, "node_modules/@aws-sdk/nested-clients/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -4881,18 +4977,18 @@ } }, "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.840.0.tgz", - "integrity": "sha512-1jcrhVoSZjiAQJGNswI0RGR36/+OG6yTV42wQamHdNHk+/68dn9MGTUVr+58AEFOyEAPE/EvkiYRD6n5WkUjMg==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.879.0.tgz", + "integrity": "sha512-WNUrY4UW1ZAkBiSq9HnhJcG/1NdrEy37DDxqE8u0OdIZHhbgU1x1r4iXgQssAZhV6D+Ib70oiQGtPSH/lXeMKg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/signature-v4-multi-region": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-format-url": "3.840.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", + "@aws-sdk/signature-v4-multi-region": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@aws-sdk/util-format-url": "3.873.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/protocol-http": "^5.1.3", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4900,12 +4996,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4913,12 +5009,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -4926,34 +5022,36 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -4974,18 +5072,18 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -4993,13 +5091,13 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5007,12 +5105,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5020,14 +5118,14 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5035,15 +5133,15 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5051,12 +5149,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5064,12 +5162,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5077,12 +5175,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -5091,12 +5189,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5104,12 +5202,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5117,17 +5215,17 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -5135,9 +5233,9 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -5147,13 +5245,13 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5212,12 +5310,12 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5225,14 +5323,14 @@ } }, "node_modules/@aws-sdk/s3-request-presigner/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -5269,16 +5367,16 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.840.0.tgz", - "integrity": "sha512-8AoVgHrkSfhvGPtwx23hIUO4MmMnux2pjnso1lrLZGqxfElM6jm2w4jTNLlNXk8uKHGyX89HaAIuT0lL6dJj9g==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.879.0.tgz", + "integrity": "sha512-MDsw0EWOHyKac75X3gD8tLWtmPuRliS/s4IhWRhsdDCU13wewHIs5IlA5B65kT6ISf49yEIalEH3FHUSVqdmIQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/middleware-sdk-s3": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/protocol-http": "^5.1.3", + "@smithy/signature-v4": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5286,12 +5384,12 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5299,12 +5397,12 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5312,9 +5410,9 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -5324,17 +5422,17 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.840.0.tgz", - "integrity": "sha512-6BuTOLTXvmgwjK7ve7aTg9JaWFdM5UoMolLVPMyh3wTv9Ufalh8oklxYHUBIxsKkBGO2WiHXytveuxH6tAgTYg==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.879.0.tgz", + "integrity": "sha512-47J7sCwXdnw9plRZNAGVkNEOlSiLb/kR2slnDIHRK9NB/ECKsoqgz5OZQJ9E2f0yqOs8zSNJjn3T01KxpgW8Qw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.840.0", - "@aws-sdk/nested-clients": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.879.0", + "@aws-sdk/nested-clients": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5342,12 +5440,12 @@ } }, "node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5355,12 +5453,12 @@ } }, "node_modules/@aws-sdk/token-providers/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5368,12 +5466,12 @@ } }, "node_modules/@aws-sdk/token-providers/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5381,9 +5479,9 @@ } }, "node_modules/@aws-sdk/token-providers/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -5430,14 +5528,15 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.840.0.tgz", - "integrity": "sha512-eqE9ROdg/Kk0rj3poutyRCFauPDXIf/WSvCqFiRDDVi6QOnCv/M0g2XW8/jSvkJlOyaXkNCptapIp6BeeFFGYw==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.879.0.tgz", + "integrity": "sha512-aVAJwGecYoEmbEFju3127TyJDF9qJsKDUUTRMDuS8tGn+QiWQFnfInmbt+el9GU1gEJupNTXV+E3e74y51fb7A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "@smithy/util-endpoints": "^3.0.6", + "@aws-sdk/types": "3.862.0", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-endpoints": "^3.0.7", "tslib": "^2.6.2" }, "engines": { @@ -5445,12 +5544,25 @@ } }, "node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/querystring-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5458,11 +5570,25 @@ } }, "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints/node_modules/@smithy/url-parser": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5470,14 +5596,14 @@ } }, "node_modules/@aws-sdk/util-format-url": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.840.0.tgz", - "integrity": "sha512-VB1PWyI1TQPiPvg4w7tgUGGQER1xxXPNUqfh3baxUSFi1Oh8wHrDnFywkxLm3NMmgDmnLnSZ5Q326qAoyqKLSg==", + "version": "3.873.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.873.0.tgz", + "integrity": "sha512-v//b9jFnhzTKKV3HFTw2MakdM22uBAs2lBov51BWmFXuFtSTdBLrR7zgfetQPE3PVkFai0cmtJQPdc3MX+T/cQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.862.0", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5485,12 +5611,12 @@ } }, "node_modules/@aws-sdk/util-format-url/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5498,12 +5624,12 @@ } }, "node_modules/@aws-sdk/util-format-url/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -5512,9 +5638,9 @@ } }, "node_modules/@aws-sdk/util-format-url/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -5571,15 +5697,15 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.840.0.tgz", - "integrity": "sha512-Fy5JUEDQU1tPm2Yw/YqRYYc27W5+QD/J4mYvQvdWjUGZLB5q3eLFMGD35Uc28ZFoGMufPr4OCxK/bRfWROBRHQ==", + "version": "3.879.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.879.0.tgz", + "integrity": "sha512-A5KGc1S+CJRzYnuxJQQmH1BtGsz46AgyHkqReKfGiNQA8ET/9y9LQ5t2ABqnSBHHIh3+MiCcQSkUZ0S3rTodrQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/middleware-user-agent": "3.879.0", + "@aws-sdk/types": "3.862.0", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5595,12 +5721,12 @@ } }, "node_modules/@aws-sdk/util-user-agent-node/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "version": "3.862.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", + "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5608,14 +5734,14 @@ } }, "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5623,12 +5749,12 @@ } }, "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5636,12 +5762,12 @@ } }, "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -5649,9 +5775,9 @@ } }, "node_modules/@aws-sdk/util-user-agent-node/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -5737,10 +5863,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.5.tgz", - "integrity": "sha512-HLkYQfRICudzcOtjGwkPvGc5nF1b4ljLZh1IRDj50lRZ718NAKVgQpIAUX8bfg6u/yuSKY3L7E0YzIV+OxrB8Q==", - "dev": true, + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.0.tgz", + "integrity": "sha512-N4ntErOlKvcbTt01rr5wj3y55xnIdx1ymrfIr8C2WnM1Y9glFgWaGDEULJIazOX3XM9NRzhfJ6zZnQ1sBNWU+w==", "license": "MIT", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -5977,9 +6102,10 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", - "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", + "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", + "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -6028,9 +6154,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", - "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.6", @@ -6042,18 +6168,18 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", - "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", - "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" @@ -6098,9 +6224,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.29.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", - "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", + "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6119,12 +6245,12 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", - "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.14.0", + "@eslint/core": "^0.15.2", "levn": "^0.4.1" }, "engines": { @@ -6329,172 +6455,619 @@ "node": ">=10.0.0" } }, + "node_modules/@google-cloud/storage/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==", + "license": "MIT", + "optional": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@google-cloud/storage/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "license": "MIT", "optional": true, - "bin": { - "uuid": "dist/bin/uuid" + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@google-cloud/storage/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==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@graphql-tools/merge": { + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.24.tgz", + "integrity": "sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw==", + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^10.8.6", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/schema": { + "version": "10.0.23", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.23.tgz", + "integrity": "sha512-aEGVpd1PCuGEwqTXCStpEkmheTHNdMayiIKH1xDWqYp9i8yKv9FRDgkGrY4RD8TNxnf7iII+6KOBGaJ3ygH95A==", + "license": "MIT", + "dependencies": { + "@graphql-tools/merge": "^9.0.24", + "@graphql-tools/utils": "^10.8.6", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/utils": { + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "dset": "^3.1.4", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "license": "MIT", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.3.tgz", + "integrity": "sha512-FTXHdOoPbZrBjlVLHuKbDZnsTxXv2BlHF57xw6LuThXacXvtkahEPED0CKMk6obZDf65Hv4k3z62eyPNpvinIg==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", + "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0", + "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==", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", + "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.0" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz", + "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz", + "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", + "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz", + "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz", + "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", + "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz", + "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz", + "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz", + "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz", + "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@graphql-tools/merge": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.24.tgz", - "integrity": "sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw==", - "license": "MIT", - "dependencies": { - "@graphql-tools/utils": "^10.8.6", - "tslib": "^2.4.0" - }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz", + "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.0" } }, - "node_modules/@graphql-tools/schema": { - "version": "10.0.23", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.23.tgz", - "integrity": "sha512-aEGVpd1PCuGEwqTXCStpEkmheTHNdMayiIKH1xDWqYp9i8yKv9FRDgkGrY4RD8TNxnf7iII+6KOBGaJ3ygH95A==", - "license": "MIT", - "dependencies": { - "@graphql-tools/merge": "^9.0.24", - "@graphql-tools/utils": "^10.8.6", - "tslib": "^2.4.0" - }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz", + "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.0" } }, - "node_modules/@graphql-tools/utils": { - "version": "10.8.6", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", - "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", - "license": "MIT", - "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "@whatwg-node/promise-helpers": "^1.0.0", - "cross-inspect": "1.0.1", - "dset": "^3.1.4", - "tslib": "^2.4.0" - }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz", + "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16.0.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.0" } }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", - "license": "MIT", - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz", + "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.0" } }, - "node_modules/@grpc/grpc-js": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.3.tgz", - "integrity": "sha512-FTXHdOoPbZrBjlVLHuKbDZnsTxXv2BlHF57xw6LuThXacXvtkahEPED0CKMk6obZDf65Hv4k3z62eyPNpvinIg==", + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz", + "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==", + "cpu": [ + "x64" + ], "license": "Apache-2.0", "optional": true, - "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" - }, + "os": [ + "linux" + ], "engines": { - "node": ">=12.10.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.0" } }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", - "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz", + "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==", + "cpu": [ + "arm64" + ], "license": "Apache-2.0", "optional": true, - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + "funding": { + "url": "https://opencollective.com/libvips" }, - "engines": { - "node": ">=6" + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.0" } }, - "node_modules/@grpc/proto-loader/node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz", + "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==", + "cpu": [ + "x64" + ], "license": "Apache-2.0", - "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==", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.18.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.0" } }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "node_modules/@img/sharp-wasm32": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz", + "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@emnapi/runtime": "^1.4.4" }, "engines": { - "node": ">=18.18.0" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz", + "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=18.18" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://opencollective.com/libvips" } }, - "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==", + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz", + "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=12.22" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://opencollective.com/libvips" } }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", - "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", - "license": "Apache-2.0", + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz", + "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=18.18" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://opencollective.com/libvips" } }, "node_modules/@isaacs/cliui": { @@ -8195,6 +8768,12 @@ "node": ">=14" } }, + "node_modules/@posthog/core": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@posthog/core/-/core-1.0.2.tgz", + "integrity": "sha512-hWk3rUtJl2crQK0WNmwg13n82hnTwB99BT99/XI5gZSvIlYZ1TPmMZE8H2dhJJ98J/rm9vYJ/UXNzw3RV5HTpQ==", + "license": "MIT" + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -8484,15 +9063,15 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", - "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.5.tgz", + "integrity": "sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -8500,14 +9079,14 @@ } }, "node_modules/@smithy/config-resolver/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8515,12 +9094,12 @@ } }, "node_modules/@smithy/config-resolver/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8528,12 +9107,12 @@ } }, "node_modules/@smithy/config-resolver/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8541,9 +9120,9 @@ } }, "node_modules/@smithy/config-resolver/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8553,12 +9132,12 @@ } }, "node_modules/@smithy/config-resolver/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8584,15 +9163,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", - "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.7.tgz", + "integrity": "sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -8600,14 +9179,14 @@ } }, "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8615,12 +9194,12 @@ } }, "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8628,12 +9207,12 @@ } }, "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8641,12 +9220,12 @@ } }, "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8654,9 +9233,9 @@ } }, "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8666,13 +9245,13 @@ } }, "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8680,13 +9259,13 @@ } }, "node_modules/@smithy/eventstream-codec": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.4.tgz", - "integrity": "sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.5.tgz", + "integrity": "sha512-miEUN+nz2UTNoRYRhRqVTJCx7jMeILdAurStT2XoS+mhokkmz1xAPp95DFW9Gxt4iF2VBqpeF9HbTQ3kY1viOA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-hex-encoding": "^4.0.0", "tslib": "^2.6.2" }, @@ -8695,9 +9274,9 @@ } }, "node_modules/@smithy/eventstream-codec/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8719,13 +9298,13 @@ } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.4.tgz", - "integrity": "sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.5.tgz", + "integrity": "sha512-LCUQUVTbM6HFKzImYlSB9w4xafZmpdmZsOh9rIl7riPC3osCgGFVP+wwvYVw6pXda9PPT9TcEZxaq3XE81EdJQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/eventstream-serde-universal": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8733,9 +9312,9 @@ } }, "node_modules/@smithy/eventstream-serde-browser/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8745,12 +9324,12 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.2.tgz", - "integrity": "sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.3.tgz", + "integrity": "sha512-yTTzw2jZjn/MbHu1pURbHdpjGbCuMHWncNBpJnQAPxOVnFUAbSIUSwafiphVDjNV93TdBJWmeVAds7yl5QCkcA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8758,9 +9337,9 @@ } }, "node_modules/@smithy/eventstream-serde-config-resolver/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8770,13 +9349,13 @@ } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.4.tgz", - "integrity": "sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.5.tgz", + "integrity": "sha512-lGS10urI4CNzz6YlTe5EYG0YOpsSp3ra8MXyco4aqSkQDuyZPIw2hcaxDU82OUVtK7UY9hrSvgWtpsW5D4rb4g==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/eventstream-serde-universal": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8784,9 +9363,9 @@ } }, "node_modules/@smithy/eventstream-serde-node/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8796,13 +9375,13 @@ } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.4.tgz", - "integrity": "sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.5.tgz", + "integrity": "sha512-JFnmu4SU36YYw3DIBVao3FsJh4Uw65vVDIqlWT4LzR6gXA0F3KP0IXFKKJrhaVzCBhAuMsrUUaT5I+/4ZhF7aw==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/eventstream-codec": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8810,9 +9389,9 @@ } }, "node_modules/@smithy/eventstream-serde-universal/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8834,14 +9413,14 @@ } }, "node_modules/@smithy/hash-blob-browser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.4.tgz", - "integrity": "sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.5.tgz", + "integrity": "sha512-F7MmCd3FH/Q2edhcKd+qulWkwfChHbc9nhguBlVjSUE6hVHhec3q6uPQ+0u69S6ppvLtR3eStfCuEKMXBXhvvA==", "license": "Apache-2.0", "dependencies": { "@smithy/chunked-blob-reader": "^5.0.0", "@smithy/chunked-blob-reader-native": "^4.0.0", - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -8849,9 +9428,9 @@ } }, "node_modules/@smithy/hash-blob-browser/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8861,12 +9440,12 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", - "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.5.tgz", + "integrity": "sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" @@ -8888,9 +9467,9 @@ } }, "node_modules/@smithy/hash-node/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8926,12 +9505,12 @@ } }, "node_modules/@smithy/hash-stream-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.4.tgz", - "integrity": "sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.5.tgz", + "integrity": "sha512-IJuDS3+VfWB67UC0GU0uYBG/TA30w+PlOaSo0GPm9UHS88A6rCP6uZxNjNYiyRtOcjv7TXn/60cW8ox1yuZsLg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -8952,9 +9531,9 @@ } }, "node_modules/@smithy/hash-stream-node/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -8990,12 +9569,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", - "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.5.tgz", + "integrity": "sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9003,9 +9582,9 @@ } }, "node_modules/@smithy/invalid-dependency/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -9026,12 +9605,12 @@ } }, "node_modules/@smithy/md5-js": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.4.tgz", - "integrity": "sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.5.tgz", + "integrity": "sha512-8n2XCwdUbGr8W/XhMTaxILkVlw2QebkVTn5tm3HOcbPbOpWg89zr6dPXsH8xbeTsbTXlJvlJNTQsKAIoqQGbdA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -9052,9 +9631,9 @@ } }, "node_modules/@smithy/md5-js/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -9090,13 +9669,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", - "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.5.tgz", + "integrity": "sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9104,12 +9683,12 @@ } }, "node_modules/@smithy/middleware-content-length/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9117,9 +9696,9 @@ } }, "node_modules/@smithy/middleware-content-length/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -9147,18 +9726,19 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.1.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.14.tgz", - "integrity": "sha512-eoXaLlDGpKvdmvt+YBfRXE7HmIEtFF+DJCbTPwuLunP0YUnrydl+C4tS+vEM0+nyxXrX3PSUFqC+lP1+EHB1Tw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/service-error-classification": "^4.0.6", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "version": "4.1.20", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.20.tgz", + "integrity": "sha512-T3maNEm3Masae99eFdx1Q7PIqBBEVOvRd5hralqKZNeIivnoGNx5OFtI3DiZ5gCjUkl0mNondlzSXeVxkinh7Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.1.4", + "@smithy/protocol-http": "^5.1.3", + "@smithy/service-error-classification": "^4.0.7", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-retry": "^4.0.7", + "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -9167,12 +9747,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9180,34 +9760,36 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -9228,18 +9810,18 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -9247,13 +9829,13 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9261,12 +9843,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9274,14 +9856,14 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9289,15 +9871,15 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9305,12 +9887,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9318,12 +9900,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9331,12 +9913,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -9345,12 +9927,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9358,12 +9940,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9371,17 +9953,17 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -9389,9 +9971,9 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -9401,13 +9983,13 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9466,12 +10048,12 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9479,14 +10061,14 @@ } }, "node_modules/@smithy/middleware-retry/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -9625,21 +10207,21 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", - "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.7.tgz", + "integrity": "sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1" + "@smithy/types": "^4.3.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/service-error-classification/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -9661,16 +10243,16 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", - "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.3.tgz", + "integrity": "sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/util-middleware": "^4.0.5", "@smithy/util-uri-escape": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" @@ -9692,12 +10274,12 @@ } }, "node_modules/@smithy/signature-v4/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9705,9 +10287,9 @@ } }, "node_modules/@smithy/signature-v4/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -9742,12 +10324,12 @@ } }, "node_modules/@smithy/signature-v4/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9875,14 +10457,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.21", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.21.tgz", - "integrity": "sha512-wM0jhTytgXu3wzJoIqpbBAG5U6BwiubZ6QKzSbP7/VbmF1v96xlAbX2Am/mz0Zep0NLvLh84JT0tuZnk3wmYQA==", + "version": "4.0.27", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.27.tgz", + "integrity": "sha512-i/Fu6AFT5014VJNgWxKomBJP/GB5uuOsM4iHdcmplLm8B1eAqnRItw4lT2qpdO+mf+6TFmf6dGcggGLAVMZJsQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", "bowser": "^2.11.0", "tslib": "^2.6.2" }, @@ -9891,12 +10473,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9904,34 +10486,36 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -9952,18 +10536,18 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -9971,13 +10555,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9985,12 +10569,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -9998,14 +10582,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10013,15 +10597,15 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10029,12 +10613,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10042,12 +10626,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10055,12 +10639,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -10069,12 +10653,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10082,12 +10666,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10095,17 +10679,17 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -10113,9 +10697,9 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -10125,13 +10709,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10190,12 +10774,12 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10203,14 +10787,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -10247,17 +10831,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.21", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.21.tgz", - "integrity": "sha512-/F34zkoU0GzpUgLJydHY8Rxu9lBn8xQC/s/0M0U9lLBkYbA1htaAFjWYJzpzsbXPuri5D1H8gjp2jBum05qBrA==", + "version": "4.0.27", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.27.tgz", + "integrity": "sha512-3W0qClMyxl/ELqTA39aNw1N+pN0IjpXT7lPFvZ8zTxqVFP7XCpACB9QufmN4FQtd39xbgS7/Lekn7LmDa63I5w==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.1.4", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.5", - "@smithy/types": "^4.3.1", + "@smithy/config-resolver": "^4.1.5", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/property-provider": "^4.0.5", + "@smithy/smithy-client": "^4.5.0", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10265,12 +10849,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10278,34 +10862,36 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz", - "integrity": "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.9.0.tgz", + "integrity": "sha512-B/GknvCfS3llXd/b++hcrwIuqnEozQDnRL4sBmOac5/z/dr0/yG1PURNPOyU4Lsiy1IyTj8scPxVqRs5dYWf6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", + "@smithy/util-middleware": "^4.0.5", + "@smithy/util-stream": "^4.2.4", "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", + "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, @@ -10326,18 +10912,18 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz", - "integrity": "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==", + "version": "4.1.19", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.19.tgz", + "integrity": "sha512-EAlEPncqo03siNZJ9Tm6adKCQ+sw5fNU8ncxWwaH0zTCwMPsgmERTi6CEKaermZdgJb+4Yvh0NFm36HeO4PGgQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.9.0", + "@smithy/middleware-serde": "^4.0.9", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", + "@smithy/url-parser": "^4.0.5", + "@smithy/util-middleware": "^4.0.5", "tslib": "^2.6.2" }, "engines": { @@ -10345,13 +10931,13 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", + "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10359,12 +10945,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", + "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10372,14 +10958,14 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10387,15 +10973,15 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", + "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/querystring-builder": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10403,12 +10989,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10416,12 +11002,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", + "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10429,12 +11015,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", + "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, @@ -10443,12 +11029,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", + "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10456,12 +11042,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10469,17 +11055,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/smithy-client": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz", - "integrity": "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.5.0.tgz", + "integrity": "sha512-ZSdE3vl0MuVbEwJBxSftm0J5nL/gw76xp5WF13zW9cN18MFuFXD5/LV0QD8P+sCU5bSWGyy6CTgUupE1HhOo1A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.6.0", - "@smithy/middleware-endpoint": "^4.1.13", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.9.0", + "@smithy/middleware-endpoint": "^4.1.19", + "@smithy/middleware-stack": "^4.0.5", + "@smithy/protocol-http": "^5.1.3", + "@smithy/types": "^4.3.2", + "@smithy/util-stream": "^4.2.4", "tslib": "^2.6.2" }, "engines": { @@ -10487,9 +11073,9 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -10499,13 +11085,13 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", + "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10564,12 +11150,12 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", + "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10577,14 +11163,14 @@ } }, "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", + "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.1.1", + "@smithy/node-http-handler": "^4.1.1", + "@smithy/types": "^4.3.2", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", @@ -10621,13 +11207,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", - "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.7.tgz", + "integrity": "sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@smithy/node-config-provider": "^4.1.4", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10635,14 +11221,14 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", + "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10650,12 +11236,12 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", + "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10663,12 +11249,12 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", + "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10676,9 +11262,9 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -10711,13 +11297,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", - "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.7.tgz", + "integrity": "sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.0.6", - "@smithy/types": "^4.3.1", + "@smithy/service-error-classification": "^4.0.7", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10725,9 +11311,9 @@ } }, "node_modules/@smithy/util-retry/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -10778,13 +11364,13 @@ } }, "node_modules/@smithy/util-waiter": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.6.tgz", - "integrity": "sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.7.tgz", + "integrity": "sha512-mYqtQXPmrwvUljaHyGxYUIIRI3qjBTEb/f5QFi3A6VlxhpmZd5mWXn9W+qUkf2pVE1Hv3SqxefiZOPGdxmO64A==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.0.5", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10792,12 +11378,12 @@ } }, "node_modules/@smithy/util-waiter/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", + "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.3.2", "tslib": "^2.6.2" }, "engines": { @@ -10805,9 +11391,9 @@ } }, "node_modules/@smithy/util-waiter/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", + "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -10970,29 +11556,12 @@ "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", "license": "MIT", - "optional": true, - "dependencies": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "node_modules/@types/request/node_modules/form-data": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.3.tgz", - "integrity": "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.35", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.12" + "optional": true, + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" } }, "node_modules/@types/send": { @@ -11315,12 +11884,12 @@ } }, "node_modules/assert-options": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/assert-options/-/assert-options-0.8.2.tgz", - "integrity": "sha512-XaXoMxY0zuwAb0YuZjxIm8FeWvNq0aWNIbrzHhFjme8Smxw4JlPoyrAKQ6808k5UvQdhvnWqHZCphq5mXd4TDA==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/assert-options/-/assert-options-0.8.3.tgz", + "integrity": "sha512-s6v4HnA+vYSGO4eZX+F+I3gvF74wPk+m6Z1Q3w1Dsg4Pnv/R24vhKAasoMVZGvDpOOfTg1Qz4ptZnEbuy95XsQ==", "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=14.0.0" } }, "node_modules/assert-plus": { @@ -11410,13 +11979,13 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -12485,6 +13054,15 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/dijkstrajs": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", @@ -12492,9 +13070,9 @@ "license": "MIT" }, "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.1.tgz", + "integrity": "sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -12687,19 +13265,19 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/eslint": { - "version": "9.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", - "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", + "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.1", - "@eslint/config-helpers": "^0.2.1", - "@eslint/core": "^0.14.0", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.29.0", - "@eslint/plugin-kit": "^0.3.1", + "@eslint/js": "9.34.0", + "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -13029,9 +13607,9 @@ } }, "node_modules/express-rate-limit": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", - "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", "license": "MIT", "engines": { "node": ">= 16" @@ -13040,7 +13618,7 @@ "url": "https://github.com/sponsors/express-rate-limit" }, "peerDependencies": { - "express": "^4.11 || 5 || ^5.0.0-beta.1" + "express": ">= 4.11" } }, "node_modules/express/node_modules/media-typer": { @@ -13468,9 +14046,9 @@ } }, "node_modules/form-data": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", - "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -13670,63 +14248,6 @@ "node": ">=14" } }, - "node_modules/gcp-metadata": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", - "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", - "optional": true, - "peer": true, - "dependencies": { - "gaxios": "^5.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/gcp-metadata/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "optional": true, - "peer": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/gcp-metadata/node_modules/gaxios": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", - "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", - "optional": true, - "peer": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/gcp-metadata/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "optional": true, - "peer": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/generate-api-key": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/generate-api-key/-/generate-api-key-1.0.2.tgz", @@ -13969,27 +14490,27 @@ } }, "node_modules/googleapis": { - "version": "150.0.1", - "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-150.0.1.tgz", - "integrity": "sha512-9Wa9vm3WtDpss0VFBHsbZWcoRccpOSWdpz7YIfb1LBXopZJEg/Zc8ymmaSgvDkP4FhN+pqPS9nZjO7REAJWSUg==", + "version": "159.0.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-159.0.0.tgz", + "integrity": "sha512-halby2+lQwHNxUDk70aQNXP1BlBwdwr7svTJZvDi7vKwrWbVMKhVrZ86h8p3zRcWbO4qAgLQ4ODAf8TgD3DhGQ==", "license": "Apache-2.0", "dependencies": { - "google-auth-library": "^10.0.0-rc.1", - "googleapis-common": "^8.0.2-rc.0" + "google-auth-library": "^10.2.0", + "googleapis-common": "^8.0.0" }, "engines": { "node": ">=18" } }, "node_modules/googleapis-common": { - "version": "8.0.2-rc.0", - "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-8.0.2-rc.0.tgz", - "integrity": "sha512-JTcxRvmFa9Ec1uyfMEimEMeeKq1sHNZX3vn2qmoUMtnvixXXvcqTcbDZvEZXkEWpGlPlOf4joyep6/qs0BrLyg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-8.0.0.tgz", + "integrity": "sha512-66if47It7y+Sab3HMkwEXx1kCq9qUC9px8ZXoj1CMrmLmUw81GpbnsNlXnlyZyGbGPGcj+tDD9XsZ23m7GLaJQ==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", "gaxios": "^7.0.0-rc.4", - "google-auth-library": "^10.0.0-rc.1", + "google-auth-library": "^10.1.0", "qs": "^6.7.0", "url-template": "^2.0.8" }, @@ -13998,9 +14519,9 @@ } }, "node_modules/googleapis-common/node_modules/gaxios": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.0.tgz", - "integrity": "sha512-y1Q0MX1Ba6eg67Zz92kW0MHHhdtWksYckQy1KJsI6P4UlDQ8cvdvpLEPslD/k7vFkdPppMESFGTvk7XpSiKj8g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.1.tgz", + "integrity": "sha512-Odju3uBUJyVCkW64nLD4wKLhbh93bh6vIg/ZIXkWiLPBrdgtc65+tls/qml+un3pr6JqYVFDZbbmLDQT68rTOQ==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -14012,9 +14533,9 @@ } }, "node_modules/googleapis-common/node_modules/gcp-metadata": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.0.tgz", - "integrity": "sha512-3PfRTzvT3Msu0Hy8Gf9ypxJvaClG2IB9pyH0r8QOmRBW5mUcrHgYpF4GYP+XulDbfhxEhBYtJtJJQb5S2wM+LA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", + "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", "license": "Apache-2.0", "dependencies": { "gaxios": "^7.0.0", @@ -14075,9 +14596,9 @@ } }, "node_modules/googleapis/node_modules/gaxios": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.0.tgz", - "integrity": "sha512-y1Q0MX1Ba6eg67Zz92kW0MHHhdtWksYckQy1KJsI6P4UlDQ8cvdvpLEPslD/k7vFkdPppMESFGTvk7XpSiKj8g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.1.tgz", + "integrity": "sha512-Odju3uBUJyVCkW64nLD4wKLhbh93bh6vIg/ZIXkWiLPBrdgtc65+tls/qml+un3pr6JqYVFDZbbmLDQT68rTOQ==", "license": "Apache-2.0", "dependencies": { "extend": "^3.0.2", @@ -14089,9 +14610,9 @@ } }, "node_modules/googleapis/node_modules/gcp-metadata": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.0.tgz", - "integrity": "sha512-3PfRTzvT3Msu0Hy8Gf9ypxJvaClG2IB9pyH0r8QOmRBW5mUcrHgYpF4GYP+XulDbfhxEhBYtJtJJQb5S2wM+LA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", + "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", "license": "Apache-2.0", "dependencies": { "gaxios": "^7.0.0", @@ -14103,9 +14624,9 @@ } }, "node_modules/googleapis/node_modules/google-auth-library": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.1.0.tgz", - "integrity": "sha512-GspVjZj1RbyRWpQ9FbAXMKjFGzZwDKnUHi66JJ+tcjcu5/xYAP1pdlWotCuIkMwjfVsxxDvsGZXGLzRt72D0sQ==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.2.1.tgz", + "integrity": "sha512-HMxFl2NfeHYnaL1HoRIN1XgorKS+6CDaM+z9LSSN+i/nKDDL4KFFEWogMXu7jV4HZQy2MsxpY+wA5XIf3w410A==", "license": "Apache-2.0", "dependencies": { "base64-js": "^1.3.0", @@ -14559,34 +15080,6 @@ "resolved": "https://registry.npmjs.org/intersect/-/intersect-1.0.1.tgz", "integrity": "sha512-qsc720yevCO+4NydrJWgEWKccAQwTOvj2m73O/VBA6iUL2HGZJ9XqBiyraNrBXX/W1IAjdpXdRZk24sq8TzBRg==" }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "optional": true, - "peer": true, - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "optional": true, - "peer": true - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "optional": true, - "peer": true - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -14936,23 +15429,23 @@ } }, "node_modules/jasmine": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.8.0.tgz", - "integrity": "sha512-1V6HGa0+TMoMY20+/vp++RqLlL1noupV8awzV6CiPuICC0g7iKZ9z87zV2KyelRyoig0G1lHn7ueElXVMGVagg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-5.10.0.tgz", + "integrity": "sha512-v4FojO8cXQdx15mJXovGhjJOvyIcVf7AC+H0ZahnfLk52vUbwuLxjVgbikc95yLmgwKQsFT47/FGQ3dOrWVxtQ==", "dev": true, "license": "MIT", "dependencies": { "glob": "^10.2.2", - "jasmine-core": "~5.8.0" + "jasmine-core": "~5.10.0" }, "bin": { "jasmine": "bin/jasmine.js" } }, "node_modules/jasmine-core": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.8.0.tgz", - "integrity": "sha512-Q9dqmpUAfptwyueW3+HqBOkSuYd9I/clZSSfN97wXE/Nr2ROFNCwIBEC1F6kb3QXS9Fcz0LjFYSDQT+BiwjuhA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.10.0.tgz", + "integrity": "sha512-MrChbWV5LBo+EaeKwTM1eZ6oYSz1brvFExnRafraEkJkbJ9evbUxABhnIgGQimhpMxhg+BD6QmOvb/e3NXsNdg==", "dev": true, "license": "MIT" }, @@ -15630,9 +16123,9 @@ } }, "node_modules/mongodb": { - "version": "6.17.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.17.0.tgz", - "integrity": "sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.19.0.tgz", + "integrity": "sha512-H3GtYujOJdeKIMLKBT9PwlDhGrQfplABNF1G904w6r5ZXKWyv77aB0X9B+rhmaAwjtllHzaEkvi9mkGVZxs2Bw==", "license": "Apache-2.0", "dependencies": { "@mongodb-js/saslprep": "^1.1.9", @@ -15648,7 +16141,7 @@ "gcp-metadata": "^5.2.0", "kerberos": "^2.0.1", "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", + "snappy": "^7.3.2", "socks": "^2.7.1" }, "peerDependenciesMeta": { @@ -15737,9 +16230,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.1.tgz", - "integrity": "sha512-Ug8bXeTIUlxurg8xLTEskKShvcKDZALo1THEX5E41pYCD2sCVub5/kIRIGqWNoqV6szyLyQKV6mD4QUrWE5GCQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", @@ -15884,9 +16377,9 @@ "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" }, "node_modules/nodemailer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.4.tgz", - "integrity": "sha512-9O00Vh89/Ld2EcVCqJ/etd7u20UhME0f/NToPfArwPEe1Don1zy4mAIz6ariRr7mJ2RDxtaDzN0WJVdVXPtZaw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.6.tgz", + "integrity": "sha512-F44uVzgwo49xboqbFgBGkRaiMgtoBrBEWCVincJPK9+S9Adkzt/wXCLKbf7dxucmxfTI5gHGB+bEmdyzN6QKjw==", "license": "MIT-0", "engines": { "node": ">=6.0.0" @@ -16295,14 +16788,15 @@ } }, "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.1.1.tgz", + "integrity": "sha512-i8PyM2JnsNChVSYWLr2BAjNoLi0BAYC+wecOnZnVV+YSNJkzP7cWmvI34dk0WArWfH9KwBHNoZI3P3MppImlIA==", + "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "yocto-queue": "^1.2.1" }, "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -16322,6 +16816,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-locate/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==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate/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==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-map": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", @@ -16476,14 +16997,14 @@ } }, "node_modules/parse-server": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/parse-server/-/parse-server-8.2.1.tgz", - "integrity": "sha512-Z0k0a6UAmcbWTt21naacGDjNRNQpe3vrS+EM/cjSlXHPVAxYFnXuXK8R3kSCWKXU49tYkhep6A4KbtcFr2NsVw==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/parse-server/-/parse-server-8.2.4.tgz", + "integrity": "sha512-ebtdNwiRaMAOwn7lTixlH7K4EnpP97AA7iJhUPGsdohXfRkwViiAPvYJdb8eTeFCCcBP0+MwBFU7qgJd82RYjw==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@apollo/server": "4.12.0", - "@babel/eslint-parser": "7.27.1", + "@apollo/server": "4.12.1", + "@babel/eslint-parser": "7.28.0", "@graphql-tools/merge": "9.0.24", "@graphql-tools/schema": "10.0.23", "@graphql-tools/utils": "10.8.6", @@ -16494,7 +17015,7 @@ "cors": "2.8.5", "deepcopy": "2.1.0", "express": "5.1.0", - "express-rate-limit": "7.5.0", + "express-rate-limit": "7.5.1", "follow-redirects": "1.15.9", "graphql": "16.11.0", "graphql-list-fields": "2.0.4", @@ -16508,13 +17029,13 @@ "lodash": "4.17.21", "lru-cache": "10.4.0", "mime": "4.0.7", - "mongodb": "6.16.0", + "mongodb": "6.17.0", "mustache": "4.2.0", "otpauth": "9.4.0", "parse": "6.1.1", "path-to-regexp": "6.3.0", "pg-monitor": "3.0.0", - "pg-promise": "11.13.0", + "pg-promise": "11.14.0", "pluralize": "8.0.0", "punycode": "2.3.1", "rate-limit-redis": "4.2.0", @@ -16554,33 +17075,6 @@ "node": "18 || 20 || 22" } }, - "node_modules/parse-server/node_modules/@babel/eslint-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.1.tgz", - "integrity": "sha512-q8rjOuadH0V6Zo4XLMkJ3RMQ9MSBqwaDByyYB0izsYdaIWGNLmEblbCOf1vyFHICcg16CD7Fsi51vcQnYxmt6Q==", - "license": "MIT", - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/parse-server/node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/parse-server/node_modules/lru-cache": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.0.tgz", @@ -16590,13 +17084,13 @@ } }, "node_modules/parse-server/node_modules/mongodb": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.16.0.tgz", - "integrity": "sha512-D1PNcdT0y4Grhou5Zi/qgipZOYeWrhLEpk33n3nm6LGtz61jvO88WlrWCK/bigMjpnOdAUKKQwsGIl0NtWMyYw==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.17.0.tgz", + "integrity": "sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA==", "license": "Apache-2.0", "dependencies": { "@mongodb-js/saslprep": "^1.1.9", - "bson": "^6.10.3", + "bson": "^6.10.4", "mongodb-connection-string-url": "^3.0.0" }, "engines": { @@ -16769,23 +17263,23 @@ "license": "MIT" }, "node_modules/pg": { - "version": "8.15.5", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.15.5.tgz", - "integrity": "sha512-EpAhHFQc+aH9VfeffWIVC+XXk6lmAhS9W1FxtxcPXs94yxhrI1I6w/zkWfIOII/OkBv3Be04X3xMOj0kQ78l6w==", + "version": "8.16.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", + "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "license": "MIT", "peer": true, "dependencies": { - "pg-connection-string": "^2.8.5", - "pg-pool": "^3.9.5", - "pg-protocol": "^1.9.5", - "pg-types": "^2.1.0", - "pgpass": "1.x" + "pg-connection-string": "^2.9.1", + "pg-pool": "^3.10.1", + "pg-protocol": "^1.10.3", + "pg-types": "2.2.0", + "pgpass": "1.0.5" }, "engines": { - "node": ">= 8.0.0" + "node": ">= 16.0.0" }, "optionalDependencies": { - "pg-cloudflare": "^1.2.5" + "pg-cloudflare": "^1.2.7" }, "peerDependencies": { "pg-native": ">=3.0.1" @@ -16797,22 +17291,22 @@ } }, "node_modules/pg-cloudflare": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.5.tgz", - "integrity": "sha512-OOX22Vt0vOSRrdoUPKJ8Wi2OpE/o/h9T8X1s4qSkCedbNah9ei2W2765be8iMVxQUsvgT7zIAT2eIa9fs5+vtg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", + "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", "license": "MIT", "optional": true }, "node_modules/pg-connection-string": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.8.5.tgz", - "integrity": "sha512-Ni8FuZ8yAF+sWZzojvtLE2b03cqjO5jNULcHFfM9ZZ0/JXrgom5pBREbtnAw7oxsxJqHw9Nz/XWORUEL3/IFow==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", + "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==", "license": "MIT" }, "node_modules/pg-cursor": { - "version": "2.14.5", - "resolved": "https://registry.npmjs.org/pg-cursor/-/pg-cursor-2.14.5.tgz", - "integrity": "sha512-RvvMUhrgY5MqF6RhrOKK6n0184Ph9KqFLv3VAyUoJWO4c1JrQ/t7P5uszCXWlcNCLiiUBWkg7ZU63+1EgdpQFw==", + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/pg-cursor/-/pg-cursor-2.15.3.tgz", + "integrity": "sha512-eHw63TsiGtFEfAd7tOTZ+TLy+i/2ePKS20H84qCQ+aQ60pve05Okon9tKMC+YN3j6XyeFoHnaim7Lt9WVafQsA==", "license": "MIT", "peer": true, "peerDependencies": { @@ -16850,24 +17344,24 @@ } }, "node_modules/pg-pool": { - "version": "3.9.5", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.9.5.tgz", - "integrity": "sha512-DxyAlOgvUzRFpFAZjbCc8fUfG7BcETDHgepFPf724B0i08k9PAiZV1tkGGgQIL0jbMEuR9jW1YN7eX+WgXxCsQ==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", + "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", "license": "MIT", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-promise": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-11.13.0.tgz", - "integrity": "sha512-NWCsh1gnELfYRF5hNhfXPcSxuCk9C3FyM9MhmGkVTmepczAC2aXuBkyXhipVlHzp0V/IVzyCZOrlH48Ma3i7YQ==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-11.14.0.tgz", + "integrity": "sha512-x/HZ6hK0MxYllyfUbmN/XZc7JBYoow7KElyNW9hnlhgRHMiRZmRUtfNM/wcuElpjSoASPxkoIKi4IA5QlwOONA==", "license": "MIT", "dependencies": { - "assert-options": "0.8.2", + "assert-options": "0.8.3", "pg": "8.14.1", "pg-minify": "1.7.0", - "spex": "3.4.0" + "spex": "3.4.1" }, "engines": { "node": ">=14.0" @@ -16904,9 +17398,9 @@ } }, "node_modules/pg-protocol": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.9.5.tgz", - "integrity": "sha512-DYTWtWpfd5FOro3UnAfwvhD8jh59r2ig8bPtc9H8Ds7MscE/9NYruUQWFAOuraRl29jwcT2kyMFQ3MxeaVjUhg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", + "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", "license": "MIT" }, "node_modules/pg-query-stream": { @@ -17126,10 +17620,13 @@ } }, "node_modules/posthog-node": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.1.1.tgz", - "integrity": "sha512-6VISkNdxO24ehXiDA4dugyCSIV7lpGVaEu5kn/dlAj+SJ1lgcDru9PQ8p/+GSXsXVxohd1t7kHL2JKc9NoGb0w==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/posthog-node/-/posthog-node-5.8.1.tgz", + "integrity": "sha512-YJYlYnlpItVjHqM9IhvZx8TzK8gnx2nU+0uhiog4RN47NnV0Z0K1AdC4ul+O8VuvS/jHqKCQvL8iAONRA37+0A==", "license": "MIT", + "dependencies": { + "@posthog/core": "1.0.2" + }, "engines": { "node": ">=20" } @@ -17523,9 +18020,9 @@ } }, "node_modules/rate-limiter-flexible": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-7.1.1.tgz", - "integrity": "sha512-lsYRcqRSJrKBNt6pMzBJTiCJP5KnwsGWdObMZxd19JFUJRntM+yuHs4/2bs6NZweSLgpsDcykvzyQaumoslWQg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/rate-limiter-flexible/-/rate-limiter-flexible-7.2.0.tgz", + "integrity": "sha512-hrf0vIS/WOBegnHg+uPXxsXhuQYlNGfZiCmK5Wgudb12xlZUhpv9yD23yp/EW6BKQosshqnIQRQV+r3jyfIGQg==", "license": "ISC" }, "node_modules/raw-body": { @@ -17645,20 +18142,6 @@ "node": ">= 4" } }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/request/node_modules/qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", @@ -17985,16 +18468,108 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", "license": "(MIT AND BSD-3-Clause)", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" }, "bin": { "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sharp": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", + "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.4", + "semver": "^7.7.2" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.3", + "@img/sharp-darwin-x64": "0.34.3", + "@img/sharp-libvips-darwin-arm64": "1.2.0", + "@img/sharp-libvips-darwin-x64": "1.2.0", + "@img/sharp-libvips-linux-arm": "1.2.0", + "@img/sharp-libvips-linux-arm64": "1.2.0", + "@img/sharp-libvips-linux-ppc64": "1.2.0", + "@img/sharp-libvips-linux-s390x": "1.2.0", + "@img/sharp-libvips-linux-x64": "1.2.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", + "@img/sharp-libvips-linuxmusl-x64": "1.2.0", + "@img/sharp-linux-arm": "0.34.3", + "@img/sharp-linux-arm64": "0.34.3", + "@img/sharp-linux-ppc64": "0.34.3", + "@img/sharp-linux-s390x": "0.34.3", + "@img/sharp-linux-x64": "0.34.3", + "@img/sharp-linuxmusl-arm64": "0.34.3", + "@img/sharp-linuxmusl-x64": "0.34.3", + "@img/sharp-wasm32": "0.34.3", + "@img/sharp-win32-arm64": "0.34.3", + "@img/sharp-win32-ia32": "0.34.3", + "@img/sharp-win32-x64": "0.34.3" + } + }, + "node_modules/sharp/node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/sharp/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==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/sharp/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==", + "license": "MIT" + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/shebang-command": { @@ -18131,32 +18706,6 @@ "node": ">=10" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "optional": true, - "peer": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "optional": true, - "peer": true, - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -18238,9 +18787,9 @@ } }, "node_modules/spex": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/spex/-/spex-3.4.0.tgz", - "integrity": "sha512-8JeZJ7QlEBnSj1W1fKXgbB2KUPA8k4BxFMf6lZX/c1ZagU/1b9uZWZK0yD6yjfzqAIuTNG4YlRmtMpQiXuohsg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/spex/-/spex-3.4.1.tgz", + "integrity": "sha512-Br0Mu3S+c70kr4keXF+6K4B8ohR+aJjI9s7SbdsI3hliE1Riz4z+FQk7FQL+r7X1t90KPkpuKwQyITpCIQN9mg==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -18689,9 +19238,9 @@ "license": "MIT" }, "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.4.tgz", + "integrity": "sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==", "license": "MIT", "engines": { "node": ">=14.14" @@ -18701,7 +19250,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", - "dev": true, "license": "MIT", "dependencies": { "isarray": "^2.0.5", @@ -18716,7 +19264,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, "license": "MIT" }, "node_modules/to-regex-range": { @@ -18868,7 +19415,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -19590,11 +20136,12 @@ } }, "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==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" diff --git a/apps/OpenSignServer/package.json b/apps/OpenSignServer/package.json index 91695218b4..ddd0b69bc5 100644 --- a/apps/OpenSignServer/package.json +++ b/apps/OpenSignServer/package.json @@ -1,6 +1,6 @@ { "name": "open_sign_server", - "version": "2.21.1", + "version": "2.26.0", "description": "An example Parse API server using the parse-server module", "repository": { "type": "git", @@ -18,8 +18,8 @@ "watch": "nodemon index.js" }, "dependencies": { - "@aws-sdk/client-s3": "^3.840.0", - "@aws-sdk/s3-request-presigner": "^3.840.0", + "@aws-sdk/client-s3": "^3.879.0", + "@aws-sdk/s3-request-presigner": "^3.879.0", "@parse/fs-files-adapter": "^3.0.0", "@parse/s3-files-adapter": "^4.2.0", "@pdf-lib/fontkit": "^1.1.1", @@ -27,38 +27,40 @@ "@signpdf/signer-p12": "^3.2.4", "@signpdf/signpdf": "^3.2.5", "aws-sdk": "^2.1692.0", - "axios": "^1.10.0", + "axios": "^1.11.0", "coherentpdf": "^2.5.5", "cors": "^2.8.5", "date-fns-tz": "^3.2.0", - "dotenv": "^16.6.1", + "dotenv": "^17.2.1", "express": "^5.1.0", - "form-data": "^4.0.3", + "form-data": "^4.0.4", "generate-api-key": "^1.0.2", - "googleapis": "^150.0.1", + "googleapis": "^159.0.0", "libreoffice-convert": "^1.6.1", "mailgun.js": "^12.0.3", - "mongodb": "^6.17.0", - "multer": "^2.0.1", + "mongodb": "^6.19.0", + "multer": "^2.0.2", "multer-s3": "^3.0.1", "node-forge": "^1.3.1", - "nodemailer": "^7.0.4", + "nodemailer": "^7.0.6", + "p-limit": "^7.1.1", "parse": "^6.1.1", "parse-dbtool": "^1.2.0", - "parse-server": "^8.2.1", + "parse-server": "^8.2.4", "parse-server-api-mail-adapter": "^4.1.0", "pdf-lib": "^1.17.1", - "posthog-node": "^5.1.1", + "posthog-node": "^5.8.1", "qrcode": "^1.5.4", - "rate-limiter-flexible": "^7.1.1", + "rate-limiter-flexible": "^7.2.0", + "sharp": "^0.34.3", "speakeasy": "^2.0.0", "ws": "^8.18.3" }, "type": "module", "devDependencies": { - "@babel/eslint-parser": "^7.27.5", - "eslint": "^9.29.0", - "jasmine": "^5.8.0", + "@babel/eslint-parser": "^7.28.0", + "eslint": "^9.34.0", + "jasmine": "^5.10.0", "mongodb-runner": "^5.9.2", "nodemon": "^3.1.10", "nyc": "^17.1.0", @@ -66,7 +68,8 @@ }, "overrides": { "ws": "$ws", - "parse": "$parse" + "parse": "$parse", + "form-data": "$form-data" }, "engines": { "node": "18 || 20 || 22" diff --git a/apps/OpenSignServer/public/assets/images/parse-logo.png b/apps/OpenSignServer/public/assets/images/parse-logo.png index 17f2684db7..ac5141cb72 100644 Binary files a/apps/OpenSignServer/public/assets/images/parse-logo.png and b/apps/OpenSignServer/public/assets/images/parse-logo.png differ diff --git a/apps/OpenSignServer/spec/helper.js b/apps/OpenSignServer/spec/helper.js index a127c9e39e..4eb1fb45d5 100644 --- a/apps/OpenSignServer/spec/helper.js +++ b/apps/OpenSignServer/spec/helper.js @@ -1,7 +1,10 @@ import { startParseServer, stopParseServer, dropDB } from './utils/test-runner.js'; -beforeAll(async () => { - await startParseServer(); -}, 100 * 60 * 2); +beforeAll( + async () => { + await startParseServer(); + }, + 100 * 60 * 2 +); afterAll(async () => { await dropDB(); diff --git a/apps/OpenSignServer/utils/fileUtils.js b/apps/OpenSignServer/utils/fileUtils.js new file mode 100644 index 0000000000..3f76fed6ec --- /dev/null +++ b/apps/OpenSignServer/utils/fileUtils.js @@ -0,0 +1,77 @@ +function formatFixedDate(date = new Date()) { + const dd = String(date.getDate()).padStart(2, '0'); + const months = [ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec', + ]; + const mmm = months[date.getMonth()]; + const yyyy = String(date.getFullYear()); + let h = date.getHours(); + const ampm = h >= 12 ? 'PM' : 'AM'; + h = h % 12; + if (h === 0) h = 12; + const HH12 = String(h).padStart(2, '0'); + const MM = String(date.getMinutes()).padStart(2, '0'); + return `${dd}-${mmm}-${yyyy} ${HH12}:${MM} ${ampm}`; +} + +/** + * Remove characters not allowed in file names for major OSes. + */ +function sanitizeDownloadFilename(name) { + return name + .replace(/[\\/:*?"<>|\u0000-\u001F]/g, ' ') // reserved + control + .replace(/\s+/g, ' ') // collapse spaces + .trim(); +} + +/** + * Build filename using the selected format ID and runtime values. + * @param {string} formatId - One of FILENAME_FORMATS ids + * @param {object} ctx - { docName, email, date, ext, isSigned, datePattern } + * @returns {string} + */ +export function buildDownloadFilename(formatId, ctx) { + const { + docName = 'Document', + email = 'user@example.com', + date = new Date(), + ext = 'pdf', + isSigned = false, + } = ctx || {}; + + const base = sanitizeDownloadFilename(String(docName) || 'Document'); + const safeEmail = sanitizeDownloadFilename(String(email) || 'user@example.com'); + const dateStr = formatFixedDate(date); + + let stem; + switch (formatId) { + case 'DOCNAME': + stem = base; + break; + case 'DOCNAME_SIGNED': + stem = isSigned ? `${base} - Signed` : base; // if not signed, fallback to base + break; + case 'DOCNAME_EMAIL': + stem = `${base} - ${safeEmail}`; + break; + case 'DOCNAME_EMAIL_DATE': + stem = `${base} - ${safeEmail} - ${dateStr}`; + break; + default: + stem = base; // safe default + } + + const safeExt = ext.replace(/\.+/g, '').toLowerCase() || 'pdf'; + return `${stem}.${safeExt}`; +}