From a1d03ea0255dcae740d8d3c46b8d6655d474892f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 17:47:57 +0000 Subject: [PATCH 1/7] chore(deps): bump recharts from 2.12.6 to 2.12.7 (#1050) --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3d1f95dee..2594b7037 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "react-router": "^6.12.1", "react-router-dom": "^6.26.1", "react18-json-view": "^0.2.8", - "recharts": "^2.12.6", + "recharts": "^2.12.7", "redux": "^5.0.1", "redux-logger": "^3.0.6", "redux-thunk": "^2.2.0", @@ -23695,9 +23695,9 @@ } }, "node_modules/recharts": { - "version": "2.12.6", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.12.6.tgz", - "integrity": "sha512-D+7j9WI+D0NHauah3fKHuNNcRK8bOypPW7os1DERinogGBGaHI7i6tQKJ0aUF3JXyBZ63dyfKIW2WTOPJDxJ8w==", + "version": "2.12.7", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.12.7.tgz", + "integrity": "sha512-hlLJMhPQfv4/3NBSAyq3gzGg4h2v69RJh6KU7b3pXYNNAELs9kEoXOjbkxdXpALqKBoVmVptGfLpxdaVYqjmXQ==", "dependencies": { "clsx": "^2.0.0", "eventemitter3": "^4.0.1", @@ -44456,9 +44456,9 @@ } }, "recharts": { - "version": "2.12.6", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.12.6.tgz", - "integrity": "sha512-D+7j9WI+D0NHauah3fKHuNNcRK8bOypPW7os1DERinogGBGaHI7i6tQKJ0aUF3JXyBZ63dyfKIW2WTOPJDxJ8w==", + "version": "2.12.7", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.12.7.tgz", + "integrity": "sha512-hlLJMhPQfv4/3NBSAyq3gzGg4h2v69RJh6KU7b3pXYNNAELs9kEoXOjbkxdXpALqKBoVmVptGfLpxdaVYqjmXQ==", "requires": { "clsx": "^2.0.0", "eventemitter3": "^4.0.1", diff --git a/package.json b/package.json index f9aeef9c5..d23c9d72b 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "react-router": "^6.12.1", "react-router-dom": "^6.26.1", "react18-json-view": "^0.2.8", - "recharts": "^2.12.6", + "recharts": "^2.12.7", "redux": "^5.0.1", "redux-logger": "^3.0.6", "redux-thunk": "^2.2.0", From 46dfb607869c97e9bdb4da838345bf828e5bdcd4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 17:54:22 +0000 Subject: [PATCH 2/7] chore(deps): bump vite from 4.2.3 to 5.4.8 (#1046) --- package-lock.json | 853 +++++++++++++++++++++++++++++++++------------- package.json | 2 +- 2 files changed, 611 insertions(+), 244 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2594b7037..c13e3c552 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,7 @@ "ripple-address-codec": "^5.0.0", "topojson-client": "^3.0.0", "usehooks-ts": "^3.1.0", - "vite": "^4.2.3", + "vite": "^5.4.8", "vite-plugin-environment": "^1.1.3", "vite-plugin-html": "^3.2.0", "vite-plugin-svgr": "^4.2.0", @@ -5537,6 +5537,198 @@ } } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rushstack/eslint-patch": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz", @@ -6044,9 +6236,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "node_modules/@types/graceful-fs": { "version": "4.1.5", @@ -13983,6 +14175,7 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -22881,6 +23074,7 @@ }, "node_modules/path-parse": { "version": "1.0.7", + "dev": true, "license": "MIT" }, "node_modules/path-to-regexp": { @@ -22909,9 +23103,9 @@ "license": "MIT" }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -22973,9 +23167,9 @@ } }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "funding": [ { "type": "opencollective", @@ -22992,8 +23186,8 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -24022,6 +24216,7 @@ "version": "1.22.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -24202,17 +24397,36 @@ "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" }, "node_modules/rollup": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", - "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "dependencies": { + "@types/estree": "1.0.6" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", "fsevents": "~2.3.2" } }, @@ -25098,8 +25312,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "license": "BSD-3-Clause", + "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==", "engines": { "node": ">=0.10.0" } @@ -26052,6 +26267,7 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -27377,28 +27593,32 @@ } }, "node_modules/vite": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.3.tgz", - "integrity": "sha512-kLU+m2q0Y434Y1kCy3TchefAdtFso0ILi0dLyFV8Us3InXTU11H/B5ZTqCKIQHzSKNxVG/yEx813EA9f1imQ9A==", + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", + "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", "dependencies": { - "esbuild": "^0.17.5", - "postcss": "^8.4.21", - "resolve": "^1.22.1", - "rollup": "^3.18.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", + "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -27410,9 +27630,15 @@ "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -27576,10 +27802,25 @@ } } }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -27592,9 +27833,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -27607,9 +27848,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -27622,9 +27863,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -27637,9 +27878,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -27652,9 +27893,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -27667,9 +27908,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -27682,9 +27923,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -27697,9 +27938,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -27712,9 +27953,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -27727,9 +27968,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -27742,9 +27983,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -27757,9 +27998,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -27772,9 +28013,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -27787,9 +28028,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -27802,9 +28043,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -27817,9 +28058,9 @@ } }, "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -27832,9 +28073,9 @@ } }, "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -27847,9 +28088,9 @@ } }, "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -27862,9 +28103,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -27877,9 +28118,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -27892,9 +28133,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -27907,9 +28148,9 @@ } }, "node_modules/vite/node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -27918,34 +28159,35 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/vite/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, "optional": true, "os": [ @@ -32001,6 +32243,102 @@ "picomatch": "^2.3.1" } }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "optional": true + }, + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "optional": true + }, + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "optional": true + }, "@rushstack/eslint-patch": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz", @@ -32349,9 +32687,9 @@ } }, "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "@types/graceful-fs": { "version": "4.1.5", @@ -37826,6 +38164,7 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, "requires": { "hasown": "^2.0.0" } @@ -43952,7 +44291,8 @@ "dev": true }, "path-parse": { - "version": "1.0.7" + "version": "1.0.7", + "dev": true }, "path-to-regexp": { "version": "0.1.7" @@ -43974,9 +44314,9 @@ "dev": true }, "picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "picomatch": { "version": "2.3.1" @@ -44009,13 +44349,13 @@ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" }, "postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "requires": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" } }, "postcss-media-query-parser": { @@ -44692,6 +45032,7 @@ "version": "1.22.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, "requires": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -44815,10 +45156,27 @@ "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" }, "rollup": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", - "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", - "requires": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "requires": { + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", + "@types/estree": "1.0.6", "fsevents": "~2.3.2" }, "dependencies": { @@ -45415,7 +45773,9 @@ } }, "source-map-js": { - "version": "1.0.2" + "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==" }, "source-map-resolve": { "version": "0.5.3", @@ -46063,7 +46423,8 @@ } }, "supports-preserve-symlinks-flag": { - "version": "1.0.0" + "version": "1.0.0", + "dev": true }, "svg-parser": { "version": "2.0.4", @@ -46974,182 +47335,188 @@ } }, "vite": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.3.tgz", - "integrity": "sha512-kLU+m2q0Y434Y1kCy3TchefAdtFso0ILi0dLyFV8Us3InXTU11H/B5ZTqCKIQHzSKNxVG/yEx813EA9f1imQ9A==", + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", + "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", "requires": { - "esbuild": "^0.17.5", - "fsevents": "~2.3.2", - "postcss": "^8.4.21", - "resolve": "^1.22.1", - "rollup": "^3.18.0" + "esbuild": "^0.21.3", + "fsevents": "~2.3.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "dependencies": { + "@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "optional": true + }, "@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "optional": true }, "@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "optional": true }, "@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "optional": true }, "@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "optional": true }, "@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "optional": true }, "@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "optional": true }, "@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "optional": true }, "@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "optional": true }, "@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "optional": true }, "@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "optional": true }, "@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "optional": true }, "@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "optional": true }, "@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "optional": true }, "@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "optional": true }, "esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "requires": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "requires": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "optional": true } } diff --git a/package.json b/package.json index d23c9d72b..ced1dfd04 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "ripple-address-codec": "^5.0.0", "topojson-client": "^3.0.0", "usehooks-ts": "^3.1.0", - "vite": "^4.2.3", + "vite": "^5.4.8", "vite-plugin-environment": "^1.1.3", "vite-plugin-html": "^3.2.0", "vite-plugin-svgr": "^4.2.0", From f6bd85405f4591b01e0e17afbf4a8b958f87ef3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 18:25:53 +0000 Subject: [PATCH 3/7] chore(deps): bump debug from 4.3.6 to 4.3.7 (#1048) --- package-lock.json | 34 +++++++++++++++------------------- package.json | 2 +- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index c13e3c552..1ece46d36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,7 @@ "d3-geo": "^3.1.0", "d3-hexbin": "^0.2.2", "d3-scale": "^4.0.2", - "debug": "^4.3.6", + "debug": "^4.3.7", "dotenv": "^16.4.5", "enzyme": "3.11.0", "enzyme-adapter-react-17-updated": "^1.0.2", @@ -10099,11 +10099,11 @@ } }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -22262,8 +22262,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "license": "MIT" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/mv": { "version": "2.1.1", @@ -24674,10 +24675,6 @@ "node": ">= 0.8" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "license": "MIT" - }, "node_modules/send/node_modules/statuses": { "version": "2.0.1", "license": "MIT", @@ -35376,11 +35373,11 @@ } }, "debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "decamelize": { @@ -43763,7 +43760,9 @@ "requires": {} }, "ms": { - "version": "2.1.2" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "mv": { "version": "2.1.1", @@ -45340,9 +45339,6 @@ "depd": { "version": "2.0.0" }, - "ms": { - "version": "2.1.3" - }, "statuses": { "version": "2.0.1" } diff --git a/package.json b/package.json index ced1dfd04..722babc6b 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "d3-geo": "^3.1.0", "d3-hexbin": "^0.2.2", "d3-scale": "^4.0.2", - "debug": "^4.3.6", + "debug": "^4.3.7", "dotenv": "^16.4.5", "enzyme": "3.11.0", "enzyme-adapter-react-17-updated": "^1.0.2", From ade2d89c5a737bc77923df61d7e90f2006f139cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 18:34:53 +0000 Subject: [PATCH 4/7] chore(deps): bump @google-cloud/bigquery from 7.9.0 to 7.9.1 (#1049) --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1ece46d36..d31cafdc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "explorer", "version": "1.5.0", "dependencies": { - "@google-cloud/bigquery": "^7.9.0", + "@google-cloud/bigquery": "^7.9.1", "@paystring/utils": "^2.0.0", "@redux-devtools/extension": "^3.3.0", "@rollup/plugin-inject": "^5.0.5", @@ -2866,9 +2866,9 @@ } }, "node_modules/@google-cloud/bigquery": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-7.9.0.tgz", - "integrity": "sha512-KJTimGLDlAR1IfZ4Y8xhIVfoZ+XBXd0GGuJttLSXxtR0g+4vNsUt0xS33PRVa5TXey97374yU+uWNlCb5bHwBw==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-7.9.1.tgz", + "integrity": "sha512-ZkcRMpBoFLxIh6TiQBywA22yT3c2j0f07AHWEMjtYqMQzZQbFrpxuJU2COp3tyjZ91ZIGHe4gY7/dGZL88cltg==", "dependencies": { "@google-cloud/common": "^5.0.0", "@google-cloud/paginator": "^5.0.2", @@ -30383,9 +30383,9 @@ "dev": true }, "@google-cloud/bigquery": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-7.9.0.tgz", - "integrity": "sha512-KJTimGLDlAR1IfZ4Y8xhIVfoZ+XBXd0GGuJttLSXxtR0g+4vNsUt0xS33PRVa5TXey97374yU+uWNlCb5bHwBw==", + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@google-cloud/bigquery/-/bigquery-7.9.1.tgz", + "integrity": "sha512-ZkcRMpBoFLxIh6TiQBywA22yT3c2j0f07AHWEMjtYqMQzZQbFrpxuJU2COp3tyjZ91ZIGHe4gY7/dGZL88cltg==", "requires": { "@google-cloud/common": "^5.0.0", "@google-cloud/paginator": "^5.0.2", diff --git a/package.json b/package.json index 722babc6b..a9d5d7d5e 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "description": "XRPL Data Visualization", "version": "1.5.0", "dependencies": { - "@google-cloud/bigquery": "^7.9.0", + "@google-cloud/bigquery": "^7.9.1", "@paystring/utils": "^2.0.0", "@redux-devtools/extension": "^3.3.0", "@rollup/plugin-inject": "^5.0.5", From e1e37de1a2b82f5e44e617ee2b4b25d5f263ea3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 18:58:47 +0000 Subject: [PATCH 5/7] chore(deps-dev): bump @babel/preset-env from 7.25.3 to 7.25.7 (#1053) --- package-lock.json | 2050 ++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 1019 insertions(+), 1033 deletions(-) diff --git a/package-lock.json b/package-lock.json index d31cafdc1..0c886fb87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ }, "devDependencies": { "@babel/eslint-parser": "^7.22.6", - "@babel/preset-env": "^7.25.3", + "@babel/preset-env": "^7.25.7", "@babel/preset-react": "^7.24.7", "@types/create-hash": "^1.2.6", "@types/enzyme": "^3.10.12", @@ -152,11 +152,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/highlight": "^7.25.7", "picocolors": "^1.0.0" }, "engines": { @@ -164,9 +164,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", + "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", "engines": { "node": ">=6.9.0" } @@ -240,52 +240,52 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "dependencies": { - "@babel/types": "^7.25.0", + "@babel/types": "^7.25.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz", + "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -315,17 +315,17 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", - "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", + "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.0", + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/traverse": "^7.25.7", "semver": "^6.3.1" }, "engines": { @@ -345,13 +345,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", - "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz", + "integrity": "sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.25.7", + "regexpu-core": "^6.1.1", "semver": "^6.3.1" }, "engines": { @@ -387,39 +387,39 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", + "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -429,34 +429,34 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", + "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", - "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz", + "integrity": "sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-wrap-function": "^7.25.0", - "@babel/traverse": "^7.25.0" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-wrap-function": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -466,14 +466,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", - "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", + "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -483,25 +483,25 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", + "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -520,38 +520,38 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", - "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz", + "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==", "dev": true, "dependencies": { - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -571,11 +571,11 @@ } }, "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -585,11 +585,11 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", + "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", "dependencies": { - "@babel/types": "^7.25.2" + "@babel/types": "^7.25.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -599,13 +599,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", - "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz", + "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.3" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -615,12 +615,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", - "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz", + "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -630,12 +630,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.0", - "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.25.0.tgz", - "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", + "version": "7.25.7", + "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.25.7.tgz", + "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -645,14 +645,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz", + "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -662,13 +662,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", - "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz", + "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -893,12 +893,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", + "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -908,12 +908,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", + "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1087,12 +1087,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz", + "integrity": "sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1102,15 +1102,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", - "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz", + "integrity": "sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7", "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.0" + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1120,14 +1120,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz", + "integrity": "sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1137,12 +1137,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz", + "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1152,12 +1152,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", - "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz", + "integrity": "sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1167,13 +1167,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", - "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz", + "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1183,13 +1183,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz", + "integrity": "sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1200,16 +1200,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", - "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz", + "integrity": "sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.0", + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/traverse": "^7.25.7", "globals": "^11.1.0" }, "engines": { @@ -1220,13 +1220,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz", + "integrity": "sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/template": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1236,12 +1236,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", - "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz", + "integrity": "sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1251,13 +1251,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz", + "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1267,12 +1267,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz", + "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1282,13 +1282,13 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", - "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1298,12 +1298,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz", + "integrity": "sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1314,13 +1314,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz", + "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1330,12 +1330,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz", + "integrity": "sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1362,13 +1362,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz", + "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1378,14 +1378,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", - "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz", + "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.1" + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1395,12 +1395,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz", + "integrity": "sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1411,12 +1411,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", - "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz", + "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1426,12 +1426,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz", + "integrity": "sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1442,12 +1442,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz", + "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1457,13 +1457,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz", + "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1473,14 +1473,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", + "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1490,15 +1490,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", - "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz", + "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1508,13 +1508,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz", + "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1524,13 +1524,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1540,12 +1540,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz", + "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1555,12 +1555,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz", + "integrity": "sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1571,12 +1571,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz", + "integrity": "sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1587,15 +1587,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz", + "integrity": "sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" + "@babel/plugin-transform-parameters": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1605,13 +1605,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz", + "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1621,12 +1621,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz", + "integrity": "sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1637,13 +1637,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", - "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz", + "integrity": "sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1654,12 +1654,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", + "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1669,13 +1669,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", - "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", + "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1685,14 +1685,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz", + "integrity": "sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1703,12 +1703,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz", + "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1811,12 +1811,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz", + "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1827,12 +1827,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz", + "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1871,12 +1871,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz", + "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1886,13 +1886,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", + "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1902,12 +1902,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz", + "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1917,12 +1917,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz", + "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1932,12 +1932,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", - "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz", + "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1965,12 +1965,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz", + "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1980,13 +1980,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz", + "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -1996,13 +1996,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz", + "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -2012,13 +2012,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", - "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz", + "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -2028,28 +2028,28 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", - "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz", + "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-assertions": "^7.25.7", + "@babel/plugin-syntax-import-attributes": "^7.25.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -2061,60 +2061,60 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.0", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.0", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.25.0", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.8", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/plugin-transform-arrow-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.7", + "@babel/plugin-transform-async-to-generator": "^7.25.7", + "@babel/plugin-transform-block-scoped-functions": "^7.25.7", + "@babel/plugin-transform-block-scoping": "^7.25.7", + "@babel/plugin-transform-class-properties": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.7", + "@babel/plugin-transform-classes": "^7.25.7", + "@babel/plugin-transform-computed-properties": "^7.25.7", + "@babel/plugin-transform-destructuring": "^7.25.7", + "@babel/plugin-transform-dotall-regex": "^7.25.7", + "@babel/plugin-transform-duplicate-keys": "^7.25.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.7", + "@babel/plugin-transform-exponentiation-operator": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.7", + "@babel/plugin-transform-for-of": "^7.25.7", + "@babel/plugin-transform-function-name": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.7", + "@babel/plugin-transform-literals": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.7", + "@babel/plugin-transform-member-expression-literals": "^7.25.7", + "@babel/plugin-transform-modules-amd": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-modules-systemjs": "^7.25.7", + "@babel/plugin-transform-modules-umd": "^7.25.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-new-target": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7", + "@babel/plugin-transform-numeric-separator": "^7.25.7", + "@babel/plugin-transform-object-rest-spread": "^7.25.7", + "@babel/plugin-transform-object-super": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7", + "@babel/plugin-transform-parameters": "^7.25.7", + "@babel/plugin-transform-private-methods": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.7", + "@babel/plugin-transform-property-literals": "^7.25.7", + "@babel/plugin-transform-regenerator": "^7.25.7", + "@babel/plugin-transform-reserved-words": "^7.25.7", + "@babel/plugin-transform-shorthand-properties": "^7.25.7", + "@babel/plugin-transform-spread": "^7.25.7", + "@babel/plugin-transform-sticky-regex": "^7.25.7", + "@babel/plugin-transform-template-literals": "^7.25.7", + "@babel/plugin-transform-typeof-symbol": "^7.25.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.7", + "@babel/plugin-transform-unicode-property-regex": "^7.25.7", + "@babel/plugin-transform-unicode-regex": "^7.25.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.7", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.37.1", + "core-js-compat": "^3.38.1", "semver": "^6.3.1" }, "engines": { @@ -2141,13 +2141,13 @@ } }, "node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -2227,12 +2227,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, "node_modules/@babel/runtime": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", @@ -2245,28 +2239,28 @@ } }, "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2275,12 +2269,12 @@ } }, "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", + "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -8695,9 +8689,9 @@ "license": "BSD-2-Clause" }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "funding": [ { "type": "opencollective", @@ -8713,8 +8707,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" }, @@ -8894,9 +8888,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==", + "version": "1.0.30001666", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001666.tgz", + "integrity": "sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g==", "funding": [ { "type": "opencollective", @@ -9477,9 +9471,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz", - "integrity": "sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "dev": true, "dependencies": { "browserslist": "^4.23.3" @@ -10579,9 +10573,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.11", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.11.tgz", - "integrity": "sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew==" + "version": "1.5.31", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.31.tgz", + "integrity": "sha512-QcDoBbQeYt0+3CWcK/rEbuHvwpbT/8SV9T3OSgs6cX1FlcUAkgrkqbg9zLnDrMM/rLamzQwal4LYFCiWk861Tg==" }, "node_modules/emittery": { "version": "0.7.2", @@ -20807,13 +20801,14 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "license": "MIT", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-bigint": { @@ -23991,9 +23986,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "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, "dependencies": { "regenerate": "^1.4.2" @@ -24047,15 +24042,15 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", "dev": true, "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -24063,27 +24058,24 @@ "node": ">=4" } }, + "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 + }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.0.tgz", + "integrity": "sha512-vTbzVAjQDzwQdKuvj7qEq6OlAprCjE656khuGQ4QaBLg7abQ9I9ISpmLuc6inWe7zP75AECjqUa4g4sdQvOXhg==", "dev": true, "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/relateurl": { "version": "0.2.7", "license": "MIT", @@ -27270,9 +27262,9 @@ "devOptional": true }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "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, "engines": { "node": ">=4" @@ -27292,9 +27284,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "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, "engines": { "node": ">=4" @@ -28666,18 +28658,18 @@ } }, "@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "requires": { - "@babel/highlight": "^7.24.7", + "@babel/highlight": "^7.25.7", "picocolors": "^1.0.0" } }, "@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==" + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", + "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==" }, "@babel/core": { "version": "7.23.7", @@ -28731,43 +28723,43 @@ } }, "@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "requires": { - "@babel/types": "^7.25.0", + "@babel/types": "^7.25.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" } }, "@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", "dev": true, "requires": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.7" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz", + "integrity": "sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==", "dev": true, "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/helper-compilation-targets": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "requires": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-validator-option": "^7.24.8", - "browserslist": "^4.23.1", + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -28793,17 +28785,17 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", - "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", + "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.0", + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/traverse": "^7.25.7", "semver": "^6.3.1" }, "dependencies": { @@ -28816,13 +28808,13 @@ } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", - "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz", + "integrity": "sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.25.7", + "regexpu-core": "^6.1.1", "semver": "^6.3.1" }, "dependencies": { @@ -28848,88 +28840,88 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", + "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", "dev": true, "requires": { - "@babel/traverse": "^7.24.8", - "@babel/types": "^7.24.8" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/helper-module-transforms": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "requires": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.2" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" } }, "@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", + "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", "dev": true, "requires": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.7" } }, "@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==" + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", - "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz", + "integrity": "sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-wrap-function": "^7.25.0", - "@babel/traverse": "^7.25.0" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-wrap-function": "^7.25.7", + "@babel/traverse": "^7.25.7" } }, "@babel/helper-replace-supers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", - "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", + "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.24.8", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/traverse": "^7.25.7" } }, "@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", + "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", "dev": true, "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/helper-split-export-declaration": { @@ -28942,29 +28934,29 @@ } }, "@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==" + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==" }, "@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==" + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==" }, "@babel/helper-validator-option": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==" + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==" }, "@babel/helper-wrap-function": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", - "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz", + "integrity": "sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==", "dev": true, "requires": { - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/helpers": { @@ -28978,71 +28970,71 @@ } }, "@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "requires": { - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", + "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", "requires": { - "@babel/types": "^7.25.2" + "@babel/types": "^7.25.7" } }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", - "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz", + "integrity": "sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.3" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" } }, "@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", - "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz", + "integrity": "sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.0", - "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.25.0.tgz", - "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", + "version": "7.25.7", + "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.25.7.tgz", + "integrity": "sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz", + "integrity": "sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7" } }, "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", - "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz", + "integrity": "sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" } }, "@babel/plugin-proposal-class-properties": { @@ -29185,21 +29177,21 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz", + "integrity": "sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz", + "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-syntax-import-meta": { @@ -29305,165 +29297,165 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz", + "integrity": "sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", - "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.7.tgz", + "integrity": "sha512-4B6OhTrwYKHYYgcwErvZjbmH9X5TxQBsaBHdzEIB4l71gR5jh/tuHGlb9in47udL2+wVUcOz5XXhhfhVJwEpEg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7", "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/traverse": "^7.25.0" + "@babel/traverse": "^7.25.7" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz", + "integrity": "sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-remap-async-to-generator": "^7.25.7" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz", + "integrity": "sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", - "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz", + "integrity": "sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-class-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", - "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz", + "integrity": "sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.7.tgz", + "integrity": "sha512-rvUUtoVlkDWtDWxGAiiQj0aNktTPn3eFynBcMC2IhsXweehwgdI9ODe+XjWw515kEmv22sSOTp/rxIRuTiB7zg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-transform-classes": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", - "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz", + "integrity": "sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.0", + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/traverse": "^7.25.7", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz", + "integrity": "sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/template": "^7.25.7" } }, "@babel/plugin-transform-destructuring": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", - "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz", + "integrity": "sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz", + "integrity": "sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz", + "integrity": "sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", - "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.7.tgz", + "integrity": "sha512-UvcLuual4h7/GfylKm2IAA3aph9rwvAM2XBA0uPKU3lca+Maai4jBjjEVUS568ld6kJcgbouuumCBhMd/Yz17w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz", + "integrity": "sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.7.tgz", + "integrity": "sha512-h3MDAP5l34NQkkNulsTNyjdaR+OiB0Im67VU//sFupouP8Q6m9Spy7l66DcaAQxtmCqGdanPByLsnwFttxKISQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, @@ -29478,227 +29470,227 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz", + "integrity": "sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" } }, "@babel/plugin-transform-function-name": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", - "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz", + "integrity": "sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.1" + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/traverse": "^7.25.7" } }, "@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.7.tgz", + "integrity": "sha512-Ot43PrL9TEAiCe8C/2erAjXMeVSnE/BLEx6eyrKLNFCCw5jvhTHKyHxdI1pA0kz5njZRYAnMO2KObGqOCRDYSA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-transform-literals": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", - "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz", + "integrity": "sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.7.tgz", + "integrity": "sha512-iImzbA55BjiovLyG2bggWS+V+OLkaBorNvc/yJoeeDQGztknRnDdYfp2d/UPmunZYEnZi6Lg8QcTmNMHOB0lGA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz", + "integrity": "sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz", + "integrity": "sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", - "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", + "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.24.8", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-simple-access": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", - "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz", + "integrity": "sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "@babel/traverse": "^7.25.0" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz", + "integrity": "sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz", + "integrity": "sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz", + "integrity": "sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.7.tgz", + "integrity": "sha512-FbuJ63/4LEL32mIxrxwYaqjJxpbzxPVQj5a+Ebrc8JICV6YX8nE53jY+K0RZT3um56GoNWgkS2BQ/uLGTjtwfw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.7.tgz", + "integrity": "sha512-8CbutzSSh4hmD+jJHIA8vdTNk15kAzOnFLVVgBSMGr28rt85ouT01/rezMecks9pkU939wDInImwCKv4ahU4IA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.7.tgz", + "integrity": "sha512-1JdVKPhD7Y5PvgfFy0Mv2brdrolzpzSoUq2pr6xsR+m+3viGGeHEokFKsCgOkbeFOQxfB1Vt2F0cPJLRpFI4Zg==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" + "@babel/plugin-transform-parameters": "^7.25.7" } }, "@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz", + "integrity": "sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7" } }, "@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.7.tgz", + "integrity": "sha512-m9obYBA39mDPN7lJzD5WkGGb0GO54PPLXsbcnj1Hyeu8mSRz7Gb4b1A6zxNX32ZuUySDK4G6it8SDFWD1nCnqg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-transform-optional-chaining": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", - "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.7.tgz", + "integrity": "sha512-h39agClImgPWg4H8mYVAbD1qP9vClFbEjqoJmt87Zen8pjqK8FTPUwrOXAvqu5soytwxrLMd2fx2KSCp2CHcNg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz", + "integrity": "sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-private-methods": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", - "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz", + "integrity": "sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.7.tgz", + "integrity": "sha512-LzA5ESzBy7tqj00Yjey9yWfs3FKy4EmJyKOSWld144OxkTji81WWnUT8nkLUn+imN/zHL8ZQlOu/MTUAhHaX3g==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, "@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz", + "integrity": "sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-react-display-name": { @@ -29759,22 +29751,22 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz", + "integrity": "sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.7", "regenerator-transform": "^0.15.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz", + "integrity": "sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-runtime": { @@ -29800,49 +29792,49 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz", + "integrity": "sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz", + "integrity": "sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz", + "integrity": "sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz", + "integrity": "sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", - "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz", + "integrity": "sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.8" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-typescript": { @@ -29858,67 +29850,67 @@ } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz", + "integrity": "sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz", + "integrity": "sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz", + "integrity": "sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", - "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz", + "integrity": "sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/preset-env": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", - "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz", + "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-assertions": "^7.25.7", + "@babel/plugin-syntax-import-attributes": "^7.25.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -29930,60 +29922,60 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.0", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.0", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.25.0", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.8", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/plugin-transform-arrow-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.7", + "@babel/plugin-transform-async-to-generator": "^7.25.7", + "@babel/plugin-transform-block-scoped-functions": "^7.25.7", + "@babel/plugin-transform-block-scoping": "^7.25.7", + "@babel/plugin-transform-class-properties": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.7", + "@babel/plugin-transform-classes": "^7.25.7", + "@babel/plugin-transform-computed-properties": "^7.25.7", + "@babel/plugin-transform-destructuring": "^7.25.7", + "@babel/plugin-transform-dotall-regex": "^7.25.7", + "@babel/plugin-transform-duplicate-keys": "^7.25.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.7", + "@babel/plugin-transform-exponentiation-operator": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.7", + "@babel/plugin-transform-for-of": "^7.25.7", + "@babel/plugin-transform-function-name": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.7", + "@babel/plugin-transform-literals": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.7", + "@babel/plugin-transform-member-expression-literals": "^7.25.7", + "@babel/plugin-transform-modules-amd": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-modules-systemjs": "^7.25.7", + "@babel/plugin-transform-modules-umd": "^7.25.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-new-target": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7", + "@babel/plugin-transform-numeric-separator": "^7.25.7", + "@babel/plugin-transform-object-rest-spread": "^7.25.7", + "@babel/plugin-transform-object-super": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7", + "@babel/plugin-transform-parameters": "^7.25.7", + "@babel/plugin-transform-private-methods": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.7", + "@babel/plugin-transform-property-literals": "^7.25.7", + "@babel/plugin-transform-regenerator": "^7.25.7", + "@babel/plugin-transform-reserved-words": "^7.25.7", + "@babel/plugin-transform-shorthand-properties": "^7.25.7", + "@babel/plugin-transform-spread": "^7.25.7", + "@babel/plugin-transform-sticky-regex": "^7.25.7", + "@babel/plugin-transform-template-literals": "^7.25.7", + "@babel/plugin-transform-typeof-symbol": "^7.25.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.7", + "@babel/plugin-transform-unicode-property-regex": "^7.25.7", + "@babel/plugin-transform-unicode-regex": "^7.25.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.7", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.37.1", + "core-js-compat": "^3.38.1", "semver": "^6.3.1" }, "dependencies": { @@ -30001,13 +29993,13 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" } }, "babel-plugin-polyfill-regenerator": { @@ -30065,12 +30057,6 @@ "@babel/plugin-transform-typescript": "^7.21.3" } }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, "@babel/runtime": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", @@ -30080,36 +30066,36 @@ } }, "@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", - "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "requires": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", + "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", "requires": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" } }, @@ -34419,12 +34405,12 @@ "dev": true }, "browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "requires": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" } @@ -34540,9 +34526,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001651", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", - "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==" + "version": "1.0.30001666", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001666.tgz", + "integrity": "sha512-gD14ICmoV5ZZM1OdzPWmpx+q4GyefaK06zi8hmfHV5xe4/2nOQX3+Dw5o+fSqOws2xVwL9j+anOPFwHzdEdV4g==" }, "canvas": { "version": "2.11.2", @@ -34926,9 +34912,9 @@ "dev": true }, "core-js-compat": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz", - "integrity": "sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "dev": true, "requires": { "browserslist": "^4.23.3" @@ -35710,9 +35696,9 @@ } }, "electron-to-chromium": { - "version": "1.5.11", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.11.tgz", - "integrity": "sha512-R1CccCDYqndR25CaXFd6hp/u9RaaMcftMkphmvuepXr5b1vfLkRml6aWVeBhXJ7rbevHkKEMJtz8XqPf7ffmew==" + "version": "1.5.31", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.31.tgz", + "integrity": "sha512-QcDoBbQeYt0+3CWcK/rEbuHvwpbT/8SV9T3OSgs6cX1FlcUAkgrkqbg9zLnDrMM/rLamzQwal4LYFCiWk861Tg==" }, "emittery": { "version": "0.7.2", @@ -42776,7 +42762,9 @@ } }, "jsesc": { - "version": "2.5.2" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==" }, "json-bigint": { "version": "1.0.0", @@ -44872,9 +44860,9 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "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, "requires": { "regenerate": "^1.4.2" @@ -44915,34 +44903,32 @@ } }, "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", "dev": true, "requires": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" } }, + "regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.0.tgz", + "integrity": "sha512-vTbzVAjQDzwQdKuvj7qEq6OlAprCjE656khuGQ4QaBLg7abQ9I9ISpmLuc6inWe7zP75AECjqUa4g4sdQvOXhg==", "dev": true, "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } + "jsesc": "~3.0.2" } }, "relateurl": { @@ -47115,9 +47101,9 @@ "devOptional": true }, "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "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 }, "unicode-match-property-ecmascript": { @@ -47131,9 +47117,9 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "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 }, "unicode-property-aliases-ecmascript": { diff --git a/package.json b/package.json index a9d5d7d5e..f04822efe 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ }, "devDependencies": { "@babel/eslint-parser": "^7.22.6", - "@babel/preset-env": "^7.25.3", + "@babel/preset-env": "^7.25.7", "@babel/preset-react": "^7.24.7", "@types/create-hash": "^1.2.6", "@types/enzyme": "^3.10.12", From e7a89c90be6df38379ead3fa8b20b350b07201b4 Mon Sep 17 00:00:00 2001 From: Shawn Xie <35279399+shawnxie999@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:34:04 -0400 Subject: [PATCH 6/7] XLS-33 Multi Purpose token (#989) ## High Level Overview of Change - add MPT transactions: MPTokenIssuance, MPTokenIssuanceDestroy, MPTokenAuthorize, MPTokenIssuanceSet - add MPT page - support search by MPTID - updates transactions: Payment, Clawback - modified Currency to support MPTID ### Context of Change Spec: https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0033d-multi-purpose-tokens --- public/locales/ca-CA/translations.json | 25 ++- public/locales/en-US/translations.json | 25 ++- public/locales/es-ES/translations.json | 25 ++- public/locales/fr-FR/translations.json | 25 ++- public/locales/ja-JP/translations.json | 25 ++- public/locales/ko-KR/translations.json | 25 ++- .../test/AMMAccountHeader.test.tsx | 14 +- .../AccountAssetTab/AccountAssetTab.tsx | 11 +- .../AccountMPTTable/AccountMPTTable.tsx | 125 +++++++++++++++ .../test/AccountMPTRow.test.tsx | 63 ++++++++ .../test/AccountMPTTable.test.tsx | 114 ++++++++++++++ src/containers/App/index.tsx | 3 + src/containers/App/routes.ts | 8 +- src/containers/Header/Search.tsx | 12 +- src/containers/Header/test/Search.test.js | 4 + src/containers/Ledger/index.tsx | 4 +- src/containers/MPT/MPT.tsx | 75 +++++++++ src/containers/MPT/MPTHeader/Details.tsx | 48 ++++++ src/containers/MPT/MPTHeader/MPTHeader.tsx | 117 ++++++++++++++ src/containers/MPT/MPTHeader/Settings.tsx | 41 +++++ src/containers/MPT/MPTHeader/styles.scss | 144 ++++++++++++++++++ .../MPT/MPTHeader/test/Details.test.js | 58 +++++++ .../MPT/MPTHeader/test/MPTHeader.test.js | 82 ++++++++++ .../MPT/MPTHeader/test/Settings.test.js | 48 ++++++ src/containers/MPT/styles.scss | 15 ++ src/containers/MPT/test/MPT.test.js | 46 ++++++ src/containers/NFT/NFTHeader/NFTHeader.tsx | 4 +- .../Transactions/DetailTab/Meta/MPToken.jsx | 43 ++++++ .../DetailTab/Meta/MPTokenIssuance.jsx | 43 ++++++ .../DetailTab/Meta/RippleState.jsx | 7 +- .../Transactions/DetailTab/Meta/index.tsx | 6 + src/containers/Transactions/index.tsx | 9 +- .../Transactions/test/Description.test.tsx | 10 +- .../Transactions/test/DetailTab.test.tsx | 10 +- .../Transactions/test/Meta.test.tsx | 29 ++++ .../Transactions/test/SimpleTab.test.tsx | 16 +- .../test/mock_data/DirectMPTPayment.json | 95 ++++++++++++ src/containers/shared/Interfaces.tsx | 14 ++ src/containers/shared/analytics.ts | 1 + src/containers/shared/components/Amount.tsx | 51 ++++++- src/containers/shared/components/Currency.tsx | 56 ++++--- .../shared/components/MPTokenLink.tsx | 12 ++ .../shared/components/Tooltip/Tooltip.tsx | 3 + .../Transaction/Clawback/Description.tsx | 2 +- .../components/Transaction/Clawback/parser.ts | 38 ++++- .../Clawback/test/ClawbackSimple.test.tsx | 48 ++++++ .../Clawback/test/mock_data/ClawbackMPT.json | 85 +++++++++++ .../test/mock_data/ClawbackMPT_Failure.json | 46 ++++++ .../components/Transaction/Clawback/types.ts | 1 + .../Transaction/MPTokenAuthorize/Simple.tsx | 26 ++++ .../Transaction/MPTokenAuthorize/index.ts | 13 ++ .../test/MPTokenAuthorizeSimple.test.jsx | 66 ++++++++ .../test/mock_data/MPTokenAuthorize.json | 70 +++++++++ .../test/mock_data/MPTokenAuthorize_Fail.json | 49 ++++++ .../MPTokenAuthorize_WithHolder.json | 67 ++++++++ .../MPTokenAuthorize_WithHolderFail.json | 50 ++++++ .../Transaction/MPTokenAuthorize/types.ts | 6 + .../MPTokenIssuanceCreate/Simple.tsx | 63 ++++++++ .../MPTokenIssuanceCreate/index.ts | 15 ++ .../MPTokenIssuanceCreate/parser.ts | 21 +++ .../test/MPTokenIssuanceCreateSimple.test.jsx | 27 ++++ .../test/mock_data/MPTokenIssuanceCreate.json | 79 ++++++++++ .../MPTokenIssuanceCreate/types.ts | 16 ++ .../MPTokenIssuanceDestroy/Simple.tsx | 18 +++ .../MPTokenIssuanceDestroy/index.ts | 13 ++ .../MPTokenIssuanceDestroySimple.test.jsx | 29 ++++ .../mock_data/MPTokenIssuanceDestroy.json | 76 +++++++++ .../MPTokenIssuanceDestroy_Fail.json | 49 ++++++ .../MPTokenIssuanceDestroy/types.ts | 5 + .../Transaction/MPTokenIssuanceSet/Simple.tsx | 26 ++++ .../Transaction/MPTokenIssuanceSet/index.ts | 13 ++ .../test/MPTokenIssuanceSetSimple.test.jsx | 53 +++++++ .../test/mock_data/MPTokenIssuanceSet.json | 67 ++++++++ .../mock_data/MPTokenIssuanceSet_Fail.json | 50 ++++++ .../MPTokenIssuanceSet_NoHolder.json | 67 ++++++++ .../Transaction/MPTokenIssuanceSet/types.ts | 6 + .../Transaction/NFTokenAcceptOffer/types.ts | 4 +- .../test/NFTokenCancelOfferSimple.test.jsx | 18 ++- .../Transaction/NFTokenCreateOffer/types.ts | 4 +- .../Transaction/OfferCreate/parser.ts | 2 +- .../Transaction/OracleSet/parser.ts | 15 +- .../OracleSet/test/ConvertScalePrice.test.ts | 2 +- .../components/Transaction/Payment/parser.ts | 5 +- .../Payment/test/PaymentSimple.test.tsx | 35 +++++ .../Payment/test/mock_data/PaymentMPT.json | 91 +++++++++++ .../shared/components/Transaction/index.ts | 8 + .../Transaction/test/createWrapperFactory.tsx | 10 +- .../shared/components/Transaction/types.ts | 1 + .../test/TransactionTable.test.js | 26 ++-- .../shared/components/test/Amount.test.tsx | 36 +++++ .../shared/components/test/Currency.test.tsx | 22 +++ src/containers/shared/css/global.scss | 1 + src/containers/shared/css/variables.scss | 1 + src/containers/shared/transactionUtils.ts | 15 ++ src/containers/shared/types.ts | 10 +- src/containers/shared/utils.js | 59 ++++++- src/rippled/lib/rippled.js | 54 ++++++- src/rippled/lib/txSummary/formatAmount.ts | 28 +++- src/rippled/lib/utils.js | 45 +++++- 99 files changed, 3225 insertions(+), 118 deletions(-) create mode 100644 src/containers/Accounts/AccountMPTTable/AccountMPTTable.tsx create mode 100644 src/containers/Accounts/AccountMPTTable/test/AccountMPTRow.test.tsx create mode 100644 src/containers/Accounts/AccountMPTTable/test/AccountMPTTable.test.tsx create mode 100644 src/containers/MPT/MPT.tsx create mode 100644 src/containers/MPT/MPTHeader/Details.tsx create mode 100644 src/containers/MPT/MPTHeader/MPTHeader.tsx create mode 100644 src/containers/MPT/MPTHeader/Settings.tsx create mode 100644 src/containers/MPT/MPTHeader/styles.scss create mode 100644 src/containers/MPT/MPTHeader/test/Details.test.js create mode 100644 src/containers/MPT/MPTHeader/test/MPTHeader.test.js create mode 100644 src/containers/MPT/MPTHeader/test/Settings.test.js create mode 100644 src/containers/MPT/styles.scss create mode 100644 src/containers/MPT/test/MPT.test.js create mode 100644 src/containers/Transactions/DetailTab/Meta/MPToken.jsx create mode 100644 src/containers/Transactions/DetailTab/Meta/MPTokenIssuance.jsx create mode 100644 src/containers/Transactions/test/mock_data/DirectMPTPayment.json create mode 100644 src/containers/shared/components/MPTokenLink.tsx create mode 100644 src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT.json create mode 100644 src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT_Failure.json create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/Simple.tsx create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/index.ts create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/test/MPTokenAuthorizeSimple.test.jsx create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize.json create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_Fail.json create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolder.json create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolderFail.json create mode 100644 src/containers/shared/components/Transaction/MPTokenAuthorize/types.ts create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceCreate/index.ts create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceCreate/parser.ts create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/MPTokenIssuanceCreateSimple.test.jsx create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/mock_data/MPTokenIssuanceCreate.json create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceCreate/types.ts create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/Simple.tsx create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/index.ts create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/MPTokenIssuanceDestroySimple.test.jsx create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy.json create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy_Fail.json create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/types.ts create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceSet/Simple.tsx create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceSet/index.ts create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/MPTokenIssuanceSetSimple.test.jsx create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet.json create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_Fail.json create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_NoHolder.json create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceSet/types.ts create mode 100644 src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentMPT.json diff --git a/public/locales/ca-CA/translations.json b/public/locales/ca-CA/translations.json index d5e305960..a39916bf5 100644 --- a/public/locales/ca-CA/translations.json +++ b/public/locales/ca-CA/translations.json @@ -530,5 +530,28 @@ "last_update_time": null, "asset_class": null, "trading_pairs": null, - "deleted": null + "deleted": null, + "assets.mpt_tab_title": null, + "assets.no_mpts_message": null, + "transaction_type_name_MPTokenIssuanceCreate": null, + "transaction_type_name_MPTokenIssuanceDestroy": null, + "transaction_type_name_MPTokenIssuanceSet": null, + "transaction_type_name_MPTokenAuthorize": null, + "transaction_outstanding_balance_line_two": null, + "transaction_mptoken_line_one": null, + "transaction_mpt_issuance_line_one":null, + "mpt_issuance_id": null, + "asset_scale": null, + "metadata": null, + "max_amount": null, + "mpt_holder": null, + "check_mpt_id": null, + "outstanding_amount": null, + "locked": null, + "can_lock": null, + "require_auth": null, + "can_escrow": null, + "can_trade": null, + "can_transfer": null, + "can_clawback": null } diff --git a/public/locales/en-US/translations.json b/public/locales/en-US/translations.json index 369edfa7a..58453bb65 100644 --- a/public/locales/en-US/translations.json +++ b/public/locales/en-US/translations.json @@ -2,9 +2,11 @@ "action": "action", "assets": "Assets", "assets.nft_tab_title": "Non-Fungible Tokens", + "assets.mpt_tab_title": "Multi-Purpose Tokens", "assets.issued_tab_title": "Issued Tokens", "assets.no_issued_message": "No tokens found.", "assets.no_nfts_message": "No NFTs found.", + "assets.no_mpts_message": "No MPTs found.", "network": "Network", "amendments": "Amendments", "network_name": "Unknown Network", @@ -166,6 +168,10 @@ "transaction_type_name_EscrowCreate": "Escrow Create", "transaction_type_name_EscrowFinish": "Escrow Finish", "transaction_type_name_Invoke": "Invoke", + "transaction_type_name_MPTokenIssuanceCreate": "MPT Issuance Create", + "transaction_type_name_MPTokenIssuanceDestroy": "MPT Issuance Destroy", + "transaction_type_name_MPTokenIssuanceSet": "MPT Issuance Set", + "transaction_type_name_MPTokenAuthorize": "MPT Authorize", "transaction_type_name_NFTokenAcceptOffer": "NFT Accept Offer", "transaction_type_name_NFTokenBurn": "NFT Burn", "transaction_type_name_NFTokenCancelOffer": "NFT Cancel Offer", @@ -248,8 +254,11 @@ "node_meta_type": "It {{action}} a node with type", "transaction_balance_line_one": "It <1><0>{{action}} a <3><0>{{currency}} RippleState node between <5><0>{{account}} and <7><0>{{counterAccount}}", "transaction_balance_line_two": "Balance changed by <1><0>{{change}} from <3><0>{{previousBalance}} to <5><0>{{finalBalance}}", + "transaction_outstanding_balance_line_two": "Outstanding balance changed by <1><0>{{change}} from <3><0>{{previousBalance}} to <5><0>{{finalBalance}}", "transaction_owned_directory": "It {{action}} a DirectoryNode node owned by", "transaction_unowned_directory": "It {{action}} a DirectoryNode node", + "transaction_mptoken_line_one": "It <1><0>{{action}} an MPToken node of <3><0>{{account}}", + "transaction_mpt_issuance_line_one": "It <1><0>{{action}} an MPTokenIssuance node of <3><0>{{account}}", "owned_account_root": "It {{action}} the AccountRoot node of", "unowned_account_root": "It {{action}} the AccountRoot node", "account_balance_increased": "Balance increased by <1><0>{{difference}}<1><0>{{currency}} from <3><0>{{previous}}<1><0>{{currency}} to <5><0>{{final}}<1><0>{{currency}}", @@ -530,5 +539,19 @@ "last_update_time": "Last Update Time", "asset_class": "Asset Class", "trading_pairs": "Trading Pairs", - "deleted": "Deleted" + "deleted": "Deleted", + "mpt_issuance_id": "MPT Issuance ID", + "asset_scale": "Asset Scale", + "metadata": "Metadata", + "max_amount": "Max Amount", + "mpt_holder": "MPT Holder", + "check_mpt_id": "Please check your MPT Issuance ID", + "outstanding_amount": "Issued Amount", + "locked": "Locked", + "can_lock": "Can Lock", + "require_auth": "Require Auth", + "can_escrow": "Can Escrow", + "can_trade": "Can Trade", + "can_transfer": "Can Transfer", + "can_clawback": "Can Clawback" } diff --git a/public/locales/es-ES/translations.json b/public/locales/es-ES/translations.json index bde04d337..d694f1db3 100644 --- a/public/locales/es-ES/translations.json +++ b/public/locales/es-ES/translations.json @@ -526,5 +526,28 @@ "last_update_time": null, "asset_class": null, "trading_pairs": null, - "deleted": null + "deleted": null, + "assets.mpt_tab_title": null, + "assets.no_mpts_message": null, + "transaction_type_name_MPTokenIssuanceCreate": null, + "transaction_type_name_MPTokenIssuanceDestroy": null, + "transaction_type_name_MPTokenIssuanceSet": null, + "transaction_type_name_MPTokenAuthorize": null, + "transaction_outstanding_balance_line_two": null, + "transaction_mptoken_line_one": null, + "transaction_mpt_issuance_line_one":null, + "mpt_issuance_id": null, + "asset_scale": null, + "metadata": null, + "max_amount": null, + "mpt_holder": null, + "check_mpt_id": null, + "outstanding_amount": null, + "locked": null, + "can_lock": null, + "require_auth": null, + "can_escrow": null, + "can_trade": null, + "can_transfer": null, + "can_clawback": null } diff --git a/public/locales/fr-FR/translations.json b/public/locales/fr-FR/translations.json index 9cbdc4293..d6683c855 100644 --- a/public/locales/fr-FR/translations.json +++ b/public/locales/fr-FR/translations.json @@ -527,5 +527,28 @@ "last_update_time": null, "asset_class": null, "trading_pairs": null, - "deleted": null + "deleted": null, + "assets.mpt_tab_title": null, + "assets.no_mpts_message": null, + "transaction_type_name_MPTokenIssuanceCreate": null, + "transaction_type_name_MPTokenIssuanceDestroy": null, + "transaction_type_name_MPTokenIssuanceSet": null, + "transaction_type_name_MPTokenAuthorize": null, + "transaction_outstanding_balance_line_two": null, + "transaction_mptoken_line_one": null, + "transaction_mpt_issuance_line_one":null, + "mpt_issuance_id": null, + "asset_scale": null, + "metadata": null, + "max_amount": null, + "mpt_holder": null, + "check_mpt_id": null, + "outstanding_amount": null, + "locked": null, + "can_lock": null, + "require_auth": null, + "can_escrow": null, + "can_trade": null, + "can_transfer": null, + "can_clawback": null } diff --git a/public/locales/ja-JP/translations.json b/public/locales/ja-JP/translations.json index 953a54eba..9ed8133ee 100644 --- a/public/locales/ja-JP/translations.json +++ b/public/locales/ja-JP/translations.json @@ -526,5 +526,28 @@ "last_update_time": null, "asset_class": null, "trading_pairs": null, - "deleted": null + "deleted": null, + "assets.mpt_tab_title": null, + "assets.no_mpts_message": null, + "transaction_type_name_MPTokenIssuanceCreate": null, + "transaction_type_name_MPTokenIssuanceDestroy": null, + "transaction_type_name_MPTokenIssuanceSet": null, + "transaction_type_name_MPTokenAuthorize": null, + "transaction_outstanding_balance_line_two": null, + "transaction_mptoken_line_one": null, + "transaction_mpt_issuance_line_one":null, + "mpt_issuance_id": null, + "asset_scale": null, + "metadata": null, + "max_amount": null, + "mpt_holder": null, + "check_mpt_id": null, + "outstanding_amount": null, + "locked": null, + "can_lock": null, + "require_auth": null, + "can_escrow": null, + "can_trade": null, + "can_transfer": null, + "can_clawback": null } diff --git a/public/locales/ko-KR/translations.json b/public/locales/ko-KR/translations.json index 2094a1fe5..148714cd5 100644 --- a/public/locales/ko-KR/translations.json +++ b/public/locales/ko-KR/translations.json @@ -524,5 +524,28 @@ "last_update_time": null, "asset_class": null, "trading_pairs": null, - "deleted": null + "deleted": null, + "assets.mpt_tab_title": null, + "assets.no_mpts_message": null, + "transaction_type_name_MPTokenIssuanceCreate": null, + "transaction_type_name_MPTokenIssuanceDestroy": null, + "transaction_type_name_MPTokenIssuanceSet": null, + "transaction_type_name_MPTokenAuthorize": null, + "transaction_outstanding_balance_line_two": null, + "transaction_mptoken_line_one": null, + "transaction_mpt_issuance_line_one":null, + "mpt_issuance_id": null, + "asset_scale": null, + "metadata": null, + "max_amount": null, + "mpt_holder": null, + "check_mpt_id": null, + "outstanding_amount": null, + "locked": null, + "can_lock": null, + "require_auth": null, + "can_escrow": null, + "can_trade": null, + "can_transfer": null, + "can_clawback": null } diff --git a/src/containers/Accounts/AMM/AMMAccounts/AMMAccountHeader/test/AMMAccountHeader.test.tsx b/src/containers/Accounts/AMM/AMMAccounts/AMMAccountHeader/test/AMMAccountHeader.test.tsx index bc38fa370..74ad7ef95 100644 --- a/src/containers/Accounts/AMM/AMMAccounts/AMMAccountHeader/test/AMMAccountHeader.test.tsx +++ b/src/containers/Accounts/AMM/AMMAccounts/AMMAccountHeader/test/AMMAccountHeader.test.tsx @@ -1,20 +1,24 @@ import { mount } from 'enzyme' import { I18nextProvider } from 'react-i18next' import { MemoryRouter } from 'react-router' +import { QueryClientProvider } from 'react-query' import i18n from '../../../../../../i18n/testConfig' import { AMMAccountHeader, AmmDataType } from '../AMMAccountHeader' import { flushPromises } from '../../../../../test/utils' +import { queryClient } from '../../../../../shared/QueryClient' describe('AMM Account Header', () => { const TEST_ACCOUNT_ID = 'rTEST_ACCOUNT' const createWrapper = (state: AmmDataType) => mount( - - - - - , + + + + + + + , ) it('renders AMM account page', async () => { diff --git a/src/containers/Accounts/AccountAssetTab/AccountAssetTab.tsx b/src/containers/Accounts/AccountAssetTab/AccountAssetTab.tsx index c58f6e6da..2832e2834 100644 --- a/src/containers/Accounts/AccountAssetTab/AccountAssetTab.tsx +++ b/src/containers/Accounts/AccountAssetTab/AccountAssetTab.tsx @@ -5,6 +5,7 @@ import { useNavigate } from 'react-router' import { useRouteParams } from '../../shared/routing' import { AccountIssuedTokenTable } from '../AccountIssuedTokenTable' import { AccountNFTTable } from '../AccountNFTTable/AccountNFTTable' +import { AccountMPTTable } from '../AccountMPTTable/AccountMPTTable' import { ACCOUNT_ROUTE } from '../../App/routes' // TODO: Add state types or convert to react query @@ -12,11 +13,17 @@ interface Props { account: any } -const assetTypes = ['issued', 'nft'] +let assetTypes = ['issued', 'nft'] const AccountAssetTabDisconnected = ({ account }: Props) => { const { id: accountId = '', assetType = assetTypes[0] } = useRouteParams(ACCOUNT_ROUTE) + + const supportsMPT = ['mpt_sandbox', 'devnet'].includes( + process.env.VITE_ENVIRONMENT as string, + ) + if (supportsMPT) assetTypes = ['issued', 'nft', 'mpt'] + const navigate = useNavigate() const { t } = useTranslation() function switchAsset(event: ChangeEvent) { @@ -48,11 +55,13 @@ const AccountAssetTabDisconnected = ({ account }: Props) => { ) })} +
{assetType === 'issued' && ( )} {assetType === 'nft' && } + {assetType === 'mpt' && }
) diff --git a/src/containers/Accounts/AccountMPTTable/AccountMPTTable.tsx b/src/containers/Accounts/AccountMPTTable/AccountMPTTable.tsx new file mode 100644 index 000000000..d1ab69f6c --- /dev/null +++ b/src/containers/Accounts/AccountMPTTable/AccountMPTTable.tsx @@ -0,0 +1,125 @@ +import { useContext } from 'react' +import { useTranslation } from 'react-i18next' +import { useInfiniteQuery, useQuery } from 'react-query' +import { Loader } from '../../shared/components/Loader' +import SocketContext from '../../shared/SocketContext' +import { useAnalytics } from '../../shared/analytics' +import { EmptyMessageTableRow } from '../../shared/EmptyMessageTableRow' +import { getAccountMPTs, getMPTIssuance } from '../../../rippled/lib/rippled' +import { Account } from '../../shared/components/Account' +import { LoadMoreButton } from '../../shared/LoadMoreButton' +import { MPTokenLink } from '../../shared/components/MPTokenLink' +import { + formatMPTokenInfo, + formatMPTIssuanceInfo, +} from '../../../rippled/lib/utils' +import { MPTIssuanceFormattedInfo } from '../../shared/Interfaces' +import { convertScaledPrice } from '../../shared/utils' + +export interface AccountMPTTableProps { + accountId: string +} + +export const AccountMPTRow = ({ mpt }: any) => { + const rippledSocket = useContext(SocketContext) + const { trackException } = useAnalytics() + const { data: mptIssuanceData } = useQuery( + ['getMPTIssuanceScale', mpt.mptIssuanceID], + async () => { + const info = await getMPTIssuance(rippledSocket, mpt.mptIssuanceID) + return formatMPTIssuanceInfo(info) + }, + { + onError: (e: any) => { + trackException( + `mptIssuance ${mpt.mptIssuanceID} --- ${JSON.stringify(e)}`, + ) + }, + }, + ) + + if (!mptIssuanceData) return null + + const scale = mptIssuanceData?.assetScale ?? 0 + + return ( + + + + + + + + + {convertScaledPrice( + parseInt(mpt.mptAmount as string, 10).toString(16), + scale, + )} + + + ) +} + +export const AccountMPTTable = ({ accountId }: AccountMPTTableProps) => { + const rippledSocket = useContext(SocketContext) + const { trackException } = useAnalytics() + const { + data: pages, + isFetching: loading, + hasNextPage, + fetchNextPage, + } = useInfiniteQuery( + ['account_objects', accountId], + ({ pageParam = '' }) => + getAccountMPTs(rippledSocket, accountId, pageParam).catch( + (errorResponse) => { + const errorLocation = `account MPTs ${accountId} at ${pageParam}` + trackException( + `${errorLocation} --- ${JSON.stringify(errorResponse)}`, + ) + }, + ), + { + getNextPageParam: (data) => data.marker, + }, + ) + const { t } = useTranslation() + + function renderNoResults() { + return ( + + {t('assets.no_mpts_message')} + + ) + } + + const renderLoadMoreButton = () => + hasNextPage && fetchNextPage()} /> + + const mpts = pages?.pages + .flatMap((page: any) => page.account_objects) + .map((mpt) => formatMPTokenInfo(mpt)) + + return ( +
+ + + + + + + + + + {!loading && + (mpts?.length + ? mpts.map((mpt) => ( + + )) + : renderNoResults())} + +
{t('mpt_issuance_id')} {t('issuer')}{t('amount')}
+ {loading ? : renderLoadMoreButton()} +
+ ) +} diff --git a/src/containers/Accounts/AccountMPTTable/test/AccountMPTRow.test.tsx b/src/containers/Accounts/AccountMPTTable/test/AccountMPTRow.test.tsx new file mode 100644 index 000000000..04d9eb120 --- /dev/null +++ b/src/containers/Accounts/AccountMPTTable/test/AccountMPTRow.test.tsx @@ -0,0 +1,63 @@ +import { I18nextProvider } from 'react-i18next' +import { BrowserRouter } from 'react-router-dom' +import { mount } from 'enzyme' +import { QueryClientProvider } from 'react-query' +import { AccountMPTRow } from '../AccountMPTTable' +import i18n from '../../../../i18n/testConfig' +import { testQueryClient } from '../../../test/QueryClient' +import { getMPTIssuance } from '../../../../rippled/lib/rippled' +import { flushPromises } from '../../../test/utils' + +import Mock = jest.Mock + +jest.mock('../../../../rippled/lib/rippled', () => ({ + __esModule: true, + getMPTIssuance: jest.fn(), +})) + +const mockedFetMPTIssuance = getMPTIssuance as Mock + +const mptData = { + account: 'rw6UtpfBFaGht6SiC1HpDPNw6Yt25pKvnu', + flags: [], + mptIssuanceID: '000017C2CE76E3E3328AE9E0D80CDD68BA72CC8D8D053DB6', + mptIssuer: 'rKFgd9FNzwu7a7iVYa2Me4dmBC3zzUepSC', + mptAmount: '100', +} + +describe('AccountMPTRow', () => { + const createWrapper = (component: JSX.Element) => + mount( + + + {component} + + , + ) + + it('handles Account MPT row', async () => { + const issuanceData = { + node: { + AssetScale: 3, + }, + } + + mockedFetMPTIssuance.mockReset() + + mockedFetMPTIssuance.mockImplementation(() => + Promise.resolve({ ...issuanceData }), + ) + + const wrapper = createWrapper() + await flushPromises() + wrapper.update() + expect(wrapper.find('td').at(0).html()).toBe( + '000017C2CE76E3E3328AE9E0D80CDD68BA72CC8D8D053DB6', + ) + expect(wrapper.find('td').at(1).html()).toBe( + '', + ) + expect(wrapper.find('td').at(2).html()).toBe('0.100') + wrapper.unmount() + }) +}) diff --git a/src/containers/Accounts/AccountMPTTable/test/AccountMPTTable.test.tsx b/src/containers/Accounts/AccountMPTTable/test/AccountMPTTable.test.tsx new file mode 100644 index 000000000..5ad642fb2 --- /dev/null +++ b/src/containers/Accounts/AccountMPTTable/test/AccountMPTTable.test.tsx @@ -0,0 +1,114 @@ +import { mount } from 'enzyme' +import { QueryClientProvider } from 'react-query' +import { I18nextProvider } from 'react-i18next' +import { BrowserRouter } from 'react-router-dom' +import { getAccountMPTs } from '../../../../rippled/lib/rippled' +import { AccountMPTTable } from '../AccountMPTTable' +import i18n from '../../../../i18n/testConfig' +import { EmptyMessageTableRow } from '../../../shared/EmptyMessageTableRow' +import { testQueryClient } from '../../../test/QueryClient' +import { flushPromises } from '../../../test/utils' + +import Mock = jest.Mock + +jest.mock('../../../../rippled/lib/rippled', () => ({ + __esModule: true, + getAccountMPTs: jest.fn(), +})) + +const mockedGetAccountMPTs = getAccountMPTs as Mock + +const data = { + account: 'rw6UtpfBFaGht6SiC1HpDPNw6Yt25pKvnu', + account_objects: [ + { + Account: 'rw6UtpfBFaGht6SiC1HpDPNw6Yt25pKvnu', + Flags: 0, + LedgerEntryType: 'MPToken', + MPTAmount: '100', + MPTokenIssuanceID: '000017C2CE76E3E3328AE9E0D80CDD68BA72CC8D8D053DB6', + OwnerNode: '0', + PreviousTxnID: + '98646C9E7C6D7B8461DC92712B83EFF6CDA4203CE3FF3FF7E0B86FD57907949F', + PreviousTxnLgrSeq: 969, + index: '3BAA73912496683A414494218D3CCA33D02F80D588F80C1257C691448E00E486', + }, + ], + ledger_current_index: 970, + status: 'success', + validated: false, +} + +describe('AccountMPTTable component', () => { + const TEST_ACCOUNT_ID = 'rTEST_ACCOUNT' + + const createWrapper = () => + mount( + + + + + + + , + ) + + afterEach(() => { + mockedGetAccountMPTs.mockReset() + }) + + it('should render a table of mpts', async () => { + mockedGetAccountMPTs.mockReset() + + mockedGetAccountMPTs.mockImplementation(() => Promise.resolve(data)) + + const wrapper = createWrapper() + await flushPromises() + wrapper.update() + expect(wrapper.find('.load-more-btn')).not.toExist() + wrapper.unmount() + }) + + it('should handle load more', async () => { + mockedGetAccountMPTs.mockReset() + + mockedGetAccountMPTs.mockImplementation(() => + Promise.resolve({ + ...data, + marker: 'hello', + }), + ) + + const wrapper = createWrapper() + await flushPromises() + wrapper.update() + + expect(wrapper.find('.load-more-btn')).toExist() + wrapper.find('.load-more-btn').simulate('click') + expect(mockedGetAccountMPTs.mock.calls[1][2]).toEqual('hello') + wrapper.unmount() + }) + + it(`should handle no results`, async () => { + mockedGetAccountMPTs.mockReset() + + mockedGetAccountMPTs.mockImplementation(() => + Promise.resolve({ + account: 'rLEr9C6kwybj1BFE1iYbhJXNFVz8rnLu8C', + account_objects: [], + ledger_hash: + '7CC58622B7071E675AF63F39AAF81BDB4E87FDFEBB0BA8CE7D753F3C702D2886', + ledger_index: 6086, + validated: true, + marker: 'hello', + }), + ) + + const wrapper = createWrapper() + await flushPromises() + wrapper.update() + + expect(wrapper.find(EmptyMessageTableRow)).toExist() + wrapper.unmount() + }) +}) diff --git a/src/containers/App/index.tsx b/src/containers/App/index.tsx index d03150b9e..1b5734800 100644 --- a/src/containers/App/index.tsx +++ b/src/containers/App/index.tsx @@ -25,6 +25,7 @@ import { VALIDATOR_ROUTE, AMENDMENTS_ROUTE, AMENDMENT_ROUTE, + MPT_ROUTE, } from './routes' import { LedgersPage as Ledgers } from '../Ledgers' import { Ledger } from '../Ledger' @@ -39,6 +40,7 @@ import { legacyRedirect } from './legacyRedirects' import { useCustomNetworks } from '../shared/hooks' import { Amendments } from '../Amendments' import { Amendment } from '../Amendment' +import { MPT } from '../MPT/MPT' export const AppWrapper = () => { const mode = process.env.VITE_ENVIRONMENT @@ -72,6 +74,7 @@ export const AppWrapper = () => { [TOKEN_ROUTE, Token], [NFT_ROUTE, NFT], [AMENDMENT_ROUTE, Amendment], + [MPT_ROUTE, MPT], ] const redirect = legacyRedirect(basename, location) diff --git a/src/containers/App/routes.ts b/src/containers/App/routes.ts index a7ece5ec3..b94707689 100644 --- a/src/containers/App/routes.ts +++ b/src/containers/App/routes.ts @@ -3,7 +3,7 @@ import { RouteDefinition } from '../shared/routing' export const ACCOUNT_ROUTE: RouteDefinition<{ id?: string tab?: 'assets' | 'transactions' - assetType?: 'issued' | 'nfts' + assetType?: 'issued' | 'nfts' | 'mpts' }> = { path: '/accounts/:id?/:tab?/:assetType?', } @@ -66,3 +66,9 @@ export const AMENDMENT_ROUTE: RouteDefinition<{ }> = { path: `/amendment/:identifier`, } + +export const MPT_ROUTE: RouteDefinition<{ + id: string +}> = { + path: '/mpt/:id', +} diff --git a/src/containers/Header/Search.tsx b/src/containers/Header/Search.tsx index 98eed5b17..65f45e3f7 100644 --- a/src/containers/Header/Search.tsx +++ b/src/containers/Header/Search.tsx @@ -14,9 +14,10 @@ import { CURRENCY_REGEX, DECIMAL_REGEX, FULL_CURRENCY_REGEX, - HASH_REGEX, + HASH256_REGEX, VALIDATORS_REGEX, CTID_REGEX, + HASH192_REGEX, } from '../shared/utils' import './search.scss' import { isValidPayString } from '../../rippled/payString' @@ -30,6 +31,7 @@ import { TOKEN_ROUTE, TRANSACTION_ROUTE, VALIDATOR_ROUTE, + MPT_ROUTE, } from '../App/routes' const determineHashType = async (id: string, rippledContext: XrplClient) => { @@ -60,7 +62,7 @@ const getRoute = async ( path: buildPath(ACCOUNT_ROUTE, { id: normalizeAccount(id) }), } } - if (HASH_REGEX.test(id)) { + if (HASH256_REGEX.test(id)) { // Transactions and NFTs share the same syntax // We must make an api call to ensure if it's one or the other const type = await determineHashType(id, rippledContext) @@ -76,6 +78,12 @@ const getRoute = async ( type, } } + if (HASH192_REGEX.test(id)) { + return { + path: buildPath(MPT_ROUTE, { id: id.toUpperCase() }), + type: 'mpt', + } + } if (isValidXAddress(id) || isValidClassicAddress(id.split(':')[0])) { return { type: 'accounts', diff --git a/src/containers/Header/test/Search.test.js b/src/containers/Header/test/Search.test.js index c694eab6b..027075dfc 100644 --- a/src/containers/Header/test/Search.test.js +++ b/src/containers/Header/test/Search.test.js @@ -83,6 +83,8 @@ describe('Search component', () => { const nftoken = '000800011C7D8ED1D715A0017E41BF9499ECC17E7FB666320000099B00000000' + + const mptoken = '00002AF2588C244FE5F74BF48B5C5E2823235B243AA34634' const invalidString = '123invalid' // mock getNFTInfo api to test transactions and nfts @@ -167,6 +169,8 @@ describe('Search component', () => { // handle lower case ctid await testValue(ctid.toLowerCase(), `/transactions/${ctid}`) + + await testValue(mptoken, `/mpt/${mptoken}`) wrapper.unmount() }) diff --git a/src/containers/Ledger/index.tsx b/src/containers/Ledger/index.tsx index 840a6059d..a1ec8eea6 100644 --- a/src/containers/Ledger/index.tsx +++ b/src/containers/Ledger/index.tsx @@ -14,7 +14,7 @@ import { NOT_FOUND, BAD_REQUEST, DECIMAL_REGEX, - HASH_REGEX, + HASH256_REGEX, } from '../shared/utils' import LeftArrow from '../shared/images/ic_left_arrow.svg' @@ -69,7 +69,7 @@ export const Ledger = () => { } = useQuery(['ledger', identifier], () => { if ( !DECIMAL_REGEX.test(identifier.toString()) && - !HASH_REGEX.test(identifier.toString()) + !HASH256_REGEX.test(identifier.toString()) ) { return Promise.reject(BAD_REQUEST) } diff --git a/src/containers/MPT/MPT.tsx b/src/containers/MPT/MPT.tsx new file mode 100644 index 000000000..83e55e443 --- /dev/null +++ b/src/containers/MPT/MPT.tsx @@ -0,0 +1,75 @@ +import { FC, PropsWithChildren, useEffect, useState } from 'react' +import { useParams } from 'react-router' +import { Helmet } from 'react-helmet-async' +import NoMatch from '../NoMatch' +import { MPTHeader } from './MPTHeader/MPTHeader' +import { useAnalytics } from '../shared/analytics' +import { NOT_FOUND, BAD_REQUEST } from '../shared/utils' +import { ErrorMessage } from '../shared/Interfaces' +import './styles.scss' + +const ERROR_MESSAGES: { [code: number]: ErrorMessage } = { + [NOT_FOUND]: { + title: 'assets.no_mpts_message', + hints: ['check_mpt_id'], + }, + [BAD_REQUEST]: { + title: 'invalid_xrpl_address', + hints: ['check_mpt_id'], + }, +} + +const DEFAULT_ERROR: ErrorMessage = { + title: 'generic_error', + hints: ['not_your_fault'], +} + +const getErrorMessage = (error: any) => ERROR_MESSAGES[error] ?? DEFAULT_ERROR + +const Page: FC> = ({ + tokenId, + children, +}) => ( +
+ + {children} +
+) + +export const MPT = () => { + const { trackScreenLoaded } = useAnalytics() + const { id: tokenId = '' } = useParams<{ id: string }>() + const [error, setError] = useState(null) + + useEffect(() => { + trackScreenLoaded({ + mpt_issuance_id: tokenId, + }) + return () => { + window.scrollTo(0, 0) + } + }, [tokenId, trackScreenLoaded]) + + const renderError = () => { + const message = getErrorMessage(error) + return ( +
+ +
+ ) + } + + if (error) { + return {renderError()} + } + return ( + + {tokenId && } + {!tokenId && ( +
+

Enter a MPT Issuance ID in the search box

+
+ )} +
+ ) +} diff --git a/src/containers/MPT/MPTHeader/Details.tsx b/src/containers/MPT/MPTHeader/Details.tsx new file mode 100644 index 000000000..b980380c0 --- /dev/null +++ b/src/containers/MPT/MPTHeader/Details.tsx @@ -0,0 +1,48 @@ +import { useTranslation } from 'react-i18next' +import './styles.scss' +import { useLanguage } from '../../shared/hooks' +import { localizeNumber } from '../../shared/utils' +import { MPTIssuanceFormattedInfo } from '../../shared/Interfaces' +import { TokenTableRow } from '../../shared/components/TokenTableRow' + +interface Props { + data: MPTIssuanceFormattedInfo +} + +export const Details = ({ data }: Props) => { + const { + assetScale, + maxAmt, + outstandingAmt, + transferFee, + sequence, + metadata, + } = data + const { t } = useTranslation() + const language = useLanguage() + const formattedFee = + transferFee && + `${localizeNumber((transferFee / 1000).toPrecision(5), language, { + minimumFractionDigits: 3, + })}%` + + return ( + + + {assetScale && ( + + )} + {maxAmt && } + {outstandingAmt && ( + + )} + + + {metadata && } + +
+ ) +} diff --git a/src/containers/MPT/MPTHeader/MPTHeader.tsx b/src/containers/MPT/MPTHeader/MPTHeader.tsx new file mode 100644 index 000000000..354268991 --- /dev/null +++ b/src/containers/MPT/MPTHeader/MPTHeader.tsx @@ -0,0 +1,117 @@ +import { useEffect, useContext, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { useQuery } from 'react-query' +import { Loader } from '../../shared/components/Loader' +import './styles.scss' +import SocketContext from '../../shared/SocketContext' +import { Tooltip, TooltipInstance } from '../../shared/components/Tooltip' +import { BAD_REQUEST, HASH192_REGEX } from '../../shared/utils' +import { Account } from '../../shared/components/Account' +import { useAnalytics } from '../../shared/analytics' +import { getMPTIssuance } from '../../../rippled/lib/rippled' +import { formatMPTIssuanceInfo } from '../../../rippled/lib/utils' +import { MPTIssuanceFormattedInfo } from '../../shared/Interfaces' +import { Details } from './Details' +import { Settings } from './Settings' + +interface Props { + tokenId: string + setError: (error: number | null) => void +} + +export const MPTHeader = (props: Props) => { + const { t } = useTranslation() + const { tokenId, setError } = props + const rippledSocket = useContext(SocketContext) + const { trackException } = useAnalytics() + const [tooltip, setTooltip] = useState(undefined) + + const { data, isFetching: loading } = useQuery( + ['getMPTIssuance', tokenId], + async () => { + const info = await getMPTIssuance(rippledSocket, tokenId) + return formatMPTIssuanceInfo(info) + }, + { + onError: (e: any) => { + trackException(`mptIssuance ${tokenId} --- ${JSON.stringify(e)}`) + setError(e.code) + }, + }, + ) + + useEffect(() => { + if (!HASH192_REGEX.test(tokenId)) { + setError(BAD_REQUEST) + } + }, [setError, tokenId]) + + const showTooltip = (event: any, d: any) => { + setTooltip({ + data: d, + mode: 'mptId', + x: event.currentTarget.offsetLeft, + y: event.currentTarget.offsetTop, + }) + } + + const hideTooltip = () => { + setTooltip(undefined) + } + + const renderHeaderContent = () => { + const { issuer } = data! + + return ( +
+
+
+
{t('issuer_address')}
+
+
+ +
+
+
+
+
+
+

{t('details')}

+
+
+
+

{t('settings')}

+ +
+
+
+ ) + } + + return ( +
+
+ {!loading && ( +
+
+ MPT Issuance ID +
mpt
+
+
showTooltip(e, { tokenId })} + onFocus={() => {}} + onMouseLeave={hideTooltip} + > + {tokenId} +
+
+ )} +
+
+ {loading ? : renderHeaderContent()} +
+ +
+ ) +} diff --git a/src/containers/MPT/MPTHeader/Settings.tsx b/src/containers/MPT/MPTHeader/Settings.tsx new file mode 100644 index 000000000..8fadc5333 --- /dev/null +++ b/src/containers/MPT/MPTHeader/Settings.tsx @@ -0,0 +1,41 @@ +import './styles.scss' +import { useTranslation } from 'react-i18next' +import { TokenTableRow } from '../../shared/components/TokenTableRow' + +interface Props { + flags: string[] +} + +export const Settings = ({ flags }: Props) => { + const { t } = useTranslation() + + const locked = flags.includes('lsfMPTLocked') ? 'enabled' : 'disabled' + const canLock = flags.includes('lsfMPTCanLock') ? 'enabled' : 'disabled' + const requireAuth = flags.includes('lsfMPTRequireAuth') + ? 'enabled' + : 'disabled' + + const canEscrow = flags.includes('lsfMPTCanEscrow') ? 'enabled' : 'disabled' + const canTrade = flags.includes('lsfMPTCanTrade') ? 'enabled' : 'disabled' + const canTransfer = flags.includes('lsfMPTCanTransfer') + ? 'enabled' + : 'disabled' + + const canClawback = flags.includes('lsfMPTCanClawback') + ? 'enabled' + : 'disabled' + + return ( + + + + + + + + + + +
+ ) +} diff --git a/src/containers/MPT/MPTHeader/styles.scss b/src/containers/MPT/MPTHeader/styles.scss new file mode 100644 index 000000000..fc1b25e01 --- /dev/null +++ b/src/containers/MPT/MPTHeader/styles.scss @@ -0,0 +1,144 @@ +@import '../../shared/css/variables'; +@import '../../shared/css/table'; + +.mpt-header-container { + .mpt-bottom-container { + display: flex; + flex-direction: column; + padding-top: 64px; + + @include for-size(desktop-up) { + flex-direction: row; + padding-top: 80px; + } + + .details { + width: 100%; + @include for-size(desktop-up) { + width: 490px; + } + } + + .settings { + width: 100%; + @include for-size(desktop-up) { + width: 650px; + } + } + } + + .mpt-info-container { + display: flex; + flex-direction: column; + justify-content: space-between; + margin-top: 68px; + + @include for-size(desktop-up) { + flex-direction: row; + margin-top: 80px; + } + + .values { + display: flex; + flex-direction: row; + justify-content: space-between; + margin-bottom: 18px; + color: $white; + + @include for-size(desktop-up) { + flex-direction: column; + margin-bottom: 0; + } + + .title { + padding-bottom: 4px; + margin-bottom: 4.5px; + color: $black-40; + font-size: 14px; + text-transform: uppercase; + @include semibold; + } + + .value { + display: flex; + + .mpt-issuer { + margin: auto; + color: $white; + font-size: 18px; + font-style: normal; + line-height: 125%; + text-align: right; + text-decoration: none; + @include bold; + } + + .copy { + width: 24px; + height: 24px; + flex: none; + flex-grow: 0; + order: 1; + margin-left: 10px; + } + } + } + } +} + +.mpt-token-header { + width: 100%; + margin-bottom: 16px; + + .mpt-box-header { + display: flex; + flex-direction: column; + align-items: flex-start; + margin-top: 0; + text-align: left; + + .title-content { + overflow: hidden; + width: 100%; + min-width: 0; + min-height: 0; + padding-top: 0; + margin-top: 0; + margin-bottom: 0; + color: $white; + font-size: 24px; + text-overflow: ellipsis; + white-space: nowrap; + @include bold; + } + + .token-title { + display: flex; + flex-direction: row; + align-items: center; + padding-bottom: 4px; + color: $black-40; + font-size: 14px; + text-transform: uppercase; + + @include semibold; + + .badge { + background: $mpt; + color: $white; + } + } + + img { + width: 24px; + height: 24px; + margin-left: 16px; + object-fit: contain; + } + } + + .box-content { + min-height: 100px; + padding-bottom: 20px; + } +} diff --git a/src/containers/MPT/MPTHeader/test/Details.test.js b/src/containers/MPT/MPTHeader/test/Details.test.js new file mode 100644 index 000000000..9ccd42740 --- /dev/null +++ b/src/containers/MPT/MPTHeader/test/Details.test.js @@ -0,0 +1,58 @@ +import { mount } from 'enzyme' +import { I18nextProvider } from 'react-i18next' +import { BrowserRouter } from 'react-router-dom' +import { Details } from '../Details' +import i18n from '../../../../i18n/testConfig' + +describe('MPT Details container', () => { + const dataDefault = { + issuer: 'r3SnSE9frruxwsC9qGHFiUJShda62fNFGQ', + assetScale: 2, + maxAmt: '256', + outstandingAmt: '64', + transferFee: 3, + sequence: 3949, + metadata: 'https://www.google.com/', + flags: ['lsfMPTCanClawback', 'lsfMPTCanTransfer'], + } + + const createWrapper = (data = dataDefault) => + mount( + + +
+ + , + ) + + it('renders without crashing', () => { + const wrapper = createWrapper() + wrapper.unmount() + }) + + it('renders defined fields', () => { + const wrapper = createWrapper() + expect(wrapper.find('.row').length).toEqual(6) + + expect(wrapper.find('.row').at(0).html()).toBe( + 'asset_scale2', + ) + expect(wrapper.find('.row').at(1).html()).toBe( + 'max_amount256', + ) + expect(wrapper.find('.row').at(2).html()).toBe( + 'outstanding_amount64', + ) + expect(wrapper.find('.row').at(3).html()).toBe( + 'transfer_fee0.003%', + ) + expect(wrapper.find('.row').at(4).html()).toBe( + 'sequence_number_short3949', + ) + expect(wrapper.find('.row').at(5).html()).toBe( + 'metadatahttps://www.google.com/', + ) + + wrapper.unmount() + }) +}) diff --git a/src/containers/MPT/MPTHeader/test/MPTHeader.test.js b/src/containers/MPT/MPTHeader/test/MPTHeader.test.js new file mode 100644 index 000000000..295110078 --- /dev/null +++ b/src/containers/MPT/MPTHeader/test/MPTHeader.test.js @@ -0,0 +1,82 @@ +import { mount } from 'enzyme' +import { I18nextProvider } from 'react-i18next' +import { BrowserRouter } from 'react-router-dom' +import { useQuery, QueryClientProvider } from 'react-query' +import { MPTHeader } from '../MPTHeader' +import i18n from '../../../../i18n/testConfig' +import { queryClient } from '../../../shared/QueryClient' + +const data = { + issuer: 'r3SnSE9frruxwsC9qGHFiUJShda62fNFGQ', + assetScale: 2, + maxAmt: '100', + outstandingAmt: '64', + transferFee: 3, + sequence: 3949, + metadata: 'https://www.google.com/', + flags: ['lsfMPTCanClawback', 'lsfMPTCanTransfer'], +} + +jest.mock('react-query', () => ({ + ...jest.requireActual('react-query'), + useQuery: jest.fn(), +})) +const setError = jest.fn() + +describe('MPT header container', () => { + const createWrapper = () => + mount( + + + + + + + , + ) + + it('renders without crashing', async () => { + useQuery.mockImplementation(() => ({ + data, + isFetching: false, + })) + const wrapper = createWrapper() + wrapper.unmount() + }) + + it('renders MPT content', async () => { + useQuery.mockImplementation(() => ({ + data, + isFetching: false, + })) + const wrapper = createWrapper() + + expect( + wrapper + .text() + .includes('00000F6D5186FB5C90A8112419BED54193EDC7218835C6F5'), + ).toBe(true) + expect(wrapper.text().includes('r3SnSE9frruxwsC9qGHFiUJShda62fNFGQ')).toBe( + true, + ) + expect(wrapper.find('Settings').length).toBe(1) + expect(wrapper.find('Details').length).toBe(1) + wrapper.find('.title-content').first().simulate('mouseOver') + expect(wrapper.find('.tooltip').length).toBe(1) + wrapper.unmount() + }) + + it('renders loader', async () => { + useQuery.mockImplementation(() => ({ + data, + isFetching: true, + error: {}, + })) + const wrapper = createWrapper() + expect(wrapper.find('Loader').length).toEqual(1) + wrapper.unmount() + }) +}) diff --git a/src/containers/MPT/MPTHeader/test/Settings.test.js b/src/containers/MPT/MPTHeader/test/Settings.test.js new file mode 100644 index 000000000..a94ee80af --- /dev/null +++ b/src/containers/MPT/MPTHeader/test/Settings.test.js @@ -0,0 +1,48 @@ +import { mount } from 'enzyme' +import { I18nextProvider } from 'react-i18next' +import { Settings } from '../Settings' +import i18n from '../../../../i18n/testConfig' + +describe('MPT Setttings container', () => { + const flags = ['lsfMPTCanClawback', 'lsfMPTCanTransfer'] + + const createWrapper = () => + mount( + + + , + ) + + it('renders without crashing', () => { + const wrapper = createWrapper() + wrapper.unmount() + }) + + it('renders defined fields', () => { + const wrapper = createWrapper() + expect(wrapper.find('.row').length).toEqual(7) + + expect(wrapper.find('.row').at(0).html()).toBe( + 'lockeddisabled', + ) + expect(wrapper.find('.row').at(1).html()).toBe( + 'can_lockdisabled', + ) + expect(wrapper.find('.row').at(2).html()).toBe( + 'require_authdisabled', + ) + expect(wrapper.find('.row').at(3).html()).toBe( + 'can_escrowdisabled', + ) + expect(wrapper.find('.row').at(4).html()).toBe( + 'can_tradedisabled', + ) + expect(wrapper.find('.row').at(5).html()).toBe( + 'can_transferenabled', + ) + expect(wrapper.find('.row').at(6).html()).toBe( + 'can_clawbackenabled', + ) + wrapper.unmount() + }) +}) diff --git a/src/containers/MPT/styles.scss b/src/containers/MPT/styles.scss new file mode 100644 index 000000000..51c0c4fc3 --- /dev/null +++ b/src/containers/MPT/styles.scss @@ -0,0 +1,15 @@ +@import '../shared/css/variables'; + +.mpt-page { + width: 100%; + margin-top: 100px; + + .loader { + min-height: 100px; + } +} + +.mpt-warning { + font-size: 14px; + text-align: center; +} diff --git a/src/containers/MPT/test/MPT.test.js b/src/containers/MPT/test/MPT.test.js new file mode 100644 index 000000000..ae924fc10 --- /dev/null +++ b/src/containers/MPT/test/MPT.test.js @@ -0,0 +1,46 @@ +import * as React from 'react' +import { mount } from 'enzyme' +import { Route } from 'react-router-dom' +import { MPT } from '../MPT' +import i18n from '../../../i18n/testConfig' +import { QuickHarness } from '../../test/utils' +import { MPT_ROUTE } from '../../App/routes' + +describe('MPT container', () => { + const mptID = '00000F6D5186FB5C90A8112419BED54193EDC7218835C6F5' + + const createWrapper = (mpt = undefined) => + mount( + + } /> + , + ) + + it('renders without crashing', () => { + const wrapper = createWrapper(mptID) + wrapper.unmount() + }) + + it('renders children', () => { + const wrapper = createWrapper(mptID) + expect(wrapper.find('MPTHeader').length).toBe(1) + wrapper.unmount() + }) + + it('does not render when no mpt provided', () => { + const wrapper = createWrapper() + expect(wrapper.find('MPTHeader').length).toBe(0) + wrapper.unmount() + }) + + it('renders error', () => { + jest.mock('../MPTHeader/MPTHeader', () => ({ + NFTHeader: ({ setError }) => { + setError(404) + }, + })) + + const wrapper = createWrapper('something') + expect(wrapper.find('NoMatch').length).toBe(1) + }) +}) diff --git a/src/containers/NFT/NFTHeader/NFTHeader.tsx b/src/containers/NFT/NFTHeader/NFTHeader.tsx index 1a46f7ac6..d53e2c233 100644 --- a/src/containers/NFT/NFTHeader/NFTHeader.tsx +++ b/src/containers/NFT/NFTHeader/NFTHeader.tsx @@ -7,7 +7,7 @@ import SocketContext from '../../shared/SocketContext' import { Tooltip, TooltipInstance } from '../../shared/components/Tooltip' import { getNFTInfo, getAccountInfo } from '../../../rippled/lib/rippled' import { formatNFTInfo, formatAccountInfo } from '../../../rippled/lib/utils' -import { localizeDate, BAD_REQUEST, HASH_REGEX } from '../../shared/utils' +import { localizeDate, BAD_REQUEST, HASH256_REGEX } from '../../shared/utils' import { Details } from './Details' import { Settings } from './Settings' import { Account } from '../../shared/components/Account' @@ -56,7 +56,7 @@ export const NFTHeader = (props: Props) => { ) useEffect(() => { - if (!HASH_REGEX.test(tokenId)) { + if (!HASH256_REGEX.test(tokenId)) { setError(BAD_REQUEST) } }, [setError, tokenId]) diff --git a/src/containers/Transactions/DetailTab/Meta/MPToken.jsx b/src/containers/Transactions/DetailTab/Meta/MPToken.jsx new file mode 100644 index 000000000..b94856e40 --- /dev/null +++ b/src/containers/Transactions/DetailTab/Meta/MPToken.jsx @@ -0,0 +1,43 @@ +import { Trans } from 'react-i18next' +import { Account } from '../../../shared/components/Account' +import { computeMPTokenBalanceChange } from '../../../shared/utils' + +const render = (t, language, action, node, index) => { + const { previousBalance, finalBalance, account, change } = + computeMPTokenBalanceChange(node) + const previousBalanceStr = previousBalance.toString(10) + const finalBalanceStr = finalBalance.toString(10) + const changeStr = change.toString(10) + + const line1 = ( + + It {action} an MPToken node of + + + ) + + const line2 = + change !== BigInt(0) ? ( +
    +
  • + + Balance changed by + {changeStr} + from + {previousBalanceStr} + to + {finalBalanceStr} + +
  • +
+ ) : null + + return ( +
  • + {line1} + {line2} +
  • + ) +} + +export default render diff --git a/src/containers/Transactions/DetailTab/Meta/MPTokenIssuance.jsx b/src/containers/Transactions/DetailTab/Meta/MPTokenIssuance.jsx new file mode 100644 index 000000000..99305b59c --- /dev/null +++ b/src/containers/Transactions/DetailTab/Meta/MPTokenIssuance.jsx @@ -0,0 +1,43 @@ +import { Trans } from 'react-i18next' +import { Account } from '../../../shared/components/Account' +import { computeMPTIssuanceBalanceChange } from '../../../shared/utils' + +const render = (t, language, action, node, index) => { + const { previousBalance, finalBalance, account, change } = + computeMPTIssuanceBalanceChange(node) + const previousBalanceStr = previousBalance.toString(10) + const finalBalanceStr = finalBalance.toString(10) + const changeStr = change.toString(10) + + const line1 = ( + + It {action} an MPTokenIssuance node of + + + ) + + const line2 = + change !== BigInt(0) ? ( +
      +
    • + + Outstanding balance changed by + {changeStr} + from + {previousBalanceStr} + to + {finalBalanceStr} + +
    • +
    + ) : null + + return ( +
  • + {line1} + {line2} +
  • + ) +} + +export default render diff --git a/src/containers/Transactions/DetailTab/Meta/RippleState.jsx b/src/containers/Transactions/DetailTab/Meta/RippleState.jsx index 6d50ce114..2ea9539eb 100644 --- a/src/containers/Transactions/DetailTab/Meta/RippleState.jsx +++ b/src/containers/Transactions/DetailTab/Meta/RippleState.jsx @@ -1,6 +1,9 @@ import { Trans } from 'react-i18next' import { Account } from '../../../shared/components/Account' -import { localizeNumber, computeBalanceChange } from '../../../shared/utils' +import { + localizeNumber, + computeRippleStateBalanceChange, +} from '../../../shared/utils' const render = (t, language, action, node, index) => { const { @@ -11,7 +14,7 @@ const render = (t, language, action, node, index) => { currency, account, counterAccount, - } = computeBalanceChange(node) + } = computeRippleStateBalanceChange(node) const line1 = ( diff --git a/src/containers/Transactions/DetailTab/Meta/index.tsx b/src/containers/Transactions/DetailTab/Meta/index.tsx index 24335e480..a7a6cc226 100644 --- a/src/containers/Transactions/DetailTab/Meta/index.tsx +++ b/src/containers/Transactions/DetailTab/Meta/index.tsx @@ -5,6 +5,8 @@ import renderDirectoryNode from './DirectoryNode' import renderOffer from './Offer' import renderRippleState from './RippleState' import renderPayChannel from './PayChannel' +import renderMPToken from './MPToken' +import renderMPTokenIssuance from './MPTokenIssuance' import { groupAffectedNodes } from '../../../shared/transactionUtils' import { useLanguage } from '../../../shared/hooks' @@ -31,6 +33,10 @@ export const TransactionMeta: FC<{ data: any }> = ({ data }) => { return renderRippleState(t, language, action, node, index) case 'PayChannel': return renderPayChannel(t, language, action, node, index) + case 'MPTokenIssuance': + return renderMPTokenIssuance(t, language, action, node, index) + case 'MPToken': + return renderMPToken(t, language, action, node, index) default: return renderDefault(t, action, node, index) } diff --git a/src/containers/Transactions/index.tsx b/src/containers/Transactions/index.tsx index fa34e0e4f..2918e7674 100644 --- a/src/containers/Transactions/index.tsx +++ b/src/containers/Transactions/index.tsx @@ -6,7 +6,12 @@ import { useWindowSize } from 'usehooks-ts' import NoMatch from '../NoMatch' import { Loader } from '../shared/components/Loader' import { Tabs } from '../shared/components/Tabs' -import { NOT_FOUND, BAD_REQUEST, HASH_REGEX, CTID_REGEX } from '../shared/utils' +import { + NOT_FOUND, + BAD_REQUEST, + HASH256_REGEX, + CTID_REGEX, +} from '../shared/utils' import { SimpleTab } from './SimpleTab' import { DetailTab } from './DetailTab' import './transaction.scss' @@ -54,7 +59,7 @@ export const Transaction = () => { if (identifier === '') { return undefined } - if (HASH_REGEX.test(identifier) || CTID_REGEX.test(identifier)) { + if (HASH256_REGEX.test(identifier) || CTID_REGEX.test(identifier)) { return getTransaction(identifier, rippledSocket).catch( (transactionRequestError) => { const status = transactionRequestError.code diff --git a/src/containers/Transactions/test/Description.test.tsx b/src/containers/Transactions/test/Description.test.tsx index 04ae40ccb..4c6074494 100644 --- a/src/containers/Transactions/test/Description.test.tsx +++ b/src/containers/Transactions/test/Description.test.tsx @@ -1,19 +1,23 @@ import { mount } from 'enzyme' import { BrowserRouter as Router } from 'react-router-dom' import { I18nextProvider } from 'react-i18next' +import { QueryClientProvider } from 'react-query' import i18n from '../../../i18n/testConfigEnglish' import { TransactionDescription } from '../DetailTab/Description' import Transaction from './mock_data/Transaction.json' import OfferCreateTicket from './mock_data/OfferCreateTicket.json' import EmittedPayment from './mock_data/EmittedPayment.json' +import { queryClient } from '../../shared/QueryClient' describe('Description container', () => { const createWrapper = (data = {}) => mount( - - - + + + + + , ) diff --git a/src/containers/Transactions/test/DetailTab.test.tsx b/src/containers/Transactions/test/DetailTab.test.tsx index 0e734c06c..46ff5488c 100644 --- a/src/containers/Transactions/test/DetailTab.test.tsx +++ b/src/containers/Transactions/test/DetailTab.test.tsx @@ -1,6 +1,7 @@ import { mount } from 'enzyme' import { BrowserRouter as Router } from 'react-router-dom' import { I18nextProvider } from 'react-i18next' +import { QueryClientProvider } from 'react-query' import Transaction from '../../shared/components/Transaction/EscrowCreate/test/mock_data/EscrowCreate.json' import FailedTransaction from '../../shared/components/Transaction/SignerListSet/test/mock_data/SignerListSet.json' import HookPayment from './mock_data/HookPayment.json' @@ -8,14 +9,17 @@ import EmittedPayment from './mock_data/EmittedPayment.json' import { DetailTab } from '../DetailTab' import i18n from '../../../i18n/testConfigEnglish' import { convertHexToString } from '../../../rippled/lib/utils' +import { queryClient } from '../../shared/QueryClient' describe('DetailTab container', () => { const createWrapper = (transaction: any = Transaction) => mount( - - - + + + + + , ) diff --git a/src/containers/Transactions/test/Meta.test.tsx b/src/containers/Transactions/test/Meta.test.tsx index e6e2fe903..ac4195799 100644 --- a/src/containers/Transactions/test/Meta.test.tsx +++ b/src/containers/Transactions/test/Meta.test.tsx @@ -6,6 +6,7 @@ import Transaction from './mock_data/Transaction.json' import OfferCancel from '../../shared/components/Transaction/OfferCancel/test/mock_data/OfferCancel.json' import OfferCreateWithMissingPreviousFields from '../../shared/components/Transaction/OfferCreate/test/mock_data/OfferCreateWithMissingPreviousFields.json' import PaymentChannelClaim from '../../shared/components/Transaction/PaymentChannelClaim/test/mock_data/PaymentChannelClaim.json' +import DirectMPTPayment from './mock_data/DirectMPTPayment.json' import { TransactionMeta } from '../DetailTab/Meta' describe('TransactionMeta container', () => { @@ -160,4 +161,32 @@ describe('TransactionMeta container', () => { ) expect(w.find('li').length).toBe(4) }) + + it('renders MPT Payment Meta', () => { + const w = createWrapper(DirectMPTPayment) + + expect(w.find('.title').length).toBe(1) + expect(w.find('.detail-subsection').length).toBe(1) + expect(w.contains(
    number_of_affected_node
    )).toBe(true) + expect(w.contains(
    nodes_type
    )).toBe( + true, + ) + expect(w.find('li').length).toBe(6) + + expect(w.find('li').at(2).html()).toBe( + '
  • It modified an MPToken node of
    • Balance changed by100from0to100
  • ', + ) + + expect(w.find('li').at(3).html()).toBe( + '
  • Balance changed by100from0to100
  • ', + ) + + expect(w.find('li').at(4).html()).toBe( + '
  • It modified an MPTokenIssuance node of
    • Outstanding balance changed by100from0to100
  • ', + ) + + expect(w.find('li').at(5).html()).toBe( + '
  • Outstanding balance changed by100from0to100
  • ', + ) + }) }) diff --git a/src/containers/Transactions/test/SimpleTab.test.tsx b/src/containers/Transactions/test/SimpleTab.test.tsx index 8fe7794eb..652ded5b7 100644 --- a/src/containers/Transactions/test/SimpleTab.test.tsx +++ b/src/containers/Transactions/test/SimpleTab.test.tsx @@ -2,23 +2,27 @@ import { mount } from 'enzyme' import { I18nextProvider } from 'react-i18next' import { BrowserRouter as Router } from 'react-router-dom' +import { QueryClientProvider } from 'react-query' import EnableAmendment from './mock_data/EnableAmendment.json' import Payment from '../../shared/components/Transaction/Payment/test/mock_data/Payment.json' import { SimpleTab } from '../SimpleTab' import summarize from '../../../rippled/lib/txSummary' import i18n from '../../../i18n/testConfig' import { expectSimpleRowText } from '../../shared/components/Transaction/test' +import { queryClient } from '../../shared/QueryClient' describe('SimpleTab container', () => { const createWrapper = (tx, width = 1200) => mount( - - - + + + + + , ) diff --git a/src/containers/Transactions/test/mock_data/DirectMPTPayment.json b/src/containers/Transactions/test/mock_data/DirectMPTPayment.json new file mode 100644 index 000000000..87d3c374b --- /dev/null +++ b/src/containers/Transactions/test/mock_data/DirectMPTPayment.json @@ -0,0 +1,95 @@ +{ + "tx": { + "Account": "rwREfyDU1SbcjN3xXZDbm8uNJV77T2ruKw", + "Amount": { + "mpt_issuance_id": "0000301C674EE6ECD0374A628E2C442EF8E3BBBEE8C58CF3", + "value": "100" + }, + "DeliverMax": { + "mpt_issuance_id": "0000301C674EE6ECD0374A628E2C442EF8E3BBBEE8C58CF3", + "value": "100" + }, + "Destination": "rnNkvddM96FE2QsaFztLAn5xicjq5d6d8d", + "Fee": "10", + "Flags": 2147483648, + "Sequence": 12317, + "SigningPubKey": "ED1E43F90700506F98E45CC8E77563ACB8FF0338739229AC98F0E1AEB409E786F9", + "TransactionType": "Payment", + "TxnSignature": "9949EF3E718A6776586A1DD91256C4055E761CBF1CE7A351912C08FE1BB415F6638FA096CAAE88D30B32E684448CDC52DEB022A7E3576AFA0C6E5ABB7BE2FE02", + "ctid": "C000302000000000", + "date": 1712087804000, + "hash": "undefined", + "inLedger": "undefined", + "ledger_index": "undefined", + "meta": "undefined", + "validated": "undefined", + "metaData": "undefined", + "status": "undefined" + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rwREfyDU1SbcjN3xXZDbm8uNJV77T2ruKw", + "Balance": "99999980", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 12318 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "80909CC95DCD7E5E08631635C559E218D42C49721A1285192885B46E4737CF60", + "PreviousFields": { + "Balance": "99999990", + "Sequence": 12317 + }, + "PreviousTxnID": "C9D0965E7A13F54186B6501D08ED54D74AA946A856D96BF7AAE18EA5FD5E93C2", + "PreviousTxnLgrSeq": 12318 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rnNkvddM96FE2QsaFztLAn5xicjq5d6d8d", + "Flags": 0, + "MPTAmount": "100", + "MPTokenIssuanceID": "0000301C674EE6ECD0374A628E2C442EF8E3BBBEE8C58CF3", + "OwnerNode": "0" + }, + "LedgerEntryType": "MPToken", + "LedgerIndex": "9B2E5EA9ACF16B591B941CAE5323EBED55E42495B16C92DC9FBEC0997E8E6804", + "PreviousFields": {}, + "PreviousTxnID": "4C41449D0C083746CC93DDA78F00E97AB8B857188E805F39C1A250F8C9467982", + "PreviousTxnLgrSeq": 12319 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 64, + "Issuer": "rwREfyDU1SbcjN3xXZDbm8uNJV77T2ruKw", + "OutstandingAmount": "100", + "OwnerNode": "0", + "Sequence": 12316 + }, + "LedgerEntryType": "MPTokenIssuance", + "LedgerIndex": "C38E54FD2C98FE848FE31CDA95F6F990A9A8715987171DA342A3296B7A9123B6", + "PreviousFields": { + "OutstandingAmount": "0" + }, + "PreviousTxnID": "C9D0965E7A13F54186B6501D08ED54D74AA946A856D96BF7AAE18EA5FD5E93C2", + "PreviousTxnLgrSeq": 12318 + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS", + "delivered_amount": { + "mpt_issuance_id": "0000301C674EE6ECD0374A628E2C442EF8E3BBBEE8C58CF3", + "value": "100" + } + }, + "hash": "5E74603F7C2E11030E644E681508FD1F24CAEB4CC0CE1F35A6230689D9694E85", + "ledger_index": 12320, + "date": 1712087804000 +} diff --git a/src/containers/shared/Interfaces.tsx b/src/containers/shared/Interfaces.tsx index 201b0daea..83c03903f 100644 --- a/src/containers/shared/Interfaces.tsx +++ b/src/containers/shared/Interfaces.tsx @@ -36,6 +36,20 @@ export interface NFTFormattedInfo { warnings?: string[] } +/** + * Values returned by 'formatMPTIssuanceInfo' from /src/rippled/lib/utils.js + */ +export interface MPTIssuanceFormattedInfo { + issuer: string + sequence: number + assetScale?: number + maxAmt?: string + outstandingAmt?: string + flags?: string[] + transferFee?: number + metadata?: string +} + export interface ErrorMessage { title: string hints: string[] diff --git a/src/containers/shared/analytics.ts b/src/containers/shared/analytics.ts index bff40dcfb..b11d5c349 100644 --- a/src/containers/shared/analytics.ts +++ b/src/containers/shared/analytics.ts @@ -27,6 +27,7 @@ export interface AnalyticsFields { search_term?: string search_category?: string validator?: string + mpt_issuance_id?: string description?: string page_title?: string diff --git a/src/containers/shared/components/Amount.tsx b/src/containers/shared/components/Amount.tsx index 164b06737..e7fe6ecd5 100644 --- a/src/containers/shared/components/Amount.tsx +++ b/src/containers/shared/components/Amount.tsx @@ -1,8 +1,15 @@ +import { useQuery } from 'react-query' +import { useContext } from 'react' import { CURRENCY_OPTIONS, XRP_BASE } from '../transactionUtils' import { useLanguage } from '../hooks' -import { localizeNumber } from '../utils' +import { localizeNumber, convertScaledPrice } from '../utils' import Currency from './Currency' import { ExplorerAmount } from '../types' +import { MPTIssuanceFormattedInfo } from '../Interfaces' +import { getMPTIssuance } from '../../../rippled/lib/rippled' +import { formatMPTIssuanceInfo } from '../../../rippled/lib/utils' +import SocketContext from '../SocketContext' +import { useAnalytics } from '../analytics' export interface AmountProps { value: ExplorerAmount | string @@ -16,15 +23,17 @@ export const Amount = ({ value, }: AmountProps) => { const language = useLanguage() + const rippledSocket = useContext(SocketContext) + const { trackException } = useAnalytics() const issuer = typeof value === 'string' ? undefined : value.issuer const currency = typeof value === 'string' ? 'XRP' : value.currency const amount = typeof value === 'string' ? parseInt(value, 10) / XRP_BASE : value.amount + const isMPT = typeof value === 'string' ? false : value.isMPT const options = { ...CURRENCY_OPTIONS, currency } - const localizedAmount = localizeNumber(amount, language, options) - return ( + const renderAmount = (localizedAmount) => ( {modifier && {modifier}} @@ -35,7 +44,43 @@ export const Amount = ({ currency={currency} link displaySymbol={false} + isMPT={isMPT} /> ) + + const mptID = isMPT ? (value as ExplorerAmount).currency : null + + // fetch MPTIssuance only if isMPT is true + const { data: mptIssuanceData } = + useQuery( + ['getMPTIssuanceScale', mptID], + async () => { + const info = await getMPTIssuance(rippledSocket, mptID) + return formatMPTIssuanceInfo(info) + }, + { + onError: (e: any) => { + trackException(`mptIssuance ${mptID} --- ${JSON.stringify(e)}`) + }, + enabled: isMPT, + }, + ) || {} + + // if amount is MPT type, we need to fetch the scale from the MPTokenIssuance + // object so we can show the scaled amount + if (isMPT && typeof value !== 'string') { + if (mptIssuanceData) { + const scale = mptIssuanceData.assetScale ?? 0 + const scaledAmount = convertScaledPrice( + parseInt(amount as string, 10).toString(16), + scale, + ) + + return renderAmount(localizeNumber(scaledAmount, language, {}, true)) + } + return null + } + + return renderAmount(localizeNumber(amount, language, options)) } diff --git a/src/containers/shared/components/Currency.tsx b/src/containers/shared/components/Currency.tsx index 64727ca0a..ac48efa7c 100644 --- a/src/containers/shared/components/Currency.tsx +++ b/src/containers/shared/components/Currency.tsx @@ -1,5 +1,5 @@ import { RouteLink } from '../routing' -import { TOKEN_ROUTE } from '../../App/routes' +import { TOKEN_ROUTE, MPT_ROUTE } from '../../App/routes' // https://xrpl.org/currency-formats.html#nonstandard-currency-codes const NON_STANDARD_CODE_LENGTH = 40 @@ -12,6 +12,7 @@ export interface Props { link?: boolean shortenIssuer?: boolean displaySymbol?: boolean + isMPT?: boolean } /* @@ -25,33 +26,46 @@ const Currency = (props: Props) => { link = true, shortenIssuer = false, displaySymbol = true, + isMPT = false, } = props + let content - const currencyCode = - currency?.length === NON_STANDARD_CODE_LENGTH && - currency?.substring(0, 2) !== LP_TOKEN_IDENTIFIER - ? hexToString(currency) - : currency - - let display = `${currencyCode}` - - if (currencyCode === XRP && displaySymbol) { - display = `\uE900 ${display}` - } - - if (issuer) { - display += '.' - display += shortenIssuer ? issuer.substring(0, 4) : issuer - } - - const content = - link && issuer ? ( - + if (isMPT) { + const display = `MPT (${currency})` + content = link ? ( + {display} ) : ( display ) + } else { + const currencyCode = + currency?.length === NON_STANDARD_CODE_LENGTH && + currency?.substring(0, 2) !== LP_TOKEN_IDENTIFIER + ? hexToString(currency) + : currency + + let display = `${currencyCode}` + + if (currencyCode === XRP && displaySymbol) { + display = `\uE900 ${display}` + } + + if (issuer) { + display += '.' + display += shortenIssuer ? issuer.substring(0, 4) : issuer + } + + content = + link && issuer ? ( + + {display} + + ) : ( + display + ) + } return {content} } diff --git a/src/containers/shared/components/MPTokenLink.tsx b/src/containers/shared/components/MPTokenLink.tsx new file mode 100644 index 000000000..f1c2198bb --- /dev/null +++ b/src/containers/shared/components/MPTokenLink.tsx @@ -0,0 +1,12 @@ +import { RouteLink } from '../routing' +import { MPT_ROUTE } from '../../App/routes' + +export interface MPTokenLinkProps { + tokenID: string +} + +export const MPTokenLink = ({ tokenID }: MPTokenLinkProps) => ( + + {tokenID} + +) diff --git a/src/containers/shared/components/Tooltip/Tooltip.tsx b/src/containers/shared/components/Tooltip/Tooltip.tsx index 7154eb8ca..673cd72de 100644 --- a/src/containers/shared/components/Tooltip/Tooltip.tsx +++ b/src/containers/shared/components/Tooltip/Tooltip.tsx @@ -91,6 +91,8 @@ export const Tooltip = ({ tooltip }: { tooltip?: TooltipInstance }) => { ) + const renderMPTId = () =>
    {data.tokenId}
    + const { x, y, mode } = tooltip const style: CSSProperties = { top: y + PADDING_Y, left: x } const modeMap = { @@ -100,6 +102,7 @@ export const Tooltip = ({ tooltip }: { tooltip?: TooltipInstance }) => { missing: renderMissingValidators, paystring: renderPayStringToolTip, nftId: renderNFTId, + mptId: renderMPTId, } return modeMap[mode] ? ( diff --git a/src/containers/shared/components/Transaction/Clawback/Description.tsx b/src/containers/shared/components/Transaction/Clawback/Description.tsx index ec59c0a96..c92397c35 100644 --- a/src/containers/shared/components/Transaction/Clawback/Description.tsx +++ b/src/containers/shared/components/Transaction/Clawback/Description.tsx @@ -6,8 +6,8 @@ import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' export const Description = ({ data }: TransactionDescriptionProps) => { const issuer = data.tx.Account - const holder = data.tx.Amount.issuer const amount = formatAmount(data.tx.Amount) + const holder = amount.isMPT ? data.tx.MPTokenHolder : data.tx.Amount.issuer amount.issuer = issuer return ( <> diff --git a/src/containers/shared/components/Transaction/Clawback/parser.ts b/src/containers/shared/components/Transaction/Clawback/parser.ts index 0da7126b7..f5ce6f6a0 100644 --- a/src/containers/shared/components/Transaction/Clawback/parser.ts +++ b/src/containers/shared/components/Transaction/Clawback/parser.ts @@ -1,7 +1,10 @@ import { Clawback, ClawbackInstructions } from './types' import { TransactionParser } from '../types' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' -import { computeBalanceChange } from '../../../utils' +import { + computeRippleStateBalanceChange, + computeMPTokenBalanceChange, +} from '../../../utils' export const parser: TransactionParser = ( tx, @@ -9,6 +12,37 @@ export const parser: TransactionParser = ( ) => { const account = tx.Account const amount = formatAmount(tx.Amount) + + if (amount.isMPT === true) { + const holder = tx.MPTokenHolder + + const filteredMptNode = meta.AffectedNodes.filter( + (node: any) => node.ModifiedNode?.LedgerEntryType === 'MPToken', + ) + + // If no mpt is modified, it means the tx failed. + // We just return the amount that was attempted to claw. + if (!filteredMptNode || filteredMptNode.length !== 1) + return { + amount, + account, + holder, + } + + const mptNode = filteredMptNode[0].ModifiedNode + const { change } = computeMPTokenBalanceChange(mptNode) + amount.amount = + BigInt(change) < 0 + ? BigInt(-change).toString(10) + : BigInt(change).toString(10) + + return { + account, + amount, + holder, + } + } + const holder = amount.issuer amount.issuer = account @@ -30,7 +64,7 @@ export const parser: TransactionParser = ( holder, } - const { change } = computeBalanceChange( + const { change } = computeRippleStateBalanceChange( trustlineNode[0].ModifiedNode ?? trustlineNode[0].DeletedNode, ) diff --git a/src/containers/shared/components/Transaction/Clawback/test/ClawbackSimple.test.tsx b/src/containers/shared/components/Transaction/Clawback/test/ClawbackSimple.test.tsx index 6110b2b41..1a7e19ee7 100644 --- a/src/containers/shared/components/Transaction/Clawback/test/ClawbackSimple.test.tsx +++ b/src/containers/shared/components/Transaction/Clawback/test/ClawbackSimple.test.tsx @@ -1,7 +1,15 @@ +import { useQuery } from 'react-query' import { createSimpleWrapperFactory, expectSimpleRowText } from '../../test' import { Simple } from '../Simple' import transaction from './mock_data/Clawback.json' import transactionFailure from './mock_data/Clawback_Failure.json' +import transactionMPT from './mock_data/ClawbackMPT.json' +import transactionMPTFailure from './mock_data/ClawbackMPT_Failure.json' + +jest.mock('react-query', () => ({ + ...jest.requireActual('react-query'), + useQuery: jest.fn(), +})) const createWrapper = createSimpleWrapperFactory(Simple) @@ -17,6 +25,26 @@ describe('Clawback', () => { wrapper.unmount() }) + it('handles MPT Clawback simple view ', () => { + const data = { + assetScale: 3, + } + + // @ts-ignore + useQuery.mockImplementation(() => ({ + data, + })) + const wrapper = createWrapper(transactionMPT) + expectSimpleRowText(wrapper, 'holder', 'rUZTPFN7MBJkjiZ48rak6q7MbhT4ur2kAD') + expectSimpleRowText( + wrapper, + 'amount', + '0.05 MPT (00000D668E702F54A27C42EF98C13B0787D1766CC9162A47)', + ) + + wrapper.unmount() + }) + it('handles failed Clawback simple view ', () => { const wrapper = createWrapper(transactionFailure) expectSimpleRowText(wrapper, 'holder', 'rDZ713igKfedN4hhY6SjQse4Mv3ZrBxnn9') @@ -27,4 +55,24 @@ describe('Clawback', () => { ) wrapper.unmount() }) + + it('handles failed MPT Clawback simple view ', () => { + const data = { + assetScale: 3, + } + + // @ts-ignore + useQuery.mockImplementation(() => ({ + data, + })) + const wrapper = createWrapper(transactionMPTFailure) + + expectSimpleRowText(wrapper, 'holder', 'r9rAqX8Jjo4uACsimYDVsy5thHDPivujqf') + expectSimpleRowText( + wrapper, + 'amount', + '0.05 MPT (000010952ECE2AFC727F1C67EF568F360A2D92CB7C29FF7C)', + ) + wrapper.unmount() + }) }) diff --git a/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT.json b/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT.json new file mode 100644 index 000000000..2a7d4513a --- /dev/null +++ b/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT.json @@ -0,0 +1,85 @@ +{ + "tx": { + "Account": "rDz9LyymZh4C1jJvFK6v6qXeeARLdYKuEW", + "Amount": { + "mpt_issuance_id": "00000D668E702F54A27C42EF98C13B0787D1766CC9162A47", + "value": "50" + }, + "Fee": "10", + "Flags": 2147483648, + "MPTokenHolder": "rUZTPFN7MBJkjiZ48rak6q7MbhT4ur2kAD", + "Sequence": 3432, + "SigningPubKey": "ED0C1DE70A8762E6C98EC78CF13D278D6950ECDFE8E87BAD3732730845E2D9AB6A", + "TransactionType": "Clawback", + "TxnSignature": "8099CED925A463A2A24F55A496D2BB40108B75840770DFBA9796FBBD40AA482126EE9DAF2512D5D2E8268BCBFC277828E66A28CF3394702611290B45FBA88109", + "ctid": "C0000D6D00000000", + "date": 1728575981000 + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rDz9LyymZh4C1jJvFK6v6qXeeARLdYKuEW", + "Balance": "99999970", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 3433 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "06A3654A4A8829FD0575ADDD068BD04F7483C407E027CB43F77C2A5CA575368B", + "PreviousFields": { + "Balance": "99999980", + "Sequence": 3432 + }, + "PreviousTxnID": "4B6D63C7AA15899EC1CB3D84C923B08A62D6643A75D28B254F7A0C082B2C0D75", + "PreviousTxnLgrSeq": 3436 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "AssetScale": 3, + "Flags": 98, + "Issuer": "rDz9LyymZh4C1jJvFK6v6qXeeARLdYKuEW", + "MPTokenMetadata": "7B226E616D65223A2255532054726561737572792042696C6C20546F6B656E222C2273796D626F6C223A225553544254222C22646563696D616C73223A322C22746F74616C537570706C79223A313030303030302C22697373756572223A225553205472656173757279222C22697373756544617465223A22323032342D30332D3235222C226D6174757269747944617465223A22323032352D30332D3235222C226661636556616C7565223A2231303030222C22696E74657265737452617465223A22322E35222C22696E7465726573744672657175656E6379223A22517561727465726C79222C22636F6C6C61746572616C223A22555320476F7665726E6D656E74222C226A7572697364696374696F6E223A22556E6974656420537461746573222C22726567756C61746F7279436F6D706C69616E6365223A2253454320526567756C6174696F6E73222C22736563757269747954797065223A2254726561737572792042696C6C222C2265787465726E616C5F75726C223A2268747470733A2F2F6578616D706C652E636F6D2F742D62696C6C2D746F6B656E2D6D657461646174612E6A736F6E227D", + "MaximumAmount": "9223372036854775807", + "OutstandingAmount": "50", + "OwnerNode": "0", + "Sequence": 3430 + }, + "LedgerEntryType": "MPTokenIssuance", + "LedgerIndex": "0EABDC95DBBC52F8A95A5F49C38211A30B916BC329774F46CC081D502F9E1895", + "PreviousFields": { + "OutstandingAmount": "100" + }, + "PreviousTxnID": "4B6D63C7AA15899EC1CB3D84C923B08A62D6643A75D28B254F7A0C082B2C0D75", + "PreviousTxnLgrSeq": 3436 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rUZTPFN7MBJkjiZ48rak6q7MbhT4ur2kAD", + "Flags": 0, + "MPTAmount": "50", + "MPTokenIssuanceID": "00000D668E702F54A27C42EF98C13B0787D1766CC9162A47", + "OwnerNode": "0" + }, + "LedgerEntryType": "MPToken", + "LedgerIndex": "DA40BA069F110465BD90BF5732163836F011E3E761CCF7B6949FAA24D97132F6", + "PreviousFields": { + "MPTAmount": "100" + }, + "PreviousTxnID": "4B6D63C7AA15899EC1CB3D84C923B08A62D6643A75D28B254F7A0C082B2C0D75", + "PreviousTxnLgrSeq": 3436 + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + }, + "hash": "46B686335794B911B3B76C2F4B76AF424F9978C3E82B2F6488801C359AA71856", + "ledger_index": 3437, + "date": 1728575981000 +} diff --git a/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT_Failure.json b/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT_Failure.json new file mode 100644 index 000000000..b0c7d31c8 --- /dev/null +++ b/src/containers/shared/components/Transaction/Clawback/test/mock_data/ClawbackMPT_Failure.json @@ -0,0 +1,46 @@ +{ + "tx": { + "Account": "rnGVhdnWv7g3fW8UNJyFHj6eyngsMdwA8c", + "Amount": { + "mpt_issuance_id": "000010952ECE2AFC727F1C67EF568F360A2D92CB7C29FF7C", + "value": "50" + }, + "Fee": "10", + "Flags": 2147483648, + "MPTokenHolder": "r9rAqX8Jjo4uACsimYDVsy5thHDPivujqf", + "Sequence": 4246, + "SigningPubKey": "ED4F6FF2241860884D4DD6C5797BDA553155D194F07B1BFC67129F183322DA7DC3", + "TransactionType": "Clawback", + "TxnSignature": "C54F175F0AFD950507C059E0EA5E6FA0079E7CDE5DF62BB122B56DC34A351C2369E208B31F7C27B1E9D21753506E195B147500D033884C44373899C84A97680B", + "ctid": "C000109B00000000", + "date": 1728577343000 + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rnGVhdnWv7g3fW8UNJyFHj6eyngsMdwA8c", + "Balance": "99999980", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 4247 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "95A16157D164CD90D64BC94DE3EA7758AE3088391C9AC44AFCAC90C5153D83D5", + "PreviousFields": { + "Balance": "99999990", + "Sequence": 4246 + }, + "PreviousTxnID": "8ACD0682CB1EDDCF6C61F15E6B9637D2719FDA2EC32EB384A68F36F0A0297D91", + "PreviousTxnLgrSeq": 4248 + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tecINSUFFICIENT_FUNDS" + }, + "hash": "26E6E7AEA4F78801EB0408D802FEBA11B962BFD680501DF0D0C58F30C6EA8951", + "ledger_index": 4251, + "date": 1728577343000 +} diff --git a/src/containers/shared/components/Transaction/Clawback/types.ts b/src/containers/shared/components/Transaction/Clawback/types.ts index 81930d4c2..bbfaa9067 100644 --- a/src/containers/shared/components/Transaction/Clawback/types.ts +++ b/src/containers/shared/components/Transaction/Clawback/types.ts @@ -3,6 +3,7 @@ import { Amount, ExplorerAmount } from '../../../types' export interface Clawback extends TransactionCommonFields { Amount: Amount + MPTokenHolder?: string } export interface ClawbackInstructions { diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/Simple.tsx b/src/containers/shared/components/Transaction/MPTokenAuthorize/Simple.tsx new file mode 100644 index 000000000..9823dfe4f --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/Simple.tsx @@ -0,0 +1,26 @@ +import { useTranslation } from 'react-i18next' +import { SimpleRow } from '../SimpleRow' +import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' +import { MPTokenAuthorize } from './types' +import { Account } from '../../Account' +import { MPTokenLink } from '../../MPTokenLink' + +export const Simple: TransactionSimpleComponent = ({ + data, +}: TransactionSimpleProps) => { + const { MPTokenIssuanceID, MPTokenHolder } = data.instructions + const { t } = useTranslation() + + return ( + <> + + + + {MPTokenHolder && ( + + + + )} + + ) +} diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/index.ts b/src/containers/shared/components/Transaction/MPTokenAuthorize/index.ts new file mode 100644 index 000000000..707282fdf --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/index.ts @@ -0,0 +1,13 @@ +import { + TransactionAction, + TransactionCategory, + TransactionMapping, +} from '../types' + +import { Simple } from './Simple' + +export const MPTokenAuthorizeTransaction: TransactionMapping = { + Simple, + action: TransactionAction.MODIFY, + category: TransactionCategory.MPT, +} diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/test/MPTokenAuthorizeSimple.test.jsx b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/MPTokenAuthorizeSimple.test.jsx new file mode 100644 index 000000000..932a18cc1 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/MPTokenAuthorizeSimple.test.jsx @@ -0,0 +1,66 @@ +import { createSimpleWrapperFactory } from '../../test/createWrapperFactory' +import { Simple } from '../Simple' +import { expectSimpleRowText, expectSimpleRowNotToExist } from '../../test' +import transactionSuccess from './mock_data/MPTokenAuthorize.json' +import transactionFail from './mock_data/MPTokenAuthorize_Fail.json' +import transactionWithHolder from './mock_data/MPTokenAuthorize_WithHolder.json' +import transactionWithHolderFail from './mock_data/MPTokenAuthorize_WithHolderFail.json' + +const createWrapper = createSimpleWrapperFactory(Simple) + +describe('MPTokenAuthorize', () => { + it('handles MPTokenAuthorize w/o holder simple view ', () => { + const wrapper = createWrapper(transactionSuccess) + + expectSimpleRowText( + wrapper, + 'mpt-issuance-id', + '000005F398B624EBD06822198649C920C8B20ADB8EBE745E', + ) + expectSimpleRowNotToExist(wrapper, 'mpt-holder') + wrapper.unmount() + }) + + it('handles MPTokenAuthorize view w/ holder simple view ', () => { + const wrapper = createWrapper(transactionWithHolder) + + expectSimpleRowText( + wrapper, + 'mpt-issuance-id', + '0000130B63FC523E33FDF4D1318D8D484B0D1111098CFD0B', + ) + expectSimpleRowText( + wrapper, + 'mpt-holder', + 'rK3bB9myvWoMaLbLnpksGx2Zz58BL225am', + ) + wrapper.unmount() + }) + + it('handles failed MPTokenAuthorize view w/ holder simple view ', () => { + const wrapper = createWrapper(transactionWithHolderFail) + + expectSimpleRowText( + wrapper, + 'mpt-issuance-id', + '00000F76D46440EE21F74E5B2398315BC1CFEB9A7EB48A14', + ) + expectSimpleRowText( + wrapper, + 'mpt-holder', + 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', + ) + wrapper.unmount() + }) + + it('handles failed MPTokenAuthorize w/o holder simple view ', () => { + const wrapper = createWrapper(transactionFail) + expectSimpleRowText( + wrapper, + 'mpt-issuance-id', + '0000098410531B842DEECCF4ABB1268C931EB71D9F6A1B64', + ) + expectSimpleRowNotToExist(wrapper, 'mpt-holder') + wrapper.unmount() + }) +}) diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize.json b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize.json new file mode 100644 index 000000000..e41a47854 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize.json @@ -0,0 +1,70 @@ +{ + "tx": { + "Account": "rnLz9TWQAvaLpdyrtb1WbMgp7jZdNQ47Ny", + "Fee": "10", + "Flags": 2147483648, + "MPTokenIssuanceID": "000005F398B624EBD06822198649C920C8B20ADB8EBE745E", + "Sequence": 1524, + "SigningPubKey": "ED97BAFB2D380AF67DA2C1968C3A1DC38797E9BA0653CE620F6BC97FFD66925EBB", + "TransactionType": "MPTokenAuthorize", + "TxnSignature": "28879892AF0D465063993BD1DDCA147C7CA0AB9C8429DAB3A0030AA4AC57AA80F725F295622913C07E4CAFB3160DEF7E8D0209429390B0FBD78F96B28E700A07", + "ctid": "C00005F600000000", + "date": 1711397033000, + "hash": "undefined", + "inLedger": "undefined", + "ledger_index": "undefined", + "meta": "undefined", + "validated": "undefined", + "metaData": "undefined", + "status": "undefined" + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rnLz9TWQAvaLpdyrtb1WbMgp7jZdNQ47Ny", + "Balance": "99999990", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 1525 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "424AAE60FE8A4B7EF77DA492F9561AAFA1D09DB56BE5804B055235BCD662C9FE", + "PreviousFields": { + "Balance": "100000000", + "OwnerCount": 0, + "Sequence": 1524 + }, + "PreviousTxnID": "B6301327D79A93DC211043ABF66A60DC9C70BD2962FC42E0EAD0A829680ABAE8", + "PreviousTxnLgrSeq": 1524 + } + }, + { + "CreatedNode": { + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "65BCF554A41D30521B876D012D3DC167F9E886E02D88231E9DEBD2501A4A7BB5", + "NewFields": { + "Owner": "rnLz9TWQAvaLpdyrtb1WbMgp7jZdNQ47Ny", + "RootIndex": "65BCF554A41D30521B876D012D3DC167F9E886E02D88231E9DEBD2501A4A7BB5" + } + } + }, + { + "CreatedNode": { + "LedgerEntryType": "MPToken", + "LedgerIndex": "91D261494BB3D64D5D3D12BD480EB58C5E2B21F3222B12FE442BC73276C27266", + "NewFields": { + "Account": "rnLz9TWQAvaLpdyrtb1WbMgp7jZdNQ47Ny", + "MPTokenIssuanceID": "000005F398B624EBD06822198649C920C8B20ADB8EBE745E" + } + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + }, + "hash": "9592E76A725CF4A5A441024EE80596DFE8809D1AD1EC28A8D9DB2CEC2CB81EDC", + "ledger_index": 1526, + "date": 1711397033000 +} diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_Fail.json b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_Fail.json new file mode 100644 index 000000000..8d305ae95 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_Fail.json @@ -0,0 +1,49 @@ +{ + "tx": { + "Account": "rJtok1j4okh4HkKxC3ArAvZbMD1vcDSteo", + "Fee": "10", + "Flags": 2147483648, + "MPTokenIssuanceID": "0000098410531B842DEECCF4ABB1268C931EB71D9F6A1B64", + "Sequence": 2438, + "SigningPubKey": "EDE493F0B7846A102A5C6EF4FDD9E95D1A84B0BEB99DED06C4436C0D61E5FA0B67", + "TransactionType": "MPTokenAuthorize", + "TxnSignature": "C903E4BA935BA27424D05CA230385FBA392CB4B48C136E37EF5DABE07814A2A8FA0AAEE34FCAB994D1AED7A663EB4CA121FA07B83E3C5A74289ABA258AA45F00", + "ctid": "C000098800000000", + "date": 1711398512000, + "hash": "undefined", + "inLedger": "undefined", + "ledger_index": "undefined", + "meta": "undefined", + "validated": "undefined", + "metaData": "undefined", + "status": "undefined" + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rJtok1j4okh4HkKxC3ArAvZbMD1vcDSteo", + "Balance": "99999980", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 2439 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "FE496E6B5CBE4778460846E5B93648B41E15463E691311EA4CD7E578561CA20E", + "PreviousFields": { + "Balance": "99999990", + "Sequence": 2438 + }, + "PreviousTxnID": "26BB8D3B11AA0C967470DBA5D6B09A10608B4D1DADE0408668A45C010F4B8DDC", + "PreviousTxnLgrSeq": 2439 + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tecMPTOKEN_EXISTS" + }, + "hash": "7B785C2D172D8FAE35DBBA66868D147747F32B5D6AA41F62D698E872643CE2B6", + "ledger_index": 2440, + "date": 1711398512000 +} diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolder.json b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolder.json new file mode 100644 index 000000000..3cce1b4e2 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolder.json @@ -0,0 +1,67 @@ +{ + "tx": { + "Account": "rwfgw2dWqUAexB46z5QRq2dJcgTK9piw5w", + "Fee": "10", + "Flags": 2147483648, + "MPTokenHolder": "rK3bB9myvWoMaLbLnpksGx2Zz58BL225am", + "MPTokenIssuanceID": "0000130B63FC523E33FDF4D1318D8D484B0D1111098CFD0B", + "Sequence": 4876, + "SigningPubKey": "ED936E848B8E37D20991C2E1C5C76ABAEC0625D693CEB85BA495B58E16712DA627", + "TransactionType": "MPTokenAuthorize", + "TxnSignature": "3F31AD3682B9261975E27895DFCB9F373C33C174A076445C33AE13A6713D7FC8C8305A4D05C4918979C9EAD0230A61CE9998B71BEE21653D6BFCCC65F599100E", + "ctid": "C000130F00000000", + "date": 1711400951000, + "hash": "undefined", + "inLedger": "undefined", + "ledger_index": "undefined", + "meta": "undefined", + "validated": "undefined", + "metaData": "undefined", + "status": "undefined" + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rwfgw2dWqUAexB46z5QRq2dJcgTK9piw5w", + "Balance": "99999980", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 4877 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "C688ECD4065B909634121581E792188424F29B48C062F1D1D4FED180DEAF3A23", + "PreviousFields": { + "Balance": "99999990", + "Sequence": 4876 + }, + "PreviousTxnID": "D12E5ED52F495449A537DB9293174209CC132CDCD4EFBBACCEB7F8E8FC582BBC", + "PreviousTxnLgrSeq": 4877 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rK3bB9myvWoMaLbLnpksGx2Zz58BL225am", + "Flags": 2, + "MPTokenIssuanceID": "0000130B63FC523E33FDF4D1318D8D484B0D1111098CFD0B", + "OwnerNode": "0" + }, + "LedgerEntryType": "MPToken", + "LedgerIndex": "E6BC3F027146E5A2A50C01C37E7C5320E608C9D1D5BE763F32748865DB6EF3DE", + "PreviousFields": { + "Flags": 0 + }, + "PreviousTxnID": "FA5F2B8CE18C33D09E0243A2D20319AB9AF9D6CF5F1C2568B0CC4764DEC31F7A", + "PreviousTxnLgrSeq": 4878 + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + }, + "hash": "5F92E78273BCF8A71E129F2CC9B8B0D5611E79D4CF81B530BF7B69892A579060", + "ledger_index": 4879, + "date": 1711400951000 +} diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolderFail.json b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolderFail.json new file mode 100644 index 000000000..69b7eaa8c --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/test/mock_data/MPTokenAuthorize_WithHolderFail.json @@ -0,0 +1,50 @@ +{ + "tx": { + "Account": "rL4pMQAa3V7s9QNw1wEk2znnhjbfYo4GQC", + "Fee": "10", + "Flags": 2147483648, + "MPTokenHolder": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "MPTokenIssuanceID": "00000F76D46440EE21F74E5B2398315BC1CFEB9A7EB48A14", + "Sequence": 3959, + "SigningPubKey": "EDF7A3D93CE3AA46168649283C20C2D4FC36642FDD87449F1CCF068638BF17B10E", + "TransactionType": "MPTokenAuthorize", + "TxnSignature": "2795F1DC9C54493ADE475800A67FD5B3BC7B65F4E343CEEA0950E994F0FC10D0DAED13B4B0FD345E92BFD2B4F42A09A44906D5B2CD1D8FD7A4B3D28983F51806", + "ctid": "C0000F7900000000", + "date": 1711400033000, + "hash": "undefined", + "inLedger": "undefined", + "ledger_index": "undefined", + "meta": "undefined", + "validated": "undefined", + "metaData": "undefined", + "status": "undefined" + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rL4pMQAa3V7s9QNw1wEk2znnhjbfYo4GQC", + "Balance": "99999980", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 3960 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "00BFE84169F6CAA5D03348856B57D47788B6856ABA9FA6EC7A16E6DA1B99B9D7", + "PreviousFields": { + "Balance": "99999990", + "Sequence": 3959 + }, + "PreviousTxnID": "E07D68B9728EE8954C66219FF713782933612A7D5EF44B50F5485557629DFE3D", + "PreviousTxnLgrSeq": 3960 + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tecNO_AUTH" + }, + "hash": "95AE2E382D6CFBFCECC012DDC52458E753FB9208A5040D2F441B5DE5BEA535CF", + "ledger_index": 3961, + "date": 1711400033000 +} diff --git a/src/containers/shared/components/Transaction/MPTokenAuthorize/types.ts b/src/containers/shared/components/Transaction/MPTokenAuthorize/types.ts new file mode 100644 index 000000000..878129a9f --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenAuthorize/types.ts @@ -0,0 +1,6 @@ +import { TransactionCommonFields } from '../types' + +export interface MPTokenAuthorize extends TransactionCommonFields { + MPTokenIssuanceID: string + MPTokenHolder?: string +} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx new file mode 100644 index 000000000..dc80d5625 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx @@ -0,0 +1,63 @@ +import { useTranslation } from 'react-i18next' +import { SimpleRow } from '../SimpleRow' +import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' +import { MPTokenIssuanceCreateInstructions } from './types' +import { useLanguage } from '../../../hooks' +import { localizeNumber } from '../../../utils' +import { MPTokenLink } from '../../MPTokenLink' + +export const Simple: TransactionSimpleComponent = ({ + data, +}: TransactionSimpleProps) => { + const { issuanceID, metadata, assetScale, transferFee, maxAmount } = + data.instructions + const { t } = useTranslation() + const language = useLanguage() + const formattedFee = + transferFee && + `${localizeNumber((transferFee / 1000).toPrecision(5), language, { + minimumFractionDigits: 3, + })}%` + + return ( + <> + {issuanceID && ( + + + + )} + {assetScale && ( + + {assetScale} + + )} + {transferFee && ( + + {formattedFee} + + )} + {maxAmount && ( + + {maxAmount} + + )} + {metadata && ( + + {metadata} + + )} + + ) +} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/index.ts b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/index.ts new file mode 100644 index 000000000..03275f8f7 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/index.ts @@ -0,0 +1,15 @@ +import { + TransactionAction, + TransactionCategory, + TransactionMapping, +} from '../types' + +import { Simple } from './Simple' +import { parser } from './parser' + +export const MPTokenIssuanceCreateTransaction: TransactionMapping = { + Simple, + action: TransactionAction.CREATE, + category: TransactionCategory.MPT, + parser, +} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/parser.ts b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/parser.ts new file mode 100644 index 000000000..d24770bc7 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/parser.ts @@ -0,0 +1,21 @@ +import { + MPTokenIssuanceCreate, + MPTokenIssuanceCreateInstructions, +} from './types' +import { TransactionParser } from '../types' +import { convertHexToString } from '../../../../../rippled/lib/utils' + +export const parser: TransactionParser< + MPTokenIssuanceCreate, + MPTokenIssuanceCreateInstructions +> = (tx, meta) => ({ + issuanceID: meta.mpt_issuance_id, + metadata: tx.MPTokenMetadata + ? convertHexToString(tx.MPTokenMetadata) + : undefined, + transferFee: tx.TransferFee, + assetScale: tx.AssetScale, + maxAmount: tx.MaximumAmount + ? BigInt(tx.MaximumAmount).toString(10) + : undefined, +}) diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/MPTokenIssuanceCreateSimple.test.jsx b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/MPTokenIssuanceCreateSimple.test.jsx new file mode 100644 index 000000000..0c82efab4 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/MPTokenIssuanceCreateSimple.test.jsx @@ -0,0 +1,27 @@ +import { createSimpleWrapperFactory } from '../../test/createWrapperFactory' +import { Simple } from '../Simple' +import { expectSimpleRowText } from '../../test' +import transactionSuccess from './mock_data/MPTokenIssuanceCreate.json' + +const createWrapper = createSimpleWrapperFactory(Simple) + +describe('MPTokenIssuanceCreate', () => { + it('handles MPTokenIssuanceCreate simple view ', () => { + const wrapper = createWrapper(transactionSuccess) + + expectSimpleRowText( + wrapper, + 'mpt-issuance-id', + '0000157844C3F3B57A8B579FEE1033CC8E8498729D063617', + ) + expectSimpleRowText(wrapper, 'mpt-asset-scale', '2') + expectSimpleRowText(wrapper, 'mpt-max-amount', '9223372036854775807') + expectSimpleRowText( + wrapper, + 'mpt-metadata', + 'https://ipfs.io/ipfs/QmZnjmB9Tk4xaA9E679ytrPXda3beWMLUnMB5RFj1eStLp', + ) + expectSimpleRowText(wrapper, 'mpt-fee', '0.010%') + wrapper.unmount() + }) +}) diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/mock_data/MPTokenIssuanceCreate.json b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/mock_data/MPTokenIssuanceCreate.json new file mode 100644 index 000000000..2b5b91b7d --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/test/mock_data/MPTokenIssuanceCreate.json @@ -0,0 +1,79 @@ +{ + "tx": { + "Account": "rfGb6p2kWy3zQweWnYNxSFYoHeymcx7mhg", + "AssetScale": 2, + "Fee": "10", + "Flags": 34, + "MPTokenMetadata": "68747470733A2F2F697066732E696F2F697066732F516D5A6E6A6D4239546B34786141394536373979747250586461336265574D4C556E4D423552466A316553744C70", + "MaximumAmount": "9223372036854775807", + "Sequence": 5496, + "SigningPubKey": "EDAD408FAEE57EB4A347E6FE395B834DD47C6531C3C37B09ACC35528161CAD4B0E", + "TransactionType": "MPTokenIssuanceCreate", + "TransferFee": 10, + "TxnSignature": "F7AA8083EE7D7EFD10E11FF5A12B73D2D45A80094AEED4B41FBF2A90C9E03E5E4D162E91FA1EC156BF94E770E70E7633DF09665A5C2D5408178FC376BFC9B100", + "ctid": "C000157A00000000", + "date": 1710949602000, + "hash": "undefined", + "inLedger": "undefined", + "ledger_index": "undefined", + "meta": "undefined", + "validated": "undefined", + "metaData": "undefined", + "status": "undefined" + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rfGb6p2kWy3zQweWnYNxSFYoHeymcx7mhg", + "Balance": "99999990", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 5497 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "1996F74D57092C1AC261F55CB16A45A63C785993691869A431D72A5BF8AF47A0", + "PreviousFields": { + "Balance": "100000000", + "OwnerCount": 0, + "Sequence": 5496 + }, + "PreviousTxnID": "531254FC0F1599CCAF9ABCDBE0854B6BFBBA225ADD7CA341D2897CBDC3E78E5E", + "PreviousTxnLgrSeq": 5496 + } + }, + { + "CreatedNode": { + "LedgerEntryType": "MPTokenIssuance", + "LedgerIndex": "265CEA78D8246B8B51D5CCC20AF4DB95569DE09E53115C888B176A3D1D05048A", + "NewFields": { + "AssetScale": 2, + "Flags": 34, + "Issuer": "rfGb6p2kWy3zQweWnYNxSFYoHeymcx7mhg", + "MPTokenMetadata": "68747470733A2F2F697066732E696F2F697066732F516D5A6E6A6D4239546B34786141394536373979747250586461336265574D4C556E4D423552466A316553744C70", + "MaximumAmount": "9223372036854775807", + "Sequence": 5496, + "TransferFee": 10 + } + } + }, + { + "CreatedNode": { + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "3A6F809498F6C0E3664BD8451BBAE5F972E45AF17537354D1C28F3A00B35BDFE", + "NewFields": { + "Owner": "rfGb6p2kWy3zQweWnYNxSFYoHeymcx7mhg", + "RootIndex": "3A6F809498F6C0E3664BD8451BBAE5F972E45AF17537354D1C28F3A00B35BDFE" + } + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS", + "mpt_issuance_id": "0000157844C3F3B57A8B579FEE1033CC8E8498729D063617" + }, + "hash": "9686DA1322D2D8F9CD97C5848A8E3CADB9D3F73154DA59BB3A3CACC4CA43671C", + "ledger_index": 5498, + "date": 1710949602000 +} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/types.ts b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/types.ts new file mode 100644 index 000000000..2cce5aa21 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/types.ts @@ -0,0 +1,16 @@ +import { TransactionCommonFields } from '../types' + +export interface MPTokenIssuanceCreate extends TransactionCommonFields { + AssetScale?: number + MaximumAmount?: string + TransferFee?: number + MPTokenMetadata?: string +} + +export interface MPTokenIssuanceCreateInstructions { + issuanceID?: string + metadata?: string + transferFee?: number + assetScale?: number + maxAmount?: string +} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/Simple.tsx b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/Simple.tsx new file mode 100644 index 000000000..2b9bb6676 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/Simple.tsx @@ -0,0 +1,18 @@ +import { useTranslation } from 'react-i18next' +import { SimpleRow } from '../SimpleRow' +import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' +import { MPTokenIssuanceDestroy } from './types' +import { MPTokenLink } from '../../MPTokenLink' + +export const Simple: TransactionSimpleComponent = ({ + data, +}: TransactionSimpleProps) => { + const { MPTokenIssuanceID } = data.instructions + const { t } = useTranslation() + + return ( + + + + ) +} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/index.ts b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/index.ts new file mode 100644 index 000000000..52f730f68 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/index.ts @@ -0,0 +1,13 @@ +import { + TransactionAction, + TransactionCategory, + TransactionMapping, +} from '../types' + +import { Simple } from './Simple' + +export const MPTokenIssuanceDestroyTransaction: TransactionMapping = { + Simple, + action: TransactionAction.CANCEL, + category: TransactionCategory.MPT, +} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/MPTokenIssuanceDestroySimple.test.jsx b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/MPTokenIssuanceDestroySimple.test.jsx new file mode 100644 index 000000000..ee9a5b7c0 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/MPTokenIssuanceDestroySimple.test.jsx @@ -0,0 +1,29 @@ +import { createSimpleWrapperFactory } from '../../test/createWrapperFactory' +import { Simple } from '../Simple' +import { expectSimpleRowText } from '../../test' +import transactionSuccess from './mock_data/MPTokenIssuanceDestroy.json' +import transactionFail from './mock_data/MPTokenIssuanceDestroy_Fail.json' + +const createWrapper = createSimpleWrapperFactory(Simple) + +describe('MPTokenIssuanceDestroy', () => { + it('handles MPTokenIssuanceDestroy simple view ', () => { + const wrapper = createWrapper(transactionSuccess) + expectSimpleRowText( + wrapper, + 'mpt-issuance-id', + '0000071E15A457415B9A921957CA1958F0E3B8A049BE8627', + ) + wrapper.unmount() + }) + + it('handles failed MPTokenIssuanceDestroy simple view ', () => { + const wrapper = createWrapper(transactionFail) + expectSimpleRowText( + wrapper, + 'mpt-issuance-id', + '0000097E2ACB52C693EABBB156034140B2ED5E9522C4ACF4', + ) + wrapper.unmount() + }) +}) diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy.json b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy.json new file mode 100644 index 000000000..3ac12863b --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy.json @@ -0,0 +1,76 @@ +{ + "tx": { + "Account": "rpyShdZBMVC9p6tesouh97JEEWZgYGYTW1", + "Fee": "10", + "Flags": 2147483648, + "MPTokenIssuanceID": "0000071E15A457415B9A921957CA1958F0E3B8A049BE8627", + "Sequence": 1823, + "SigningPubKey": "ED31ED6E308C928DA72935A03526C3C5422353EB686908D3ADAD9D573921DBDFB5", + "TransactionType": "MPTokenIssuanceDestroy", + "TxnSignature": "432417F93E86710B50619E4B9EAA43A7F636546A70D4A854E619AF01108A400519A4022B7BABE4807263CDD7EB43217B9ABB8F9745B988981B1A556D11C83200", + "ctid": "C000072100000000", + "date": 1710968140000, + "hash": "undefined", + "inLedger": "undefined", + "ledger_index": "undefined", + "meta": "undefined", + "validated": "undefined", + "metaData": "undefined", + "status": "undefined" + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rpyShdZBMVC9p6tesouh97JEEWZgYGYTW1", + "Balance": "99999980", + "Flags": 0, + "OwnerCount": 0, + "Sequence": 1824 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "27F062565B9B9226F10C5AA25E1AD5C3E70A6A93FF2AB4851614A2C43D083850", + "PreviousFields": { + "Balance": "99999990", + "OwnerCount": 1, + "Sequence": 1823 + }, + "PreviousTxnID": "E6DFD28EDD7213F43B7D0DB1296D09460458709583BEEA29F17C2F63B4DA9FC4", + "PreviousTxnLgrSeq": 1824 + } + }, + { + "DeletedNode": { + "FinalFields": { + "Flags": 0, + "Issuer": "rpyShdZBMVC9p6tesouh97JEEWZgYGYTW1", + "OutstandingAmount": "0", + "OwnerNode": "0", + "PreviousTxnID": "E6DFD28EDD7213F43B7D0DB1296D09460458709583BEEA29F17C2F63B4DA9FC4", + "PreviousTxnLgrSeq": 1824, + "Sequence": 1822 + }, + "LedgerEntryType": "MPTokenIssuance", + "LedgerIndex": "9C882DA4DF7B92FC968A0ADCA8BAFB7842264F98A5E147348C6E6077EAB24AA8" + } + }, + { + "DeletedNode": { + "FinalFields": { + "Flags": 0, + "Owner": "rpyShdZBMVC9p6tesouh97JEEWZgYGYTW1", + "RootIndex": "B8124B2AD6A85560C73E1748E2C8B0E5C0871F4439F10B042DD7E4017D864287" + }, + "LedgerEntryType": "DirectoryNode", + "LedgerIndex": "B8124B2AD6A85560C73E1748E2C8B0E5C0871F4439F10B042DD7E4017D864287" + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + }, + "hash": "9EB556D18BFB67F31C8716C7F3CBBB070E1E7B120DEDDC423D25DFAD850BD93A", + "ledger_index": 1825, + "date": 1710968140000 +} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy_Fail.json b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy_Fail.json new file mode 100644 index 000000000..88b5cc651 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/test/mock_data/MPTokenIssuanceDestroy_Fail.json @@ -0,0 +1,49 @@ +{ + "tx": { + "Account": "rJbNXmT1uhmbghSQAFcgxAAN9yCRCu9y7g", + "Fee": "10", + "Flags": 2147483648, + "MPTokenIssuanceID": "0000097E2ACB52C693EABBB156034140B2ED5E9522C4ACF4", + "Sequence": 2431, + "SigningPubKey": "EDF5A4F08EDD12BB89658B8DE56558600342AD92D42FEDFAD682F4DAD9647EF5AA", + "TransactionType": "MPTokenIssuanceDestroy", + "TxnSignature": "C3B5F7D9A21A5EF85663058790DE7F458EA903C0010F3C2E1FEA45647052C2D85231ED4C17EB324A97AC2D4DE9A71F46D277B8A0A7AFB42D30A3EDA42E8E4106", + "ctid": "C000098100000000", + "date": 1710970247000, + "hash": "undefined", + "inLedger": "undefined", + "ledger_index": "undefined", + "meta": "undefined", + "validated": "undefined", + "metaData": "undefined", + "status": "undefined" + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rJbNXmT1uhmbghSQAFcgxAAN9yCRCu9y7g", + "Balance": "99999990", + "Flags": 0, + "OwnerCount": 0, + "Sequence": 2432 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "BA6DF5388FF6BF026D3F8C91893534890F87309A32D30749CC70BCB1C6F1BEF6", + "PreviousFields": { + "Balance": "100000000", + "Sequence": 2431 + }, + "PreviousTxnID": "07F74CD4BD3E54410E436F9895BC2EC98D35E05F7584CB95D6660AF0411E9283", + "PreviousTxnLgrSeq": 2431 + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tecNO_PERMISSION" + }, + "hash": "2F31C86C343B2D2DB3D8B01BDE84E5BFA0BCB86321365A16D93DF806B79B16FD", + "ledger_index": 2433, + "date": 1710970247000 +} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/types.ts b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/types.ts new file mode 100644 index 000000000..db9b812f9 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceDestroy/types.ts @@ -0,0 +1,5 @@ +import { TransactionCommonFields } from '../types' + +export interface MPTokenIssuanceDestroy extends TransactionCommonFields { + MPTokenIssuanceID: string +} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/Simple.tsx b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/Simple.tsx new file mode 100644 index 000000000..9f0b13ca8 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/Simple.tsx @@ -0,0 +1,26 @@ +import { useTranslation } from 'react-i18next' +import { SimpleRow } from '../SimpleRow' +import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' +import { MPTokenIssuanceSet } from './types' +import { Account } from '../../Account' +import { MPTokenLink } from '../../MPTokenLink' + +export const Simple: TransactionSimpleComponent = ({ + data, +}: TransactionSimpleProps) => { + const { MPTokenIssuanceID, MPTokenHolder } = data.instructions + const { t } = useTranslation() + + return ( + <> + + + + {MPTokenHolder && ( + + + + )} + + ) +} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/index.ts b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/index.ts new file mode 100644 index 000000000..acbe8d389 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/index.ts @@ -0,0 +1,13 @@ +import { + TransactionAction, + TransactionCategory, + TransactionMapping, +} from '../types' + +import { Simple } from './Simple' + +export const MPTokenIssuanceSetTransaction: TransactionMapping = { + Simple, + action: TransactionAction.MODIFY, + category: TransactionCategory.MPT, +} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/MPTokenIssuanceSetSimple.test.jsx b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/MPTokenIssuanceSetSimple.test.jsx new file mode 100644 index 000000000..2083e158c --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/MPTokenIssuanceSetSimple.test.jsx @@ -0,0 +1,53 @@ +import { createSimpleWrapperFactory } from '../../test/createWrapperFactory' +import { Simple } from '../Simple' +import { expectSimpleRowText, expectSimpleRowNotToExist } from '../../test' +import transactionSuccess from './mock_data/MPTokenIssuanceSet.json' +import transactionNoHolder from './mock_data/MPTokenIssuanceSet_NoHolder.json' +import transactionFail from './mock_data/MPTokenIssuanceSet_Fail.json' + +const createWrapper = createSimpleWrapperFactory(Simple) + +describe('MPTokenIssuanceSet', () => { + it('handles MPTokenIssuanceSet simple view ', () => { + const wrapper = createWrapper(transactionSuccess) + + expectSimpleRowText( + wrapper, + 'mpt-issuance-id', + '00000BED9E4ADA3DCC1BE78683C4B623A74013818160590C', + ) + expectSimpleRowText( + wrapper, + 'mpt-holder', + 'r9hF4e3e6kLuxLobPwfQa2wzXZMDvBDeUg', + ) + wrapper.unmount() + }) + + it('handles MPTokenIssuanceSet simple view w/o holder ', () => { + const wrapper = createWrapper(transactionNoHolder) + + expectSimpleRowText( + wrapper, + 'mpt-issuance-id', + '000002609BB39CEC721B5AB337B6BD862ACD2811CBBB5F18', + ) + expectSimpleRowNotToExist(wrapper, 'mpt-holder') + wrapper.unmount() + }) + + it('handles failed MPTokenIssuanceSet simple view ', () => { + const wrapper = createWrapper(transactionFail) + expectSimpleRowText( + wrapper, + 'mpt-issuance-id', + '00000F83146C83112AED215CD345F8E7327459BFCF6B8062', + ) + expectSimpleRowText( + wrapper, + 'mpt-holder', + 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', + ) + wrapper.unmount() + }) +}) diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet.json b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet.json new file mode 100644 index 000000000..e78513a6c --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet.json @@ -0,0 +1,67 @@ +{ + "tx": { + "Account": "rERyS9qtwky94UMMjjmbku3uo5aQwAoJ58", + "Fee": "10", + "Flags": 1, + "MPTokenHolder": "r9hF4e3e6kLuxLobPwfQa2wzXZMDvBDeUg", + "MPTokenIssuanceID": "00000BED9E4ADA3DCC1BE78683C4B623A74013818160590C", + "Sequence": 3054, + "SigningPubKey": "EDF73A1C528F5BFBD6FF2B05D0C71760D7D2DF1DE3496935612E47BCB440F28040", + "TransactionType": "MPTokenIssuanceSet", + "TxnSignature": "5BC9ABE91A10F86440E301F17DFADD08D2E55E0699441372BE73D843B4481869BD6224ED461BC4F9894E97F1F99562D3CF2CD1A4E991BD7993DC24EDA63F5B05", + "ctid": "C0000BF100000000", + "date": 1711047580000, + "hash": "undefined", + "inLedger": "undefined", + "ledger_index": "undefined", + "meta": "undefined", + "validated": "undefined", + "metaData": "undefined", + "status": "undefined" + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "r9hF4e3e6kLuxLobPwfQa2wzXZMDvBDeUg", + "Flags": 1, + "MPTokenIssuanceID": "00000BED9E4ADA3DCC1BE78683C4B623A74013818160590C", + "OwnerNode": "0" + }, + "LedgerEntryType": "MPToken", + "LedgerIndex": "DDA698915F22D7CEA45896CB70DCC0DF803E1F573B92B6F0178F1688208EED04", + "PreviousFields": { + "Flags": 0 + }, + "PreviousTxnID": "39709CA66D9103354D09070234A14253EC779846BB73477EEB21C5A65144C844", + "PreviousTxnLgrSeq": 3056 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rERyS9qtwky94UMMjjmbku3uo5aQwAoJ58", + "Balance": "99999980", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 3055 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "EDD52DA05DAB16BAF6A3B7D47CCB9FEAB7AAC2BDD9CB007F6A3B8E0DBCE50A45", + "PreviousFields": { + "Balance": "99999990", + "Sequence": 3054 + }, + "PreviousTxnID": "41A99F7E107F813C132B105AB930FD8C6960530DDFA5D98FCEF5A5600DA39D38", + "PreviousTxnLgrSeq": 3055 + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + }, + "hash": "4993E5B875E0217ABC92EFC395805F1344D8A9A3D75437EEA457C05EDB3AB20B", + "ledger_index": 3057, + "date": 1711047580000 +} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_Fail.json b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_Fail.json new file mode 100644 index 000000000..60062ffc1 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_Fail.json @@ -0,0 +1,50 @@ +{ + "tx": { + "Account": "rpizWPf4g8JLWFUT7143Zn9A1n2Dy9bnji", + "Fee": "10", + "Flags": 1, + "MPTokenHolder": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "MPTokenIssuanceID": "00000F83146C83112AED215CD345F8E7327459BFCF6B8062", + "Sequence": 3972, + "SigningPubKey": "ED4EC06184C745D99AEAAA16526C900DC181C8546899F462C3D105C11A6677A65A", + "TransactionType": "MPTokenIssuanceSet", + "TxnSignature": "2A9D1795983016A162F05CEBBD35E65B955BD67AB96B8A2DB2E31027EA67DDF082B1C4D67F9219CBF9893520ACB0ACB80E2ED3CE96496AA4668BCCF4A46EAE0A", + "ctid": "C0000F8700000000", + "date": 1711048704000, + "hash": "undefined", + "inLedger": "undefined", + "ledger_index": "undefined", + "meta": "undefined", + "validated": "undefined", + "metaData": "undefined", + "status": "undefined" + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rpizWPf4g8JLWFUT7143Zn9A1n2Dy9bnji", + "Balance": "99999980", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 3973 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "F937A006AB86775D475946D43BA1612F3BC24A2C144550D4EC0266C2F08303D5", + "PreviousFields": { + "Balance": "99999990", + "Sequence": 3972 + }, + "PreviousTxnID": "8D322CBF8A965E64FB903551C80A2E1DF9E2480A7AD0B1D98BE56574BC9FE215", + "PreviousTxnLgrSeq": 3973 + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tecOBJECT_NOT_FOUND" + }, + "hash": "E47D5242B7E210B9E1DAEFF90DC19DA9310C04CF4444C76F2C76A44533EEC48F", + "ledger_index": 3975, + "date": 1711048704000 +} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_NoHolder.json b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_NoHolder.json new file mode 100644 index 000000000..165596d2a --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/test/mock_data/MPTokenIssuanceSet_NoHolder.json @@ -0,0 +1,67 @@ +{ + "tx": { + "Account": "rEUGuTqrySk9o1rZSVx8seuvcsEZymeEYM", + "Fee": "10", + "Flags": 1, + "MPTokenIssuanceID": "000002609BB39CEC721B5AB337B6BD862ACD2811CBBB5F18", + "Sequence": 609, + "SigningPubKey": "ED92DDE49AA689EC63589623067968B85E4885A9874B3CAB89E07D192EBFA42FF9", + "TransactionType": "MPTokenIssuanceSet", + "TxnSignature": "6678BF017A62360DAA39156112960D934440467D2E4098958F053B6758A2D237DA82CD27FDA3B35BAB610D74669BF6C4DEB12D77984E48158B2D79C8BAEC3303", + "ctid": "C000026400000000", + "date": 1711133159000, + "hash": "undefined", + "inLedger": "undefined", + "ledger_index": "undefined", + "meta": "undefined", + "validated": "undefined", + "metaData": "undefined", + "status": "undefined" + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "Account": "rEUGuTqrySk9o1rZSVx8seuvcsEZymeEYM", + "Balance": "99999980", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 610 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "1D54D263727856612FC7C7A27D93532ED0C41B74FA651992C125AD19C900669D", + "PreviousFields": { + "Balance": "99999990", + "Sequence": 609 + }, + "PreviousTxnID": "CF68A8D929F089F6F53B071250935DD7C3F52F6E175D82E53118265D776D4BF7", + "PreviousTxnLgrSeq": 610 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Flags": 35, + "Issuer": "rEUGuTqrySk9o1rZSVx8seuvcsEZymeEYM", + "OutstandingAmount": "0", + "OwnerNode": "0", + "Sequence": 608 + }, + "LedgerEntryType": "MPTokenIssuance", + "LedgerIndex": "E8DF796110B1FBD9086A4637491E49843D33D897FBC32F03A33140F76378EE86", + "PreviousFields": { + "Flags": 34 + }, + "PreviousTxnID": "CF68A8D929F089F6F53B071250935DD7C3F52F6E175D82E53118265D776D4BF7", + "PreviousTxnLgrSeq": 610 + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS" + }, + "hash": "73C21D8B5DFBF5DE03FCAF0D69C00E9E2918280561E9898C556A1C743A566D47", + "ledger_index": 612, + "date": 1711133159000 +} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceSet/types.ts b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/types.ts new file mode 100644 index 000000000..5e15d49e8 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceSet/types.ts @@ -0,0 +1,6 @@ +import { TransactionCommonFields } from '../types' + +export interface MPTokenIssuanceSet extends TransactionCommonFields { + MPTokenIssuanceID: string + MPTokenHolder?: string +} diff --git a/src/containers/shared/components/Transaction/NFTokenAcceptOffer/types.ts b/src/containers/shared/components/Transaction/NFTokenAcceptOffer/types.ts index 249a9632d..5091a827e 100644 --- a/src/containers/shared/components/Transaction/NFTokenAcceptOffer/types.ts +++ b/src/containers/shared/components/Transaction/NFTokenAcceptOffer/types.ts @@ -1,6 +1,8 @@ +import { ExplorerAmount } from '../../../types' + export interface NFTokenAcceptOfferInstructions { acceptedOfferIDs: string[] - amount?: { currency: string; amount: number; issuer?: string } + amount?: ExplorerAmount tokenID?: string seller?: string buyer?: string diff --git a/src/containers/shared/components/Transaction/NFTokenCancelOffer/test/NFTokenCancelOfferSimple.test.jsx b/src/containers/shared/components/Transaction/NFTokenCancelOffer/test/NFTokenCancelOfferSimple.test.jsx index b16576254..ec58e6280 100644 --- a/src/containers/shared/components/Transaction/NFTokenCancelOffer/test/NFTokenCancelOfferSimple.test.jsx +++ b/src/containers/shared/components/Transaction/NFTokenCancelOffer/test/NFTokenCancelOfferSimple.test.jsx @@ -1,21 +1,25 @@ import { BrowserRouter as Router } from 'react-router-dom' import { mount } from 'enzyme' import { I18nextProvider } from 'react-i18next' +import { QueryClientProvider } from 'react-query' import { Simple as NFTokenCancelOffer } from '../Simple' import transaction from './mock_data/NFTokenCancelOffer.json' import summarizeTransaction from '../../../../../../rippled/lib/txSummary' import i18n from '../../../../../../i18n/testConfig' +import { queryClient } from '../../../../QueryClient' describe('NFTokenCancelOffer', () => { it.only('handles NFTokenCancelOffer simple view ', () => { const wrapper = mount( - - - - - , + + + + + + + , ) expect(wrapper.find('[data-test="token-id"] .value')).toHaveText( '000800006203F49C21D5D6E022CB16DE3538F248662FC73C258BA1B200000018', diff --git a/src/containers/shared/components/Transaction/NFTokenCreateOffer/types.ts b/src/containers/shared/components/Transaction/NFTokenCreateOffer/types.ts index 624c2dc47..e25ed0359 100644 --- a/src/containers/shared/components/Transaction/NFTokenCreateOffer/types.ts +++ b/src/containers/shared/components/Transaction/NFTokenCreateOffer/types.ts @@ -1,6 +1,8 @@ +import { ExplorerAmount } from '../../../types' + export interface NFTokenCreateOfferInstructions { account: string - amount: { currency: string; amount: number; issuer?: string } + amount: ExplorerAmount tokenID: string isSellOffer: boolean owner?: string diff --git a/src/containers/shared/components/Transaction/OfferCreate/parser.ts b/src/containers/shared/components/Transaction/OfferCreate/parser.ts index e895c2b5c..238bfd6a5 100644 --- a/src/containers/shared/components/Transaction/OfferCreate/parser.ts +++ b/src/containers/shared/components/Transaction/OfferCreate/parser.ts @@ -6,7 +6,7 @@ export function parser(tx: any) { const base = tx.TakerGets.currency ? tx.TakerGets : { currency: 'XRP' } const counter = tx.TakerPays.currency ? tx.TakerPays : { currency: 'XRP' } const pays = formatAmount(tx.TakerPays) - const price = pays.amount / gets.amount + const price = Number(pays.amount) / Number(gets.amount) const invert = CURRENCY_ORDER.indexOf(counter.currency) > CURRENCY_ORDER.indexOf(base.currency) diff --git a/src/containers/shared/components/Transaction/OracleSet/parser.ts b/src/containers/shared/components/Transaction/OracleSet/parser.ts index bca503f5f..b27a3ba04 100644 --- a/src/containers/shared/components/Transaction/OracleSet/parser.ts +++ b/src/containers/shared/components/Transaction/OracleSet/parser.ts @@ -1,19 +1,6 @@ import { convertHexToString } from '../../../../../rippled/lib/utils' import { OracleSet } from './types' - -// Convert scaled price (assetPrice) to original price using formula: -// originalPrice = assetPrice / 10**scale -// More details: https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-47d-PriceOracles -export function convertScaledPrice(assetPrice: string, scale: number) { - const scaledPriceInBigInt = BigInt(`0x${assetPrice}`) - const divisor = BigInt(10 ** scale) - const integerPart = scaledPriceInBigInt / divisor - const remainder = scaledPriceInBigInt % divisor - const fractionalPart = (remainder * BigInt(10 ** scale)) / divisor - return fractionalPart > 0 - ? `${integerPart}.${fractionalPart.toString().padStart(scale, '0')}` - : `${integerPart}` -} +import { convertScaledPrice } from '../../../utils' export function parser(tx: OracleSet) { const priceDataSeries = tx.PriceDataSeries.map((priceDataObj) => ({ diff --git a/src/containers/shared/components/Transaction/OracleSet/test/ConvertScalePrice.test.ts b/src/containers/shared/components/Transaction/OracleSet/test/ConvertScalePrice.test.ts index 984c63e2b..2437a40c9 100644 --- a/src/containers/shared/components/Transaction/OracleSet/test/ConvertScalePrice.test.ts +++ b/src/containers/shared/components/Transaction/OracleSet/test/ConvertScalePrice.test.ts @@ -1,4 +1,4 @@ -import { convertScaledPrice } from '../parser' +import { convertScaledPrice } from '../../../../utils' const numberToHex = (number) => number.toString(16) describe('convertScaledPrice', () => { diff --git a/src/containers/shared/components/Transaction/Payment/parser.ts b/src/containers/shared/components/Transaction/Payment/parser.ts index 743c05367..57dc16157 100644 --- a/src/containers/shared/components/Transaction/Payment/parser.ts +++ b/src/containers/shared/components/Transaction/Payment/parser.ts @@ -1,4 +1,4 @@ -import type { Payment } from 'xrpl' +// import type { Payment } from 'xrpl' import { formatAmount } from '../../../../../rippled/lib/txSummary/formatAmount' import { PaymentInstructions } from './types' import { Amount, ExplorerAmount } from '../../../types' @@ -10,7 +10,8 @@ const formatFailedPartialAmount = (d: Amount): ExplorerAmount => ({ export const isPartialPayment = (flags: any) => 0x00020000 & flags -export const parser = (tx: Payment, meta: any): PaymentInstructions => { +// TODO: use MPTAmount type from xrpl.js +export const parser = (tx: any, meta: any): PaymentInstructions => { const max = tx.SendMax ? formatAmount(tx.SendMax) : undefined const partial = !!isPartialPayment(tx.Flags) const failedPartial = partial && meta.TransactionResult !== 'tesSUCCESS' diff --git a/src/containers/shared/components/Transaction/Payment/test/PaymentSimple.test.tsx b/src/containers/shared/components/Transaction/Payment/test/PaymentSimple.test.tsx index 60c9ab4b3..5166c919f 100644 --- a/src/containers/shared/components/Transaction/Payment/test/PaymentSimple.test.tsx +++ b/src/containers/shared/components/Transaction/Payment/test/PaymentSimple.test.tsx @@ -1,3 +1,4 @@ +import { useQuery } from 'react-query' import { createSimpleWrapperFactory, expectSimpleRowLabel, @@ -10,6 +11,12 @@ import mockPaymentDestinationTag from './mock_data/PaymentWithDestinationTag.jso import mockPaymentPartial from './mock_data/PaymentWithPartial.json' import mockPaymentSendMax from './mock_data/PaymentWithSendMax.json' import mockPaymentSourceTag from './mock_data/PaymentWithSourceTag.json' +import mockPaymentMPT from './mock_data/PaymentMPT.json' + +jest.mock('react-query', () => ({ + ...jest.requireActual('react-query'), + useQuery: jest.fn(), +})) const createWrapper = createSimpleWrapperFactory(Simple) @@ -114,4 +121,32 @@ describe('Payment: Simple', () => { wrapper.unmount() }) + + it('renders direct MPT payment', () => { + const data = { + assetScale: 3, + } + + // @ts-ignore + useQuery.mockImplementation(() => ({ + data, + })) + + const wrapper = createWrapper(mockPaymentMPT) + + expectSimpleRowText( + wrapper, + 'amount', + `0.1 MPT (000003C31D321B7DDA58324DC38CDF18934FAFFFCDF69D5F)`, + ) + expectSimpleRowLabel(wrapper, 'amount', `send`) + + expectSimpleRowText( + wrapper, + 'destination', + `rw6UtpfBFaGht6SiC1HpDPNw6Yt25pKvnu`, + ) + + wrapper.unmount() + }) }) diff --git a/src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentMPT.json b/src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentMPT.json new file mode 100644 index 000000000..d35339b88 --- /dev/null +++ b/src/containers/shared/components/Transaction/Payment/test/mock_data/PaymentMPT.json @@ -0,0 +1,91 @@ +{ + "tx": { + "Account": "rsC4dnxCb66FQT4XmCUeuQ7dYeqNio4rWg", + "Amount": { + "mpt_issuance_id": "000003C31D321B7DDA58324DC38CDF18934FAFFFCDF69D5F", + "value": "100" + }, + "DeliverMax": { + "mpt_issuance_id": "000003C31D321B7DDA58324DC38CDF18934FAFFFCDF69D5F", + "value": "100" + }, + "Destination": "rw6UtpfBFaGht6SiC1HpDPNw6Yt25pKvnu", + "Fee": "10", + "Flags": 2147483648, + "Sequence": 964, + "SigningPubKey": "ED35B07F41420220332C35B9F4D1F7AF26E67EBD5AD6C9E106D0F774DA15924169", + "TransactionType": "Payment", + "TxnSignature": "2C5CB9740457222F928667DC1196060EF7E61B4E3A8824727AE63ACCFDE35ED5CBEE69E982423592DF0464C57C2C445B4271573DE7A3346630024287844F2502", + "ctid": "C00003C900000000", + "date": 1727802036000 + }, + "meta": { + "AffectedNodes": [ + { + "ModifiedNode": { + "FinalFields": { + "AssetScale": 3, + "Flags": 34, + "Issuer": "rsC4dnxCb66FQT4XmCUeuQ7dYeqNio4rWg", + "MPTokenMetadata": "7B226E616D65223A2255532054726561737572792042696C6C20546F6B656E222C2273796D626F6C223A225553544254222C22646563696D616C73223A322C22746F74616C537570706C79223A313030303030302C22697373756572223A225553205472656173757279222C22697373756544617465223A22323032342D30332D3235222C226D6174757269747944617465223A22323032352D30332D3235222C226661636556616C7565223A2231303030222C22696E74657265737452617465223A22322E35222C22696E7465726573744672657175656E6379223A22517561727465726C79222C22636F6C6C61746572616C223A22555320476F7665726E6D656E74222C226A7572697364696374696F6E223A22556E6974656420537461746573222C22726567756C61746F7279436F6D706C69616E6365223A2253454320526567756C6174696F6E73222C22736563757269747954797065223A2254726561737572792042696C6C222C2265787465726E616C5F75726C223A2268747470733A2F2F6578616D706C652E636F6D2F742D62696C6C2D746F6B656E2D6D657461646174612E6A736F6E227D", + "MaximumAmount": "9223372036854775807", + "OutstandingAmount": "100", + "OwnerNode": "0", + "Sequence": 963 + }, + "LedgerEntryType": "MPTokenIssuance", + "LedgerIndex": "1CFF89335B544E0D6EEC35D74C0D26FF407DC02670F1C4E35A36CC875D34B1C3", + "PreviousFields": { + "OutstandingAmount": "0" + }, + "PreviousTxnID": "6329586F264E4A6E2224318DCFC9B5F28048D84060B78A92CFFE65840DF8D970", + "PreviousTxnLgrSeq": 966 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rw6UtpfBFaGht6SiC1HpDPNw6Yt25pKvnu", + "Flags": 0, + "MPTAmount": "100", + "MPTokenIssuanceID": "000003C31D321B7DDA58324DC38CDF18934FAFFFCDF69D5F", + "OwnerNode": "0" + }, + "LedgerEntryType": "MPToken", + "LedgerIndex": "3BAA73912496683A414494218D3CCA33D02F80D588F80C1257C691448E00E486", + "PreviousFields": {}, + "PreviousTxnID": "60F99C8A23C4A366D19F43EA4BD43414AD4D4B7C21D0228FB7539D1C893E4A74", + "PreviousTxnLgrSeq": 967 + } + }, + { + "ModifiedNode": { + "FinalFields": { + "Account": "rsC4dnxCb66FQT4XmCUeuQ7dYeqNio4rWg", + "Balance": "99999980", + "Flags": 0, + "OwnerCount": 1, + "Sequence": 965 + }, + "LedgerEntryType": "AccountRoot", + "LedgerIndex": "77ECC02B8A7F16EB19A7BFBE8494E959497B4EC7734088583BD4F6B8C82878A5", + "PreviousFields": { + "Balance": "99999990", + "Sequence": 964 + }, + "PreviousTxnID": "6329586F264E4A6E2224318DCFC9B5F28048D84060B78A92CFFE65840DF8D970", + "PreviousTxnLgrSeq": 966 + } + } + ], + "TransactionIndex": 0, + "TransactionResult": "tesSUCCESS", + "delivered_amount": { + "mpt_issuance_id": "000003C31D321B7DDA58324DC38CDF18934FAFFFCDF69D5F", + "value": "100" + } + }, + "hash": "CD9EC015E68D3027919598E0466CFEF19950D0BC688A568DF8822A8BB0AFF98F", + "ledger_index": 11707, + "date": 1712072515000 +} diff --git a/src/containers/shared/components/Transaction/index.ts b/src/containers/shared/components/Transaction/index.ts index babf265fc..c483a22cb 100644 --- a/src/containers/shared/components/Transaction/index.ts +++ b/src/containers/shared/components/Transaction/index.ts @@ -9,6 +9,10 @@ import { AccountSetTransaction as AccountSet } from './AccountSet' import { DIDSetTransaction as DIDSet } from './DIDSet' import { DepositPreauthTransaction as DepositPreauth } from './DepositPreauth' import { EnableAmendmentTransaction as EnableAmendment } from './EnableAmendment' +import { MPTokenAuthorizeTransaction as MPTokenAuthorize } from './MPTokenAuthorize' +import { MPTokenIssuanceCreateTransaction as MPTokenIssuanceCreate } from './MPTokenIssuanceCreate' +import { MPTokenIssuanceDestroyTransaction as MPTokenIssuanceDestroy } from './MPTokenIssuanceDestroy' +import { MPTokenIssuanceSetTransaction as MPTokenIssuanceSet } from './MPTokenIssuanceSet' import { NFTokenMintTransaction as NFTokenMint } from './NFTokenMint' import { NFTokenCancelOfferTransaction as NFTokenCancelOffer } from './NFTokenCancelOffer' import { NFTokenBurnTransaction as NFTokenBurn } from './NFTokenBurn' @@ -55,6 +59,10 @@ export const transactionTypes: { [key: string]: TransactionMapping } = { DIDSet, DepositPreauth, EnableAmendment, + MPTokenAuthorize, + MPTokenIssuanceCreate, + MPTokenIssuanceDestroy, + MPTokenIssuanceSet, NFTokenMint, NFTokenCancelOffer, NFTokenBurn, diff --git a/src/containers/shared/components/Transaction/test/createWrapperFactory.tsx b/src/containers/shared/components/Transaction/test/createWrapperFactory.tsx index 709d242ee..9c93c4a01 100644 --- a/src/containers/shared/components/Transaction/test/createWrapperFactory.tsx +++ b/src/containers/shared/components/Transaction/test/createWrapperFactory.tsx @@ -3,6 +3,7 @@ import { ReactElement } from 'react' import { I18nextProvider } from 'react-i18next' import { BrowserRouter } from 'react-router-dom' import { i18n } from 'i18next' +import { QueryClientProvider } from 'react-query' import defaultI18nConfig from '../../../../../i18n/testConfig' import summarizeTransaction from '../../../../../rippled/lib/txSummary' import { @@ -10,6 +11,7 @@ import { TransactionSimpleComponent, TransactionTableDetailComponent, } from '../types' +import { testQueryClient } from '../../../../test/QueryClient' /** * Methods that produce createWrapper function for tests @@ -22,9 +24,11 @@ export function createWrapper( i18nConfig?: i18n, ): ReactWrapper { return mount( - - {TestComponent} - , + + + {TestComponent} + + , ) } diff --git a/src/containers/shared/components/Transaction/types.ts b/src/containers/shared/components/Transaction/types.ts index d1154be4a..722687b69 100644 --- a/src/containers/shared/components/Transaction/types.ts +++ b/src/containers/shared/components/Transaction/types.ts @@ -8,6 +8,7 @@ export enum TransactionCategory { PAYMENT = 'PAYMENT', NFT = 'NFT', XCHAIN = 'XCHAIN', + MPT = 'MPT', PSEUDO = 'PSEUDO', UNKNOWN = 'UNKNOWN', } diff --git a/src/containers/shared/components/TransactionTable/test/TransactionTable.test.js b/src/containers/shared/components/TransactionTable/test/TransactionTable.test.js index 54517c301..734e4f0d5 100644 --- a/src/containers/shared/components/TransactionTable/test/TransactionTable.test.js +++ b/src/containers/shared/components/TransactionTable/test/TransactionTable.test.js @@ -1,9 +1,11 @@ import { mount } from 'enzyme' import { I18nextProvider } from 'react-i18next' import { BrowserRouter } from 'react-router-dom' +import { QueryClientProvider } from 'react-query' import { TransactionTable } from '../TransactionTable' import i18n from '../../../../../i18n/testConfig' import mockTx from './mockTransactions.json' +import { queryClient } from '../../../QueryClient' const loadMore = jest.fn() @@ -16,17 +18,19 @@ describe('Transaction Table container', () => { hasAdditionalResults = false, ) => mount( - - - - - , + + + + + + + , ) it('renders without crashing', () => { diff --git a/src/containers/shared/components/test/Amount.test.tsx b/src/containers/shared/components/test/Amount.test.tsx index acbe14315..749f62033 100644 --- a/src/containers/shared/components/test/Amount.test.tsx +++ b/src/containers/shared/components/test/Amount.test.tsx @@ -1,9 +1,15 @@ import { I18nextProvider } from 'react-i18next' import { BrowserRouter } from 'react-router-dom' import { mount } from 'enzyme' +import { useQuery } from 'react-query' import { Amount } from '../Amount' import i18n from '../../../../i18n/testConfig' +jest.mock('react-query', () => ({ + ...jest.requireActual('react-query'), + useQuery: jest.fn(), +})) + describe('Amount', () => { const createWrapper = (component: JSX.Element) => mount( @@ -117,4 +123,34 @@ describe('Amount', () => { expect(wrapper.find('.amount-localized').text()).toEqual('+\uE9000.009') wrapper.unmount() }) + + it('handles MPT amount', async () => { + const data = { + issuer: 'rL2LzUhsBJMqsaVCXVvzedPjePbjVzBCC', + assetScale: 3, + maxAmt: '100000000', + outstandingAmt: '1043001', + sequence: 2447, + metadata: + '{"name":"US Treasury Bill Token","symbol":"USTBT","decimals":2,"totalSupply":1000000,"issuer":"US Treasury","issueDate":"2024-03-25","maturityDate":"2025-03-25","faceValue":"1000","interestRate":"2.5","interestFrequency":"Quarterly","collateral":"US Government","jurisdiction":"United States","regulatoryCompliance":"SEC Regulations","securityType":"Treasury Bill","external_url":"https://example.com/t-bill-token-metadata.json"}', + flags: [], + } + + // @ts-ignore + useQuery.mockImplementation(() => ({ + data, + })) + + const value = { + amount: '1043001', + currency: '0000098F03B3BCE934EE8CAA1DF25A42032388361B9E5A65', + isMPT: true, + } + const wrapper = createWrapper( + , + ) + + expect(wrapper.find('.amount-localized').text()).toEqual('1,043.001') + wrapper.unmount() + }) }) diff --git a/src/containers/shared/components/test/Currency.test.tsx b/src/containers/shared/components/test/Currency.test.tsx index e3d218090..8d7de259c 100644 --- a/src/containers/shared/components/test/Currency.test.tsx +++ b/src/containers/shared/components/test/Currency.test.tsx @@ -63,4 +63,26 @@ describe('Currency', () => { expect(wrapper.find('.currency').text()).toEqual('\uE900 XRP') wrapper.unmount() }) + + it('handles MPT ID ', () => { + const wrapper = mount( + + + , + ) + const mpt = wrapper.find('.currency').at(0) + + expect(mpt).toHaveText( + 'MPT (00000BDE5B4F868ECE457207E2C1750065987730B8839E0D)', + ) + expect(mpt.find('a')).toHaveProp( + 'href', + '/mpt/00000BDE5B4F868ECE457207E2C1750065987730B8839E0D', + ) + wrapper.unmount() + }) }) diff --git a/src/containers/shared/css/global.scss b/src/containers/shared/css/global.scss index 327c74065..8d7bf9b0d 100644 --- a/src/containers/shared/css/global.scss +++ b/src/containers/shared/css/global.scss @@ -121,6 +121,7 @@ div.react-stockchart div { @include transaction-category(XCHAIN, $yellow, $yellow-30, $yellow-90); @include transaction-category(PSEUDO, $white, $white, $black-80); @include transaction-category(UNKNOWN, $black-50, $black-30, $black-90); +@include transaction-category(MPT, $blue, $blue-30, $blue-90); .tx-result { &.success { diff --git a/src/containers/shared/css/variables.scss b/src/containers/shared/css/variables.scss index a1987f372..91b259bed 100644 --- a/src/containers/shared/css/variables.scss +++ b/src/containers/shared/css/variables.scss @@ -120,6 +120,7 @@ $custom: $yellow-50; // Feature Sets $amm: $blue; $nft: $blue-purple; +$mpt: $blue; // Currency colors $CURRENCY_DEFAULT: #aedbf7; diff --git a/src/containers/shared/transactionUtils.ts b/src/containers/shared/transactionUtils.ts index e39c28ef1..0ccd26bd9 100644 --- a/src/containers/shared/transactionUtils.ts +++ b/src/containers/shared/transactionUtils.ts @@ -41,6 +41,21 @@ export const TX_FLAGS: Record> = { 0x00200000: 'tfOneAssetLPToken', 0x00400000: 'tfLimitLPToken', }, + MPTokenAuthorize: { + 0x00000001: 'tfMPTUnauthorize', + }, + MPTokenIssuanceCreate: { + 0x00000002: 'tfMPTCanLock', + 0x00000004: 'tfMPTRequireAuth', + 0x00000008: 'tfMPTCanEscrow', + 0x00000010: 'tfMPTCanTrade', + 0x00000020: 'tfMPTCanTransfer', + 0x00000040: 'tfMPTCanClawback', + }, + MPTokenIssuanceSet: { + 0x00000001: 'tfMPTLock', + 0x00000002: 'tfMPTUnlock', + }, NFTokenMint: { 0x00000001: 'tfBurnable', 0x00000002: 'tfOnlyXRP', diff --git a/src/containers/shared/types.ts b/src/containers/shared/types.ts index d219bc63e..3ae210e27 100644 --- a/src/containers/shared/types.ts +++ b/src/containers/shared/types.ts @@ -17,12 +17,18 @@ export interface IssuedCurrencyAmount extends IssuedCurrency { value: string } -export type Amount = IssuedCurrencyAmount | string +export interface MPTAmount { + mpt_issuance_id: string + value: string +} + +export type Amount = IssuedCurrencyAmount | MPTAmount | string export type ExplorerAmount = { issuer?: string currency: string - amount: number + amount: number | string + isMPT?: boolean } export interface Tx { diff --git a/src/containers/shared/utils.js b/src/containers/shared/utils.js index bdeae56e2..ac510adeb 100644 --- a/src/containers/shared/utils.js +++ b/src/containers/shared/utils.js @@ -23,7 +23,8 @@ export const FETCH_INTERVAL_NODES_MILLIS = 60000 export const FETCH_INTERVAL_ERROR_MILLIS = 300 export const DECIMAL_REGEX = /^\d+$/ -export const HASH_REGEX = /[0-9A-Fa-f]{64}/i +export const HASH256_REGEX = /[0-9A-Fa-f]{64}/i +export const HASH192_REGEX = /[0-9A-Fa-f]{48}/i export const CURRENCY_REGEX = /^[a-zA-Z0-9]{3,}[.:+-]r[rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz]{27,35}$/ export const FULL_CURRENCY_REGEX = @@ -129,14 +130,19 @@ export const isEarlierVersion = (source, target) => { } // Document: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat -export const localizeNumber = (num, lang = 'en-US', options = {}) => { +export const localizeNumber = ( + num, + lang = 'en-US', + options = {}, + isMPT = false, +) => { const number = Number.parseFloat(num) const config = { ...NUMBER_DEFAULT_OPTIONS, ...options } if (Number.isNaN(number)) { return null } - if (config.style === 'currency') { + if (config.style === 'currency' && !isMPT) { try { const neg = number < 0 ? '-' : '' const d = new Intl.NumberFormat(lang, config).format(number) @@ -255,6 +261,8 @@ export const formatLargeNumber = (d = 0, digits = 4) => { } } +export const convertHexToBigInt = (s) => BigInt(`0x${s}`) + export const durationToHuman = (s, decimal = 2) => { const d = {} const seconds = Math.abs(s) @@ -301,7 +309,7 @@ export const formatTradingFee = (tradingFee) => }) : undefined -export const computeBalanceChange = (node) => { +export const computeRippleStateBalanceChange = (node) => { const fields = node.FinalFields || node.NewFields const prev = node.PreviousFields const { currency } = fields.Balance @@ -333,7 +341,50 @@ export const computeBalanceChange = (node) => { } } +export const computeMPTokenBalanceChange = (node) => { + const final = node.FinalFields || node.NewFields + const prev = node.PreviousFields + const prevAmount = prev && prev.MPTAmount ? prev.MPTAmount : '0' + const finalAmount = final.MPTAmount ?? '0' + + return { + previousBalance: BigInt(prevAmount), + finalBalance: BigInt(finalAmount), + account: final.Account, + change: BigInt(finalAmount) - BigInt(prevAmount), + } +} + +export const computeMPTIssuanceBalanceChange = (node) => { + const final = node.FinalFields || node.NewFields + const prev = node.PreviousFields + const prevAmount = + prev && prev.OutstandingAmount ? prev.OutstandingAmount : '0' + const finalAmount = final.OutstandingAmount ?? '0' + + return { + previousBalance: BigInt(prevAmount), + finalBalance: BigInt(finalAmount), + account: final.Issuer, + change: BigInt(finalAmount) - BigInt(prevAmount), + } +} + export const renderXRP = (d, language) => { const options = { ...CURRENCY_OPTIONS, currency: 'XRP' } return localizeNumber(d, language, options) } + +// Convert scaled price (assetPrice) in hex string to original price using formula: +// originalPrice = assetPrice / 10**scale +// More details: https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-47d-PriceOracles +export function convertScaledPrice(assetPrice, scale) { + const scaledPriceInBigInt = BigInt(`0x${assetPrice}`) + const divisor = BigInt(10 ** scale) + const integerPart = scaledPriceInBigInt / divisor + const remainder = scaledPriceInBigInt % divisor + const fractionalPart = (remainder * BigInt(10 ** scale)) / divisor + return fractionalPart > 0 + ? `${integerPart}.${fractionalPart.toString().padStart(scale, '0')}` + : `${integerPart}` +} diff --git a/src/rippled/lib/rippled.js b/src/rippled/lib/rippled.js index 598a57e63..c77c6584d 100644 --- a/src/rippled/lib/rippled.js +++ b/src/rippled/lib/rippled.js @@ -1,4 +1,4 @@ -import { CTID_REGEX, HASH_REGEX } from '../../containers/shared/utils' +import { CTID_REGEX, HASH256_REGEX } from '../../containers/shared/utils' import { formatAmount } from './txSummary/formatAmount' import { Error, XRP_BASE, convertRippleDate } from './utils' @@ -144,7 +144,7 @@ const getTransaction = (rippledSocket, txId) => { const params = { command: 'tx', } - if (HASH_REGEX.test(txId)) { + if (HASH256_REGEX.test(txId)) { params.transaction = txId } else if (CTID_REGEX.test(txId)) { params.ctid = txId @@ -557,6 +557,54 @@ const getAMMInfo = (rippledSocket, asset, asset2) => { }) } +const getMPTIssuance = (rippledSocket, tokenId) => + query(rippledSocket, { + command: 'ledger_entry', + mpt_issuance: tokenId, + ledger_index: 'validated', + }).then((resp) => { + if ( + resp.error === 'entryNotFound' || + resp.error === 'lgrNotFound' || + resp.error === 'objectNotFound' + ) { + throw new Error('MPT not found', 404) + } + + if (resp.error_message) { + throw new Error(resp.error_message, 500) + } + return resp + }) + +const getAccountMPTs = ( + rippledSocket, + account, + marker = '', + ledgerIndex = 'validated', +) => + query(rippledSocket, { + command: 'account_objects', + account, + ledger_index: ledgerIndex, + type: 'mptoken', + marker: marker || undefined, + limit: 400, + }).then((resp) => { + if (resp.error === 'actNotFound') { + throw new Error('account not found', 404) + } + if (resp.error === 'invalidParams') { + return undefined + } + + if (resp.error_message) { + throw new Error(resp.error_message, 500) + } + + return resp + }) + export { getLedger, getLedgerEntry, @@ -576,4 +624,6 @@ export { getSellNFToffers, getNFTTransactions, getAMMInfo, + getMPTIssuance, + getAccountMPTs, } diff --git a/src/rippled/lib/txSummary/formatAmount.ts b/src/rippled/lib/txSummary/formatAmount.ts index 7eaf91239..c8cccd4d5 100644 --- a/src/rippled/lib/txSummary/formatAmount.ts +++ b/src/rippled/lib/txSummary/formatAmount.ts @@ -1,18 +1,34 @@ -import { Amount, ExplorerAmount } from '../../../containers/shared/types' +import { + Amount, + ExplorerAmount, + MPTAmount, +} from '../../../containers/shared/types' import { XRP_BASE } from '../utils' +export const isMPTAmount = (amount: Amount): amount is MPTAmount => + (amount as MPTAmount).mpt_issuance_id !== undefined && + (amount as MPTAmount).value !== undefined + export const formatAmount = (d: Amount | number): ExplorerAmount => { if (d == null) { return d } - return typeof d !== 'string' && typeof d !== 'number' + + if (typeof d === 'string' || typeof d === 'number') + return { + currency: 'XRP', + amount: Number(d) / XRP_BASE, + } + + return isMPTAmount(d) ? { + currency: d.mpt_issuance_id, + amount: d.value, + isMPT: true, + } + : { currency: d.currency, issuer: d.issuer, amount: Number(d.value), } - : { - currency: 'XRP', - amount: Number(d) / XRP_BASE, - } } diff --git a/src/rippled/lib/utils.js b/src/rippled/lib/utils.js index 2c95c4db4..a1b19680e 100644 --- a/src/rippled/lib/utils.js +++ b/src/rippled/lib/utils.js @@ -1,4 +1,5 @@ -import { hexToString } from '@xrplf/isomorphic/utils' +import { hexToString, hexToBytes } from '@xrplf/isomorphic/utils' +import { encodeAccountID } from 'ripple-address-codec' import { convertRippleDate } from './convertRippleDate' import { formatSignerList } from './formatSignerList' import { decodeHex } from '../../containers/shared/transactionUtils' @@ -27,6 +28,19 @@ const NFT_FLAGS = { 0x00000002: 'lsfOnlyXRP', 0x00000008: 'lsfTransferable', } +const MPT_ISSUANCE_FLAGS = { + 0x00000001: 'lsfMPTLocked', + 0x00000002: 'lsfMPTCanLock', + 0x00000004: 'lsfMPTRequireAuth', + 0x00000008: 'lsfMPTCanEscrow', + 0x00000010: 'lsfMPTCanTrade', + 0x00000020: 'lsfMPTCanTransfer', + 0x00000040: 'lsfMPTCanClawback', +} +const MPTOKEN_FLAGS = { + 0x00000001: 'lsfMPTLocked', + 0x00000002: 'lsfMPTAuthorized', +} const hex32 = (d) => { const int = d & 0xffffffff const hex = int.toString(16).toUpperCase() @@ -128,6 +142,33 @@ const formatNFTInfo = (info) => ({ warnings: info.warnings, }) +const formatMPTIssuanceInfo = (info) => ({ + issuer: info.node.Issuer, + assetScale: info.node.AssetScale, + maxAmt: info.node.MaximumAmount + ? BigInt(info.node.MaximumAmount).toString(10) + : undefined, // default is undefined because the default maxAmt is the largest 63-bit int + outstandingAmt: info.node.OutstandingAmount + ? BigInt(info.node.OutstandingAmount).toString(10) + : '0', + transferFee: info.node.TransferFee, + sequence: info.node.Sequence, + metadata: info.node.MPTokenMetadata + ? decodeHex(info.node.MPTokenMetadata) + : info.node.MPTokenMetadata, + flags: buildFlags(info.node.Flags, MPT_ISSUANCE_FLAGS), +}) + +const formatMPTokenInfo = (info) => ({ + account: info.Account, + flags: buildFlags(info.Flags, MPTOKEN_FLAGS), + mptIssuanceID: info.MPTokenIssuanceID, + mptIssuer: encodeAccountID( + hexToBytes(info.MPTokenIssuanceID.substring(8, 48)), + ), + mptAmount: info.MPTAmount ? info.MPTAmount.toString(10) : '0', +}) + export { XRP_BASE, RippledError as Error, @@ -137,4 +178,6 @@ export { formatAccountInfo, convertHexToString, formatNFTInfo, + formatMPTIssuanceInfo, + formatMPTokenInfo, } From 6d1d9d14b9ec234d6a8ff5fe32931f335c8dafb7 Mon Sep 17 00:00:00 2001 From: pdp2121 <71317875+pdp2121@users.noreply.github.com> Date: Mon, 14 Oct 2024 14:05:00 -0400 Subject: [PATCH 7/7] Add metadata styling for Multi Purpose Token (#1057) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## High Level Overview of Change MPTokenMetadata is an essential part of a MPT token as it allows issuers to define their own metadata standards, tailored to their specific requirements, encompassing details like asset codes, common names, symbols, or even visual representations. This PR formats the display of this metadata field in the Explorer by adding json formatter for readability. ### Context of Change Spec: https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0033d-multi-purpose-tokens ### Type of Change - [ ] Bug fix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) - [ ] Refactor (non-breaking change that only restructures code) - [ ] Tests (You added tests for code that already exists, or your new feature included in this PR) - [ ] Documentation Updates - [ ] Translation Updates - [ ] Release ## Before / After MPTokenIssuanceCreate Page: ![Screenshot 2024-10-10 at 3 53 01 PM](https://github.com/user-attachments/assets/eb0b6f27-3d8e-494a-9af0-00f96f119d3e) MPT Page: ![Screenshot 2024-10-10 at 3 53 20 PM](https://github.com/user-attachments/assets/5316a92f-4c22-4dcf-82cd-3dd6f6a6f3f8) --- src/containers/MPT/MPTHeader/Details.tsx | 16 ++++++++++++++-- src/containers/MPT/MPTHeader/styles.scss | 4 ++++ .../Transaction/MPTokenIssuanceCreate/Simple.tsx | 10 ++++++++-- .../MPTokenIssuanceCreate/styles.scss | 3 +++ src/containers/shared/utils.js | 9 +++++++++ 5 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 src/containers/shared/components/Transaction/MPTokenIssuanceCreate/styles.scss diff --git a/src/containers/MPT/MPTHeader/Details.tsx b/src/containers/MPT/MPTHeader/Details.tsx index b980380c0..6a0e3d9f1 100644 --- a/src/containers/MPT/MPTHeader/Details.tsx +++ b/src/containers/MPT/MPTHeader/Details.tsx @@ -1,9 +1,10 @@ import { useTranslation } from 'react-i18next' import './styles.scss' import { useLanguage } from '../../shared/hooks' -import { localizeNumber } from '../../shared/utils' +import { isValidJsonString, localizeNumber } from '../../shared/utils' import { MPTIssuanceFormattedInfo } from '../../shared/Interfaces' import { TokenTableRow } from '../../shared/components/TokenTableRow' +import { JsonView } from '../../shared/components/JsonView' interface Props { data: MPTIssuanceFormattedInfo @@ -41,7 +42,18 @@ export const Details = ({ data }: Props) => { )} - {metadata && } + {metadata && ( + + ) : ( + metadata + ) + } + /> + )} ) diff --git a/src/containers/MPT/MPTHeader/styles.scss b/src/containers/MPT/MPTHeader/styles.scss index fc1b25e01..682ea36e4 100644 --- a/src/containers/MPT/MPTHeader/styles.scss +++ b/src/containers/MPT/MPTHeader/styles.scss @@ -17,6 +17,10 @@ @include for-size(desktop-up) { width: 490px; } + + .jv-indent { + border-left: none; + } } .settings { diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx index dc80d5625..218ae93d2 100644 --- a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/Simple.tsx @@ -3,8 +3,10 @@ import { SimpleRow } from '../SimpleRow' import { TransactionSimpleComponent, TransactionSimpleProps } from '../types' import { MPTokenIssuanceCreateInstructions } from './types' import { useLanguage } from '../../../hooks' -import { localizeNumber } from '../../../utils' +import { isValidJsonString, localizeNumber } from '../../../utils' import { MPTokenLink } from '../../MPTokenLink' +import { JsonView } from '../../JsonView' +import './styles.scss' export const Simple: TransactionSimpleComponent = ({ data, @@ -55,7 +57,11 @@ export const Simple: TransactionSimpleComponent = ({ className="dt" data-test="mpt-metadata" > - {metadata} + {isValidJsonString(metadata) ? ( + + ) : ( + metadata + )} )} diff --git a/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/styles.scss b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/styles.scss new file mode 100644 index 000000000..f7ce40841 --- /dev/null +++ b/src/containers/shared/components/Transaction/MPTokenIssuanceCreate/styles.scss @@ -0,0 +1,3 @@ +.jv-indent { + border-left: none; +} diff --git a/src/containers/shared/utils.js b/src/containers/shared/utils.js index ac510adeb..9046410e0 100644 --- a/src/containers/shared/utils.js +++ b/src/containers/shared/utils.js @@ -129,6 +129,15 @@ export const isEarlierVersion = (source, target) => { return false } +export const isValidJsonString = (str) => { + try { + JSON.parse(str) + return true + } catch (e) { + return false + } +} + // Document: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat export const localizeNumber = ( num,