diff --git a/.claude/skills/twig-upgrade/SKILL.md b/.claude/skills/twig-upgrade/SKILL.md new file mode 100644 index 00000000000..23e29444610 --- /dev/null +++ b/.claude/skills/twig-upgrade/SKILL.md @@ -0,0 +1,61 @@ +--- +name: twig-upgrade +description: Checklist for updating the twig/twig dependency. Lists the Craft classes and methods that copy or mirror Twig core code, what to diff each one against, and how to verify the upgrade. Use when bumping twig/twig in composer.json, or when reviewing whether Craft's Twig integration is in sync with upstream. +--- + +# Updating Twig + +Several Craft classes copy, fork, or depend on Twig internals. When `twig/twig` is bumped, each of them must be compared against the new upstream code, or Craft silently drifts from Twig's behavior (including sandbox security fixes). + +## 1. See what changed upstream + +Clone Twig into the scratchpad and diff the two versions for the files listed below: + +```sh +git clone https://github.com/twigphp/Twig.git /twig +cd /twig +git diff v v --stat -- src/ +git diff v v -- src/Node/Expression/GetAttrExpression.php src/Sandbox/ src/NodeVisitor/SandboxNodeVisitor.php +``` + +Also read `CHANGELOG` between the two versions. Look especially for entries mentioning the sandbox, `GetAttrExpression`, `getAttribute()`, deprecations, or security fixes. + +## 2. Files to check + +### Direct copies (highest risk) + +| Craft file | Upstream counterpart | Notes | +|---|---|---| +| `src/web/twig/nodes/GetAttrNode.php` — `compile()` | `src/Node/Expression/GetAttrExpression.php` — `compile()` | Line-for-line port. Differences are marked with `// DIFF` comments. The main intended difference is calling `craft\helpers\Template::attribute()` instead of `CoreExtension::getAttribute()`. `compileArrayKey()` also intentionally coerces every `Stringable` key to a string, to match `Template::attribute()`, rather than only for arrays, `ArrayObject`, and `ArrayIterator` like upstream (since Twig 3.29). Private upstream helpers (`compileArrayKey()`, `isShortCircuited()`, `markAsShortCircuited()`, `getVarName()`) are reimplemented here and must be re-synced too. Port every upstream change to `compile()` or its helpers. | +| `src/web/twig/SecurityPolicy.php` | `src/Sandbox/SecurityPolicy.php` (a `final` class, so Craft forks it) | `checkSecurity()`, `checkMethodAllowed()`, `checkPropertyAllowed()`, the error messages, and the constructor/setter structure mirror upstream. Craft adds `allowedClasses`, the `AllowedInSandbox` attribute, the `AllowableInSandbox` interface, and a getter fallback for `yii\base\BaseObject` properties. Also check `src/Sandbox/SecurityPolicyInterface.php` for signature changes. See the sandbox notes below. | +| `src/web/twig/nodes/expressions/binaries/HasSomeBinary.php`, `HasEveryBinary.php` | `src/Node/Expression/Binary/HasSomeBinary.php`, `HasEveryBinary.php` | Identical except they compile to `craft\web\twig\Extension::arraySome()`/`arrayEvery()`. Those methods in `src/web/twig/Extension.php` delegate to `CoreExtension::checkArrow()` and `CoreExtension::arraySome()`/`arrayEvery()`, so check those signatures too. | +| `src/web/twig/tokenparsers/DeprecatedTokenParser.php`, `nodes/DeprecatedNode.php` | `src/TokenParser/DeprecatedTokenParser.php`, `src/Node/DeprecatedNode.php` | Derived from an older upstream version. The node logs to Craft's deprecator instead of calling `trigger_deprecation()`. Upstream's `package`/`version` options were never ported. Only update if upstream changes the core parsing. | + +### Code that depends on Twig internals + +| Craft file | What to check | +|---|---| +| `src/web/twig/nodevisitors/GetAttrAdjuster.php` | Swaps every `GetAttrExpression` for `GetAttrNode` and copies its nodes and attributes **explicitly**. If upstream adds an attribute to `GetAttrExpression` (or sets one on it from elsewhere, such as `sandboxed_function_name`/`sandboxed_function` from `ExpressionParser/Infix/FunctionExpressionParser.php`), it must be copied here too, or it is silently dropped. Grep the new version for `setAttribute(` calls that target `GetAttrExpression` nodes. | +| `src/helpers/Template.php` — `attribute()` | Wraps `CoreExtension::getAttribute()`. Compare its signature with upstream's. The `BaseObject` property branch bypasses `getAttribute()`, so compare it against upstream's sandbox checks (`checkPropertyAllowed()`, `ensureToStringAllowed()` for `Stringable` items). Its twigphp/Twig#4701 workaround coerces every `Stringable` key to a string for non-method calls. Upstream only does that for arrays, `ArrayObject`, and `ArrayIterator`, and passes the object through for other `ArrayAccess` implementations, which breaks Collections, so keep the workaround unless upstream's behavior changes. | +| `src/web/twig/nodes/FallbackNameExpression.php` | Mirrors `src/Node/Expression/Variable/ContextVariable.php`/`NameExpression.php`'s `compile()`. Deprecated since 5.9.15; only keep it compiling. | +| `src/web/twig/nodes/NavNode.php` | Extends `src/Node/ForNode.php` and calls `parent::compile()`. Check `ForNode`'s constructor signature and the loop variables it compiles. | +| `src/web/twig/Extension.php` | Many filters and functions override core ones but delegate to `CoreExtension` static methods (`sort`, `reduce`, `map`, `filter`, `merge`, `length`, `testEmpty`, `checkArrow`, `formatDate`, `convertDate`, …). Check that those still exist with the same signatures. `capitalizeFilter()` copies `CoreExtension::capitalize()`'s logic. Also compare the `getFilters()`/`getFunctions()`/`getTests()` options (e.g. `needs_environment`, `needs_charset`, `needs_is_sandboxed`, `is_safe`) against the core definitions they override. | +| `src/base/Element.php` — `getIterator()` | Skips custom fields when called from the sandbox's `__toString()` checks, to avoid infinite recursion (#19004). It detects that by checking `debug_backtrace()` for a specific class and method (`Twig\Sandbox\SecurityChecker::doEnsureToStringAllowed()` since Twig 3.29; `SandboxExtension` before that). If upstream renames or moves that method, the check silently stops matching. `tests/unit/base/ElementTest.php` covers it. | +| `src/web/View.php` — `sandbox()` | Turns sandboxing on and off for Craft's shared environment through `SandboxExtension::getChecker()->setSandboxed()`, because `enableSandbox()`/`disableSandbox()` are deprecated since Twig 3.29. `getChecker()` and `SecurityChecker` are `@internal`, so check that they still exist. Twig's replacement, `Twig\Sandbox\Sandbox`, requires a dedicated environment and a strict policy, so it doesn't fit Craft's approach yet. | +| `src/web/twig/tokenparsers/NavTokenParser.php` | Mirrors `src/TokenParser/ForTokenParser.php`'s handling of loop targets. | +| `src/config/twig-sandbox.php`, `src/web/View.php` (`createTwig()`) | If upstream adds allowlist types or constructor arguments to the sandbox, decide whether Craft's policy and config should support them. | + +## 3. Sandbox notes + +- Twig's `SandboxExtension::checkSecurity()` uses reflection to check how many parameters the policy's `checkSecurity()` declares, and triggers a deprecation if it declares fewer than upstream expects. Keep `SecurityPolicy::checkSecurity()`'s parameter list in sync, even for arguments Craft ignores (such as `array $tests`). +- Upstream often loosens things temporarily with "X is always allowed in sandboxes, but won't be in 4.0" deprecations. Don't copy these into Craft's policy without checking what Craft's policy currently does. If Craft already rejects something, copying upstream's deprecate-but-allow branch loosens the sandbox. For example, Twig 3.27 made `parent()`/`block()`/`attribute()` reportable to the policy, and Craft rejects them unless they're in `allowedFunctions`. +- Craft's node visitors and Twig's `SandboxNodeVisitor` all use priority `0`, and Craft's extension is registered first, so Craft's visitors see (and can replace) nodes before the sandbox does. Any node replacement must preserve the attributes the sandbox reads. + +## 4. Verify + +- **Tests:** run `vendor/bin/codecept run unit web/twig`. This needs the test database named in `tests/.env` to exist. +- **Static analysis and coding standards:** run `vendor/bin/phpstan analyse` and `vendor/bin/ecs check` on the changed files. +- **Compiled templates:** compiled templates are cached by template source, not by Craft's node or visitor code. After changing `GetAttrNode`, `GetAttrAdjuster`, or any other compile-time code, clear `tests/_craft/storage/runtime/compiled_templates/` before running tests, or stale compiled templates will hide the change. +- **Strict variables:** `GetAttrNode`'s optimized array path only runs when strict variables are **off** (Dev Mode disabled). The test config enables Dev Mode, so cover that path with a standalone `Twig\Environment` created with `'strict_variables' => false` and `GetAttrAdjuster` registered (see `tests/unit/web/twig/GetAttrNodeTest.php`). +- **Template deprecations:** compile every template under `src/templates/` with a temporary test that records `E_USER_DEPRECATED` errors, and check for deprecations introduced by the new version. `exception.twig` fails to compile because it uses a `renderSourceCode` filter that Craft doesn't register. That's a pre-existing issue, not a Twig regression. +- **Sandbox:** exercise it with `View::renderSandboxedString()` after setting `enableTwigSandbox = true` (see `tests/unit/web/twig/SecurityPolicyTest.php`). diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ef8e167717a..1fc8755f0cb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,6 +4,7 @@ on: push: branches: - 5.x + - '5.12' - '*-internal' pull_request: permissions: diff --git a/CHANGELOG-5.12.md b/CHANGELOG-5.12.md new file mode 100644 index 00000000000..07692d9a5da --- /dev/null +++ b/CHANGELOG-5.12.md @@ -0,0 +1,69 @@ +# Release Notes for Craft CMS 5.12 (WIP) + +### Content Management + +- Addresses within Addresses fields can now be edited from drafts of their owner elements, by users who can save the drafts but not the canonical owner elements. ([#19881](https://github.com/craftcms/cms/issues/19881)) + +### Administration + +- Custom fields now have “Default Tip” and “Default Warning” settings. ([#19976](https://github.com/craftcms/cms/pull/19976)) +- A rate limit is now enforced for `users/login`, `auth/verify-totp`, and `auth/verify-recovery-code` requests. ([#20054](https://github.com/craftcms/cms/pull/20054)) +- Added the `defaultRateLimit` and `defaultRateLimitDuration` config settings, which configure the rate limits for `users/login`, `users/send-password-reset-email`, `auth/verify-totp`, and `auth/verify-recovery-code` requests. ([#20054](https://github.com/craftcms/cms/pull/20054)) + +### Development + +- The `capitalize`, `lower`, `title`, and `upper` Twig filters now have `language` arguments, which default to the current application language. ([#19558](https://github.com/craftcms/cms/pull/19558)) +- Added the `project-config/check` command, which checks project config schema compatibility without applying changes. +- Added the `{% render %}` Twig tag. ([#19988](https://github.com/craftcms/cms/pull/19988)) +- `{% render %}` tags and `render()` methods are allowed within the Twig sandbox. ([#19988](https://github.com/craftcms/cms/pull/19988)) +- GraphQL schemas can now include read-only components for sites, sections, entry types, volumes, user groups, category groups, and tag groups. ([#20055](https://github.com/craftcms/cms/pull/20055)) +- Added the `sites`, `site`, `sections`, `section`, `entryTypes`, `entryType`, `volumes`, `volume`, `userGroups`, `userGroup`, `categoryGroups`, `categoryGroup`, `tagGroups`, and `tagGroup` GraphQL queries, which are available when the schema includes the corresponding components. ([#20055](https://github.com/craftcms/cms/pull/20055)) +- Elements now have `site` fields in GraphQL, when the schema includes the “Query for sites” component. ([#20055](https://github.com/craftcms/cms/pull/20055)) +- Entries now have `section` and `type` fields in GraphQL, when the schema includes the “Query for sections” and “Query for entry types” components. ([#20055](https://github.com/craftcms/cms/pull/20055)) +- Assets now have `volume` fields in GraphQL, when the schema includes the “Query for volumes” component. ([#20055](https://github.com/craftcms/cms/pull/20055)) +- Users now have `groups` fields in GraphQL, when the schema includes the “Query for user groups” component. ([#20055](https://github.com/craftcms/cms/pull/20055)) +- Categories and tags now have `group` fields in GraphQL, when the schema includes the “Query for category groups” and “Query for tag groups” components. ([#20055](https://github.com/craftcms/cms/pull/20055)) + +### Extensibility + +- Addresses now support drafts. +- Element fixtures no longer create revisions by default. Set their `createRevisions` property to `true` to retain the previous behavior. ([#19626](https://github.com/craftcms/cms/pull/19626)) +- Added `craft\base\FieldTrait::$tip`. +- Added `craft\base\FieldTrait::$warning`. +- Added `craft\base\NestedElementTrait::$touchOwnersOnSave`. +- Added `craft\base\Renderable`. ([#19988](https://github.com/craftcms/cms/pull/19988)) +- Added `craft\elements\db\NestedElementQueryTrait::mustHaveField()`. +- Added `craft\elements\db\NestedElementQueryTrait::mustHaveOwner()`. +- Added `craft\fieldlayoutelements\BaseField::defaultTip()`. +- Added `craft\fieldlayoutelements\BaseField::defaultWarning()`. +- Added `craft\gql\queries\Settings`. ([#20055](https://github.com/craftcms/cms/pull/20055)) +- Added `craft\gql\types\CategoryGroup`. ([#20055](https://github.com/craftcms/cms/pull/20055)) +- Added `craft\gql\types\EntryType`. ([#20055](https://github.com/craftcms/cms/pull/20055)) +- Added `craft\gql\types\Section`. ([#20055](https://github.com/craftcms/cms/pull/20055)) +- Added `craft\gql\types\Site`. ([#20055](https://github.com/craftcms/cms/pull/20055)) +- Added `craft\gql\types\TagGroup`. ([#20055](https://github.com/craftcms/cms/pull/20055)) +- Added `craft\gql\types\UserGroup`. ([#20055](https://github.com/craftcms/cms/pull/20055)) +- Added `craft\gql\types\Volume`. ([#20055](https://github.com/craftcms/cms/pull/20055)) +- Added `craft\helpers\Template::render()`. ([#19988](https://github.com/craftcms/cms/pull/19988)) +- Added `craft\i18n\Locale::languageId()`. +- Added `craft\services\Images::getSupportsBmp()`. +- Added `craft\services\Images::getSupportsJxl()`. +- Added `craft\test\ElementFixtureTrait`. ([#19626](https://github.com/craftcms/cms/pull/19626)) +- `Illuminate\Support\Collection` now has a `render()` macro, which replaces `craft\elements\ElementCollection::render()`. ([#19988](https://github.com/craftcms/cms/pull/19988)) +- `craft\helpers\ElementHelper::normalizeSlug()` now has a `$language` argument, which defaults to the current application language. ([#19558](https://github.com/craftcms/cms/pull/19558)) +- `craft\helpers\StringHelper::toLowerCase()`, `::toTitleCase()`, and `::toUpperCase()` now have `$language` arguments, which default to the current application language. ([#19558](https://github.com/craftcms/cms/pull/19558)) +- Deprecated `craft\helpers\ElementHelper::renderElements()`. `craft\helpers\Template::render()` should be used instead. ([#19988](https://github.com/craftcms/cms/pull/19988)) + +### System + +- Added support for JPEG XL (`.jxl`) images, when ImageMagick supports it. JPEG XL images can now be uploaded, transformed, and set as a transform’s output format. +- BMP images can now be transformed and edited in the Image Editor. +- MySQL database backups and restores now carry over SSL/TLS settings from the system’s MySQL option files (e.g. `ssl-ca` or `disable-ssl-verify-server-cert`), if the database connection doesn’t have any `PDO::MYSQL_ATTR_SSL_*` attributes set. ([#19366](https://github.com/craftcms/cms/pull/19366)) +- MySQL database backups and restores now respect the `PDO::MYSQL_ATTR_SSL_CAPATH` and `PDO::MYSQL_ATTR_SSL_CIPHER` database connection attributes. ([#19366](https://github.com/craftcms/cms/pull/19366)) +- Craft can now determine the dimensions of BMP and JPEG XL images on remote volumes without downloading them. +- Removed support for the non-standard `ED256` passkey algorithm. ([#19701](https://github.com/craftcms/cms/pull/19701)) +- Updated Axios to 1.20.0. +- Updated Twig to 3.30. +- Updated Fabric.js to v7. ([#19628](https://github.com/craftcms/cms/pull/19628)) +- Fixed a bug where entry and address indexes weren’t showing any results if they had a “Field” condition rule set to “is empty”. +- Fixed a bug where saving a deeply-nested element on its own wouldn’t update its owners’ `dateUpdated` timestamps, which could cause new revisions to reuse stale nested content. ([#19594](https://github.com/craftcms/cms/issues/19594)) diff --git a/composer.json b/composer.json index 1ffae413a96..abcdf57dc26 100644 --- a/composer.json +++ b/composer.json @@ -68,7 +68,7 @@ "symfony/var-dumper": "^5.0|^6.0|^7.0", "symfony/yaml": "^5.2.3|^6.0|^7.0", "theiconic/name-parser": "^1.2", - "twig/twig": "~3.28.0", + "twig/twig": "~3.30.0", "voku/portable-ascii": "^2.0", "web-auth/webauthn-lib": "~5.3.9", "yiisoft/yii2": "~2.0.55.0", diff --git a/composer.lock b/composer.lock index bc40b778572..6acab27a9af 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "08f5c5f1dfef3f0fc133a531a58d4593", + "content-hash": "527100f499e8b626ef535339e49aadb5", "packages": [ { "name": "bacon/bacon-qr-code", @@ -6857,16 +6857,16 @@ }, { "name": "twig/twig", - "version": "v3.28.0", + "version": "v3.30.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "597c12ed286fb9d1701a36684ce6e0cbe28ebc8b" + "reference": "8c737079b726af72ff8ef3c595be9f6a810ea1ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/597c12ed286fb9d1701a36684ce6e0cbe28ebc8b", - "reference": "597c12ed286fb9d1701a36684ce6e0cbe28ebc8b", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/8c737079b726af72ff8ef3c595be9f6a810ea1ef", + "reference": "8c737079b726af72ff8ef3c595be9f6a810ea1ef", "shasum": "" }, "require": { @@ -6921,7 +6921,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.28.0" + "source": "https://github.com/twigphp/Twig/tree/v3.30.0" }, "funding": [ { @@ -6933,7 +6933,7 @@ "type": "tidelift" } ], - "time": "2026-07-03T20:44:34+00:00" + "time": "2026-09-25T13:20:01+00:00" }, { "name": "voku/portable-ascii", @@ -11481,9 +11481,9 @@ "ext-pdo": "*", "ext-zip": "*" }, - "platform-dev": [], + "platform-dev": {}, "platform-overrides": { "php": "8.2" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.9.0" } diff --git a/package-lock.json b/package-lock.json index 53a713d83e8..d929435a990 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,11 +18,11 @@ "@simplewebauthn/browser": "^13.3.0", "@types/jquery": "^3.5.34", "accounting": "^0.4.1", - "axios": "^1.17.0", + "axios": "^1.20.0", "blueimp-file-upload": "^10.32.0", "codemirror": "^5.65.21", "d3": "^7.9.0", - "fabric": "^1.7.22", + "fabric": "^7.4.0", "htmx.org": "^1.9.12", "iframe-resizer": "^4.4.5", "inputmask": "^5.0.9", @@ -100,6 +100,27 @@ "node": ">=6.0.0" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC", + "optional": true + }, "node_modules/@awesome.me/kit-ddaed3f5c5": { "version": "1.0.74", "resolved": "https://npm.fontawesome.com/@awesome.me/kit-ddaed3f5c5/-/kit-ddaed3f5c5-1.0.74.tgz", @@ -1839,11 +1860,83 @@ "resolved": "packages/craftcms-webpack", "link": true }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, "node_modules/@csstools/css-parser-algorithms": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -1865,7 +1958,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -4373,39 +4466,6 @@ "resolved": "https://registry.npmjs.org/accounting/-/accounting-0.4.1.tgz", "integrity": "sha512-RU6KY9Y5wllyaCNBo1W11ZOTnTHMMgOZkIwdOOs6W5ibMTp72i4xIbEA48djxVGqMNTUNbvrP/1nWg5Af5m2gQ==" }, - "node_modules/acorn": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-0.11.0.tgz", - "integrity": "sha512-fvlA412hssF7l+22DIRlhXUKIuUz9Z9IrCMn/gPyWx90R75X/xB4SsqU8Y1vhiq9xd72P6duzQn5kKojqFN6cw==", - "optional": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", - "integrity": "sha512-j3/4pkfih8W4NK22gxVSXcEonTpAHOHh0hu5BoZrKcOsW/4oBPxTi4Yk3SAj+FhC1f3+bRTkXdm4019gw1vg9g==", - "optional": true, - "dependencies": { - "acorn": "^2.1.0" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha512-pXK8ez/pVjqFdAgBkF1YPVRacuLQ9EXBKaKWaeh58WNfMkCmZhOZzu+NtKSPD5PHmCCHheQ5cD29qM1K4QTxIg==", - "optional": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -4633,24 +4693,6 @@ "node": ">=0.10.0" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "optional": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "optional": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -4701,29 +4743,14 @@ "postcss": "^8.1.0" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "optional": true - }, "node_modules/axios": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.17.0.tgz", - "integrity": "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", + "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } @@ -4808,20 +4835,32 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "optional": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -4846,6 +4885,18 @@ "file-uri-to-path": "1.0.0" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "optional": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -4977,15 +5028,6 @@ "node": ">=8" } }, - "node_modules/browser-request": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", - "integrity": "sha512-YyNI4qJJ+piQG6MMEuo7J3Bzaqssufx04zpEKYfSrl/1Op59HWali9zMtBpXnkmqMcOuWJPZvudrm9wISmnCbg==", - "engines": [ - "node" - ], - "optional": true - }, "node_modules/browserslist": { "version": "4.24.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", @@ -5017,6 +5059,31 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -5289,24 +5356,20 @@ ] }, "node_modules/canvas": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-1.6.13.tgz", - "integrity": "sha512-XAfzfEOHZ3JIPjEV+WSI6PpISgUta3dgmndWbsajotz+0TQOX/jDpp2kawjRERatOGv9sMMzk5auB3GKEKA6hg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.2.3.tgz", + "integrity": "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw==", "hasInstallScript": true, + "license": "MIT", "optional": true, "dependencies": { - "nan": "^2.10.0" + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.3" }, "engines": { - "node": ">=0.8.0" + "node": "^18.12.0 || >= 20.9.0" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "optional": true - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -5706,20 +5769,6 @@ "node": ">= 0.6" } }, - "node_modules/contextify": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/contextify/-/contextify-0.1.15.tgz", - "integrity": "sha512-NpM4b6u5Mzig1/ux3ReVv42L/og3WcKKvkmTWxZpIjhZ/S23BViWZD/7hds9LGNzEL3W9ItfoZ+p6eRhCQMH6Q==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "bindings": "^1.2.1", - "nan": "^2.1.0" - }, - "engines": { - "node": ">=0.10.11" - } - }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -6192,19 +6241,18 @@ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" }, - "node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "optional": true - }, "node_modules/cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "license": "MIT", "optional": true, "dependencies": { - "cssom": "0.3.x" + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/csstype": { @@ -6601,16 +6649,18 @@ "node": ">=12" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "license": "MIT", "optional": true, "dependencies": { - "assert-plus": "^1.0.0" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" }, "engines": { - "node": ">=0.10" + "node": ">=18" } }, "node_modules/debounce-promise": { @@ -6634,6 +6684,39 @@ } } }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT", + "optional": true + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -6888,28 +6971,6 @@ "node": ">=6.0.0" } }, - "node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "optional": true, - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "optional": true - }, "node_modules/dom7": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/dom7/-/dom7-2.1.5.tgz", @@ -6919,31 +6980,6 @@ "ssr-window": "^2.0.0" } }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "optional": true - }, - "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "optional": true, - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "optional": true, - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, "node_modules/dotenv": { "version": "16.4.7", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", @@ -7003,16 +7039,6 @@ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "optional": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -7065,6 +7091,16 @@ "node": ">=0.10.0" } }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "optional": true, + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", @@ -7078,10 +7114,14 @@ } }, "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", "optional": true, + "engines": { + "node": ">=0.12" + }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -7166,6 +7206,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -7202,28 +7243,6 @@ "node": ">=0.8.0" } }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "optional": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, "node_modules/eslint": { "version": "8.57.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", @@ -7575,19 +7594,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "optional": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", @@ -7685,6 +7691,16 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "optional": true, + "engines": { + "node": ">=6" + } + }, "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -7773,32 +7789,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "optional": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ], - "optional": true - }, "node_modules/fabric": { - "version": "1.7.22", - "resolved": "https://registry.npmjs.org/fabric/-/fabric-1.7.22.tgz", - "integrity": "sha512-VRfQKuDQyTqRzWvJSjSbkOb9+988N2d522LDLI3GP8N4tEORNAttMbsh4HncJwY5LFYTKVZPfE2Ei39Npe72og==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/fabric/-/fabric-7.4.0.tgz", + "integrity": "sha512-NalYDc3eifTl1C33zryQwpH6+XA/2ClxQrH9vkASkZw3tbkRmorpikhYMmxhUTmi7O3e9ODz0vOT8qfaCh9IVA==", + "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">=20.0.0" }, "optionalDependencies": { - "canvas": "1.6.x", - "jsdom": "3.x.x", - "xmldom": "0.1.x" + "canvas": "^3.2.0", + "jsdom": "^26.1.0" } }, "node_modules/fast-deep-equal": { @@ -8195,25 +8196,17 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "optional": true, - "engines": { - "node": "*" - } - }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -8275,6 +8268,13 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT", + "optional": true + }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -8489,14 +8489,12 @@ "node": ">=6.0" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0" - } + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT", + "optional": true }, "node_modules/glob": { "version": "10.4.5", @@ -8714,29 +8712,6 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "optional": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8771,6 +8746,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -8804,9 +8780,10 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -8863,6 +8840,19 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/html-entities": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", @@ -8889,26 +8879,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "optional": true, - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "optional": true - }, "node_modules/htmx.org": { "version": "1.9.12", "resolved": "https://registry.npmjs.org/htmx.org/-/htmx.org-1.9.12.tgz", @@ -8993,21 +8963,6 @@ } } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -9073,6 +9028,27 @@ "postcss": "^8.1.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause", + "optional": true + }, "node_modules/iframe-resizer": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/iframe-resizer/-/iframe-resizer-4.4.5.tgz", @@ -9171,7 +9147,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "devOptional": true }, "node_modules/inputmask": { "version": "5.0.9", @@ -9355,6 +9331,13 @@ "node": ">=0.10.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT", + "optional": true + }, "node_modules/is-primitive": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz", @@ -9374,12 +9357,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "optional": true - }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -9409,12 +9386,6 @@ "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "optional": true - }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -9547,31 +9518,82 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "optional": true - }, "node_modules/jsdom": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-3.1.2.tgz", - "integrity": "sha512-GA+u4MzID/sjkAH2zzzSHDRStSLK2qwSockuy2X/ixqSGNv8OmCbnF49NGXLQUakOhGRm/wf7CLdF3omdAN/0g==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", + "license": "MIT", + "optional": true, + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", "optional": true, "dependencies": { - "acorn": "0.11.0", - "acorn-globals": "^1.0.2", - "browser-request": ">= 0.3.1 < 0.4.0", - "contextify": ">= 0.1.9 < 0.2.0", - "cssom": ">= 0.3.0 < 0.4.0", - "cssstyle": ">= 0.2.21 < 0.3.0", - "escodegen": "^1.6.1", - "htmlparser2": ">= 3.7.3 < 4.0.0", - "nwmatcher": ">= 1.3.4 < 2.0.0", - "parse5": ">= 1.3.1 < 2.0.0", - "request": ">= 2.44.0 < 3.0.0", - "xml-name-validator": "^1.0.0", - "xmlhttprequest": ">= 1.6.0 < 2.0.0" + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" } }, "node_modules/jsesc": { @@ -9618,12 +9640,6 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "optional": true - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -9634,12 +9650,6 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "optional": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -9651,21 +9661,6 @@ "node": ">=6" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "optional": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -9697,19 +9692,6 @@ "shell-quote": "^1.8.1" } }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "optional": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -10275,6 +10257,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mini-css-extract-plugin": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", @@ -10505,6 +10500,13 @@ "node": ">=10" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT", + "optional": true + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10555,6 +10557,13 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT", + "optional": true + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -10573,6 +10582,32 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, + "node_modules/node-abi": { + "version": "3.96.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.96.0.tgz", + "integrity": "sha512-rebQ/lz7i0EkoLzUVSrKRzA69zMkwLp95kKMWoMDkkM00Suxz0D7zEQPwRml5fQum24mj7bPvmlgLAmu2JCiYg==", + "license": "MIT", + "optional": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", @@ -10750,21 +10785,13 @@ "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" }, - "node_modules/nwmatcher": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", - "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "node_modules/nwsapi": { + "version": "2.2.27", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.27.tgz", + "integrity": "sha512-gQPNF78qebCQ6tvVFBYrvJdBNOrYZm90ZlXgpIFm06p6qHDHq/XC4TnJftN6OMbxVE0UTBAoRgcsDeJBBooITw==", + "license": "MIT", "optional": true }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "optional": true, - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -10877,23 +10904,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "optional": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -10990,10 +11000,17 @@ } }, "node_modules/parse5": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "integrity": "sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==", - "optional": true + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "optional": true, + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } }, "node_modules/parseurl": { "version": "1.3.3", @@ -11073,12 +11090,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "optional": true - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -12038,13 +12049,42 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "license": "MIT", "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" } }, "node_modules/prettier": { @@ -12139,11 +12179,16 @@ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "optional": true + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "optional": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, "node_modules/punycode": { "version": "2.3.1", @@ -12179,15 +12224,6 @@ "integrity": "sha512-ootKng4eaxNxa7rx6FJv2YKef3DuhqbEj3l70oGXwddPQEEnISm50TEZQclqiLTAtilT2nu7TErtCO523hHkyg==", "dev": true }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "optional": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -12245,6 +12281,32 @@ "node": ">= 0.8" } }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "optional": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -12458,52 +12520,6 @@ "node": ">=6" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "optional": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "optional": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -12677,6 +12693,13 @@ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "license": "MIT", + "optional": true + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -12809,6 +12832,19 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "license": "ISC", + "optional": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -13185,6 +13221,53 @@ "node": ">=4" } }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/slash": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", @@ -13328,31 +13411,6 @@ "wbuf": "^1.7.3" } }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "optional": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ssr-window": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-2.0.0.tgz", @@ -14156,6 +14214,13 @@ "url": "https://www.patreon.com/vladimirkharlampidi" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT", + "optional": true + }, "node_modules/table": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", @@ -14337,6 +14402,43 @@ "node": ">=10" } }, + "node_modules/tar-fs": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.5.tgz", + "integrity": "sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==", + "license": "MIT", + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC", + "optional": true + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tar/node_modules/minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", @@ -14486,6 +14588,26 @@ "node": ">=18" } }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "license": "MIT", + "optional": true + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -14511,16 +14633,29 @@ } }, "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "license": "BSD-3-Clause", "optional": true, "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "tldts": "^6.1.32" }, "engines": { - "node": ">=0.8" + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "license": "MIT", + "optional": true, + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" } }, "node_modules/ts-interface-checker": { @@ -14642,6 +14777,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", "optional": true, "dependencies": { "safe-buffer": "^5.0.1" @@ -14650,24 +14786,6 @@ "node": "*" } }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "optional": true - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "optional": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -14870,16 +14988,6 @@ "node": ">= 0.4.0" } }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "optional": true, - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/v-tooltip": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/v-tooltip/-/v-tooltip-2.1.3.tgz", @@ -14904,20 +15012,6 @@ "resolved": "https://registry.npmjs.org/velocity-animate/-/velocity-animate-1.5.2.tgz", "integrity": "sha512-m6EXlCAMetKztO1ppBhGU1/1MR3IiEevO6ESq6rcrSQ3Q77xYSW13jkfXW88o4xMrkXJhy/U7j4wFR/twMB0Eg==" }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/vscode-languageserver-types": { "version": "3.17.5", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", @@ -15220,6 +15314,19 @@ "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "peer": true }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "license": "MIT", + "optional": true, + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", @@ -15240,6 +15347,16 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "optional": true, + "engines": { + "node": ">=12" + } + }, "node_modules/webpack": { "version": "5.98.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", @@ -15562,6 +15679,57 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "license": "MIT", + "optional": true, + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -15634,15 +15802,6 @@ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -15825,9 +15984,10 @@ } }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -15845,29 +16005,21 @@ } }, "node_modules/xml-name-validator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-1.0.0.tgz", - "integrity": "sha512-XDmXffxxQs/+0VLW9NB2oSIbSoSINj6dQdhegY3kEM81LOoLr6NfsFE9RR59qrwsKEHaZLxa1MOSahFA0CE9Ow==", - "optional": true - }, - "node_modules/xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", - "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "license": "Apache-2.0", "optional": true, "engines": { - "node": ">=0.1" + "node": ">=18" } }, - "node_modules/xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", - "optional": true, - "engines": { - "node": ">=0.4.0" - } + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT", + "optional": true }, "node_modules/xregexp": { "version": "5.1.2", @@ -16124,6 +16276,27 @@ "@jridgewell/trace-mapping": "^0.3.9" } }, + "@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "optional": true, + "requires": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + }, + "dependencies": { + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "optional": true + } + } + }, "@awesome.me/kit-ddaed3f5c5": { "version": "1.0.74", "resolved": "https://npm.fontawesome.com/@awesome.me/kit-ddaed3f5c5/-/kit-ddaed3f5c5-1.0.74.tgz", @@ -17357,18 +17530,41 @@ } } }, + "@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "optional": true + }, + "@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "optional": true, + "requires": {} + }, + "@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "optional": true, + "requires": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" + } + }, "@csstools/css-parser-algorithms": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "dev": true, + "devOptional": true, "requires": {} }, "@csstools/css-tokenizer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "dev": true + "devOptional": true }, "@csstools/media-query-list-parser": { "version": "4.0.3", @@ -19046,29 +19242,6 @@ "resolved": "https://registry.npmjs.org/accounting/-/accounting-0.4.1.tgz", "integrity": "sha512-RU6KY9Y5wllyaCNBo1W11ZOTnTHMMgOZkIwdOOs6W5ibMTp72i4xIbEA48djxVGqMNTUNbvrP/1nWg5Af5m2gQ==" }, - "acorn": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-0.11.0.tgz", - "integrity": "sha512-fvlA412hssF7l+22DIRlhXUKIuUz9Z9IrCMn/gPyWx90R75X/xB4SsqU8Y1vhiq9xd72P6duzQn5kKojqFN6cw==", - "optional": true - }, - "acorn-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", - "integrity": "sha512-j3/4pkfih8W4NK22gxVSXcEonTpAHOHh0hu5BoZrKcOsW/4oBPxTi4Yk3SAj+FhC1f3+bRTkXdm4019gw1vg9g==", - "optional": true, - "requires": { - "acorn": "^2.1.0" - }, - "dependencies": { - "acorn": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha512-pXK8ez/pVjqFdAgBkF1YPVRacuLQ9EXBKaKWaeh58WNfMkCmZhOZzu+NtKSPD5PHmCCHheQ5cD29qM1K4QTxIg==", - "optional": true - } - } - }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -19234,21 +19407,6 @@ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==" }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "optional": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "optional": true - }, "astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -19273,25 +19431,13 @@ "postcss-value-parser": "^4.2.0" } }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "optional": true - }, - "aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "optional": true - }, "axios": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.17.0.tgz", - "integrity": "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", "requires": { "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", + "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } @@ -19359,20 +19505,17 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "optional": true + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -19391,6 +19534,17 @@ "file-uri-to-path": "1.0.0" } }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "optional": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -19502,12 +19656,6 @@ "fill-range": "^7.1.1" } }, - "browser-request": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", - "integrity": "sha512-YyNI4qJJ+piQG6MMEuo7J3Bzaqssufx04zpEKYfSrl/1Op59HWali9zMtBpXnkmqMcOuWJPZvudrm9wISmnCbg==", - "optional": true - }, "browserslist": { "version": "4.24.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", @@ -19519,6 +19667,16 @@ "update-browserslist-db": "^1.1.1" } }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "optional": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -19726,20 +19884,15 @@ "integrity": "sha512-NgL3vUTnDrPCZ3zTahp4fsugQ4dc7EKTSzwQDPEel6DMoMnfH2jhry9n2Zm8onbSR+f/QtKHFOA+iAQu4kbtWA==" }, "canvas": { - "version": "1.6.13", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-1.6.13.tgz", - "integrity": "sha512-XAfzfEOHZ3JIPjEV+WSI6PpISgUta3dgmndWbsajotz+0TQOX/jDpp2kawjRERatOGv9sMMzk5auB3GKEKA6hg==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.2.3.tgz", + "integrity": "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw==", "optional": true, "requires": { - "nan": "^2.10.0" + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.3" } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "optional": true - }, "chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -20042,16 +20195,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, - "contextify": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/contextify/-/contextify-0.1.15.tgz", - "integrity": "sha512-NpM4b6u5Mzig1/ux3ReVv42L/og3WcKKvkmTWxZpIjhZ/S23BViWZD/7hds9LGNzEL3W9ItfoZ+p6eRhCQMH6Q==", - "optional": true, - "requires": { - "bindings": "^1.2.1", - "nan": "^2.1.0" - } - }, "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -20348,19 +20491,14 @@ } } }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "optional": true - }, "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", "optional": true, "requires": { - "cssom": "0.3.x" + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" } }, "csstype": { @@ -20646,13 +20784,14 @@ "d3-transition": "2 - 3" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "optional": true, "requires": { - "assert-plus": "^1.0.0" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" } }, "debounce-promise": { @@ -20668,6 +20807,27 @@ "ms": "^2.1.3" } }, + "decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "optional": true + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "optional": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "optional": true + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -20861,24 +21021,6 @@ "esutils": "^2.0.2" } }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "optional": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "optional": true - } - } - }, "dom7": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/dom7/-/dom7-2.1.5.tgz", @@ -20888,31 +21030,6 @@ "ssr-window": "^2.0.0" } }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "optional": true - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "optional": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "optional": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, "dotenv": { "version": "16.4.7", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", @@ -20956,16 +21073,6 @@ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "optional": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -21011,6 +21118,15 @@ } } }, + "end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "optional": true, + "requires": { + "once": "^1.4.0" + } + }, "enhanced-resolve": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", @@ -21021,9 +21137,9 @@ } }, "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "optional": true }, "env-paths": { @@ -21109,19 +21225,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "optional": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, "eslint": { "version": "8.57.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", @@ -21353,12 +21456,6 @@ } } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "optional": true - }, "esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", @@ -21430,6 +21527,12 @@ "strip-final-newline": "^2.0.0" } }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "optional": true + }, "exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -21500,28 +21603,15 @@ "side-channel": "^1.0.4" } } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "optional": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "optional": true + } }, "fabric": { - "version": "1.7.22", - "resolved": "https://registry.npmjs.org/fabric/-/fabric-1.7.22.tgz", - "integrity": "sha512-VRfQKuDQyTqRzWvJSjSbkOb9+988N2d522LDLI3GP8N4tEORNAttMbsh4HncJwY5LFYTKVZPfE2Ei39Npe72og==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/fabric/-/fabric-7.4.0.tgz", + "integrity": "sha512-NalYDc3eifTl1C33zryQwpH6+XA/2ClxQrH9vkASkZw3tbkRmorpikhYMmxhUTmi7O3e9ODz0vOT8qfaCh9IVA==", "requires": { - "canvas": "1.6.x", - "jsdom": "3.x.x", - "xmldom": "0.1.x" + "canvas": "^3.2.0", + "jsdom": "^26.1.0" } }, "fast-deep-equal": { @@ -21792,22 +21882,16 @@ } } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "optional": true - }, "form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" } }, "forwarded": { @@ -21847,6 +21931,12 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "optional": true + }, "fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -22001,14 +22091,11 @@ "isobject": "^3.0.1" } }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - } + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "optional": true }, "glob": { "version": "10.4.5", @@ -22158,22 +22245,6 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "optional": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "optional": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -22220,9 +22291,9 @@ } }, "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "requires": { "function-bind": "^1.1.2" } @@ -22278,6 +22349,15 @@ } } }, + "html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "optional": true, + "requires": { + "whatwg-encoding": "^3.1.1" + } + }, "html-entities": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", @@ -22288,28 +22368,6 @@ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==" }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "optional": true, - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", - "optional": true - } - } - }, "htmx.org": { "version": "1.9.12", "resolved": "https://registry.npmjs.org/htmx.org/-/htmx.org-1.9.12.tgz", @@ -22374,17 +22432,6 @@ "micromatch": "^4.0.2" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, "https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -22427,6 +22474,12 @@ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "requires": {} }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "optional": true + }, "iframe-resizer": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/iframe-resizer/-/iframe-resizer-4.4.5.tgz", @@ -22493,7 +22546,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "devOptional": true }, "inputmask": { "version": "5.0.9", @@ -22619,6 +22672,12 @@ "isobject": "^3.0.1" } }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "optional": true + }, "is-primitive": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz", @@ -22629,12 +22688,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "optional": true - }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -22658,12 +22711,6 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "optional": true - }, "jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -22765,31 +22812,60 @@ "argparse": "^2.0.1" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "optional": true - }, "jsdom": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-3.1.2.tgz", - "integrity": "sha512-GA+u4MzID/sjkAH2zzzSHDRStSLK2qwSockuy2X/ixqSGNv8OmCbnF49NGXLQUakOhGRm/wf7CLdF3omdAN/0g==", + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", "optional": true, "requires": { - "acorn": "0.11.0", - "acorn-globals": "^1.0.2", - "browser-request": ">= 0.3.1 < 0.4.0", - "contextify": ">= 0.1.9 < 0.2.0", - "cssom": ">= 0.3.0 < 0.4.0", - "cssstyle": ">= 0.2.21 < 0.3.0", - "escodegen": "^1.6.1", - "htmlparser2": ">= 3.7.3 < 4.0.0", - "nwmatcher": ">= 1.3.4 < 2.0.0", - "parse5": ">= 1.3.1 < 2.0.0", - "request": ">= 2.44.0 < 3.0.0", - "xml-name-validator": "^1.0.0", - "xmlhttprequest": ">= 1.6.0 < 2.0.0" + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "dependencies": { + "agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "optional": true + }, + "http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "optional": true, + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + } + }, + "https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "optional": true, + "requires": { + "agent-base": "^7.1.2", + "debug": "4" + } + } } }, "jsesc": { @@ -22820,12 +22896,6 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "optional": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -22836,29 +22906,11 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "optional": true - }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, "keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -22887,16 +22939,6 @@ "shell-quote": "^1.8.1" } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "optional": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, "lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -23313,6 +23355,12 @@ "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "optional": true + }, "mini-css-extract-plugin": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", @@ -23492,6 +23540,12 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "optional": true + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -23527,6 +23581,12 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==" }, + "napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "optional": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -23542,6 +23602,23 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, + "node-abi": { + "version": "3.96.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.96.0.tgz", + "integrity": "sha512-rebQ/lz7i0EkoLzUVSrKRzA69zMkwLp95kKMWoMDkkM00Suxz0D7zEQPwRml5fQum24mj7bPvmlgLAmu2JCiYg==", + "optional": true, + "requires": { + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "optional": true + } + } + }, "node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", @@ -23670,16 +23747,10 @@ "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" }, - "nwmatcher": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", - "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", - "optional": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "nwsapi": { + "version": "2.2.27", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.27.tgz", + "integrity": "sha512-gQPNF78qebCQ6tvVFBYrvJdBNOrYZm90ZlXgpIFm06p6qHDHq/XC4TnJftN6OMbxVE0UTBAoRgcsDeJBBooITw==", "optional": true }, "object-assign": { @@ -23758,20 +23829,6 @@ "is-wsl": "^2.2.0" } }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "optional": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -23835,10 +23892,13 @@ } }, "parse5": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "integrity": "sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==", - "optional": true + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "optional": true, + "requires": { + "entities": "^6.0.0" + } }, "parseurl": { "version": "1.3.3", @@ -23896,12 +23956,6 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==" }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "optional": true - }, "picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -24468,11 +24522,33 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "optional": true + "prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "optional": true, + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "optional": true + } + } }, "prettier": { "version": "3.8.3", @@ -24541,11 +24617,15 @@ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "optional": true + "pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "optional": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } }, "punycode": { "version": "2.3.1", @@ -24574,12 +24654,6 @@ } } }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "optional": true - }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -24616,6 +24690,26 @@ } } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "optional": true + } + } + }, "react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -24763,47 +24857,6 @@ } } }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "optional": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -24925,6 +24978,12 @@ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, + "rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "optional": true + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -24982,6 +25041,15 @@ "neo-async": "^2.6.2" } }, + "saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "optional": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, "scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -25289,6 +25357,23 @@ } } }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "optional": true + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "optional": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "slash": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", @@ -25399,23 +25484,6 @@ "wbuf": "^1.7.3" } }, - "sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "ssr-window": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-2.0.0.tgz", @@ -25944,6 +26012,12 @@ "ssr-window": "^2.0.0" } }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "optional": true + }, "table": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", @@ -26095,6 +26169,39 @@ } } }, + "tar-fs": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.5.tgz", + "integrity": "sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==", + "optional": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "optional": true + } + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "optional": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, "terser": { "version": "5.39.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", @@ -26187,6 +26294,21 @@ "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", "dev": true }, + "tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "optional": true, + "requires": { + "tldts-core": "^6.1.86" + } + }, + "tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "optional": true + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -26206,13 +26328,21 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "optional": true, "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "tldts": "^6.1.32" + } + }, + "tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "optional": true, + "requires": { + "punycode": "^2.3.1" } }, "ts-interface-checker": { @@ -26303,21 +26433,6 @@ "safe-buffer": "^5.0.1" } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "optional": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -26436,12 +26551,6 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "optional": true - }, "v-tooltip": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/v-tooltip/-/v-tooltip-2.1.3.tgz", @@ -26463,17 +26572,6 @@ "resolved": "https://registry.npmjs.org/velocity-animate/-/velocity-animate-1.5.2.tgz", "integrity": "sha512-m6EXlCAMetKztO1ppBhGU1/1MR3IiEevO6ESq6rcrSQ3Q77xYSW13jkfXW88o4xMrkXJhy/U7j4wFR/twMB0Eg==" }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "vscode-languageserver-types": { "version": "3.17.5", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", @@ -26696,6 +26794,15 @@ "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "peer": true }, + "w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "optional": true, + "requires": { + "xml-name-validator": "^5.0.0" + } + }, "watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", @@ -26713,6 +26820,12 @@ "minimalistic-assert": "^1.0.0" } }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "optional": true + }, "webpack": { "version": "5.98.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", @@ -26924,6 +27037,42 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, + "whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "optional": true, + "requires": { + "iconv-lite": "0.6.3" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "optional": true + }, + "whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "optional": true, + "requires": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -26980,12 +27129,6 @@ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" }, - "word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "optional": true - }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -27116,27 +27259,21 @@ } }, "ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", "requires": {} }, "xml-name-validator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-1.0.0.tgz", - "integrity": "sha512-XDmXffxxQs/+0VLW9NB2oSIbSoSINj6dQdhegY3kEM81LOoLr6NfsFE9RR59qrwsKEHaZLxa1MOSahFA0CE9Ow==", - "optional": true - }, - "xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "optional": true }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "optional": true }, "xregexp": { diff --git a/package.json b/package.json index 254ff2b2bab..3863ff21a91 100644 --- a/package.json +++ b/package.json @@ -46,11 +46,11 @@ "@simplewebauthn/browser": "^13.3.0", "@types/jquery": "^3.5.34", "accounting": "^0.4.1", - "axios": "^1.17.0", + "axios": "^1.20.0", "blueimp-file-upload": "^10.32.0", "codemirror": "^5.65.21", "d3": "^7.9.0", - "fabric": "^1.7.22", + "fabric": "^7.4.0", "htmx.org": "^1.9.12", "iframe-resizer": "^4.4.5", "inputmask": "^5.0.9", diff --git a/src/auth/passkeys/WebauthnServer.php b/src/auth/passkeys/WebauthnServer.php index 6a8b9cdca60..d01703c7fbc 100644 --- a/src/auth/passkeys/WebauthnServer.php +++ b/src/auth/passkeys/WebauthnServer.php @@ -5,7 +5,6 @@ use Cose\Algorithm\Manager; use Cose\Algorithm\Signature\ECDSA\ES256; use Cose\Algorithm\Signature\ECDSA\ES256K; -use Cose\Algorithm\Signature\EdDSA\Ed256; use Cose\Algorithm\Signature\RSA\PS256; use Cose\Algorithm\Signature\RSA\RS256; use Cose\Algorithms; @@ -127,7 +126,6 @@ public function getAlgorithmManager(): Manager ES256K::create(), RS256::create(), PS256::create(), - Ed256::create(true), // removed as registration option; remove it in the next major release ); } diff --git a/src/base/ApplicationTrait.php b/src/base/ApplicationTrait.php index 7b789dde2f8..bc934a685ef 100644 --- a/src/base/ApplicationTrait.php +++ b/src/base/ApplicationTrait.php @@ -49,6 +49,7 @@ use craft\helpers\FileHelper; use craft\helpers\Markdown as MarkdownHelper; use craft\helpers\Session; +use craft\helpers\Template as TemplateHelper; use craft\i18n\Formatter; use craft\i18n\I18N; use craft\i18n\Locale; @@ -1602,6 +1603,12 @@ private function _preInit(): void return $this->first(...func_get_args()); }); + // Register Collection::render() for rendering collections of Renderable objects + Collection::macro('render', function(array $variables = []) { + assert($this instanceof Collection); + return TemplateHelper::render($this, $variables); + }); + // Set the Craft edition $this->_setCraftEdition(); diff --git a/src/base/Element.php b/src/base/Element.php index 5c43085d41c..56dab887e9d 100644 --- a/src/base/Element.php +++ b/src/base/Element.php @@ -104,8 +104,8 @@ use Illuminate\Support\Collection; use ReflectionClass; use Traversable; -use Twig\Extension\SandboxExtension; use Twig\Markup; +use Twig\Sandbox\SecurityChecker; use UnitEnum; use yii\base\ArrayableTrait; use yii\base\Event; @@ -2938,11 +2938,11 @@ public function getIterator(): Traversable { $attributes = $this->getAttributes(); - // Include custom fields, unless this is coming from Twig’s SandboxExtension + // Include custom fields, unless this is coming from Twig’s sandbox // (see https://github.com/craftcms/cms/issues/19004) $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, limit: 3); if (!( - ($backtrace[2]['class'] ?? null) === SandboxExtension::class && + ($backtrace[2]['class'] ?? null) === SecurityChecker::class && $backtrace[2]['function'] === 'doEnsureToStringAllowed' )) { $fieldLayout = $this->getFieldLayout(); @@ -7255,7 +7255,15 @@ private function _getRelativeElement(mixed $criteria, int $dir): ?ElementInterfa } /** - * @inheritdoc + * Renders the element using its partial template. + * + * If no partial template exists for the element, its string representation will be output instead. + * + * @param array $variables + * @return Markup + * @throws InvalidConfigException + * @throws NotSupportedException + * @since 5.8.0 */ public function render(array $variables = []): Markup { diff --git a/src/base/ElementInterface.php b/src/base/ElementInterface.php index 63ddb7b692e..96498a67ed7 100644 --- a/src/base/ElementInterface.php +++ b/src/base/ElementInterface.php @@ -21,8 +21,6 @@ use craft\web\twig\AllowedInSandbox; use GraphQL\Type\Definition\Type; use Twig\Markup; -use yii\base\InvalidConfigException; -use yii\base\NotSupportedException; use yii\web\Response; /** @@ -44,7 +42,8 @@ interface ElementInterface extends CpEditable, Thumbable, Statusable, - Actionable + Actionable, + Renderable { /** * Returns the lowercase version of [[displayName()]]. @@ -2005,17 +2004,4 @@ public function afterMoveInStructure(int $structureId): void; * Returns the string representation of the element. */ public function __toString(): string; - - /** - * Renders the element using its partial template. - * - * If no partial template exists for the element, its string representation will be output instead. - * - * @param array $variables - * @return Markup - * @throws InvalidConfigException - * @throws NotSupportedException - * @since 5.8.0 - */ - public function render(array $variables = []): Markup; } diff --git a/src/base/FieldTrait.php b/src/base/FieldTrait.php index d92e93cd203..9bdf5519fe2 100644 --- a/src/base/FieldTrait.php +++ b/src/base/FieldTrait.php @@ -38,6 +38,18 @@ trait FieldTrait */ public ?string $instructions = null; + /** + * @var string|null The field’s default tip text + * @since 5.12.0 + */ + public ?string $tip = null; + + /** + * @var string|null The field’s default warning text + * @since 5.12.0 + */ + public ?string $warning = null; + /** * @var bool Whether the field's values should be registered as search keywords on the elements. */ diff --git a/src/base/NestedElementTrait.php b/src/base/NestedElementTrait.php index 80a2ce3fe54..c7616636490 100644 --- a/src/base/NestedElementTrait.php +++ b/src/base/NestedElementTrait.php @@ -103,6 +103,17 @@ public static function eagerLoadingMap(array $sourceElements, string $handle): a */ public bool $updateSearchIndexForOwner = false; + /** + * @var bool Whether the owner element’s `dateUpdated` timestamp should be updated (recursively, up + * through any further ancestors) when this (canonical) element is saved. + * + * This is set to `false` when a nested element is being saved as part of its owner’s own save + * operation, since the owner’s `dateUpdated` will already be getting updated in that case. + * + * @since 5.12.0 + */ + public bool $touchOwnersOnSave = true; + /** * @var ElementInterface|false|null The primary owner element, or false if [[primaryOwnerId]] is invalid * @see getPrimaryOwner() diff --git a/src/base/Renderable.php b/src/base/Renderable.php new file mode 100644 index 00000000000..3e482de33a0 --- /dev/null +++ b/src/base/Renderable.php @@ -0,0 +1,29 @@ + + * @since 5.12.0 + */ +interface Renderable +{ + /** + * Renders the object. + * + * @param array $variables Variables that should be made available to the rendered template + * @return Markup + */ + #[AllowedInSandbox] + public function render(array $variables = []): Markup; +} diff --git a/src/config/GeneralConfig.php b/src/config/GeneralConfig.php index e672c55a0cc..cdd43692cdd 100644 --- a/src/config/GeneralConfig.php +++ b/src/config/GeneralConfig.php @@ -278,6 +278,7 @@ class GeneralConfig extends BaseConfig 'jpx', 'js', 'json', + 'jxl', 'lrc', 'm2t', 'm4a', @@ -833,6 +834,61 @@ class GeneralConfig extends BaseConfig */ public int $defaultImageQuality = 82; + /** + * @var int|false The number of requests Craft will allow from a single IP address within , + * for actions that are rate-limited by default, before responding with a 429 error. + * + * This applies to the following actions, each of which is tracked separately: + * + * - `auth/verify-recovery-code` + * - `auth/verify-totp` + * - `users/login` (POST requests only) + * - `users/send-password-reset-email` + * + * This can be set to `false` to disable the default rate limits. + * + * ::: tip + * If Craft is running behind a load balancer or reverse proxy, make sure [[\yii\web\Request::$trustedHosts]] and + * are configured correctly, so rate limits are applied to each visitor’s IP rather than the + * proxy’s. + * ::: + * + * ::: code + * ```php Static Config + * ->defaultRateLimit(20) + * ``` + * ```shell Environment Override + * CRAFT_DEFAULT_RATE_LIMIT=20 + * ``` + * ::: + * + * @group Security + * @since 5.12.0 + */ + public int|false $defaultRateLimit = 10; + + /** + * @var mixed The amount of time that applies to. + * + * See [[ConfigHelper::durationInSeconds()]] for a list of supported value types. + * + * ::: code + * ```php Static Config + * // 5 minutes + * ->defaultRateLimitDuration(300) + * ``` + * ```shell Environment Override + * # 5 minutes + * CRAFT_DEFAULT_RATE_LIMIT_DURATION=300 + * ``` + * ::: + * + * @group Security + * @defaultAlt 1 minute + * @since 5.12.0 + */ + public mixed $defaultRateLimitDuration = 60; + /** * @var array The default options that should be applied to each search term. * @@ -3489,6 +3545,7 @@ public function init(): void // durations ->cacheDuration($this->cacheDuration) ->cooldownDuration($this->cooldownDuration) + ->defaultRateLimitDuration($this->defaultRateLimitDuration) ->defaultTokenDuration($this->defaultTokenDuration) ->elevatedSessionDuration($this->elevatedSessionDuration) ->invalidLoginWindowDuration($this->invalidLoginWindowDuration) @@ -4290,6 +4347,51 @@ public function defaultImageQuality(int $value): self return $this; } + /** + * The number of requests Craft will allow from a single IP address within , + * for actions that are rate-limited by default, before responding with a 429 error. + * + * This can be set to `false` to disable the default rate limits. + * + * ```php + * ->defaultRateLimit(20) + * ``` + * + * @group Security + * @param int|false $value + * @return self + * @see $defaultRateLimit + * @since 5.12.0 + */ + public function defaultRateLimit(int|false $value): self + { + $this->defaultRateLimit = $value; + return $this; + } + + /** + * The amount of time that applies to. + * + * See [[ConfigHelper::durationInSeconds()]] for a list of supported value types. + * + * ```php + * // 5 minutes + * ->defaultRateLimitDuration(300) + * ``` + * + * @group Security + * @defaultAlt 1 minute + * @param mixed $value + * @return self + * @see $defaultRateLimitDuration + * @since 5.12.0 + */ + public function defaultRateLimitDuration(mixed $value): self + { + $this->defaultRateLimitDuration = ConfigHelper::durationInSeconds($value); + return $this; + } + /** * The default options that should be applied to each search term. * diff --git a/src/config/app.php b/src/config/app.php index 87f0fc7f828..a018c29d595 100644 --- a/src/config/app.php +++ b/src/config/app.php @@ -4,7 +4,7 @@ 'id' => 'CraftCMS', 'name' => 'Craft CMS', 'version' => '5.11.5.1', - 'schemaVersion' => '5.11.0.2', + 'schemaVersion' => '5.12.0.0', 'minVersionRequired' => '4.5.0', 'basePath' => dirname(__DIR__), // Defines the @app alias 'runtimePath' => '@storage/runtime', // Defines the @runtime alias diff --git a/src/config/twig-sandbox.php b/src/config/twig-sandbox.php index ddbd0c0bfb2..e3510b3ef09 100644 --- a/src/config/twig-sandbox.php +++ b/src/config/twig-sandbox.php @@ -1,5 +1,6 @@ [], + 'allowedMethods' => [ + Collection::class => ['render'], + ], 'allowedProperties' => [], 'allowedClasses' => [ Event::class, diff --git a/src/console/controllers/FieldsController.php b/src/console/controllers/FieldsController.php index 4e284ef3f1a..b4a7efea910 100644 --- a/src/console/controllers/FieldsController.php +++ b/src/console/controllers/FieldsController.php @@ -494,10 +494,12 @@ private function updateFieldUsages( $changed = false; foreach ($layout->getCustomFieldElements() as $layoutElement) { if ($layoutElement->getFieldUid() === $outgoingField->uid) { - // hard code the label, handle, and instructions, if they differ from the persistent field + // hard code the label, handle, instructions, tip, and warning, if they differ from the persistent field $layoutElement->label = $this->layoutElementOverride($persistingField->name, $outgoingField->name, $layoutElement->label); $layoutElement->handle = $this->layoutElementOverride($persistingField->handle, $outgoingField->handle, $layoutElement->handle); $layoutElement->instructions = $this->layoutElementOverride($persistingField->instructions, $outgoingField->instructions, $layoutElement->instructions); + $layoutElement->tip = $this->layoutElementOverride($persistingField->tip, $outgoingField->tip, $layoutElement->tip); + $layoutElement->warning = $this->layoutElementOverride($persistingField->warning, $outgoingField->warning, $layoutElement->warning); // let Fields::saveLayout() know to update any condition rules that reference the outgoing field $layoutElement->oldFieldUid ??= $outgoingField->uid; diff --git a/src/console/controllers/ProjectConfigController.php b/src/console/controllers/ProjectConfigController.php index 33e55807e1d..34eef431b63 100644 --- a/src/console/controllers/ProjectConfigController.php +++ b/src/console/controllers/ProjectConfigController.php @@ -71,6 +71,12 @@ class ProjectConfigController extends Controller */ public bool $overwrite = false; + /** + * @var bool Whether the check should fail if `project.yaml` is missing. + * @since 5.12.0 + */ + public bool $requireYaml = true; + /** * @var int Counter of the total paths that have been processed. */ @@ -94,6 +100,9 @@ public function options($actionID): array $options = parent::options($actionID); switch ($actionID) { + case 'check': + $options[] = 'requireYaml'; + break; case 'apply': case 'sync': $options[] = 'force'; @@ -261,6 +270,54 @@ public function actionDiff(): int return ExitCode::OK; } + /** + * Checks project config schema compatibility with installed Craft and enabled plugins. + * + * Requires database access to an existing Craft installation, even when `--require-yaml=0` is passed. Does not apply project config or migrations. + * Pass `--require-yaml=0` to skip the check successfully if `project.yaml` is missing. + * + * @return int + * @since 5.12.0 + */ + public function actionCheck(): int + { + if (!Craft::$app->getIsInstalled()) { + $this->stdout('This check requires an existing Craft installation.' . PHP_EOL, Console::FG_RED); + return ExitCode::UNSPECIFIED_ERROR; + } + + $projectConfig = Craft::$app->getProjectConfig(); + if (!$projectConfig->getDoesExternalConfigExist()) { + if (!$this->requireYaml) { + $this->stdout('Project config file `project.yaml` was not found. Schema compatibility check skipped.' . PHP_EOL); + return ExitCode::OK; + } + + $this->stderr('Project config file `project.yaml` was not found. Schema compatibility could not be checked.' . PHP_EOL, Console::FG_RED); + return ExitCode::UNSPECIFIED_ERROR; + } + + if ($projectConfig->getHadFileWriteIssues()) { + $this->stderr('Resolve project config file-write errors before checking schema compatibility. Craft is currently using internal config instead of YAML.' . PHP_EOL, Console::FG_RED); + return ExitCode::UNSPECIFIED_ERROR; + } + + $pluginsService = Craft::$app->getPlugins(); + foreach (array_keys($projectConfig->get(ProjectConfigService::PATH_PLUGINS) ?? []) as $handle) { + if ($pluginsService->isPluginEnabled($handle) && $pluginsService->getPlugin($handle) === null) { + $this->stdout("Enabled plugin \"$handle\" could not be loaded. Check its Composer package and plugin initialization errors before checking schema compatibility." . PHP_EOL, Console::FG_RED); + return ExitCode::UNSPECIFIED_ERROR; + } + } + + if (!$this->_checkSchemaVersions()) { + return ExitCode::UNSPECIFIED_ERROR; + } + + $this->stdout('Project config schema versions are compatible with installed Craft and enabled plugins.' . PHP_EOL, Console::FG_GREEN); + return ExitCode::OK; + } + /** * Applies project config file changes. * @@ -277,20 +334,7 @@ public function actionApply(): int $projectConfig = Craft::$app->getProjectConfig(); - $issues = []; - if (!$projectConfig->getAreConfigSchemaVersionsCompatible($issues)) { - $this->stderr("Your project config files were created for different versions of Craft and/or plugins than what’s currently installed." . PHP_EOL . PHP_EOL, Console::FG_YELLOW); - - foreach ($issues as $issue) { - $this->stderr($issue['cause'], Console::FG_RED); - $this->stderr(' is installed with schema version of ', Console::FG_YELLOW); - $this->stderr($issue['existing'], Console::FG_RED); - $this->stderr(' while ', Console::FG_YELLOW); - $this->stderr($issue['incoming'], Console::FG_RED); - $this->stderr(' was expected.' . PHP_EOL, Console::FG_YELLOW); - } - - $this->stderr(PHP_EOL . 'Try running `composer install` from your terminal to resolve.' . PHP_EOL, Console::FG_YELLOW); + if (!$this->_checkSchemaVersions()) { return ExitCode::UNSPECIFIED_ERROR; } @@ -529,6 +573,28 @@ public function actionExport(?string $path = null): int return ExitCode::OK; } + private function _checkSchemaVersions(): bool + { + $issues = []; + if (Craft::$app->getProjectConfig()->getAreConfigSchemaVersionsCompatible($issues)) { + return true; + } + + $this->stderr("Your project config files were created for different versions of Craft and/or plugins than what’s currently installed." . PHP_EOL . PHP_EOL, Console::FG_YELLOW); + + foreach ($issues as $issue) { + $this->stderr($issue['cause'], Console::FG_RED); + $this->stderr(' is installed with schema version of ', Console::FG_YELLOW); + $this->stderr($issue['existing'], Console::FG_RED); + $this->stderr(' while ', Console::FG_YELLOW); + $this->stderr($issue['incoming'], Console::FG_RED); + $this->stderr(' was expected.' . PHP_EOL, Console::FG_YELLOW); + } + + $this->stderr(PHP_EOL . 'Try running `composer install` from your terminal to resolve.' . PHP_EOL, Console::FG_YELLOW); + return false; + } + /** * Uninstalls plugins. * diff --git a/src/controllers/AuthController.php b/src/controllers/AuthController.php index 83743d9dcdb..70f23c9575f 100644 --- a/src/controllers/AuthController.php +++ b/src/controllers/AuthController.php @@ -10,12 +10,14 @@ use Craft; use craft\auth\methods\RecoveryCodes; use craft\auth\methods\TOTP; +use craft\filters\IpRateLimitIdentity; use craft\helpers\Html; use craft\helpers\Session as SessionHelper; use craft\i18n\Locale; use craft\web\Controller; use craft\web\View; use yii\base\InvalidConfigException; +use yii\filters\RateLimiter; use yii\web\Response; /** @noinspection ClassOverridesFieldOfSuperClassInspection */ @@ -37,6 +39,21 @@ class AuthController extends Controller 'verify-totp' => self::ALLOW_ANONYMOUS_LIVE | self::ALLOW_ANONYMOUS_OFFLINE, ]; + /** + * @inheritdoc + */ + public function behaviors(): array + { + return parent::behaviors() + [ + 'rateLimiter' => [ + 'class' => RateLimiter::class, + 'only' => ['verify-totp', 'verify-recovery-code'], + 'enableRateLimitHeaders' => false, + 'user' => fn() => IpRateLimitIdentity::createDefault('auth-verify'), + ], + ]; + } + /** * Returns the HTML for an authentication method’s setup slideout. * diff --git a/src/controllers/FieldsController.php b/src/controllers/FieldsController.php index 6d9e7e10861..91ea5d75b3f 100644 --- a/src/controllers/FieldsController.php +++ b/src/controllers/FieldsController.php @@ -428,6 +428,8 @@ public function actionSaveField(): ?Response 'handle' => $this->request->getBodyParam('handle'), 'columnSuffix' => $oldField->columnSuffix ?? null, 'instructions' => $this->request->getBodyParam('instructions'), + 'tip' => $this->request->getBodyParam('tip'), + 'warning' => $this->request->getBodyParam('warning'), 'searchable' => (bool)$this->request->getBodyParam('searchable', true), 'translationMethod' => $this->request->getBodyParam('translationMethod', Field::TRANSLATION_METHOD_NONE), 'translationKeyFormat' => $this->request->getBodyParam('translationKeyFormat'), diff --git a/src/controllers/UsersController.php b/src/controllers/UsersController.php index 26a5928cb8c..5d4e95838e4 100644 --- a/src/controllers/UsersController.php +++ b/src/controllers/UsersController.php @@ -194,12 +194,14 @@ public function behaviors(): array 'class' => RateLimiter::class, 'only' => ['send-password-reset-email'], 'enableRateLimitHeaders' => false, - 'user' => fn() => new IpRateLimitIdentity([ - 'limit' => 1, - 'window' => 1, - 'keyPrefix' => 'reset-password', - 'ip' => Craft::$app->getRequest()->getUserIP() ?? 'unknown', - ]), + 'user' => fn() => IpRateLimitIdentity::createDefault('reset-password'), + ], + 'loginRateLimiter' => [ + 'class' => RateLimiter::class, + 'only' => ['login'], + 'enableRateLimitHeaders' => false, + // only count login attempts, not login page requests + 'user' => fn() => $this->request->getIsPost() ? IpRateLimitIdentity::createDefault('login') : null, ], ]; } diff --git a/src/db/mysql/Schema.php b/src/db/mysql/Schema.php index f923de08e3b..e66ab760484 100644 --- a/src/db/mysql/Schema.php +++ b/src/db/mysql/Schema.php @@ -197,7 +197,7 @@ public function createColumnSchemaBuilder($type, $length = null): ColumnSchemaBu public function getDefaultBackupCommand(?array $ignoreTables = null): string { $baseCommand = (new ShellCommand('mysqldump')) - ->addArg('--defaults-file=', $this->_createDumpConfigFile()) + ->addArg('--defaults-file=', $this->_createDumpConfigFile('mysqldump')) ->addArg('--add-drop-table') ->addArg('--comments') ->addArg('--create-options') @@ -266,7 +266,7 @@ public function getDefaultRestoreCommand(): string { $commandFromConfig = Craft::$app->getConfig()->getGeneral()->restoreCommand; $command = (new ShellCommand('mysql')) - ->addArg('--defaults-file=', $this->_createDumpConfigFile()) + ->addArg('--defaults-file=', $this->_createDumpConfigFile('mysql')) ->addArg('{database}'); if ($commandFromConfig instanceof \Closure) { @@ -455,10 +455,11 @@ protected function supportsColumnStatistics(): bool /** * Creates a temporary my.cnf file based on the DB config settings. * + * @param string $program The program that the my.cnf file will be used with (`mysqldump` or `mysql`) * @return string The path to the my.cnf file * @throws ErrorException */ - private function _createDumpConfigFile(): string + private function _createDumpConfigFile(string $program): string { $this->tempMyCnfPath = FileHelper::normalizePath(sys_get_temp_dir()) . DIRECTORY_SEPARATOR . StringHelper::randomString(12) . '.cnf'; @@ -477,14 +478,33 @@ private function _createDumpConfigFile(): string } // Certificates - if (isset($this->db->attributes[PDO::MYSQL_ATTR_SSL_CA])) { - $contents .= PHP_EOL . 'ssl_ca=' . $this->db->attributes[PDO::MYSQL_ATTR_SSL_CA]; - } - if (isset($this->db->attributes[PDO::MYSQL_ATTR_SSL_CERT])) { - $contents .= PHP_EOL . 'ssl_cert=' . $this->db->attributes[PDO::MYSQL_ATTR_SSL_CERT]; - } - if (isset($this->db->attributes[PDO::MYSQL_ATTR_SSL_KEY])) { - $contents .= PHP_EOL . 'ssl_key=' . $this->db->attributes[PDO::MYSQL_ATTR_SSL_KEY]; + if ( + isset($this->db->attributes[PDO::MYSQL_ATTR_SSL_CA]) || + (defined('PDO::MYSQL_ATTR_SSL_CAPATH') && isset($this->db->attributes[PDO::MYSQL_ATTR_SSL_CAPATH])) || + isset($this->db->attributes[PDO::MYSQL_ATTR_SSL_CERT]) || + isset($this->db->attributes[PDO::MYSQL_ATTR_SSL_KEY]) || + (defined('PDO::MYSQL_ATTR_SSL_CIPHER') && isset($this->db->attributes[PDO::MYSQL_ATTR_SSL_CIPHER])) + ) { + if (isset($this->db->attributes[PDO::MYSQL_ATTR_SSL_CA])) { + $contents .= PHP_EOL . 'ssl_ca=' . $this->db->attributes[PDO::MYSQL_ATTR_SSL_CA]; + } + if (defined('PDO::MYSQL_ATTR_SSL_CAPATH') && isset($this->db->attributes[PDO::MYSQL_ATTR_SSL_CAPATH])) { + $contents .= PHP_EOL . 'ssl_capath=' . $this->db->attributes[PDO::MYSQL_ATTR_SSL_CAPATH]; + } + if (isset($this->db->attributes[PDO::MYSQL_ATTR_SSL_CERT])) { + $contents .= PHP_EOL . 'ssl_cert=' . $this->db->attributes[PDO::MYSQL_ATTR_SSL_CERT]; + } + if (isset($this->db->attributes[PDO::MYSQL_ATTR_SSL_KEY])) { + $contents .= PHP_EOL . 'ssl_key=' . $this->db->attributes[PDO::MYSQL_ATTR_SSL_KEY]; + } + if (defined('PDO::MYSQL_ATTR_SSL_CIPHER') && isset($this->db->attributes[PDO::MYSQL_ATTR_SSL_CIPHER])) { + $contents .= PHP_EOL . 'ssl_cipher=' . $this->db->attributes[PDO::MYSQL_ATTR_SSL_CIPHER]; + } + } else { + // The db connection wasn't explicitly configured with SSL attributes, but the normal + // my.cnf file chain (which --defaults-file causes mysqldump/mysql to ignore) might + // still specify them, so carry those over. + $contents .= $this->_sslDefaultsFromConfigFiles($program); } FileHelper::writeToFile($this->tempMyCnfPath, ''); @@ -495,6 +515,85 @@ private function _createDumpConfigFile(): string return $this->tempMyCnfPath; } + /** + * Returns SSL/TLS my.cnf directives based on whatever the normal MySQL config file chain + * (e.g. `/etc/my.cnf`, `~/.my.cnf`) would otherwise provide, since those files are ignored + * once `--defaults-file` is passed to `mysqldump`/`mysql`. + * + * @param string $program The program whose defaults should be checked (`mysqldump` or `mysql`) + * @return string + */ + private function _sslDefaultsFromConfigFiles(string $program): string + { + $shellCommand = (new ShellCommand($program))->addArg('--print-defaults'); + + // If we don't have proc_open, maybe we've got exec + if (!function_exists('proc_open') && function_exists('exec')) { + $shellCommand->useExec = true; + } + + if (!$shellCommand->execute()) { + return ''; + } + + return $this->_sslDirectivesFromPrintDefaults($shellCommand->getOutput() ?? ''); + } + + /** + * Returns SSL/TLS my.cnf directives from the given `--print-defaults` output. + * + * @param string $output + * @return string + */ + private function _sslDirectivesFromPrintDefaults(string $output): string + { + // The output looks like: + // + // mysqldump would have been started with the following arguments: + // --ssl-ca=/path/to/ca.pem --ssl-verify-server-cert=0 --skip-ssl ... + // + // Values aren't quoted, so split on whitespace that is followed by `--` (rather than on all whitespace), + // so values containing spaces stay intact. + $pos = strpos($output, '--'); + if ($pos === false) { + return ''; + } + + $tokens = preg_split('/\s+(?=--)/', trim(substr($output, $pos)), -1, PREG_SPLIT_NO_EMPTY); + + $contents = ''; + + foreach ($tokens as $token) { + if (!preg_match('/^--([\w-]+)(?:=(.*))?$/s', trim($token), $match)) { + continue; + } + + // Option names can use dashes or underscores, and can be prefixed with modifiers like `skip-` and `loose-` + $name = strtolower(str_replace('_', '-', $match[1])); + $baseName = preg_replace('/^(?:loose-)?(?:skip-|disable-|enable-)?/', '', $name); + if (!preg_match('/^(ssl|tls)(-|$)/', $baseName)) { + continue; + } + + if (!isset($match[2])) { + $contents .= PHP_EOL . $name; + continue; + } + + $value = trim($match[2], "\"'"); + + // Ignore redacted values + if (preg_match('/^\*+$/', $value)) { + continue; + } + + // Backslashes are escape characters in option files (e.g. within Windows paths) + $contents .= PHP_EOL . $name . '=' . str_replace('\\', '\\\\', $value); + } + + return $contents; + } + /** * Returns the row format for the given table, if known. * diff --git a/src/elements/Address.php b/src/elements/Address.php index d673e3d38d1..7676cebaed8 100644 --- a/src/elements/Address.php +++ b/src/elements/Address.php @@ -78,6 +78,14 @@ public static function pluralLowerDisplayName(): string return Craft::t('app', 'addresses'); } + /** + * @inheritdoc + */ + public static function hasDrafts(): bool + { + return true; + } + /** * @inheritdoc */ diff --git a/src/elements/ElementCollection.php b/src/elements/ElementCollection.php index 4a3344815e6..5aebd81ba02 100644 --- a/src/elements/ElementCollection.php +++ b/src/elements/ElementCollection.php @@ -10,13 +10,11 @@ use Craft; use craft\base\ElementInterface; use craft\helpers\ArrayHelper; -use craft\helpers\ElementHelper; use Illuminate\Contracts\Support\Arrayable; use Illuminate\Support\Arr; use Illuminate\Support\Collection; use Illuminate\Support\Enumerable; use Twig\Markup; -use yii\base\InvalidConfigException; use yii\base\NotSupportedException; /** @@ -27,6 +25,7 @@ * @extends Collection * * @method TElement one(callable|null $callback, mixed $default) + * @method Markup render(array $variables = []) * @author Pixel & Tonic, Inc. * @since 4.3.0 */ @@ -365,23 +364,6 @@ public function except($keys) return new static(array_values($elements)); } - /** - * Renders the elements using their partial templates. - * - * If no partial template exists for an element, its string representation will be output instead. - * - * @param array $variables - * @return Markup - * @throws InvalidConfigException - * @throws NotSupportedException - * @see ElementHelper::renderElements() - * @since 5.0.0 - */ - public function render(array $variables = []): Markup - { - return ElementHelper::renderElements($this->items, $variables); - } - // The following methods are intercepted to always return base collections. // ------------------------------------------------------------------------- diff --git a/src/elements/NestedElementManager.php b/src/elements/NestedElementManager.php index e9b492b3e51..e4af7051d94 100644 --- a/src/elements/NestedElementManager.php +++ b/src/elements/NestedElementManager.php @@ -858,7 +858,17 @@ private function saveNestedElements(ElementInterface $owner): void // Only set $resaving=true if the element isn’t new. // Otherwise NestedElementTrait::saveOwnership() won’t do its thing. $element->resaving = $owner->resaving && $element->id; + // $owner is already being saved, so it (and its own ancestors, if any) will get its + // `dateUpdated` timestamp updated on its own; no need to do that here as well. + // see https://github.com/craftcms/cms/issues/19594 + $touchOwnersOnSave = property_exists($element, 'touchOwnersOnSave'); + if ($touchOwnersOnSave) { + $element->touchOwnersOnSave = false; + } $elementsService->saveElement($element, false); + if ($touchOwnersOnSave) { + $element->touchOwnersOnSave = true; + } // If this element's primary owner is $owner, and it’s a draft of another element whose owner is // $owner's canonical (e.g. a draft entry created by Matrix::_createEntriesFromSerializedData()), diff --git a/src/elements/db/AddressQuery.php b/src/elements/db/AddressQuery.php index 95f5db2c2c5..93659caa8c5 100644 --- a/src/elements/db/AddressQuery.php +++ b/src/elements/db/AddressQuery.php @@ -899,7 +899,7 @@ protected function beforePrepare(): bool $this->normalizeNestedElementParams(); // Only join the elements_owners table if fieldId is specified - if (!empty($this->fieldId)) { + if (isset($this->fieldId)) { $this->applyNestedElementParams('addresses.fieldId', 'addresses.primaryOwnerId'); } elseif (isset($this->primaryOwnerId) || isset($this->ownerId)) { // User addresses don't get rows in the elements_owners table @@ -968,6 +968,11 @@ protected function beforePrepare(): bool return true; } + protected function mustHaveField(): bool + { + return false; + } + /** * @inheritdoc */ diff --git a/src/elements/db/ElementQuery.php b/src/elements/db/ElementQuery.php index d63e744dcd0..9914564fb7e 100644 --- a/src/elements/db/ElementQuery.php +++ b/src/elements/db/ElementQuery.php @@ -36,8 +36,10 @@ use craft\helpers\ElementHelper; use craft\helpers\Json; use craft\helpers\StringHelper; +use craft\helpers\Template; use craft\models\FieldLayout; use craft\models\Site; +use craft\web\twig\AllowedInSandbox; use Illuminate\Support\Collection; use ReflectionClass; use ReflectionException; @@ -2105,12 +2107,13 @@ public function collectIds(?YiiConnection $db = null): Collection * @return Markup * @throws InvalidConfigException * @throws NotSupportedException - * @see ElementHelper::renderElements() + * @see Template::render() * @since 5.0.0 */ + #[AllowedInSandbox] public function render(array $variables = []): Markup { - return ElementHelper::renderElements($this->all(), $variables); + return Template::render($this->all(), $variables); } /** diff --git a/src/elements/db/EntryQuery.php b/src/elements/db/EntryQuery.php index 3e0f3d7da34..86d84c5260c 100644 --- a/src/elements/db/EntryQuery.php +++ b/src/elements/db/EntryQuery.php @@ -968,6 +968,16 @@ protected function beforePrepare(): bool return true; } + protected function mustHaveField(): bool + { + return false; + } + + protected function mustHaveOwner(): bool + { + return false; + } + /** * @inheritdoc */ diff --git a/src/elements/db/NestedElementQueryTrait.php b/src/elements/db/NestedElementQueryTrait.php index 305001f6f9e..2189efecedf 100644 --- a/src/elements/db/NestedElementQueryTrait.php +++ b/src/elements/db/NestedElementQueryTrait.php @@ -197,16 +197,49 @@ public function allowOwnerRevisions(?bool $value = true): static return $this; } + /** + * Returns whether the resulting elements will always have a field assigned to them. + * + * @since 5.12.0 + */ + protected function mustHaveField(): bool + { + return true; + } + + /** + * Returns whether the resulting elements will always have an owner assigned to them. + * + * @since 5.12.0 + */ + protected function mustHaveOwner(): bool + { + return true; + } + private function applyNestedElementParams(string $fieldIdColumn, string $primaryOwnerIdColumn): void { $this->normalizeNestedElementParams(); - if ($this->fieldId === false || $this->primaryOwnerId === false || $this->ownerId === false) { + $mustHaveField = $this->mustHaveField(); + $mustHaveOwner = $this->mustHaveOwner(); + + if ( + ($mustHaveField && $this->fieldId === false) || + ($mustHaveOwner && ($this->primaryOwnerId === false || $this->ownerId === false)) || + $this->fieldId === [] || + $this->primaryOwnerId === [] || + $this->ownerId === [] + ) { throw new QueryAbortedException(); } - if (!empty($this->fieldId) || !empty($this->ownerId) || !empty($this->primaryOwnerId)) { + if (isset($this->fieldId) || isset($this->ownerId) || isset($this->primaryOwnerId)) { // Join in the elements_owners table + $joinType = $mustHaveField || $this->fieldId || $this->ownerId || $this->primaryOwnerId + ? 'INNER JOIN' + : 'LEFT JOIN'; + $ownersCondition = [ 'and', '[[elements_owners.elementId]] = [[elements.id]]', @@ -218,15 +251,16 @@ private function applyNestedElementParams(string $fieldIdColumn, string $primary 'elements_owners.ownerId', 'elements_owners.sortOrder', ]) - ->innerJoin(['elements_owners' => Table::ELEMENTS_OWNERS], $ownersCondition); - $this->subQuery->innerJoin(['elements_owners' => Table::ELEMENTS_OWNERS], $ownersCondition); + ->join($joinType, ['elements_owners' => Table::ELEMENTS_OWNERS], $ownersCondition); + + $this->subQuery->join($joinType, ['elements_owners' => Table::ELEMENTS_OWNERS], $ownersCondition); - if ($this->fieldId) { - $this->subQuery->andWhere([$fieldIdColumn => $this->fieldId]); + if (isset($this->fieldId)) { + $this->subQuery->andWhere([$fieldIdColumn => $this->fieldId ?: null]); } - if ($this->primaryOwnerId) { - $this->subQuery->andWhere([$primaryOwnerIdColumn => $this->primaryOwnerId]); + if (isset($this->primaryOwnerId)) { + $this->subQuery->andWhere([$primaryOwnerIdColumn => $this->primaryOwnerId ?: null]); } // Ignore revision/draft blocks by default @@ -234,7 +268,8 @@ private function applyNestedElementParams(string $fieldIdColumn, string $primary $allowOwnerRevisions = $this->allowOwnerRevisions ?? ($this->id || $this->primaryOwnerId || $this->ownerId); if (!$allowOwnerDrafts || !$allowOwnerRevisions) { - $this->subQuery->innerJoin( + $this->subQuery->join( + $joinType, ['owners' => Table::ELEMENTS], $this->ownerId ? '[[owners.id]] = [[elements_owners.ownerId]]' : "[[owners.id]] = [[$primaryOwnerIdColumn]]" ); @@ -246,6 +281,10 @@ private function applyNestedElementParams(string $fieldIdColumn, string $primary if (!$allowOwnerRevisions) { $this->subQuery->andWhere(['owners.revisionId' => null]); } + + if ($this->ownerId === false) { + $this->subQuery->andWhere(['owners.id' => null]); + } } $this->defaultOrderBy = ['elements_owners.sortOrder' => SORT_ASC]; @@ -263,7 +302,7 @@ private function normalizeNestedElementParams(): void } /** - * Normalizes the fieldId param to an array of IDs or null + * Normalizes the fieldId param to an array of IDs, false, or null */ private function normalizeFieldId(): void { @@ -285,22 +324,29 @@ private function normalizeFieldId(): void } /** - * Normalizes the primaryOwnerId param to an array of IDs or null + * Normalizes the primaryOwnerId param to an array of IDs, false, or null * * @param mixed $value * @return int[]|null|false */ private function normalizeOwnerId(mixed $value): array|null|false { + if ($value === false) { + return false; + } + if (empty($value)) { - return null; + return is_array($value) ? [] : null; } + if (is_numeric($value)) { return [$value]; } + if (!is_array($value) || !ArrayHelper::isNumeric($value)) { return false; } + return $value; } diff --git a/src/fieldlayoutelements/BaseField.php b/src/fieldlayoutelements/BaseField.php index ae4f8886bd0..6e73c3dcc55 100644 --- a/src/fieldlayoutelements/BaseField.php +++ b/src/fieldlayoutelements/BaseField.php @@ -410,6 +410,8 @@ protected function settingsHtml(): ?string 'field' => $this, 'defaultLabel' => $this->defaultLabel(), 'defaultInstructions' => $this->defaultInstructions(), + 'defaultTip' => $this->defaultTip(), + 'defaultWarning' => $this->defaultWarning(), 'labelHidden' => !$this->showLabel(), ]); } @@ -834,7 +836,20 @@ abstract protected function inputHtml(?ElementInterface $element = null, bool $s */ protected function tip(?ElementInterface $element = null, bool $static = false): ?string { - return $this->tip ? Craft::t('site', $this->tip) : null; + return $this->tip ? Craft::t('site', $this->tip) : $this->defaultTip($element, $static); + } + + /** + * Returns the field’s default tip text, which will be used if [[tip]] is null. + * + * @param ElementInterface|null $element The element the form is being rendered for + * @param bool $static Whether the form should be static (non-interactive) + * @return string|null + * @since 5.12.0 + */ + protected function defaultTip(?ElementInterface $element = null, bool $static = false): ?string + { + return null; } /** @@ -846,7 +861,20 @@ protected function tip(?ElementInterface $element = null, bool $static = false): */ protected function warning(?ElementInterface $element = null, bool $static = false): ?string { - return $this->warning ? Craft::t('site', $this->warning) : null; + return $this->warning ? Craft::t('site', $this->warning) : $this->defaultWarning($element, $static); + } + + /** + * Returns the field’s default warning text, which will be used if [[warning]] is null. + * + * @param ElementInterface|null $element The element the form is being rendered for + * @param bool $static Whether the form should be static (non-interactive) + * @return string|null + * @since 5.12.0 + */ + protected function defaultWarning(?ElementInterface $element = null, bool $static = false): ?string + { + return null; } /** diff --git a/src/fieldlayoutelements/CustomField.php b/src/fieldlayoutelements/CustomField.php index 0d36a375f4e..5ce28275b62 100644 --- a/src/fieldlayoutelements/CustomField.php +++ b/src/fieldlayoutelements/CustomField.php @@ -83,6 +83,8 @@ private static function defaultElementEditCondition(string $elementType): Elemen private ?string $_originalName = null; private ?string $_originalHandle = null; private ?string $_originalInstructions = null; + private ?string $_originalTip = null; + private ?string $_originalWarning = null; /** * @var UserCondition|class-string|array|null @@ -398,11 +400,15 @@ public function setField(FieldInterface $field): void $this->_originalName = $this->_field->name; $this->_originalHandle = $this->_field->handle; $this->_originalInstructions = $this->_field->instructions; + $this->_originalTip = $this->_field->tip; + $this->_originalWarning = $this->_field->warning; // Set the instance overrides $this->_field->name = $this->label ?? $this->_field->name; $this->_field->handle = $this->handle ?? $this->_field->handle; $this->_field->instructions = $this->instructions ?? $this->_field->instructions; + $this->_field->tip = $this->tip ?? $this->_field->tip; + $this->_field->warning = $this->warning ?? $this->_field->warning; $this->_field->required = $this->required; } @@ -568,6 +574,8 @@ protected function settingsHtml(): ?string 'defaultLabel' => $this->defaultLabel(), 'defaultHandle' => $this->_originalHandle, 'defaultInstructions' => $this->defaultInstructions(), + 'defaultTip' => $this->defaultTip(), + 'defaultWarning' => $this->defaultWarning(), 'labelHidden' => !$this->showLabel(), ]); } @@ -724,6 +732,22 @@ protected function defaultInstructions(?ElementInterface $element = null, bool $ return $this->_originalInstructions ? Craft::t('site', $this->_originalInstructions) : null; } + /** + * @inheritdoc + */ + protected function defaultTip(?ElementInterface $element = null, bool $static = false): ?string + { + return $this->_originalTip ? Craft::t('site', $this->_originalTip) : null; + } + + /** + * @inheritdoc + */ + protected function defaultWarning(?ElementInterface $element = null, bool $static = false): ?string + { + return $this->_originalWarning ? Craft::t('site', $this->_originalWarning) : null; + } + /** * @inheritdoc */ diff --git a/src/fields/Addresses.php b/src/fields/Addresses.php index f27dd5b3b05..dc2659d225d 100644 --- a/src/fields/Addresses.php +++ b/src/fields/Addresses.php @@ -270,14 +270,27 @@ public function canSaveElement(NestedElementInterface $element, User $user): ?bo $elementsService = Craft::$app->getElements(); $owner = $element->getOwner(); - if (!$elementsService->canSave($owner, $user)) { + if (!$owner) { return false; } - // addresses don't support drafts, so make sure they can edit the canonical owner too - $canonicalOwner = $owner->getCanonical(true); - if ($canonicalOwner !== $owner && !$elementsService->canSave($canonicalOwner, $user)) { - return false; + if (!$elementsService->canSave($owner, $user)) { + // Check all the owners. Maybe the user can save one of the other ones? + if ($owner->getIsRevision()) { + return false; + } + + $authorized = false; + foreach ($element->getOwners(['revisions' => false]) as $o) { + if ($o->id !== $owner->id && $elementsService->canSave($o, $user)) { + $authorized = true; + break; + } + } + + if (!$authorized) { + return false; + } } // If this is a new address, make sure we aren't hitting the Max Addresses limit @@ -760,9 +773,6 @@ private function inputHtmlInternal(?ElementInterface $owner, bool $static = fals $config += [ 'allowedViewModes' => [ElementIndexViewMode::Cards], 'pageSize' => $this->pageSize ?? 50, - // addresses don't have drafts, but in this particular context we need to allow drafts, - // so that addresses show while adding them via slideout in the element index view mode - 'canHaveDrafts' => true, ]; return $this->addressManager()->getIndexHtml($owner, $config); diff --git a/src/filters/IpRateLimitIdentity.php b/src/filters/IpRateLimitIdentity.php index 6176b455880..8d71f35dda3 100644 --- a/src/filters/IpRateLimitIdentity.php +++ b/src/filters/IpRateLimitIdentity.php @@ -25,11 +25,15 @@ class IpRateLimitIdentity extends BaseObject implements RateLimitInterface { /** * @var int Maximum number of requests allowed within the window + * + * If not set, the config setting will be used. */ public int $limit; /** * @var int Time window in seconds + * + * If not set, the config setting will be used. */ public int $window; @@ -40,9 +44,44 @@ class IpRateLimitIdentity extends BaseObject implements RateLimitInterface /** * @var string The IP address to rate limit + * + * If not set, the request’s user IP will be used. */ public string $ip; + /** + * Returns a new identity configured with the default rate limit settings, or `null` if + * is disabled. + * + * @param string $keyPrefix The cache key prefix for storing allowance data + * @return self|null + * @since 5.12.0 + */ + public static function createDefault(string $keyPrefix): ?self + { + if (!Craft::$app->getConfig()->getGeneral()->defaultRateLimit) { + return null; + } + + return new self(['keyPrefix' => $keyPrefix]); + } + + /** + * @inheritdoc + */ + public function init(): void + { + parent::init(); + + if (!isset($this->limit) || !isset($this->window)) { + $generalConfig = Craft::$app->getConfig()->getGeneral(); + $this->limit ??= (int)$generalConfig->defaultRateLimit; + $this->window ??= $generalConfig->defaultRateLimitDuration; + } + + $this->ip ??= Craft::$app->getRequest()->getUserIP() ?? 'unknown'; + } + /** * @inheritdoc */ diff --git a/src/gql/interfaces/Element.php b/src/gql/interfaces/Element.php index 495c1fa80ed..adc8a7d2d27 100644 --- a/src/gql/interfaces/Element.php +++ b/src/gql/interfaces/Element.php @@ -13,6 +13,7 @@ use craft\gql\GqlEntityRegistry; use craft\gql\types\DateTime; use craft\gql\types\generators\ElementType; +use craft\gql\types\Site; use craft\helpers\Gql as GqlHelper; use craft\services\Gql; use GraphQL\Type\Definition\InterfaceType as GqlInterfaceType; @@ -60,7 +61,13 @@ public static function getType(): Type */ public static function getFieldDefinitions(): array { - return Craft::$app->getGql()->prepareFieldDefinitions(array_merge(parent::getFieldDefinitions(), [ + return Craft::$app->getGql()->prepareFieldDefinitions(array_merge(parent::getFieldDefinitions(), GqlHelper::canSchema('settings.sites') ? [ + 'site' => [ + 'name' => 'site', + 'type' => Type::nonNull(Site::getType()), + 'description' => 'The site the element is associated with.', + ], + ] : [], [ Gql::GRAPHQL_COUNT_FIELD => [ 'name' => Gql::GRAPHQL_COUNT_FIELD, 'type' => Type::int(), diff --git a/src/gql/interfaces/elements/Asset.php b/src/gql/interfaces/elements/Asset.php index 7aeee5ae50f..f1c06aae42f 100644 --- a/src/gql/interfaces/elements/Asset.php +++ b/src/gql/interfaces/elements/Asset.php @@ -15,6 +15,7 @@ use craft\gql\interfaces\Element; use craft\gql\types\DateTime; use craft\gql\types\generators\AssetType; +use craft\gql\types\Volume; use craft\helpers\Gql; use craft\services\Gql as GqlService; use GraphQL\Type\Definition\InterfaceType; @@ -231,8 +232,18 @@ public static function getFieldDefinitions(): array */ protected static function getConditionalFields(): array { + $fields = []; + + if (Gql::canSchema('settings.volumes')) { + $fields['volume'] = [ + 'name' => 'volume', + 'type' => Type::nonNull(Volume::getType()), + 'description' => 'The volume that the asset belongs to.', + ]; + } + if (Gql::canQueryAllUsers()) { - return [ + $fields += [ 'uploaderId' => [ 'name' => 'uploaderId', 'type' => Type::int(), @@ -247,6 +258,6 @@ protected static function getConditionalFields(): array ]; } - return []; + return $fields; } } diff --git a/src/gql/interfaces/elements/Category.php b/src/gql/interfaces/elements/Category.php index 79d74a935e6..711fcc731b8 100644 --- a/src/gql/interfaces/elements/Category.php +++ b/src/gql/interfaces/elements/Category.php @@ -11,6 +11,7 @@ use craft\gql\arguments\elements\Category as CategoryArguments; use craft\gql\GqlEntityRegistry; use craft\gql\interfaces\Structure; +use craft\gql\types\CategoryGroup; use craft\gql\types\generators\CategoryType; use craft\helpers\Gql; use craft\services\Gql as GqlService; @@ -67,7 +68,13 @@ public static function getName(): string */ public static function getFieldDefinitions(): array { - return Craft::$app->getGql()->prepareFieldDefinitions(array_merge(parent::getFieldDefinitions(), [ + return Craft::$app->getGql()->prepareFieldDefinitions(array_merge(parent::getFieldDefinitions(), Gql::canSchema('settings.categorygroups') ? [ + 'group' => [ + 'name' => 'group', + 'type' => Type::nonNull(CategoryGroup::getType()), + 'description' => 'The group that contains the category.', + ], + ] : [], [ 'groupId' => [ 'name' => 'groupId', 'type' => Type::nonNull(Type::int()), diff --git a/src/gql/interfaces/elements/Entry.php b/src/gql/interfaces/elements/Entry.php index 30cfaa9d087..ce804f0d33e 100644 --- a/src/gql/interfaces/elements/Entry.php +++ b/src/gql/interfaces/elements/Entry.php @@ -13,7 +13,9 @@ use craft\gql\interfaces\elements\Entry as EntryInterface; use craft\gql\interfaces\Structure; use craft\gql\types\DateTime; +use craft\gql\types\EntryType as EntryTypeGqlType; use craft\gql\types\generators\EntryType; +use craft\gql\types\Section as SectionGqlType; use craft\helpers\Gql; use craft\models\Section; use craft\services\Gql as GqlService; @@ -239,6 +241,22 @@ public static function getFieldDefinitions(): array private static function getConditionalFields(array $sectionFieldArguments): array { $fields = []; + if (Gql::canSchema('settings.sections')) { + $fields['section'] = [ + 'name' => 'section', + 'type' => SectionGqlType::getType(), + 'description' => 'The section that contains the entry.', + ]; + } + + if (Gql::canSchema('settings.entrytypes')) { + $fields['type'] = [ + 'name' => 'type', + 'type' => Type::nonNull(EntryTypeGqlType::getType()), + 'description' => 'The entry’s entry type.', + ]; + } + if (Gql::canQueryAllUsers()) { $fields = array_merge($fields, [ 'authorId' => [ diff --git a/src/gql/interfaces/elements/Tag.php b/src/gql/interfaces/elements/Tag.php index 2dddcc8b8f4..423d5185e5c 100644 --- a/src/gql/interfaces/elements/Tag.php +++ b/src/gql/interfaces/elements/Tag.php @@ -11,6 +11,7 @@ use craft\gql\GqlEntityRegistry; use craft\gql\interfaces\Element; use craft\gql\types\generators\TagType; +use craft\gql\types\TagGroup; use craft\helpers\Gql; use GraphQL\Type\Definition\InterfaceType; use GraphQL\Type\Definition\Type; @@ -65,7 +66,13 @@ public static function getName(): string */ public static function getFieldDefinitions(): array { - return Craft::$app->getGql()->prepareFieldDefinitions(array_merge(parent::getFieldDefinitions(), [ + return Craft::$app->getGql()->prepareFieldDefinitions(array_merge(parent::getFieldDefinitions(), Gql::canSchema('settings.taggroups') ? [ + 'group' => [ + 'name' => 'group', + 'type' => Type::nonNull(TagGroup::getType()), + 'description' => 'The group that contains the tag.', + ], + ] : [], [ 'groupId' => [ 'name' => 'groupId', 'type' => Type::nonNull(Type::int()), diff --git a/src/gql/interfaces/elements/User.php b/src/gql/interfaces/elements/User.php index 4b93be36ef9..e7fa9de7a57 100644 --- a/src/gql/interfaces/elements/User.php +++ b/src/gql/interfaces/elements/User.php @@ -13,6 +13,7 @@ use craft\gql\interfaces\Element; use craft\gql\resolvers\elements\Address as AddressResolver; use craft\gql\types\generators\UserType; +use craft\gql\types\UserGroup; use craft\helpers\Gql; use GraphQL\Type\Definition\InterfaceType; use GraphQL\Type\Definition\Type; @@ -141,19 +142,27 @@ public static function getFieldDefinitions(): array */ protected static function getConditionalFields(): array { + $fields = []; $volumeUid = Craft::$app->getProjectConfig()->get('users.photoVolumeUid'); if (Gql::isSchemaAwareOf('volumes.' . $volumeUid)) { - return [ - 'photo' => [ - 'name' => 'photo', - 'type' => Asset::getType(), - 'description' => 'The user’s photo.', - 'complexity' => Gql::eagerLoadComplexity(), - ], + $fields['photo'] = [ + 'name' => 'photo', + 'type' => Asset::getType(), + 'description' => 'The user’s photo.', + 'complexity' => Gql::eagerLoadComplexity(), + ]; + } + + if (Gql::canSchema('settings.usergroups')) { + $fields['groups'] = [ + 'name' => 'groups', + 'type' => Type::nonNull(Type::listOf(Type::nonNull(UserGroup::getType()))), + 'description' => 'The user groups the user belongs to.', + 'complexity' => Gql::nPlus1Complexity(), ]; } - return []; + return $fields; } } diff --git a/src/gql/queries/Settings.php b/src/gql/queries/Settings.php new file mode 100644 index 00000000000..f44e1a12da2 --- /dev/null +++ b/src/gql/queries/Settings.php @@ -0,0 +1,145 @@ + + * @since 5.12.0 + */ +class Settings extends Query +{ + /** + * @inheritdoc + */ + public static function getQueries(bool $checkToken = true): array + { + $queries = []; + + foreach (self::definitions() as $component => [$plural, $singular, $type, $description, $getAll]) { + if ($checkToken && !GqlHelper::canSchema("settings.$component")) { + continue; + } + + $queries[$plural] = [ + 'type' => Type::nonNull(Type::listOf(Type::nonNull($type))), + 'args' => self::arguments(), + 'resolve' => fn($source, array $arguments) => self::filter($getAll(), $arguments), + 'description' => "This query is used to query for $description.", + ]; + + $queries[$singular] = [ + 'type' => $type, + 'args' => self::arguments(), + 'resolve' => fn($source, array $arguments) => self::filter($getAll(), $arguments)[0] ?? null, + 'description' => "This query is used to query for a single $singular.", + ]; + } + + return $queries; + } + + /** + * Returns the query definitions, indexed by their schema component names. + * + * Each definition is an array containing the plural query name, the singular query name, the GraphQL type, + * a description of what’s being queried, and a callable that returns all of the models. + * + * @return array + */ + private static function definitions(): array + { + return [ + 'sites' => ['sites', 'site', Site::getType(), 'sites', fn() => self::sites()], + 'sections' => ['sections', 'section', Section::getType(), 'sections', fn() => Craft::$app->getEntries()->getAllSections()], + 'entrytypes' => ['entryTypes', 'entryType', EntryType::getType(), 'entry types', fn() => Craft::$app->getEntries()->getAllEntryTypes()], + 'volumes' => ['volumes', 'volume', Volume::getType(), 'volumes', fn() => Craft::$app->getVolumes()->getAllVolumes()], + 'usergroups' => ['userGroups', 'userGroup', UserGroup::getType(), 'user groups', fn() => Craft::$app->getUserGroups()->getAllGroups()], + 'categorygroups' => ['categoryGroups', 'categoryGroup', CategoryGroup::getType(), 'category groups', fn() => Craft::$app->getCategories()->getAllGroups()], + 'taggroups' => ['tagGroups', 'tagGroup', TagGroup::getType(), 'tag groups', fn() => Craft::$app->getTags()->getAllTagGroups()], + ]; + } + + /** + * Returns the sites that can be queried. + * + * Disabled sites are only included if the schema can query elements in them. + * + * @return SiteModel[] + */ + private static function sites(): array + { + return array_values(array_filter( + Craft::$app->getSites()->getAllSites(true), + fn(SiteModel $site) => $site->getEnabled() || GqlHelper::canSchema("sites.$site->uid"), + )); + } + + /** + * Returns the arguments that the queries accept. + * + * @return array + */ + private static function arguments(): array + { + return [ + 'id' => [ + 'name' => 'id', + 'type' => Type::listOf(Type::int()), + 'description' => 'Narrows the query results based on their IDs.', + ], + 'uid' => [ + 'name' => 'uid', + 'type' => Type::listOf(Type::string()), + 'description' => 'Narrows the query results based on their UUIDs.', + ], + 'handle' => [ + 'name' => 'handle', + 'type' => Type::listOf(Type::string()), + 'description' => 'Narrows the query results based on their handles.', + ], + ]; + } + + /** + * Filters the given models by the query arguments. + * + * @param Model[] $models + * @param array $arguments + * @return Model[] + */ + private static function filter(array $models, array $arguments): array + { + foreach (['id', 'uid', 'handle'] as $name) { + if (isset($arguments[$name])) { + $values = $arguments[$name]; + $models = array_filter($models, fn(Model $model) => in_array(ArrayHelper::getValue($model, $name), $values, true)); + } + } + + return array_values($models); + } +} diff --git a/src/gql/types/CategoryGroup.php b/src/gql/types/CategoryGroup.php new file mode 100644 index 00000000000..5d869f06302 --- /dev/null +++ b/src/gql/types/CategoryGroup.php @@ -0,0 +1,81 @@ + + * @since 5.12.0 + */ +class CategoryGroup extends ObjectType implements SingularTypeInterface +{ + /** + * @inheritdoc + */ + public static function getName(): string + { + return 'CategoryGroup'; + } + + /** + * @inheritdoc + */ + public static function getType(): Type + { + return GqlEntityRegistry::getOrCreate(self::getName(), fn() => new self([ + 'name' => self::getName(), + 'fields' => self::class . '::getFieldDefinitions', + 'description' => 'This is the type for category groups.', + ])); + } + + /** + * Returns the type’s field definitions. + * + * @return array + */ + public static function getFieldDefinitions(): array + { + $fields = [ + 'id' => [ + 'name' => 'id', + 'type' => Type::nonNull(Type::int()), + 'description' => 'The ID of the category group.', + ], + 'uid' => [ + 'name' => 'uid', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The UUID of the category group.', + ], + 'name' => [ + 'name' => 'name', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The name of the category group.', + ], + 'handle' => [ + 'name' => 'handle', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The handle of the category group.', + ], + 'maxLevels' => [ + 'name' => 'maxLevels', + 'type' => Type::int(), + 'description' => 'The maximum number of levels the category group’s structure can have.', + ], + ]; + + return Craft::$app->getGql()->prepareFieldDefinitions($fields, self::getName()); + } +} diff --git a/src/gql/types/EntryType.php b/src/gql/types/EntryType.php new file mode 100644 index 00000000000..82ff79637f3 --- /dev/null +++ b/src/gql/types/EntryType.php @@ -0,0 +1,110 @@ + + * @since 5.12.0 + */ +class EntryType extends ObjectType implements SingularTypeInterface +{ + /** + * @inheritdoc + */ + public static function getName(): string + { + return 'EntryType'; + } + + /** + * @inheritdoc + */ + public static function getType(): Type + { + return GqlEntityRegistry::getOrCreate(self::getName(), fn() => new self([ + 'name' => self::getName(), + 'fields' => self::class . '::getFieldDefinitions', + 'description' => 'This is the type for entry types.', + ])); + } + + /** + * Returns the type’s field definitions. + * + * @return array + */ + public static function getFieldDefinitions(): array + { + $fields = [ + 'id' => [ + 'name' => 'id', + 'type' => Type::nonNull(Type::int()), + 'description' => 'The ID of the entry type.', + ], + 'uid' => [ + 'name' => 'uid', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The UUID of the entry type.', + ], + 'name' => [ + 'name' => 'name', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The name of the entry type.', + ], + 'handle' => [ + 'name' => 'handle', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The handle of the entry type.', + ], + 'description' => [ + 'name' => 'description', + 'type' => Type::string(), + 'description' => 'The description of the entry type.', + ], + 'icon' => [ + 'name' => 'icon', + 'type' => Type::string(), + 'description' => 'The icon of the entry type.', + ], + 'color' => [ + 'name' => 'color', + 'type' => Type::string(), + 'description' => 'The color of the entry type.', + ], + 'hasTitleField' => [ + 'name' => 'hasTitleField', + 'type' => Type::nonNull(Type::boolean()), + 'description' => 'Whether entries of this type have a Title field.', + ], + ]; + + return Craft::$app->getGql()->prepareFieldDefinitions($fields, self::getName()); + } + + /** + * @inheritdoc + */ + protected function resolve(mixed $source, array $arguments, mixed $context, ResolveInfo $resolveInfo): mixed + { + /** @var EntryTypeModel $source */ + return match ($resolveInfo->fieldName) { + 'color' => $source->color?->value, + default => parent::resolve($source, $arguments, $context, $resolveInfo), + }; + } +} diff --git a/src/gql/types/Section.php b/src/gql/types/Section.php new file mode 100644 index 00000000000..9d383f8a4d1 --- /dev/null +++ b/src/gql/types/Section.php @@ -0,0 +1,109 @@ + + * @since 5.12.0 + */ +class Section extends ObjectType implements SingularTypeInterface +{ + /** + * @inheritdoc + */ + public static function getName(): string + { + return 'Section'; + } + + /** + * @inheritdoc + */ + public static function getType(): Type + { + return GqlEntityRegistry::getOrCreate(self::getName(), fn() => new self([ + 'name' => self::getName(), + 'fields' => self::class . '::getFieldDefinitions', + 'description' => 'This is the type for sections.', + ])); + } + + /** + * Returns the type’s field definitions. + * + * @return array + */ + public static function getFieldDefinitions(): array + { + $fields = [ + 'id' => [ + 'name' => 'id', + 'type' => Type::nonNull(Type::int()), + 'description' => 'The ID of the section.', + ], + 'uid' => [ + 'name' => 'uid', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The UUID of the section.', + ], + 'name' => [ + 'name' => 'name', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The name of the section.', + ], + 'handle' => [ + 'name' => 'handle', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The handle of the section.', + ], + 'type' => [ + 'name' => 'type', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The type of the section (`single`, `channel`, or `structure`).', + ], + 'maxLevels' => [ + 'name' => 'maxLevels', + 'type' => Type::int(), + 'description' => 'The maximum number of levels the section’s structure can have, if it’s a structure.', + ], + ]; + + if (Gql::canSchema('settings.entrytypes')) { + $fields['entryTypes'] = [ + 'name' => 'entryTypes', + 'type' => Type::nonNull(Type::listOf(Type::nonNull(EntryType::getType()))), + 'description' => 'The section’s entry types.', + ]; + } + + return Craft::$app->getGql()->prepareFieldDefinitions($fields, self::getName()); + } + + /** + * @inheritdoc + */ + protected function resolve(mixed $source, array $arguments, mixed $context, ResolveInfo $resolveInfo): mixed + { + /** @var SectionModel $source */ + return match ($resolveInfo->fieldName) { + 'entryTypes' => $source->getEntryTypes(), + default => parent::resolve($source, $arguments, $context, $resolveInfo), + }; + } +} diff --git a/src/gql/types/Site.php b/src/gql/types/Site.php new file mode 100644 index 00000000000..5b6480bcae4 --- /dev/null +++ b/src/gql/types/Site.php @@ -0,0 +1,116 @@ + + * @since 5.12.0 + */ +class Site extends ObjectType implements SingularTypeInterface +{ + /** + * @inheritdoc + */ + public static function getName(): string + { + return 'Site'; + } + + /** + * @inheritdoc + */ + public static function getType(): Type + { + return GqlEntityRegistry::getOrCreate(self::getName(), fn() => new self([ + 'name' => self::getName(), + 'fields' => self::class . '::getFieldDefinitions', + 'description' => 'This is the type for sites.', + ])); + } + + /** + * Returns the type’s field definitions. + * + * @return array + */ + public static function getFieldDefinitions(): array + { + $fields = [ + 'id' => [ + 'name' => 'id', + 'type' => Type::nonNull(Type::int()), + 'description' => 'The ID of the site.', + ], + 'uid' => [ + 'name' => 'uid', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The UUID of the site.', + ], + 'name' => [ + 'name' => 'name', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The name of the site.', + ], + 'handle' => [ + 'name' => 'handle', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The handle of the site.', + ], + 'language' => [ + 'name' => 'language', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The language of the site.', + ], + 'primary' => [ + 'name' => 'primary', + 'type' => Type::nonNull(Type::boolean()), + 'description' => 'Whether this is the primary site.', + ], + 'enabled' => [ + 'name' => 'enabled', + 'type' => Type::nonNull(Type::boolean()), + 'description' => 'Whether the site is enabled.', + ], + 'hasUrls' => [ + 'name' => 'hasUrls', + 'type' => Type::nonNull(Type::boolean()), + 'description' => 'Whether the site has URLs.', + ], + 'baseUrl' => [ + 'name' => 'baseUrl', + 'type' => Type::string(), + 'description' => 'The base URL of the site.', + ], + ]; + + return Craft::$app->getGql()->prepareFieldDefinitions($fields, self::getName()); + } + + /** + * @inheritdoc + */ + protected function resolve(mixed $source, array $arguments, mixed $context, ResolveInfo $resolveInfo): mixed + { + /** @var SiteModel $source */ + return match ($resolveInfo->fieldName) { + 'enabled' => $source->getEnabled(), + 'baseUrl' => $source->getBaseUrl(), + default => parent::resolve($source, $arguments, $context, $resolveInfo), + }; + } +} diff --git a/src/gql/types/TagGroup.php b/src/gql/types/TagGroup.php new file mode 100644 index 00000000000..6ebb0516b4f --- /dev/null +++ b/src/gql/types/TagGroup.php @@ -0,0 +1,76 @@ + + * @since 5.12.0 + */ +class TagGroup extends ObjectType implements SingularTypeInterface +{ + /** + * @inheritdoc + */ + public static function getName(): string + { + return 'TagGroup'; + } + + /** + * @inheritdoc + */ + public static function getType(): Type + { + return GqlEntityRegistry::getOrCreate(self::getName(), fn() => new self([ + 'name' => self::getName(), + 'fields' => self::class . '::getFieldDefinitions', + 'description' => 'This is the type for tag groups.', + ])); + } + + /** + * Returns the type’s field definitions. + * + * @return array + */ + public static function getFieldDefinitions(): array + { + $fields = [ + 'id' => [ + 'name' => 'id', + 'type' => Type::nonNull(Type::int()), + 'description' => 'The ID of the tag group.', + ], + 'uid' => [ + 'name' => 'uid', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The UUID of the tag group.', + ], + 'name' => [ + 'name' => 'name', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The name of the tag group.', + ], + 'handle' => [ + 'name' => 'handle', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The handle of the tag group.', + ], + ]; + + return Craft::$app->getGql()->prepareFieldDefinitions($fields, self::getName()); + } +} diff --git a/src/gql/types/UserGroup.php b/src/gql/types/UserGroup.php new file mode 100644 index 00000000000..69a4d2f0fa2 --- /dev/null +++ b/src/gql/types/UserGroup.php @@ -0,0 +1,81 @@ + + * @since 5.12.0 + */ +class UserGroup extends ObjectType implements SingularTypeInterface +{ + /** + * @inheritdoc + */ + public static function getName(): string + { + return 'UserGroup'; + } + + /** + * @inheritdoc + */ + public static function getType(): Type + { + return GqlEntityRegistry::getOrCreate(self::getName(), fn() => new self([ + 'name' => self::getName(), + 'fields' => self::class . '::getFieldDefinitions', + 'description' => 'This is the type for user groups.', + ])); + } + + /** + * Returns the type’s field definitions. + * + * @return array + */ + public static function getFieldDefinitions(): array + { + $fields = [ + 'id' => [ + 'name' => 'id', + 'type' => Type::nonNull(Type::int()), + 'description' => 'The ID of the user group.', + ], + 'uid' => [ + 'name' => 'uid', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The UUID of the user group.', + ], + 'name' => [ + 'name' => 'name', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The name of the user group.', + ], + 'handle' => [ + 'name' => 'handle', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The handle of the user group.', + ], + 'description' => [ + 'name' => 'description', + 'type' => Type::string(), + 'description' => 'The description of the user group.', + ], + ]; + + return Craft::$app->getGql()->prepareFieldDefinitions($fields, self::getName()); + } +} diff --git a/src/gql/types/Volume.php b/src/gql/types/Volume.php new file mode 100644 index 00000000000..a2d0f77c7a9 --- /dev/null +++ b/src/gql/types/Volume.php @@ -0,0 +1,76 @@ + + * @since 5.12.0 + */ +class Volume extends ObjectType implements SingularTypeInterface +{ + /** + * @inheritdoc + */ + public static function getName(): string + { + return 'Volume'; + } + + /** + * @inheritdoc + */ + public static function getType(): Type + { + return GqlEntityRegistry::getOrCreate(self::getName(), fn() => new self([ + 'name' => self::getName(), + 'fields' => self::class . '::getFieldDefinitions', + 'description' => 'This is the type for volumes.', + ])); + } + + /** + * Returns the type’s field definitions. + * + * @return array + */ + public static function getFieldDefinitions(): array + { + $fields = [ + 'id' => [ + 'name' => 'id', + 'type' => Type::nonNull(Type::int()), + 'description' => 'The ID of the volume.', + ], + 'uid' => [ + 'name' => 'uid', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The UUID of the volume.', + ], + 'name' => [ + 'name' => 'name', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The name of the volume.', + ], + 'handle' => [ + 'name' => 'handle', + 'type' => Type::nonNull(Type::string()), + 'description' => 'The handle of the volume.', + ], + ]; + + return Craft::$app->getGql()->prepareFieldDefinitions($fields, self::getName()); + } +} diff --git a/src/gql/types/elements/Asset.php b/src/gql/types/elements/Asset.php index 49f7fc23985..7a70b58b948 100644 --- a/src/gql/types/elements/Asset.php +++ b/src/gql/types/elements/Asset.php @@ -55,6 +55,10 @@ protected function resolve(mixed $source, array $arguments, mixed $context, Reso } } + if ($fieldName === 'volume') { + return $source->getVolume(); + } + if ($fieldName === 'srcset') { return $source->getSrcset($arguments['sizes']); } diff --git a/src/gql/types/elements/Category.php b/src/gql/types/elements/Category.php index e9bf2138203..2863f105167 100644 --- a/src/gql/types/elements/Category.php +++ b/src/gql/types/elements/Category.php @@ -41,6 +41,7 @@ protected function resolve(mixed $source, array $arguments, mixed $context, Reso $fieldName = $resolveInfo->fieldName; return match ($fieldName) { + 'group' => $source->getGroup(), 'groupHandle' => $source->getGroup()->handle, default => parent::resolve($source, $arguments, $context, $resolveInfo), }; diff --git a/src/gql/types/elements/Element.php b/src/gql/types/elements/Element.php index 3e5d3af00e2..00350593652 100644 --- a/src/gql/types/elements/Element.php +++ b/src/gql/types/elements/Element.php @@ -83,6 +83,10 @@ protected function resolve(mixed $source, array $arguments, mixed $context, Reso return $source->{'get' . ucfirst($fieldName)}($query); } + if ($fieldName === 'site') { + return $source->getSite(); + } + if ($fieldName === 'siteHandle') { return $source->getSite()->handle; } diff --git a/src/gql/types/elements/Entry.php b/src/gql/types/elements/Entry.php index d062e81619c..6fe7d33d9fa 100644 --- a/src/gql/types/elements/Entry.php +++ b/src/gql/types/elements/Entry.php @@ -47,6 +47,8 @@ protected function resolve(mixed $source, array $arguments, mixed $context, Reso 'ownerId' => $source->ownerId, 'sortOrder' => $source->sortOrder, 'typeId' => $source->getTypeId(), + 'section' => $source->getSection(), + 'type' => $source->getType(), 'sectionHandle' => $source->getSection()?->handle, 'fieldHandle' => $source->getField()?->handle, 'typeHandle' => $source->getType()->handle, diff --git a/src/gql/types/elements/Tag.php b/src/gql/types/elements/Tag.php index 881df0711e6..943e77c35c7 100644 --- a/src/gql/types/elements/Tag.php +++ b/src/gql/types/elements/Tag.php @@ -40,6 +40,7 @@ protected function resolve(mixed $source, array $arguments, mixed $context, Reso $fieldName = $resolveInfo->fieldName; return match ($fieldName) { + 'group' => $source->getGroup(), 'groupHandle' => $source->getGroup()->handle, default => parent::resolve($source, $arguments, $context, $resolveInfo), }; diff --git a/src/gql/types/elements/User.php b/src/gql/types/elements/User.php index 5cb06545097..3c741619e84 100644 --- a/src/gql/types/elements/User.php +++ b/src/gql/types/elements/User.php @@ -9,7 +9,9 @@ use craft\elements\User as UserElement; use craft\gql\interfaces\elements\User as UserInterface; +use craft\helpers\Gql; use craft\helpers\Json; +use craft\models\UserGroup; use GraphQL\Type\Definition\ResolveInfo; /** @@ -43,7 +45,31 @@ protected function resolve(mixed $source, array $arguments, mixed $context, Reso return match ($fieldName) { 'preferences' => Json::encode($source->getPreferences()), 'affiliatedSiteHandle' => $source->getAffiliatedSite()?->handle, + 'groups' => $this->resolveGroups($source), default => parent::resolve($source, $arguments, $context, $resolveInfo), }; } + + /** + * Returns the user’s groups that the active schema is allowed to see. + * + * Unless the schema can query all users, only groups that the schema can query users in are returned, so that + * membership in other groups isn’t exposed. + * + * @param UserElement $user + * @return UserGroup[] + */ + private function resolveGroups(UserElement $user): array + { + $groups = $user->getGroups(); + + if (Gql::canQueryAllUsers()) { + return $groups; + } + + return array_values(array_filter( + $groups, + fn(UserGroup $group) => Gql::canSchema("usergroups.$group->uid"), + )); + } } diff --git a/src/helpers/Assets.php b/src/helpers/Assets.php index 2efd72eb814..4fd94e3f31d 100644 --- a/src/helpers/Assets.php +++ b/src/helpers/Assets.php @@ -577,6 +577,7 @@ private static function _buildFileKinds(): void 'jpeg', 'jpg', 'jpx', + 'jxl', 'pam', 'pfm', 'pgm', diff --git a/src/helpers/Cp.php b/src/helpers/Cp.php index 6ef996da9a3..2bc539ca6d6 100644 --- a/src/helpers/Cp.php +++ b/src/helpers/Cp.php @@ -388,6 +388,8 @@ public static function chipHtml(Chippable $component, array $config = []): strin 'description' => $component instanceof Describable ? $component->getDescription() : null, 'handle' => $component instanceof Grippable ? $component->getHandle() : null, 'instructions' => $component instanceof FieldInterface && $component->instructions ? Craft::t('site', $component->instructions) : null, + 'tip' => $component instanceof FieldInterface && $component->tip ? Craft::t('site', $component->tip) : null, + 'warning' => $component instanceof FieldInterface && $component->warning ? Craft::t('site', $component->warning) : null, 'settings' => $config['autoReload'] ? [ 'selectable' => $config['selectable'], 'id' => Craft::$app->getView()->namespaceInputId($config['id']), diff --git a/src/helpers/ElementHelper.php b/src/helpers/ElementHelper.php index 04304331d3a..a0c642f2940 100644 --- a/src/helpers/ElementHelper.php +++ b/src/helpers/ElementHelper.php @@ -108,17 +108,18 @@ public static function generateSlug(string $str, ?bool $ascii = null, ?string $l $slug = StringHelper::toAscii($slug, $language); } - return static::normalizeSlug($slug); + return static::normalizeSlug($slug, $language); } /** * Normalizes a slug. * * @param string $slug + * @param string|null $language The slug’s langauge * @return string * @since 3.5.0 */ - public static function normalizeSlug(string $slug): string + public static function normalizeSlug(string $slug, ?string $language = null): string { // Special case for the homepage if ($slug === Element::HOMEPAGE_URI) { @@ -134,7 +135,7 @@ public static function normalizeSlug(string $slug): string // Make it lowercase $generalConfig = Craft::$app->getConfig()->getGeneral(); if (!$generalConfig->allowUppercaseInSlug) { - $slug = mb_strtolower($slug); + $slug = StringHelper::toLowerCase($slug, $language); } // Get the "words". Split on anything that is not alphanumeric or allowed punctuation @@ -1069,11 +1070,11 @@ public static function actionConfig(ElementActionInterface $action): array * @throws InvalidConfigException * @throws NotSupportedException * @since 5.0.0 + * @deprecated in 5.12.0. [[\craft\helpers\Template::render()]] should be used instead. */ public static function renderElements(array $elements, array $variables = []): Markup { - $output = array_map(fn(ElementInterface $element) => (string)$element->render($variables), $elements); - return new Markup(implode("\n", $output), Craft::$app->charset); + return Template::render($elements, $variables); } /** diff --git a/src/helpers/Image.php b/src/helpers/Image.php index 15d614d6507..c91a3f589ad 100644 --- a/src/helpers/Image.php +++ b/src/helpers/Image.php @@ -26,6 +26,9 @@ class Image { // Bounds metadata scans for formats whose dimensions aren't in fixed header bytes. private const MAX_IMAGE_SIZE_STREAM_BYTES = 1024 * 1024; + private const JXL_CONTAINER_SIGNATURE = "\x00\x00\x00\x0CJXL \x0D\x0A\x87\x0A"; + // Bytes needed to parse a JPEG XL SizeHeader (68 bits max), plus the 2-byte codestream signature + private const JXL_SIZE_HEADER_BYTES = 11; /** @since 5.6.0 */ public const EXIF_IFD0_ROTATE_0 = 1; @@ -384,6 +387,13 @@ public static function imageSizeByStream($stream): array|false $data = unpack('N2', stream_get_contents($stream, 8)); $dimensions = array_values($data); + break; + // Maybe BMP + case '424D': + $dimensions = self::_bmpSize(stream_get_contents($stream, 24)); + if ($dimensions === null) { + return false; + } break; // Maybe WebP case '5249': @@ -394,13 +404,28 @@ public static function imageSizeByStream($stream): array|false $dimensions = self::_webpSizeByStream($stream, $buffer); break; + // Maybe JPEG XL (bare codestream) + case 'FF0A': + $dimensions = self::_jxlCodestreamSize(hex2bin($signature) . stream_get_contents($stream, self::JXL_SIZE_HEADER_BYTES - 2)); + if ($dimensions === null) { + return false; + } + break; default: $buffer = hex2bin($signature); if ($buffer === false) { return false; } - $dimensions = self::_isoBmffSizeByStream($stream, $buffer); + $buffer .= stream_get_contents($stream, 12 - strlen($buffer)); + + // Maybe JPEG XL (ISO BMFF container) + if ($buffer === self::JXL_CONTAINER_SIGNATURE) { + $dimensions = self::_jxlContainerSizeByStream($stream); + } else { + $dimensions = self::_isoBmffSizeByStream($stream, $buffer); + } + if ($dimensions === null) { return false; } @@ -497,7 +522,7 @@ private static function _webpSizeByStream($stream, string $buffer): array */ private static function _isoBmffSizeByStream($stream, string $buffer): ?array { - $buffer .= stream_get_contents($stream, 10); + $buffer .= stream_get_contents($stream, 12 - strlen($buffer)); if (strlen($buffer) < 12 || substr($buffer, 4, 4) !== 'ftyp') { return null; } @@ -532,6 +557,164 @@ private static function _isoBmffSizeByStream($stream, string $buffer): ?array return null; } + /** + * Returns a BMP’s dimensions from the bytes following its 2-byte signature. + * + * @param string $buffer + * @return array{int,int}|null + */ + private static function _bmpSize(string $buffer): ?array + { + // The DIB header starts after the remaining 12 bytes of the file header, and begins with its own size + if (strlen($buffer) < 16) { + return null; + } + + $dibHeaderSize = unpack('V', substr($buffer, 12, 4))[1]; + + if ($dibHeaderSize === 12) { + // BITMAPCOREHEADER (OS/2 1.x): unsigned 16-bit dimensions + $width = unpack('v', substr($buffer, 16, 2))[1]; + $height = unpack('v', substr($buffer, 18, 2))[1]; + } elseif ($dibHeaderSize >= 40 && strlen($buffer) >= 24) { + // BITMAPINFOHEADER and later: signed 32-bit dimensions, where a negative height means top-down + [$width, $height] = array_map( + fn(int $value) => $value >= 0x80000000 ? $value - 0x100000000 : $value, + array_values(unpack('V2', substr($buffer, 16, 8))), + ); + $height = abs($height); + } else { + return null; + } + + if ($width <= 0 || $height <= 0) { + return null; + } + + return [$width, $height]; + } + + /** + * Reads the beginning of the codestream out of a JPEG XL container’s `jxlc`/`jxlp` boxes, + * and returns its dimensions. + * + * @param resource $stream A stream positioned right after the container signature box + * @return array{int,int}|null + */ + private static function _jxlContainerSizeByStream($stream): ?array + { + $codestream = ''; + $bytesRead = 12; + + while (strlen($codestream) < self::JXL_SIZE_HEADER_BYTES) { + $header = stream_get_contents($stream, 8); + if (strlen($header) < 8) { + return null; + } + + $size = unpack('N', substr($header, 0, 4))[1]; + $type = substr($header, 4, 4); + $bytesRead += 8; + + if ($size === 1) { + // 64-bit box size + $largeSize = stream_get_contents($stream, 8); + if (strlen($largeSize) < 8) { + return null; + } + $bytesRead += 8; + $contentSize = unpack('J', $largeSize)[1] - 16; + } elseif ($size === 0) { + // Box extends to the end of the file + $contentSize = PHP_INT_MAX; + } else { + $contentSize = $size - 8; + } + + if ($contentSize < 0) { + return null; + } + + if ($type === 'jxlc' || $type === 'jxlp') { + if ($type === 'jxlp') { + // Skip the partial codestream box index + if ($contentSize < 4 || strlen(stream_get_contents($stream, 4)) < 4) { + return null; + } + $contentSize -= 4; + } + + $chunk = stream_get_contents($stream, min($contentSize, self::JXL_SIZE_HEADER_BYTES - strlen($codestream))); + $codestream .= $chunk; + + // jxlc holds the full codestream, so there's nothing more to read + if ($type === 'jxlc' || strlen($chunk) < $contentSize) { + break; + } + } else { + if ($size === 0 || $bytesRead + $contentSize > self::MAX_IMAGE_SIZE_STREAM_BYTES) { + return null; + } + + if ($contentSize > 0 && strlen(stream_get_contents($stream, $contentSize)) < $contentSize) { + return null; + } + } + + $bytesRead += $contentSize; + } + + return self::_jxlCodestreamSize($codestream); + } + + /** + * Parses the SizeHeader at the beginning of a JPEG XL codestream (ISO/IEC 18181-1 §A.3.1). + * + * Note that the returned dimensions don’t account for the image’s orientation, consistent with JPEG. + * + * @param string $codestream The beginning of the codestream, including its signature + * @return array{int,int}|null + */ + private static function _jxlCodestreamSize(string $codestream): ?array + { + if (strlen($codestream) < self::JXL_SIZE_HEADER_BYTES || !str_starts_with($codestream, "\xFF\x0A")) { + return null; + } + + // Bits are packed least-significant-bit first + $position = 16; + $read = function(int $bits) use ($codestream, &$position): int { + $value = 0; + for ($i = 0; $i < $bits; $i++, $position++) { + $bit = (ord($codestream[$position >> 3]) >> ($position & 7)) & 1; + $value |= $bit << $i; + } + return $value; + }; + $readSize = fn() => $read([9, 13, 18, 30][$read(2)]) + 1; + + $div8 = $read(1) === 1; + $height = $div8 ? ($read(5) + 1) * 8 : $readSize(); + $ratio = $read(3); + + if ($ratio === 0) { + $width = $div8 ? ($read(5) + 1) * 8 : $readSize(); + } else { + [$numerator, $denominator] = [ + 1 => [1, 1], + 2 => [12, 10], + 3 => [4, 3], + 4 => [3, 2], + 5 => [16, 9], + 6 => [5, 4], + 7 => [2, 1], + ][$ratio]; + $width = intdiv($height * $numerator, $denominator); + } + + return [$width, $height]; + } + /** * @return array{type:string,contentOffset:int,contentSize:int,endOffset:int}|null */ diff --git a/src/helpers/ImageTransforms.php b/src/helpers/ImageTransforms.php index eb5cb966fb5..cbb3b294104 100644 --- a/src/helpers/ImageTransforms.php +++ b/src/helpers/ImageTransforms.php @@ -411,9 +411,11 @@ public static function generateTransform( $imagesService = Craft::$app->getImages(); $supported = match ($format) { + Format::ID_BMP => $imagesService->getSupportsBmp(), Format::ID_WEBP => $imagesService->getSupportsWebP(), Format::ID_AVIF => $imagesService->getSupportsAvif(), Format::ID_HEIC => $imagesService->getSupportsHeic(), + Format::ID_JXL => $imagesService->getSupportsJxl(), default => true, }; diff --git a/src/helpers/StringHelper.php b/src/helpers/StringHelper.php index e6af8830262..ba60d5bcb27 100644 --- a/src/helpers/StringHelper.php +++ b/src/helpers/StringHelper.php @@ -9,12 +9,14 @@ use BackedEnum; use Craft; +use craft\i18n\Locale; use HTMLPurifier_Config; use Illuminate\Support\Str; use IteratorAggregate; use LitEmoji\LitEmoji; use Normalizer; use Throwable; +use Transliterator; use voku\helper\ASCII; use yii\base\Exception; use yii\base\InvalidArgumentException; @@ -2324,11 +2326,12 @@ public static function toKebabCase(string $str, string $glue = '-', bool $lower * Converts all characters in the string to lowercase. An alias for PHP's mb_strtolower(). * * @param string $str The string to convert to lowercase. + * @param string|null $language The string’s langauge * @return string The lowercase string. */ - public static function toLowerCase(string $str): string + public static function toLowerCase(string $str, ?string $language = null): string { - return Str::lower($str); + return self::modifyCase($str, $language, 'Lower') ?? Str::lower($str); } /** @@ -2425,11 +2428,12 @@ public static function toTabs(string $str, int $tabLength = 4): string * Converts the first character of each word in the string to uppercase. * * @param string $str The string to convert case. + * @param string|null $language The string’s langauge * @return string The title-cased string. */ - public static function toTitleCase(string $str): string + public static function toTitleCase(string $str, ?string $language = null): string { - return Str::title($str); + return self::modifyCase($str, $language, 'Title') ?? Str::title($str); } /** @@ -2451,11 +2455,12 @@ public static function toTransliterate(string $str, bool $strict = false): strin * Converts all characters in the string to uppercase. An alias for PHP's mb_strtoupper(). * * @param string $str The string to convert to uppercase. + * @param string|null $language The string’s langauge * @return string The uppercase string. */ - public static function toUpperCase(string $str): string + public static function toUpperCase(string $str, ?string $language = null): string { - return Str::upper($str); + return self::modifyCase($str, $language, 'Upper') ?? Str::upper($str); } /** @@ -2814,4 +2819,19 @@ public static function invisibleCharsRegex(): string return sprintf('/%s/iu', implode('|', $invisibleCharCodes)); } + + private static function modifyCase(string $str, ?string $language, string $case): ?string + { + $language ??= Craft::$app->language; + $transliterator = Transliterator::create(sprintf('%s-%s', Locale::languageId($language), $case)); + + if (!$transliterator) { + return null; + } + + // Normalize NFD chars to NFC + $str = Normalizer::normalize($str, Normalizer::FORM_C); + + return $transliterator->transliterate($str); + } } diff --git a/src/helpers/Template.php b/src/helpers/Template.php index 8f02abb5030..12c2036d215 100644 --- a/src/helpers/Template.php +++ b/src/helpers/Template.php @@ -9,6 +9,7 @@ use Craft; use craft\base\ElementInterface; +use craft\base\Renderable; use craft\db\Paginator; use craft\web\twig\variables\Paginate; use craft\web\View; @@ -22,6 +23,7 @@ use Twig\Template as TwigTemplate; use Twig\TemplateWrapper; use yii\base\BaseObject; +use yii\base\InvalidArgumentException; use yii\base\InvalidConfigException; use yii\base\UnknownMethodException; use yii\base\UnknownPropertyException; @@ -381,6 +383,70 @@ public static function resolveTemplatePathAndLine(string $path, ?int $line) return [$templatePath, $templateLine]; } + /** + * Renders the given renderable object(s). + * + * If an array or other iterable is passed, each of its items will be rendered and joined with newlines, + * and a `loop` variable will be made available to each of them, like within `{% for %}` loops. Any `loop` + * variable in `$context` will be replaced, but a `loop` variable in `$variables` will be left alone. + * + * @param Renderable|iterable|null $objects The object(s) to render + * @param array $variables Variables that should be passed to each object’s `render()` method + * @param array $context Additional variables that should be passed to each object’s `render()` method, such as + * the current template context. `$variables` will take precedence over them. + * @return Markup + * @throws InvalidArgumentException if any of the objects aren’t renderable + * @since 5.12.0 + */ + public static function render(Renderable|iterable|null $objects, array $variables = [], array $context = []): Markup + { + // If `loop` was explicitly passed in, leave it alone + $defineLoop = !array_key_exists('loop', $variables); + $variables = array_merge($context, $variables); + + if ($objects instanceof Renderable) { + return $objects->render($variables); + } + + if ($objects === null) { + $objects = []; + } elseif (is_array($objects)) { + $objects = array_values($objects); + } else { + $objects = iterator_to_array($objects, false); + } + + $length = count($objects); + $output = []; + + foreach ($objects as $i => $object) { + if (!$object instanceof Renderable) { + throw new InvalidArgumentException(sprintf('%s isn’t renderable.', get_debug_type($object))); + } + + if (!$defineLoop) { + $output[] = (string)$object->render($variables); + continue; + } + + // Provide a `loop` variable, like {% for %} loops + $output[] = (string)$object->render(array_merge($variables, [ + 'loop' => [ + 'parent' => $variables, + 'index0' => $i, + 'index' => $i + 1, + 'revindex0' => $length - $i - 1, + 'revindex' => $length - $i, + 'first' => $i === 0, + 'last' => $i === $length - 1, + 'length' => $length, + ], + ])); + } + + return new Markup(implode("\n", $output), Craft::$app->charset); + } + /** * Filters the template from a context array. * diff --git a/src/i18n/Locale.php b/src/i18n/Locale.php index db9efd2b4fa..0af9cbdefa5 100644 --- a/src/i18n/Locale.php +++ b/src/i18n/Locale.php @@ -25,6 +25,19 @@ */ class Locale extends BaseObject { + /** + * Returns a locale’s language ID. + * + * @return string + * @since 5.12.0 + */ + public static function languageId(string $locale): string + { + $pos = strpos($locale, '-'); + $lang = $pos !== false ? substr($locale, 0, $pos) : $locale; + return strtolower($lang); + } + /** * @var int Positive prefix. */ @@ -296,11 +309,7 @@ public function __toString(): string #[AllowedInSandbox] public function getLanguageID(): string { - if (($pos = strpos($this->id, '-')) !== false) { - return substr($this->id, 0, $pos); - } - - return $this->id; + return static::languageId($this->id); } /** diff --git a/src/migrations/Install.php b/src/migrations/Install.php index 2df7ee974f9..795834e5329 100644 --- a/src/migrations/Install.php +++ b/src/migrations/Install.php @@ -478,6 +478,8 @@ public function createTables(): void 'context' => $this->string()->notNull()->defaultValue('global'), 'columnSuffix' => $this->char(8), 'instructions' => $this->text(), + 'tip' => $this->text(), + 'warning' => $this->text(), 'searchable' => $this->boolean()->notNull()->defaultValue(true), 'translationMethod' => $this->string()->notNull()->defaultValue(Field::TRANSLATION_METHOD_NONE), 'translationKeyFormat' => $this->text(), diff --git a/src/migrations/m261014_000000_field_tips_and_warnings.php b/src/migrations/m261014_000000_field_tips_and_warnings.php new file mode 100644 index 00000000000..523be522032 --- /dev/null +++ b/src/migrations/m261014_000000_field_tips_and_warnings.php @@ -0,0 +1,38 @@ +db->columnExists(Table::FIELDS, 'tip')) { + $this->addColumn(Table::FIELDS, 'tip', $this->text()->after('instructions')); + } + if (!$this->db->columnExists(Table::FIELDS, 'warning')) { + $this->addColumn(Table::FIELDS, 'warning', $this->text()->after('tip')); + } + + return true; + } + + /** + * @inheritdoc + */ + public function safeDown(): bool + { + $this->dropColumn(Table::FIELDS, 'tip'); + $this->dropColumn(Table::FIELDS, 'warning'); + + return true; + } +} diff --git a/src/records/Field.php b/src/records/Field.php index abc4a48c858..e177af60a90 100644 --- a/src/records/Field.php +++ b/src/records/Field.php @@ -21,6 +21,8 @@ * @property string $context Context * @property string|null $columnSuffix * @property string $instructions Instructions + * @property string|null $tip Tip + * @property string|null $warning Warning * @property bool $searchable Searchable * @property string $translationMethod Translation method * @property string $translationKeyFormat Translation key format diff --git a/src/services/Elements.php b/src/services/Elements.php index 23fe0f7b21e..aa777da1cc4 100644 --- a/src/services/Elements.php +++ b/src/services/Elements.php @@ -4403,6 +4403,19 @@ private function _saveElementInternal( } } + // Bump the owner elements' `dateUpdated` timestamps, recursively, so freshness checks based on + // `dateUpdated` (e.g. whether a new revision needs to be created for an ancestor) notice that + // something changed, even if this nested element was saved independently of its owner. + if ( + !$element->propagating && + $element instanceof NestedElementInterface && + $element->getIsCanonical() && + isset($element->touchOwnersOnSave) && + $element->touchOwnersOnSave + ) { + $this->touchOwners($element); + } + // Update the changed attributes & fields if ($trackChanges) { $userId = Craft::$app->getUser()->getId(); @@ -4494,6 +4507,33 @@ private function updateSearchIndex( } } + /** + * Updates the `dateUpdated` timestamp of a nested element’s owner, and its owner’s owner, and so on up + * the ownership chain, so that anything checking an ancestor’s `dateUpdated` to determine whether it’s + * changed (e.g. [[\craft\services\Revisions::createRevision()]], deciding whether a new revision needs + * to be created) will notice that it has, even though the ancestor itself wasn’t directly modified. + * + * @param NestedElementInterface $element The (canonical) nested element that was just saved + * @see https://github.com/craftcms/cms/issues/19594 + */ + private function touchOwners(NestedElementInterface $element): void + { + $timestamp = Db::prepareDateForDb($element->dateUpdated ?? DateTimeHelper::now()); + $owner = $element->getOwner(); + + while ($owner !== null) { + Db::update(Table::ELEMENTS, [ + 'dateUpdated' => $timestamp, + ], ['id' => $owner->id]); + + if (!$owner instanceof NestedElementInterface) { + return; + } + + $owner = $owner->getOwner(); + } + } + /** * Propagates an element to a different site * diff --git a/src/services/Fields.php b/src/services/Fields.php index 3bd880dcded..bb8872f10e7 100644 --- a/src/services/Fields.php +++ b/src/services/Fields.php @@ -593,6 +593,8 @@ public function createFieldConfig(FieldInterface $field): array 'handle' => $field->handle, 'columnSuffix' => $field->columnSuffix, 'instructions' => $field->instructions, + 'tip' => $field->tip, + 'warning' => $field->warning, 'searchable' => $field->searchable, 'translationMethod' => $field->translationMethod, 'translationKeyFormat' => $field->translationKeyFormat, @@ -1479,6 +1481,8 @@ public function applyFieldSave(string $fieldUid, array $data, string $context): $fieldRecord->context = $context; $fieldRecord->columnSuffix = $data['columnSuffix'] ?? null; $fieldRecord->instructions = $data['instructions']; + $fieldRecord->tip = $data['tip'] ?? null; + $fieldRecord->warning = $data['warning'] ?? null; $fieldRecord->searchable = $searchable; $fieldRecord->translationMethod = $data['translationMethod']; $fieldRecord->translationKeyFormat = $data['translationKeyFormat']; @@ -1678,6 +1682,11 @@ private function _createFieldQuery(): Query $query->where(['fields.dateDeleted' => null]); } + // todo: remove after the next breakpoint + if (Craft::$app->getDb()->columnExists(Table::FIELDS, 'tip')) { + $query->addSelect(['fields.tip', 'fields.warning']); + } + return $query; } diff --git a/src/services/Gql.php b/src/services/Gql.php index ca24b3e9e69..4fecc757f53 100644 --- a/src/services/Gql.php +++ b/src/services/Gql.php @@ -59,6 +59,7 @@ use craft\gql\queries\Entry as EntryQuery; use craft\gql\queries\GlobalSet as GlobalSetQuery; use craft\gql\queries\Ping as PingQuery; +use craft\gql\queries\Settings as SettingsQuery; use craft\gql\queries\Tag as TagQuery; use craft\gql\queries\User as UserQuery; use craft\gql\TypeLoader; @@ -1540,6 +1541,7 @@ private function _registerGqlQueries(): void GlobalSetQuery::getQueries(), CategoryQuery::getQueries(), TagQuery::getQueries(), + SettingsQuery::getQueries(), ]; // Flatten them @@ -1639,7 +1641,16 @@ private function _loadGqlDirectives(?GqlSchema $schema): array private function siteSchemaComponents(): array { $sites = Craft::$app->getSites()->getAllSites(true); - $queryComponents = []; + $queryComponents = [ + 'settings.sites:read' => [ + 'label' => Craft::t('app', 'Query for sites'), + 'info' => Craft::t('app', 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to elements.', [ + 'plural' => 'sites', + 'singular' => 'site', + 'field' => 'site', + ]), + ], + ]; foreach ($sites as $site) { $queryComponents["sites.{$site->uid}:read"] = [ @@ -1685,6 +1696,29 @@ private function entrySchemaComponents(): array $mutationComponents = []; $entriesService = Craft::$app->getEntries(); + + if (!empty($entriesService->getAllSections())) { + $queryComponents['settings.sections:read'] = [ + 'label' => Craft::t('app', 'Query for sections'), + 'info' => Craft::t('app', 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to entries.', [ + 'plural' => 'sections', + 'singular' => 'section', + 'field' => 'section', + ]), + ]; + } + + if (!empty($entriesService->getAllEntryTypes())) { + $queryComponents['settings.entrytypes:read'] = [ + 'label' => Craft::t('app', 'Query for entry types'), + 'info' => Craft::t('app', 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to entries.', [ + 'plural' => 'entryTypes', + 'singular' => 'entryType', + 'field' => 'type', + ]), + ]; + } + $singles = $entriesService->getSectionsByType(Section::TYPE_SINGLE); foreach ($singles as $section) { @@ -1792,6 +1826,15 @@ private function assetSchemaComponents(): array $volumes = Craft::$app->getVolumes()->getAllVolumes(); if (!empty($volumes)) { + $queryComponents['settings.volumes:read'] = [ + 'label' => Craft::t('app', 'Query for volumes'), + 'info' => Craft::t('app', 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to assets.', [ + 'plural' => 'volumes', + 'singular' => 'volume', + 'field' => 'volume', + ]), + ]; + foreach ($volumes as $volume) { $name = Craft::t('site', $volume->name); $prefix = "volumes.$volume->uid"; @@ -1862,6 +1905,17 @@ private function userSchemaComponents(): array } else { $userGroups = Craft::$app->getUserGroups()->getAllGroups(); + if (!empty($userGroups)) { + $queryComponents['settings.usergroups:read'] = [ + 'label' => Craft::t('app', 'Query for user groups'), + 'info' => Craft::t('app', 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to users.', [ + 'plural' => 'userGroups', + 'singular' => 'userGroup', + 'field' => 'groups', + ]), + ]; + } + $queryComponents['usergroups.everyone:read'] = [ 'label' => Craft::t('app', 'Query for users'), ]; @@ -1891,6 +1945,15 @@ private function categorySchemaComponents(): array $categoryGroups = Craft::$app->getCategories()->getAllGroups(); if (!empty($categoryGroups)) { + $queryComponents['settings.categorygroups:read'] = [ + 'label' => Craft::t('app', 'Query for category groups'), + 'info' => Craft::t('app', 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to categories.', [ + 'plural' => 'categoryGroups', + 'singular' => 'categoryGroup', + 'field' => 'group', + ]), + ]; + foreach ($categoryGroups as $categoryGroup) { $name = Craft::t('site', $categoryGroup->name); $prefix = "categorygroups.$categoryGroup->uid"; @@ -1927,6 +1990,15 @@ private function tagSchemaComponents(): array $tagGroups = Craft::$app->getTags()->getAllTagGroups(); if (!empty($tagGroups)) { + $queryComponents['settings.taggroups:read'] = [ + 'label' => Craft::t('app', 'Query for tag groups'), + 'info' => Craft::t('app', 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to tags.', [ + 'plural' => 'tagGroups', + 'singular' => 'tagGroup', + 'field' => 'group', + ]), + ]; + foreach ($tagGroups as $tagGroup) { $name = Craft::t('site', $tagGroup->name); $prefix = "taggroups.$tagGroup->uid"; diff --git a/src/services/Images.php b/src/services/Images.php index 4a7fe055362..e3f31bfde02 100644 --- a/src/services/Images.php +++ b/src/services/Images.php @@ -124,6 +124,10 @@ public function getSupportedImageFormats(): array $supportedFormats[] = Format::ID_WEBP; } + if ($this->getSupportsBmp()) { + $supportedFormats[] = Format::ID_BMP; + } + if ($this->getSupportsAvif()) { $supportedFormats[] = Format::ID_AVIF; } @@ -132,6 +136,10 @@ public function getSupportedImageFormats(): array $supportedFormats[] = Format::ID_HEIC; } + if ($this->getSupportsJxl()) { + $supportedFormats[] = Format::ID_JXL; + } + return $supportedFormats; } @@ -183,6 +191,18 @@ public function getCanUseImagick(): bool return true; } + /** + * Returns whether the BMP image format is supported. + * + * @return bool + * @since 5.12.0 + */ + public function getSupportsBmp(): bool + { + $info = $this->getIsImagick() ? ImagickImagine::getDriverInfo() : GdImagine::getDriverInfo(); + return $info->isFormatSupported(Format::ID_BMP); + } + /** * Returns whether the WebP image format is supported. * @@ -219,6 +239,18 @@ public function getSupportsHeic(): bool return $info->isFormatSupported(Format::ID_HEIC); } + /** + * Returns whether the JPEG XL image format is supported. + * + * @return bool + * @since 5.12.0 + */ + public function getSupportsJxl(): bool + { + $info = $this->getIsImagick() ? ImagickImagine::getDriverInfo() : GdImagine::getDriverInfo(); + return $info->isFormatSupported(Format::ID_JXL); + } + /** * Loads an image from a file system path. * diff --git a/src/templates/_includes/forms/fld/custom-field-settings.twig b/src/templates/_includes/forms/fld/custom-field-settings.twig index ce471471a4a..afa832949d7 100644 --- a/src/templates/_includes/forms/fld/custom-field-settings.twig +++ b/src/templates/_includes/forms/fld/custom-field-settings.twig @@ -28,10 +28,14 @@ const oldName = {{ defaultLabel|json_encode|raw }}; const oldHandle = {{ defaultHandle|json_encode|raw }}; const oldInstructions = {{ defaultInstructions|json_encode|raw }}; + const oldTip = {{ defaultTip|json_encode|raw }}; + const oldWarning = {{ defaultWarning|json_encode|raw }}; const $labelInput = $("#{{ 'label'|namespaceInputId }}"); const $handleInput = $("#{{ 'handle'|namespaceInputId }}"); const $instructionsInput = $("#{{ 'instructions'|namespaceInputId }}"); + const $tipInput = $("#{{ 'tip'|namespaceInputId }}"); + const $warningInput = $("#{{ 'warning'|namespaceInputId }}"); componentSelect.on('change', () => { const $chip = componentSelect.getComponents().first(); @@ -43,13 +47,17 @@ const newName = $chip.data('label'); const newHandle = $chip.data('handle'); const newInstructions = $chip.data('instructions') ?? null; + const newTip = $chip.data('tip') ?? null; + const newWarning = $chip.data('warning') ?? null; $labelInput.attr('placeholder', newName); $handleInput.attr('placeholder', newHandle); $instructionsInput.attr('placeholder', newInstructions); + $tipInput.attr('placeholder', newTip); + $warningInput.attr('placeholder', newWarning); if (!replaced) { - // Override the name/handle/instructions for consistency with the old field, + // Override the name/handle/instructions/tip/warning for consistency with the old field, // if they weren't already being overridden if (!$labelInput.val()) { $labelInput.val(oldName); @@ -60,6 +68,12 @@ if (!$instructionsInput.val()) { $instructionsInput.val(oldInstructions); } + if (!$tipInput.val()) { + $tipInput.val(oldTip); + } + if (!$warningInput.val()) { + $warningInput.val(oldWarning); + } } replaced = true; diff --git a/src/templates/_includes/forms/fld/field-settings.twig b/src/templates/_includes/forms/fld/field-settings.twig index 50075ff9848..d0587de69ba 100644 --- a/src/templates/_includes/forms/fld/field-settings.twig +++ b/src/templates/_includes/forms/fld/field-settings.twig @@ -63,6 +63,7 @@ class: 'nicetext', name: 'tip', value: field.tip, + placeholder: defaultTip ?? null, rows: 1, data: { 'error-key': 'tip' @@ -77,6 +78,7 @@ class: 'nicetext', name: 'warning', value: field.warning, + placeholder: defaultWarning ?? null, rows: 1, data: { 'error-key': 'warning' diff --git a/src/templates/settings/assets/transforms/_settings.twig b/src/templates/settings/assets/transforms/_settings.twig index 3d18dd5f3e8..393e4df1860 100644 --- a/src/templates/settings/assets/transforms/_settings.twig +++ b/src/templates/settings/assets/transforms/_settings.twig @@ -231,6 +231,10 @@ {% set formatOptions = formatOptions|merge([{label: 'avif', value: 'avif'}]) %} {% endif %} + {% if transform.format == 'jxl' or craft.app.images.supportsJxl %} + {% set formatOptions = formatOptions|merge([{label: 'jxl', value: 'jxl'}]) %} + {% endif %} + {{ forms.selectField({ label: "Image Format"|t('app'), id: "format", diff --git a/src/templates/settings/fields/_edit.twig b/src/templates/settings/fields/_edit.twig index 48a89576669..ccfff25bdad 100644 --- a/src/templates/settings/fields/_edit.twig +++ b/src/templates/settings/fields/_edit.twig @@ -50,6 +50,34 @@ disabled: readOnly, }) }} +{{ forms.textareaField({ + label: "Default Tip"|t('app'), + id: 'tip', + class: 'nicetext', + name: 'tip', + value: field.tip, + rows: 1, + errors: field.getErrors('tip'), + data: { + 'error-key': 'tip', + }, + disabled: readOnly, +}) }} + +{{ forms.textareaField({ + label: "Default Warning"|t('app'), + id: 'warning', + class: 'nicetext', + name: 'warning', + value: field.warning, + rows: 1, + errors: field.getErrors('warning'), + data: { + 'error-key': 'warning', + }, + disabled: readOnly, +}) }} + {{ forms.lightswitchField({ label: 'Use this field’s values as search keywords'|t('app'), id: 'searchable', diff --git a/src/test/ElementFixtureTrait.php b/src/test/ElementFixtureTrait.php new file mode 100644 index 00000000000..7e664275641 --- /dev/null +++ b/src/test/ElementFixtureTrait.php @@ -0,0 +1,75 @@ + + * @since 5.12.0 + */ +trait ElementFixtureTrait +{ + /** + * @var bool Whether fixture saves should create revisions when versioning is enabled. + * This also applies to nested entries saved by the fixture. + */ + public bool $createRevisions = false; + + /** + * Saves an element. + * + * @param ElementInterface $element The element to be saved + * @return bool Whether the save was successful + */ + protected function saveElement(ElementInterface $element): bool + { + $elements = Craft::$app->getElements(); + if ($this->createRevisions) { + return $elements->saveElement($element, true, true, false); + } + + /** @var array $versionedContainers */ + $versionedContainers = []; + + /** + * @param ElementEvent $event + * @return void + */ + $beforeSave = static function(ElementEvent $event) use (&$versionedContainers): void { + if (!$event->element instanceof Entry) { + return; + } + + $container = $event->element->getSection() ?? $event->element->getField(); + if (($container instanceof Section || $container instanceof Matrix) && $container->enableVersioning) { + $versionedContainers[spl_object_id($container)] = $container; + $container->enableVersioning = false; + } + }; + + // Nested entries can have versioning enabled independently of their owners. + $elements->on(Elements::EVENT_BEFORE_SAVE_ELEMENT, $beforeSave); + try { + return $elements->saveElement($element, true, true, false); + } finally { + $elements->off(Elements::EVENT_BEFORE_SAVE_ELEMENT, $beforeSave); + foreach ($versionedContainers as $container) { + $container->enableVersioning = true; + } + } + } +} diff --git a/src/test/fixtures/elements/BaseContentFixture.php b/src/test/fixtures/elements/BaseContentFixture.php index 565a7d52ddc..94f3b751cb3 100644 --- a/src/test/fixtures/elements/BaseContentFixture.php +++ b/src/test/fixtures/elements/BaseContentFixture.php @@ -10,6 +10,7 @@ use Craft; use craft\base\ElementInterface; use craft\errors\InvalidElementException; +use craft\test\ElementFixtureTrait; use yii\base\Exception; use yii\base\InvalidConfigException; use yii\test\DbFixture; @@ -33,6 +34,7 @@ abstract class BaseContentFixture extends DbFixture { use FileFixtureTrait; + use ElementFixtureTrait; /** * @var class-string The element type this is for @@ -141,15 +143,4 @@ protected function populateElement(ElementInterface $element, array $data): void $element->setFieldValues($data['fields']); } } - - /** - * Saves an element. - * - * @param ElementInterface $element The element to be saved - * @return bool Whether the save was successful - */ - protected function saveElement(ElementInterface $element): bool - { - return Craft::$app->getElements()->saveElement($element, true, true, false); - } } diff --git a/src/test/fixtures/elements/BaseElementFixture.php b/src/test/fixtures/elements/BaseElementFixture.php index cab06f66643..d8c197599b2 100644 --- a/src/test/fixtures/elements/BaseElementFixture.php +++ b/src/test/fixtures/elements/BaseElementFixture.php @@ -17,6 +17,7 @@ use craft\helpers\Db; use craft\models\FieldLayout; use craft\test\DbFixtureTrait; +use craft\test\ElementFixtureTrait; use yii\log\Logger; use yii\test\DbFixture; use yii\test\FileFixtureTrait; @@ -33,6 +34,7 @@ abstract class BaseElementFixture extends DbFixture { use FileFixtureTrait; use DbFixtureTrait; + use ElementFixtureTrait; /** * @var array @@ -168,17 +170,6 @@ protected function populateElement(ElementInterface $element, array $attributes) } } - /** - * Saves an element. - * - * @param ElementInterface $element The element to be saved - * @return bool Whether the save was successful - */ - protected function saveElement(ElementInterface $element): bool - { - return Craft::$app->getElements()->saveElement($element, true, true, false); - } - /** * Deletes an element. * diff --git a/src/translations/en/app.php b/src/translations/en/app.php index 8a8f10623db..ebb7cd598b4 100644 --- a/src/translations/en/app.php +++ b/src/translations/en/app.php @@ -74,6 +74,12 @@ 'Address fields saved.' => 'Address fields saved.', 'Address' => 'Address', 'Addresses' => 'Addresses', + 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to assets.' => 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to assets.', + 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to categories.' => 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to categories.', + 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to elements.' => 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to elements.', + 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to entries.' => 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to entries.', + 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to tags.' => 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to tags.', + 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to users.' => 'Adds “{plural}” and “{singular}” queries, and a “{field}” field to users.', 'Add…' => 'Add…', 'Admin' => 'Admin', 'Administrate users' => 'Administrate users', @@ -547,12 +553,14 @@ 'Default Sort' => 'Default Sort', 'Default Status' => 'Default Status', 'Default Table Columns' => 'Default Table Columns', + 'Default Tip' => 'Default Tip', 'Default Title Format' => 'Default Title Format', 'Default Upload Location' => 'Default Upload Location', 'Default User Group' => 'Default User Group', 'Default Value' => 'Default Value', 'Default Values' => 'Default Values', 'Default View Mode' => 'Default View Mode', + 'Default Warning' => 'Default Warning', 'Default {type} Placement' => 'Default {type} Placement', 'Default' => 'Default', 'Default?' => 'Default?', @@ -1337,17 +1345,24 @@ 'Quality' => 'Quality', 'Query for assets in the “{name}” volume' => 'Query for assets in the “{name}” volume', 'Query for categories in the “{name}” category group' => 'Query for categories in the “{name}” category group', + 'Query for category groups' => 'Query for category groups', 'Query for element drafts' => 'Query for element drafts', 'Query for element revisions' => 'Query for element revisions', 'Query for elements in the “{site}” site' => 'Query for elements in the “{site}” site', 'Query for entries in the “{name}” section' => 'Query for entries in the “{name}” section', 'Query for entries in the “{name}” {type} field' => 'Query for entries in the “{name}” {type} field', + 'Query for entry types' => 'Query for entry types', 'Query for non-enabled elements' => 'Query for non-enabled elements', + 'Query for sections' => 'Query for sections', + 'Query for sites' => 'Query for sites', + 'Query for tag groups' => 'Query for tag groups', 'Query for tags in the “{name}” tag group' => 'Query for tags in the “{name}” tag group', 'Query for the “{name}” entry' => 'Query for the “{name}” entry', 'Query for the “{name}” global set' => 'Query for the “{name}” global set', + 'Query for user groups' => 'Query for user groups', 'Query for users in the “{name}” user group' => 'Query for users in the “{name}” user group', 'Query for users' => 'Query for users', + 'Query for volumes' => 'Query for volumes', 'Query params (e.g. {ex1}) or a URI fragment (e.g. {ex2}) that should be appended to the URL.' => 'Query params (e.g. {ex1}) or a URI fragment (e.g. {ex2}) that should be appended to the URL.', 'Queue Manager' => 'Queue Manager', 'Quick Post' => 'Quick Post', diff --git a/src/web/View.php b/src/web/View.php index 7383667b5e1..0182b486361 100644 --- a/src/web/View.php +++ b/src/web/View.php @@ -2351,11 +2351,13 @@ private function sandbox(callable $callback, ?string $templateMode): string return $callback(); } - $extension->enableSandbox(); + // enableSandbox() and disableSandbox() are deprecated as of Twig 3.29 + $checker = $extension->getChecker(); + $checker->setSandboxed(true); try { return $callback(); } finally { - $extension->disableSandbox(); + $checker->setSandboxed(false); } } diff --git a/src/web/assets/axios/dist/axios.js b/src/web/assets/axios/dist/axios.js index b224eb02389..72f611b4edc 100644 --- a/src/web/assets/axios/dist/axios.js +++ b/src/web/assets/axios/dist/axios.js @@ -1,2 +1,2 @@ /*! For license information please see axios.js.LICENSE.txt */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).axios=t()}(this,(function(){"use strict";function e(e,t){this.v=e,this.k=t}function t(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n3?(o=h===r)&&(s=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=e):i[0]<=p&&((o=n<2&&pr||r>h)&&(i[4]=n,i[5]=r,d.n=h,u=0))}if(o||n>1)return a;throw l=!0,r}return function(o,f,h){if(c>1)throw TypeError("Generator is already running");for(l&&1===f&&p(f,h),u=f,s=h;(t=u<2?e:s)||!l;){i||(u?u<3?(u>1&&(d.n=-1),p(u,s)):d.n=s:d.v=s);try{if(c=2,i){if(u||(o="next"),t=i[o]){if(!(t=t.call(i,s)))throw TypeError("iterator result is not an object");if(!t.done)return t;s=t.value,u<2&&(u=0)}else 1===u&&(t=i.return)&&t.call(i),u<2&&(s=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=e}else if((t=(l=d.n<0)?s:n.call(r,d))!==a)break}catch(t){i=e,u=1,s=t}finally{c=1}}return{value:t,done:l}}}(n,o,i),!0),c}var a={};function u(){}function s(){}function c(){}t=Object.getPrototypeOf;var f=[][r]?t(t([][r]())):(g(t={},r,(function(){return this})),t),l=c.prototype=u.prototype=Object.create(f);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,c):(e.__proto__=c,g(e,o,"GeneratorFunction")),e.prototype=Object.create(l),e}return s.prototype=c,g(l,"constructor",c),g(c,"constructor",s),s.displayName="GeneratorFunction",g(c,o,"GeneratorFunction"),g(l),g(l,o,"Generator"),g(l,r,(function(){return this})),g(l,"toString",(function(){return"[object Generator]"})),(m=function(){return{w:i,m:d}})()}function g(e,t,n,r){var o=Object.defineProperty;try{o({},"",{})}catch(e){o=0}g=function(e,t,n,r){function i(t,n){g(e,t,(function(e){return this._invoke(t,n,e)}))}t?o?o(e,t,{value:n,enumerable:!r,configurable:!r,writable:!r}):e[t]=n:(i("next",0),i("throw",1),i("return",2))},g(e,t,n,r)}function w(e){if(null!=e){var t=e["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],n=0;if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length))return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}throw new TypeError(typeof e+" is not iterable")}function O(e,t){return O=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},O(e,t)}function E(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i,a,u=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(u.push(r.value),u.length!==t);s=!0);}catch(e){c=!0,o=e}finally{try{if(!s&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(c)throw o}}return u}}(e,t)||A(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function R(e){return function(e){if(Array.isArray(e))return t(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||A(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function S(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e,"string");return"symbol"==typeof t?t:t+""}function _(e){return _="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_(e)}function A(e,n){if(e){if("string"==typeof e)return t(e,n);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?t(e,n):void 0}}function T(e){return function(){return new j(e.apply(this,arguments))}}function j(t){var n,r;function o(n,r){try{var a=t[n](r),u=a.value,s=u instanceof e;Promise.resolve(s?u.v:u).then((function(e){if(s){var r="return"===n?"return":"next";if(!u.k||e.done)return o(r,e);e=t[r](e).value}i(a.done?"return":"normal",e)}),(function(e){o("throw",e)}))}catch(e){i("throw",e)}}function i(e,t){switch(e){case"return":n.resolve({value:t,done:!0});break;case"throw":n.reject(t);break;default:n.resolve({value:t,done:!1})}(n=n.next)?o(n.key,n.arg):r=null}this._invoke=function(e,t){return new Promise((function(i,a){var u={key:e,arg:t,resolve:i,reject:a,next:null};r?r=r.next=u:(n=r=u,o(e,t))}))},"function"!=typeof t.return&&(this.return=void 0)}function P(e){var t="function"==typeof Map?new Map:void 0;return P=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return function(e,t,n){if(y())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,t);var o=new(e.bind.apply(e,r));return n&&O(o,n.prototype),o}(e,arguments,p(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),O(n,e)},P(e)}function k(e,t){return function(){return e.apply(t,arguments)}}j.prototype["function"==typeof Symbol&&Symbol.asyncIterator||"@@asyncIterator"]=function(){return this},j.prototype.next=function(e){return this._invoke("next",e)},j.prototype.throw=function(e){return this._invoke("throw",e)},j.prototype.return=function(e){return this._invoke("return",e)};var x,C=Object.prototype.toString,N=Object.getPrototypeOf,D=Symbol.iterator,U=Symbol.toStringTag,L=(x=Object.create(null),function(e){var t=C.call(e);return x[t]||(x[t]=t.slice(8,-1).toLowerCase())}),F=function(e){return e=e.toLowerCase(),function(t){return L(t)===e}},B=function(e){return function(t){return _(t)===e}},I=Array.isArray,q=B("undefined");function M(e){return null!==e&&!q(e)&&null!==e.constructor&&!q(e.constructor)&&W(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}var z=F("ArrayBuffer"),H=B("string"),W=B("function"),J=B("number"),K=function(e){return null!==e&&"object"===_(e)},V=function(e){if("object"!==L(e))return!1;var t=N(e);return!(null!==t&&t!==Object.prototype&&null!==Object.getPrototypeOf(t)||U in e||D in e)},X=F("Date"),G=F("File"),$=F("Blob"),Q=F("FileList"),Z="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},Y=void 0!==Z.FormData?Z.FormData:void 0,ee=F("URLSearchParams"),te=E(["ReadableStream","Request","Response","Headers"].map(F),4),ne=te[0],re=te[1],oe=te[2],ie=te[3];function ae(e,t){var n,r,o=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).allOwnKeys,i=void 0!==o&&o;if(null!=e)if("object"!==_(e)&&(e=[e]),I(e))for(n=0,r=e.length;n0;)if(t===(n=r[o]).toLowerCase())return n;return null}var se,ce,fe,le,de,pe="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,he=function(e){return!q(e)&&e!==pe},ye=(se="undefined"!=typeof Uint8Array&&N(Uint8Array),function(e){return se&&e instanceof se}),ve=F("HTMLFormElement"),be=function(){var e=Object.prototype.hasOwnProperty;return function(t,n){return e.call(t,n)}}(),me=Object.prototype.propertyIsEnumerable,ge=F("RegExp"),we=function(e,t){var n=Object.getOwnPropertyDescriptors(e),r={};ae(n,(function(n,o){var i;!1!==(i=t(n,o,e))&&(r[o]=i||n)})),Object.defineProperties(e,r)},Oe=F("AsyncFunction"),Ee=(ce="function"==typeof setImmediate,fe=W(pe.postMessage),ce?setImmediate:fe?(le="axios@".concat(Math.random()),de=[],pe.addEventListener("message",(function(e){var t=e.source,n=e.data;t===pe&&n===le&&de.length&&de.shift()()}),!1),function(e){de.push(e),pe.postMessage(le,"*")}):function(e){return setTimeout(e)}),Re="undefined"!=typeof queueMicrotask?queueMicrotask.bind(pe):"undefined"!=typeof process&&process.nextTick||Ee,Se={isArray:I,isArrayBuffer:z,isBuffer:M,isFormData:function(e){if(!e)return!1;if(Y&&e instanceof Y)return!0;var t=N(e);if(!t||t===Object.prototype)return!1;if(!W(e.append))return!1;var n=L(e);return"formdata"===n||"object"===n&&W(e.toString)&&"[object FormData]"===e.toString()},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&z(e.buffer)},isString:H,isNumber:J,isBoolean:function(e){return!0===e||!1===e},isObject:K,isPlainObject:V,isEmptyObject:function(e){if(!K(e)||M(e))return!1;try{return 0===Object.keys(e).length&&Object.getPrototypeOf(e)===Object.prototype}catch(e){return!1}},isReadableStream:ne,isRequest:re,isResponse:oe,isHeaders:ie,isUndefined:q,isDate:X,isFile:G,isReactNativeBlob:function(e){return!(!e||void 0===e.uri)},isReactNative:function(e){return e&&void 0!==e.getParts},isBlob:$,isRegExp:ge,isFunction:W,isStream:function(e){return K(e)&&W(e.pipe)},isURLSearchParams:ee,isTypedArray:ye,isFileList:Q,forEach:ae,merge:function e(){for(var t=he(this)&&this||{},n=t.caseless,r=t.skipUndefined,o={},i=function(t,i){if("__proto__"!==i&&"constructor"!==i&&"prototype"!==i){var a=n&&"string"==typeof i&&ue(o,i)||i,u=be(o,a)?o[a]:void 0;V(u)&&V(t)?o[a]=e(u,t):V(t)?o[a]=e({},t):I(t)?o[a]=t.slice():r&&q(t)||(o[a]=t)}},a=0,u=arguments.length;a3&&void 0!==arguments[3]?arguments[3]:{}).allOwnKeys}),e},trim:function(e){return e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,n,r){e.prototype=Object.create(t.prototype,r),Object.defineProperty(e.prototype,"constructor",{__proto__:null,value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{__proto__:null,value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:function(e,t,n,r){var o,i,a,u={};if(t=t||{},null==e)return t;do{for(i=(o=Object.getOwnPropertyNames(e)).length;i-- >0;)a=o[i],r&&!r(a,e,t)||u[a]||(t[a]=e[a],u[a]=!0);e=!1!==n&&N(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:L,kindOfTest:F,endsWith:function(e,t,n){e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;var r=e.indexOf(t,n);return-1!==r&&r===n},toArray:function(e){if(!e)return null;if(I(e))return e;var t=e.length;if(!J(t))return null;for(var n=new Array(t);t-- >0;)n[t]=e[t];return n},forEachEntry:function(e,t){for(var n,r=(e&&e[D]).call(e);(n=r.next())&&!n.done;){var o=n.value;t.call(e,o[0],o[1])}},matchAll:function(e,t){for(var n,r=[];null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:ve,hasOwnProperty:be,hasOwnProp:be,reduceDescriptors:we,freezeMethods:function(e){we(e,(function(t,n){if(W(e)&&["arguments","caller","callee"].includes(n))return!1;var r=e[n];W(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=function(){throw Error("Can not rewrite read-only method '"+n+"'")}))}))},toObjectSet:function(e,t){var n={},r=function(e){e.forEach((function(e){n[e]=!0}))};return I(e)?r(e):r(String(e).split(t)),n},toCamelCase:function(e){return e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n}))},noop:function(){},toFiniteNumber:function(e,t){return null!=e&&Number.isFinite(e=+e)?e:t},findKey:ue,global:pe,isContextDefined:he,isSpecCompliantForm:function(e){return!!(e&&W(e.append)&&"FormData"===e[U]&&e[D])},toJSONObject:function(e){var t=new WeakSet,n=function(e){if(K(e)){if(t.has(e))return;if(M(e))return e;if(!("toJSON"in e)){t.add(e);var r=I(e)?[]:{};return ae(e,(function(e,t){var o=n(e);!q(o)&&(r[t]=o)})),t.delete(e),r}}return e};return n(e)},isAsyncFn:Oe,isThenable:function(e){return e&&(K(e)||W(e))&&W(e.then)&&W(e.catch)},setImmediate:Ee,asap:Re,isIterable:function(e){return null!=e&&W(e[D])}},_e=Se.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),Ae=new RegExp("[\\u0000-\\u0008\\u000a-\\u001f\\u007f]+","g"),Te=new RegExp("[^\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+","g");function je(e,t){return Se.isArray(e)?e.map((function(e){return je(e,t)})):function(e){for(var t=0,n=e.length;tt;){var o=e.charCodeAt(n-1);if(9!==o&&32!==o)break;n-=1}return 0===t&&n===e.length?e:e.slice(t,n)}(String(e).replace(t,""))}function Pe(e){var t=Object.create(null);return Se.forEach(e.toJSON(),(function(e,n){t[n]=function(e){return je(e,Te)}(e)})),t}var ke=Symbol("internals");function xe(e){return e&&String(e).trim().toLowerCase()}function Ce(e){return!1===e||null==e?e:Se.isArray(e)?e.map(Ce):function(e){return je(e,Ae)}(String(e))}function Ne(e,t,n,r,o){return Se.isFunction(r)?r.call(this,t,n):(o&&(t=n),Se.isString(t)?Se.isString(r)?-1!==t.indexOf(r):Se.isRegExp(r)?r.test(t):void 0:void 0)}var De=function(){return l((function e(t){c(this,e),t&&this.set(t)}),[{key:"set",value:function(e,t,n){var r=this;function o(e,t,n){var o=xe(t);if(o){var i=Se.findKey(r,o);(!i||void 0===r[i]||!0===n||void 0===n&&!1!==r[i])&&(r[i||t]=Ce(e))}}var i=function(e,t){return Se.forEach(e,(function(e,n){return o(e,n,t)}))};if(Se.isPlainObject(e)||e instanceof this.constructor)i(e,t);else if(Se.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))i(function(e){var t,n,r,o={};return e&&e.split("\n").forEach((function(e){r=e.indexOf(":"),t=e.substring(0,r).trim().toLowerCase(),n=e.substring(r+1).trim(),!t||o[t]&&_e[t]||("set-cookie"===t?o[t]?o[t].push(n):o[t]=[n]:o[t]=o[t]?o[t]+", "+n:n)})),o}(e),t);else if(Se.isObject(e)&&Se.isIterable(e)){var a,u,s,c={},f=function(e){var t="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!t){if(Array.isArray(e)||(t=A(e))){t&&(e=t);var n=0,r=function(){};return{s:r,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,i=!0,a=!1;return{s:function(){t=t.call(e)},n:function(){var e=t.next();return i=e.done,e},e:function(e){a=!0,o=e},f:function(){try{i||null==t.return||t.return()}finally{if(a)throw o}}}}(e);try{for(f.s();!(s=f.n()).done;){var l=s.value;if(!Se.isArray(l))throw new TypeError("Object iterator must return a key-value pair");c[u=l[0]]=(a=c[u])?Se.isArray(a)?[].concat(R(a),[l[1]]):[a,l[1]]:l[1]}}catch(e){f.e(e)}finally{f.f()}i(c,t)}else null!=e&&o(t,e,n);return this}},{key:"get",value:function(e,t){if(e=xe(e)){var n=Se.findKey(this,e);if(n){var r=this[n];if(!t)return r;if(!0===t)return function(e){for(var t,n=Object.create(null),r=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;t=r.exec(e);)n[t[1]]=t[2];return n}(r);if(Se.isFunction(t))return t.call(this,r,n);if(Se.isRegExp(t))return t.exec(r);throw new TypeError("parser must be boolean|regexp|function")}}}},{key:"has",value:function(e,t){if(e=xe(e)){var n=Se.findKey(this,e);return!(!n||void 0===this[n]||t&&!Ne(0,this[n],n,t))}return!1}},{key:"delete",value:function(e,t){var n=this,r=!1;function o(e){if(e=xe(e)){var o=Se.findKey(n,e);!o||t&&!Ne(0,n[o],o,t)||(delete n[o],r=!0)}}return Se.isArray(e)?e.forEach(o):o(e),r}},{key:"clear",value:function(e){for(var t=Object.keys(this),n=t.length,r=!1;n--;){var o=t[n];e&&!Ne(0,this[o],o,e,!0)||(delete this[o],r=!0)}return r}},{key:"normalize",value:function(e){var t=this,n={};return Se.forEach(this,(function(r,o){var i=Se.findKey(n,o);if(i)return t[i]=Ce(r),void delete t[o];var a=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n}))}(o):String(o).trim();a!==o&&delete t[o],t[a]=Ce(r),n[a]=!0})),this}},{key:"concat",value:function(){for(var e,t=arguments.length,n=new Array(t),r=0;r1?n-1:0),o=1;o0?function(e,t){var n=new Set(t.map((function(e){return String(e).toLowerCase()}))),r=[],o=function(e){if(null===e||"object"!==_(e))return e;if(Se.isBuffer(e))return e;if(-1===r.indexOf(e)){var t;if(e instanceof De&&(e=e.toJSON()),r.push(e),Se.isArray(e))t=[],e.forEach((function(e,n){var r=o(e);Se.isUndefined(r)||(t[n]=r)}));else{if(!Se.isPlainObject(e)&&function(e){if(Se.hasOwnProp(e,"toJSON"))return!0;for(var t=Object.getPrototypeOf(e);t&&t!==Object.prototype;){if(Se.hasOwnProp(t,"toJSON"))return!0;t=Object.getPrototypeOf(t)}return!1}(e))return r.pop(),e;t=Object.create(null);for(var i=0,a=Object.entries(e);i2&&void 0!==arguments[2]?arguments[2]:0;if(!Se.isUndefined(n)){if(i>s)throw new Ue("Object is too deeply nested ("+i+" levels). Max depth: "+s,Ue.ERR_FORM_DATA_DEPTH_EXCEEDED);if(-1!==d.indexOf(n))throw new Error("Circular reference detected in "+r.join("."));d.push(n),Se.forEach(n,(function(n,a){!0===(!(Se.isUndefined(n)||null===n)&&o.call(t,n,Se.isString(a)?a.trim():a,r,p))&&e(n,r?r.concat(a):[a],i+1)})),d.pop()}}(e),t}function Me(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"};return encodeURIComponent(e).replace(/[!'()~]|%20/g,(function(e){return t[e]}))}function ze(e,t){this._pairs=[],e&&qe(e,this,t)}var He=ze.prototype;function We(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Je(e,t,n){if(!t)return e;var r,o=n&&n.encode||We,i=Se.isFunction(n)?{serialize:n}:n,a=i&&i.serialize;if(r=a?a(t,i):Se.isURLSearchParams(t)?t.toString():new ze(t,i).toString(o)){var u=e.indexOf("#");-1!==u&&(e=e.slice(0,u)),e+=(-1===e.indexOf("?")?"?":"&")+r}return e}He.append=function(e,t){this._pairs.push([e,t])},He.toString=function(e){var t=e?function(t){return e.call(this,t,Me)}:Me;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var Ke=function(){return l((function e(){c(this,e),this.handlers=[]}),[{key:"use",value:function(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}},{key:"eject",value:function(e){this.handlers[e]&&(this.handlers[e]=null)}},{key:"clear",value:function(){this.handlers&&(this.handlers=[])}},{key:"forEach",value:function(e){Se.forEach(this.handlers,(function(t){null!==t&&e(t)}))}}])}(),Ve={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0,advertiseZstdAcceptEncoding:!1},Xe={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:ze,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]},Ge="undefined"!=typeof window&&"undefined"!=typeof document,$e="object"===("undefined"==typeof navigator?"undefined":_(navigator))&&navigator||void 0,Qe=Ge&&(!$e||["ReactNative","NativeScript","NS"].indexOf($e.product)<0),Ze="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,Ye=Ge&&window.location.href||"http://localhost",et=b(b({},Object.freeze({__proto__:null,hasBrowserEnv:Ge,hasStandardBrowserEnv:Qe,hasStandardBrowserWebWorkerEnv:Ze,navigator:$e,origin:Ye})),Xe);function tt(e){function t(e,n,r,o){var i=e[o++];if("__proto__"===i)return!0;var a=Number.isFinite(+i),u=o>=e.length;return i=!i&&Se.isArray(r)?r.length:i,u?(Se.hasOwnProp(r,i)?r[i]=Se.isArray(r[i])?r[i].concat(n):[r[i],n]:r[i]=n,!a):(Se.hasOwnProp(r,i)&&Se.isObject(r[i])||(r[i]=[]),t(e,n,r[i],o)&&Se.isArray(r[i])&&(r[i]=function(e){var t,n,r={},o=Object.keys(e),i=o.length;for(t=0;t-1,i=Se.isObject(e);if(i&&Se.isHTMLForm(e)&&(e=new FormData(e)),Se.isFormData(e))return o?JSON.stringify(tt(e)):e;if(Se.isArrayBuffer(e)||Se.isBuffer(e)||Se.isStream(e)||Se.isFile(e)||Se.isBlob(e)||Se.isReadableStream(e))return e;if(Se.isArrayBufferView(e))return e.buffer;if(Se.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();if(i){var a=nt(this,"formSerializer");if(r.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return qe(e,new et.classes.URLSearchParams,b({visitor:function(e,t,n,r){return et.isNode&&Se.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}(e,a).toString();if((n=Se.isFileList(e))||r.indexOf("multipart/form-data")>-1){var u=nt(this,"env"),s=u&&u.FormData;return qe(n?{"files[]":e}:e,s&&new s,a)}}return i||o?(t.setContentType("application/json",!1),function(e){if(Se.isString(e))try{return(0,JSON.parse)(e),Se.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(0,JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=nt(this,"transitional")||rt.transitional,n=t&&t.forcedJSONParsing,r=nt(this,"responseType"),o="json"===r;if(Se.isResponse(e)||Se.isReadableStream(e))return e;if(e&&Se.isString(e)&&(n&&!r||o)){var i=!(t&&t.silentJSONParsing)&&o;try{return JSON.parse(e,nt(this,"parseReviver"))}catch(e){if(i){if("SyntaxError"===e.name)throw Ue.from(e,Ue.ERR_BAD_RESPONSE,this,null,nt(this,"response"));throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:et.classes.FormData,Blob:et.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};function ot(e,t){var n=this||rt,r=t||n,o=De.from(r.headers),i=r.data;return Se.forEach(e,(function(e){i=e.call(n,i,o.normalize(),t?t.status:void 0)})),o.normalize(),i}function it(e){return!(!e||!e.__CANCEL__)}Se.forEach(["delete","get","head","post","put","patch","query"],(function(e){rt.headers[e]={}}));var at=function(e){function t(e,n,r){var o;return c(this,t),(o=s(this,t,[null==e?"canceled":e,Ue.ERR_CANCELED,n,r])).name="CanceledError",o.__CANCEL__=!0,o}return h(t,e),l(t)}(Ue);function ut(e,t,n){var r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new Ue("Request failed with status code "+n.status,n.status>=400&&n.status<500?Ue.ERR_BAD_REQUEST:Ue.ERR_BAD_RESPONSE,n.config,n.request,n)):e(n)}var st=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3,r=0,o=function(e,t){e=e||10;var n,r=new Array(e),o=new Array(e),i=0,a=0;return t=void 0!==t?t:1e3,function(u){var s=Date.now(),c=o[a];n||(n=s),r[i]=u,o[i]=s;for(var f=a,l=0;f!==i;)l+=r[f++],f%=e;if((i=(i+1)%e)===a&&(a=(a+1)%e),!(s-n1&&void 0!==arguments[1]?arguments[1]:Date.now();o=i,n=null,r&&(clearTimeout(r),r=null),e.apply(void 0,R(t))};return[function(){for(var e=Date.now(),t=e-o,u=arguments.length,s=new Array(u),c=0;c=i?a(s,e):(n=s,r||(r=setTimeout((function(){r=null,a(n)}),i-t)))},function(){return n&&a(n)}]}((function(n){if(n&&"number"==typeof n.loaded){var i=n.loaded,a=n.lengthComputable?n.total:void 0,u=null!=a?Math.min(i,a):i,s=Math.max(0,u-r),c=o(s);r=Math.max(r,u);var f=d({loaded:u,total:a,progress:a?u/a:void 0,bytes:s,rate:c||void 0,estimated:c&&a?(a-u)/c:void 0,event:n,lengthComputable:null!=a},t?"download":"upload",!0);e(f)}}),n)},ct=function(e,t){var n=null!=e;return[function(r){return t[0]({lengthComputable:n,total:e,loaded:r})},t[1]]},ft=function(e){return function(){for(var t=arguments.length,n=new Array(t),r=0;r=48&&u<=57||u>=65&&u<=70||u>=97&&u<=102)&&(s>=48&&s<=57||s>=65&&s<=70||s>=97&&s<=102)&&(o-=2,a+=2)}var c=0,f=i-1,l=function(e){return e>=2&&37===r.charCodeAt(e-2)&&51===r.charCodeAt(e-1)&&(68===r.charCodeAt(e)||100===r.charCodeAt(e))};f>=0&&(61===r.charCodeAt(f)?(c++,f--):l(f)&&(c++,f-=3)),1===c&&f>=0&&(61===r.charCodeAt(f)||l(f))&&c++;var d=3*Math.floor(o/4)-(c||0);return d>0?d:0}if("undefined"!=typeof Buffer&&"function"==typeof Buffer.byteLength)return Buffer.byteLength(r,"utf8");for(var p=0,h=0,y=r.length;h=55296&&v<=56319&&h+1=56320&&b<=57343?(p+=4,h++):p+=3}else p+=3}return p}var _t="1.17.0",At=Se.isFunction,Tt=function(e){if(!Se.isString(e))return e;try{return decodeURIComponent(e)}catch(t){return e}},jt=function(e){try{for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r-1,x=Se.isNumber(P)&&P>-1,C=function(e){return Se.hasOwnProp(t,e)?t[e]:void 0},N=i||fetch,R=R?(R+"").toLowerCase():"text",D=gt([l,d&&d.toAbortSignal()],p),U=null,L=D&&D.unsubscribe&&function(){D.unsubscribe()},e.p=1,B=void 0,(I=C("auth"))&&(q=I.username||"",M=I.password||"",B={username:q,password:M}),Pt(o)&&(z=new URL(o,et.origin),B||!z.username&&!z.password||(H=Tt(z.username),W=Tt(z.password),B={username:H,password:W}),(z.username||z.password)&&(z.username="",z.password="",o=z.href)),B&&(S.delete("authorization"),S.set("Authorization","Basic "+btoa((m=(B.username||"")+":"+(B.password||""),encodeURIComponent(m).replace(/%([0-9A-F]{2})/gi,(function(e,t){return String.fromCharCode(parseInt(t,16))})))))),!k||"string"!=typeof o||!o.startsWith("data:")){e.n=2;break}if(!(St(o)>j)){e.n=2;break}throw new Ue("maxContentLength size of "+j+" exceeded",Ue.ERR_BAD_RESPONSE,t,U);case 2:if(!x||"get"===a||"head"===a){e.n=4;break}return e.n=3,O(S,c);case 3:if(!("number"==typeof(J=e.v)&&isFinite(J)&&J>P)){e.n=4;break}throw new Ue("Request body larger than maxBodyLength limit",Ue.ERR_BAD_REQUEST,t,U);case 4:if(!(he=w&&y&&"get"!==a&&"head"!==a)){e.n=6;break}return e.n=5,O(S,c);case 5:ye=F=e.v,he=0!==ye;case 6:if(!he){e.n=7;break}K=new u(o,{method:"POST",body:c,duplex:"half"}),Se.isFormData(c)&&(V=K.headers.get("content-type"))&&S.setContentType(V),K.body&&(X=ct(F,st(ft(w))),G=E(X,2),$=G[0],Q=G[1],c=Rt(K.body,65536,$,Q));case 7:return Se.isString(A)||(A=A?"include":"omit"),Z=f&&"credentials"in u.prototype,Se.isFormData(c)&&(Y=S.getContentType())&&/^multipart\/form-data/i.test(Y)&&!/boundary=/i.test(Y)&&S.delete("content-type"),S.set("User-Agent","axios/"+_t,!1),ee=b(b({},T),{},{signal:D,method:a.toUpperCase(),headers:Pe(S.normalize()),body:c,duplex:"half",credentials:Z?A:void 0}),U=f&&new u(o,ee),e.n=8,f?N(U,T):N(o,ee);case 8:if(te=e.v,!k){e.n=9;break}if(!(null!=(ne=Se.toFiniteNumber(te.headers.get("content-length")))&&ne>j)){e.n=9;break}throw new Ue("maxContentLength size of "+j+" exceeded",Ue.ERR_BAD_RESPONSE,t,U);case 9:return re=v&&("stream"===R||"response"===R),v&&te.body&&(h||k||re&&L)&&(oe={},["status","statusText","headers"].forEach((function(e){oe[e]=te[e]})),ie=Se.toFiniteNumber(te.headers.get("content-length")),ae=h&&ct(ie,st(ft(h),!0))||[],ue=E(ae,2),se=ue[0],ce=ue[1],fe=function(e){if(k&&e>j)throw new Ue("maxContentLength size of "+j+" exceeded",Ue.ERR_BAD_RESPONSE,t,U);se&&se(e)},te=new s(Rt(te.body,65536,fe,(function(){ce&&ce(),L&&L()})),oe)),R=R||"text",e.n=10,g[Se.findKey(g,R)||"text"](te,t);case 10:if(le=e.v,!k||v||re){e.n=11;break}if(null!=le&&("number"==typeof le.byteLength?de=le.byteLength:"number"==typeof le.size?de=le.size:"string"==typeof le&&(de="function"==typeof r?(new r).encode(le).byteLength:le.length)),!("number"==typeof de&&de>j)){e.n=11;break}throw new Ue("maxContentLength size of "+j+" exceeded",Ue.ERR_BAD_RESPONSE,t,U);case 11:return!re&&L&&L(),e.n=12,new Promise((function(e,n){ut(e,n,{data:le,headers:De.from(te.headers),status:te.status,statusText:te.statusText,config:t,request:U})}));case 12:return e.a(2,e.v);case 13:if(e.p=13,ve=e.v,L&&L(),!(D&&D.aborted&&D.reason instanceof Ue)){e.n=14;break}throw(pe=D.reason).config=t,U&&(pe.request=U),ve!==pe&&(pe.cause=ve),pe;case 14:if(!ve||"TypeError"!==ve.name||!/Load failed|fetch/i.test(ve.message)){e.n=15;break}throw Object.assign(new Ue("Network Error",Ue.ERR_NETWORK,t,U,ve&&ve.response),{cause:ve.cause||ve});case 15:throw Ue.from(ve,ve&&ve.code,t,U,ve&&ve.response);case 16:return e.a(2)}var m}),e,null,[[1,13]])})));return function(t){return e.apply(this,arguments)}}()},xt=new Map,Ct=function(e){for(var t,n,r=e&&e.env||{},o=r.fetch,i=[r.Request,r.Response,o],a=i.length,u=xt;a--;)t=i[a],void 0===(n=u.get(t))&&u.set(t,n=a?new Map:kt(r)),u=n;return n};Ct();var Nt={http:null,xhr:mt,fetch:{get:Ct}};Se.forEach(Nt,(function(e,t){if(e){try{Object.defineProperty(e,"name",{__proto__:null,value:t})}catch(e){}Object.defineProperty(e,"adapterName",{__proto__:null,value:t})}}));var Dt=function(e){return"- ".concat(e)},Ut=function(e){return Se.isFunction(e)||null===e||!1===e},Lt=function(e,t){for(var n,r,o=(e=Se.isArray(e)?e:[e]).length,i={},a=0;a1?"since :\n"+s.map(Dt).join("\n"):" "+Dt(s[0]):"as no adapter specified";throw new Ue("There is no suitable adapter to dispatch the request "+c,"ERR_NOT_SUPPORT")}return r};function Ft(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new at(null,e)}function Bt(e){return Ft(e),e.headers=De.from(e.headers),e.data=ot.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1),Lt(e.adapter||rt.adapter,e)(e).then((function(t){Ft(e),e.response=t;try{t.data=ot.call(e,e.transformResponse,t)}finally{delete e.response}return t.headers=De.from(t.headers),t}),(function(t){if(!it(t)&&(Ft(e),t&&t.response)){e.response=t.response;try{t.response.data=ot.call(e,e.transformResponse,t.response)}finally{delete e.response}t.response.headers=De.from(t.response.headers)}return Promise.reject(t)}))}var It={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){It[e]=function(n){return _(n)===e||"a"+(t<1?"n ":" ")+e}}));var qt={};It.transitional=function(e,t,n){function r(e,t){return"[Axios v"+_t+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(n,o,i){if(!1===e)throw new Ue(r(o," has been removed"+(t?" in "+t:"")),Ue.ERR_DEPRECATED);return t&&!qt[o]&&(qt[o]=!0,console.warn(r(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,o,i)}},It.spelling=function(e){return function(t,n){return console.warn("".concat(n," is likely a misspelling of ").concat(e)),!0}};var Mt={assertOptions:function(e,t,n){if("object"!==_(e))throw new Ue("options must be an object",Ue.ERR_BAD_OPTION_VALUE);for(var r=Object.keys(e),o=r.length;o-- >0;){var i=r[o],a=Object.prototype.hasOwnProperty.call(t,i)?t[i]:void 0;if(a){var u=e[i],s=void 0===u||a(u,i,e);if(!0!==s)throw new Ue("option "+i+" must be "+s,Ue.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new Ue("Unknown option "+i,Ue.ERR_BAD_OPTION)}},validators:It},zt=Mt.validators,Ht=function(){return l((function e(t){c(this,e),this.defaults=t||{},this.interceptors={request:new Ke,response:new Ke}}),[{key:"request",value:(e=a(m().m((function e(t,n){var r,o,i,a,u,s;return m().w((function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,this._request(t,n);case 1:return e.a(2,e.v);case 2:if(e.p=2,(s=e.v)instanceof Error){r={},Error.captureStackTrace?Error.captureStackTrace(r):r=new Error,o=function(){if(!r.stack)return"";var e=r.stack.indexOf("\n");return-1===e?"":r.stack.slice(e+1)}();try{s.stack?o&&(i=o.indexOf("\n"),a=-1===i?-1:o.indexOf("\n",i+1),u=-1===a?"":o.slice(a+1),String(s.stack).endsWith(u)||(s.stack+="\n"+o)):s.stack=o}catch(e){}}throw s;case 3:return e.a(2)}}),e,this,[[0,2]])}))),function(t,n){return e.apply(this,arguments)})},{key:"_request",value:function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{};var n=t=yt(this.defaults,t),r=n.transitional,o=n.paramsSerializer,i=n.headers;void 0!==r&&Mt.assertOptions(r,{silentJSONParsing:zt.transitional(zt.boolean),forcedJSONParsing:zt.transitional(zt.boolean),clarifyTimeoutError:zt.transitional(zt.boolean),legacyInterceptorReqResOrdering:zt.transitional(zt.boolean),advertiseZstdAcceptEncoding:zt.transitional(zt.boolean)},!1),null!=o&&(Se.isFunction(o)?t.paramsSerializer={serialize:o}:Mt.assertOptions(o,{encode:zt.function,serialize:zt.function},!0)),void 0!==t.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),Mt.assertOptions(t,{baseUrl:zt.spelling("baseURL"),withXsrfToken:zt.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();var a=i&&Se.merge(i.common,i[t.method]);i&&Se.forEach(["delete","get","head","post","put","patch","query","common"],(function(e){delete i[e]})),t.headers=De.concat(a,i);var u=[],s=!0;this.interceptors.request.forEach((function(e){if("function"!=typeof e.runWhen||!1!==e.runWhen(t)){s=s&&e.synchronous;var n=t.transitional||Ve;n&&n.legacyInterceptorReqResOrdering?u.unshift(e.fulfilled,e.rejected):u.push(e.fulfilled,e.rejected)}}));var c,f=[];this.interceptors.response.forEach((function(e){f.push(e.fulfilled,e.rejected)}));var l,d=0;if(!s){var p=[Bt.bind(this),void 0];for(p.unshift.apply(p,u),p.push.apply(p,f),l=p.length,c=Promise.resolve(t);d0;)r._listeners[t](e);r._listeners=null}})),this.promise.then=function(e){var t,n=new Promise((function(e){r.subscribe(e),t=e})).then(e);return n.cancel=function(){r.unsubscribe(t)},n},t((function(e,t,o){r.reason||(r.reason=new at(e,t,o),n(r.reason))}))}return l(e,[{key:"throwIfRequested",value:function(){if(this.reason)throw this.reason}},{key:"subscribe",value:function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}},{key:"unsubscribe",value:function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}}},{key:"toAbortSignal",value:function(){var e=this,t=new AbortController,n=function(e){t.abort(e)};return this.subscribe(n),t.signal.unsubscribe=function(){return e.unsubscribe(n)},t.signal}}],[{key:"source",value:function(){var t;return{token:new e((function(e){t=e})),cancel:t}}}])}(),Jt={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Jt).forEach((function(e){var t=E(e,2),n=t[0],r=t[1];Jt[r]=n}));var Kt=function e(t){var n=new Ht(t),r=k(Ht.prototype.request,n);return Se.extend(r,Ht.prototype,n,{allOwnKeys:!0}),Se.extend(r,n,null,{allOwnKeys:!0}),r.create=function(n){return e(yt(t,n))},r}(rt);return Kt.Axios=Ht,Kt.CanceledError=at,Kt.CancelToken=Wt,Kt.isCancel=it,Kt.VERSION=_t,Kt.toFormData=qe,Kt.AxiosError=Ue,Kt.Cancel=Kt.CanceledError,Kt.all=function(e){return Promise.all(e)},Kt.spread=function(e){return function(t){return e.apply(null,t)}},Kt.isAxiosError=function(e){return Se.isObject(e)&&!0===e.isAxiosError},Kt.mergeConfig=yt,Kt.AxiosHeaders=De,Kt.formToJSON=function(e){return tt(Se.isHTMLForm(e)?new FormData(e):e)},Kt.getAdapter=Lt,Kt.HttpStatusCode=Jt,Kt.default=Kt,Kt})); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).axios=t()}(this,(function(){"use strict";function e(e,t){this.v=e,this.k=t}function t(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return a=e.done,e},e:function(e){u=!0,i=e},f:function(){try{a||null==n.return||n.return()}finally{if(u)throw i}}}}function p(e,t,n){return(t=_(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function h(e){return h=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},h(e)}function v(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&E(e,t)}function y(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(y=function(){return!!e})()}function b(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function m(e){for(var t=1;t3?(o=h===r)&&(s=i[(u=i[4])?5:(u=3,3)],i[4]=i[5]=e):i[0]<=p&&((o=n<2&&pr||r>h)&&(i[4]=n,i[5]=r,d.n=h,u=0))}if(o||n>1)return a;throw l=!0,r}return function(o,f,h){if(c>1)throw TypeError("Generator is already running");for(l&&1===f&&p(f,h),u=f,s=h;(t=u<2?e:s)||!l;){i||(u?u<3?(u>1&&(d.n=-1),p(u,s)):d.n=s:d.v=s);try{if(c=2,i){if(u||(o="next"),t=i[o]){if(!(t=t.call(i,s)))throw TypeError("iterator result is not an object");if(!t.done)return t;s=t.value,u<2&&(u=0)}else 1===u&&(t=i.return)&&t.call(i),u<2&&(s=TypeError("The iterator does not provide a '"+o+"' method"),u=1);i=e}else if((t=(l=d.n<0)?s:n.call(r,d))!==a)break}catch(t){i=e,u=1,s=t}finally{c=1}}return{value:t,done:l}}}(n,o,i),!0),c}var a={};function u(){}function s(){}function c(){}t=Object.getPrototypeOf;var f=[][r]?t(t([][r]())):(w(t={},r,(function(){return this})),t),l=c.prototype=u.prototype=Object.create(f);function d(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,c):(e.__proto__=c,w(e,o,"GeneratorFunction")),e.prototype=Object.create(l),e}return s.prototype=c,w(l,"constructor",c),w(c,"constructor",s),s.displayName="GeneratorFunction",w(c,o,"GeneratorFunction"),w(l),w(l,o,"Generator"),w(l,r,(function(){return this})),w(l,"toString",(function(){return"[object Generator]"})),(g=function(){return{w:i,m:d}})()}function w(e,t,n,r){var o=Object.defineProperty;try{o({},"",{})}catch(e){o=0}w=function(e,t,n,r){function i(t,n){w(e,t,(function(e){return this._invoke(t,n,e)}))}t?o?o(e,t,{value:n,enumerable:!r,configurable:!r,writable:!r}):e[t]=n:(i("next",0),i("throw",1),i("return",2))},w(e,t,n,r)}function O(e){if(null!=e){var t=e["function"==typeof Symbol&&Symbol.iterator||"@@iterator"],n=0;if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length))return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}}}throw new TypeError(typeof e+" is not iterable")}function E(e,t){return E=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},E(e,t)}function R(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i,a,u=[],s=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(r=i.call(n)).done)&&(u.push(r.value),u.length!==t);s=!0);}catch(e){c=!0,o=e}finally{try{if(!s&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(c)throw o}}return u}}(e,t)||j(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function S(e){return function(e){if(Array.isArray(e))return t(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||j(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e,"string");return"symbol"==typeof t?t:t+""}function P(e){return P="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},P(e)}function j(e,n){if(e){if("string"==typeof e)return t(e,n);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?t(e,n):void 0}}function A(e){return function(){return new T(e.apply(this,arguments))}}function T(t){var n,r;function o(n,r){try{var a=t[n](r),u=a.value,s=u instanceof e;Promise.resolve(s?u.v:u).then((function(e){if(s){var r="return"===n&&u.k?n:"next";if(!u.k||e.done)return o(r,e);e=t[r](e).value}i(!!a.done,e)}),(function(e){o("throw",e)}))}catch(e){i(2,e)}}function i(e,t){2===e?n.reject(t):n.resolve({value:t,done:e}),(n=n.next)?o(n.key,n.arg):r=null}this._invoke=function(e,t){return new Promise((function(i,a){var u={key:e,arg:t,resolve:i,reject:a,next:null};r?r=r.next=u:(n=r=u,o(e,t))}))},"function"!=typeof t.return&&(this.return=void 0)}function k(e){var t="function"==typeof Map?new Map:void 0;return k=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return function(e,t,n){if(y())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,t);var o=new(e.bind.apply(e,r));return n&&E(o,n.prototype),o}(e,arguments,h(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),E(n,e)},k(e)}function x(e,t){return function(){return e.apply(t,arguments)}}T.prototype["function"==typeof Symbol&&Symbol.asyncIterator||"@@asyncIterator"]=function(){return this},T.prototype.next=function(e){return this._invoke("next",e)},T.prototype.throw=function(e){return this._invoke("throw",e)},T.prototype.return=function(e){return this._invoke("return",e)};var C,N=Object.prototype.toString,D=Object.getPrototypeOf,U=Symbol.iterator,L=Symbol.toStringTag,F=function(){var e=Object.prototype.hasOwnProperty;return function(t,n){return e.call(t,n)}}(),B=function(e){return"string"==typeof e&&("__proto__"===e||"constructor"===e||"prototype"===e)},I=function(e,t,n){return e===Object.prototype||!n&&null===t},q=function(e,t){for(var n=e,r=[];null!=n;){if(-1!==r.indexOf(n))return!1;r.push(n);var o=D(n);if(I(n,o,n===e))return!1;if(F(n,t))return!0;n=o}return!1},M=(C=Object.create(null),function(e){var t=N.call(e);return C[t]||(C[t]=t.slice(8,-1).toLowerCase())}),z=function(e){return e=e.toLowerCase(),function(t){return M(t)===e}},H=function(e){return function(t){return P(t)===e}},W=Array.isArray,J=H("undefined");function V(e){return null!==e&&!J(e)&&null!==e.constructor&&!J(e.constructor)&&G(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}var K=z("ArrayBuffer"),X=H("string"),G=H("function"),$=H("number"),Q=function(e){return null!==e&&"object"===P(e)},Z=function(e){if(!Q(e))return!1;var t=D(e);return!(null!==t&&t!==Object.prototype&&null!==D(t)||q(e,L)||q(e,U))},Y=z("Date"),ee=z("File"),te=z("Blob"),ne=z("FileList"),re=z("Set"),oe="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},ie=void 0!==oe.FormData?oe.FormData:void 0,ae=z("URLSearchParams"),ue=R(["ReadableStream","Request","Response","Headers"].map(z),4),se=ue[0],ce=ue[1],fe=ue[2],le=ue[3];function de(e,t){var n,r,o=(arguments.length>2&&void 0!==arguments[2]?arguments[2]:{}).allOwnKeys,i=void 0!==o&&o;if(null!=e)if("object"!==P(e)&&(e=[e]),W(e))for(n=0,r=e.length;n0;)if(t===(n=r[o]).toLowerCase())return n;return null}var he,ve,ye,be,me,ge="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,we=function(e){return!J(e)&&e!==ge},Oe=(he="undefined"!=typeof Uint8Array&&D(Uint8Array),function(e){return he&&e instanceof he}),Ee=z("HTMLFormElement"),Re=Object.prototype.propertyIsEnumerable,Se=z("RegExp"),_e=function(e,t){var n=Object.getOwnPropertyDescriptors(e),r={};de(n,(function(n,o){var i;!1!==(i=t(n,o,e))&&(r[o]=i||n)})),Object.defineProperties(e,r)},Pe=z("AsyncFunction"),je=(ve="function"==typeof setImmediate,ye=G(ge.postMessage),ve?setImmediate:ye?(be="axios@".concat(Math.random()),me=[],ge.addEventListener("message",(function(e){var t=e.source,n=e.data;t===ge&&n===be&&me.length&&me.shift()()}),!1),function(e){me.push(e),ge.postMessage(be,"*")}):function(e){return setTimeout(e)}),Ae="undefined"!=typeof queueMicrotask?queueMicrotask.bind(ge):"undefined"!=typeof process&&process.nextTick||je,Te=function(e){return null!=e&&G(e[U])},ke={isArray:W,isArrayBuffer:K,isBuffer:V,isFormData:function(e){if(!e)return!1;if(ie&&e instanceof ie)return!0;var t=D(e);if(!t||t===Object.prototype)return!1;if(!G(e.append))return!1;var n=M(e);return"formdata"===n||"object"===n&&G(e.toString)&&"[object FormData]"===e.toString()},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&K(e.buffer)},isString:X,isNumber:$,isBoolean:function(e){return!0===e||!1===e},isObject:Q,isPlainObject:Z,isEmptyObject:function(e){if(!Q(e)||V(e))return!1;try{return 0===Object.keys(e).length&&Object.getPrototypeOf(e)===Object.prototype}catch(e){return!1}},isReadableStream:se,isRequest:ce,isResponse:fe,isHeaders:le,isUndefined:J,isDate:Y,isFile:ee,isReactNativeBlob:function(e){return!(!e||void 0===e.uri)},isReactNative:function(e){return e&&void 0!==e.getParts},isBlob:te,isRegExp:Se,isFunction:G,isStream:function(e){return Q(e)&&G(e.pipe)},isURLSearchParams:ae,isTypedArray:Oe,isFileList:ne,forEach:de,merge:function e(){for(var t=we(this)&&this||{},n=t.caseless,r=t.skipUndefined,o={},i=function(t,i){if("__proto__"!==i&&"constructor"!==i&&"prototype"!==i){var a=n&&"string"==typeof i&&pe(o,i)||i,u=F(o,a)?o[a]:void 0;Z(u)&&Z(t)?o[a]=e(u,t):Z(t)?o[a]=e({},t):W(t)?o[a]=t.slice():r&&J(t)||(o[a]=t)}},a=0,u=arguments.length;a3&&void 0!==arguments[3]?arguments[3]:{}).allOwnKeys}),e},trim:function(e){return e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,n,r){e.prototype=Object.create(t.prototype,r),Object.defineProperty(e.prototype,"constructor",{__proto__:null,value:e,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(e,"super",{__proto__:null,value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:function(e,t,n,r){var o,i,a,u={};if(t=t||{},null==e)return t;do{for(i=(o=Object.getOwnPropertyNames(e)).length;i-- >0;)a=o[i],r&&!r(a,e,t)||u[a]||(t[a]=e[a],u[a]=!0);e=!1!==n&&D(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:M,kindOfTest:z,endsWith:function(e,t,n){e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;var r=e.indexOf(t,n);return-1!==r&&r===n},toArray:function(e){if(!e)return null;if(W(e))return e;var t=e.length;if(!$(t))return null;for(var n=new Array(t);t-- >0;)n[t]=e[t];return n},forEachEntry:function(e,t){for(var n,r=(e&&e[U]).call(e);(n=r.next())&&!n.done;){var o=n.value;t.call(e,o[0],o[1])}},matchAll:function(e,t){for(var n,r=[];null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:Ee,hasOwnProperty:F,hasOwnProp:F,hasOwnInPrototypeChain:q,getSafeProp:function(e,t){return null!=e&&q(e,t)?e[t]:void 0},toSafeFlatObject:function(e){if(null==e||"object"!==P(e)&&"function"!=typeof e)return e;var t=D(e);if(null===t&&function(e){if(!Object.isExtensible(e))return!1;var t=Object.getOwnPropertyNames(e);return Object.getOwnPropertySymbols&&t.push.apply(t,S(Object.getOwnPropertySymbols(e))),t.every((function(t){if(B(t))return!1;var n=Object.getOwnPropertyDescriptor(e,t);return!!n&&n.configurable&&!0===n.writable}))}(e))return e;for(var n=Object.create(null),r=Object.create(null),o=[],i=e;null!=i&&-1===o.indexOf(i);){o.push(i);var a=i===e?t:D(i);if(I(i,a,i===e))break;var u=Object.getOwnPropertyNames(i);Object.getOwnPropertySymbols&&u.push.apply(u,S(Object.getOwnPropertySymbols(i)));var s,c=d(u);try{for(c.s();!(s=c.n()).done;){var f=s.value;B(f)||F(r,f)||(n[f]=e[f],r[f]=!0)}}catch(e){c.e(e)}finally{c.f()}i=a}return n},reduceDescriptors:_e,freezeMethods:function(e){_e(e,(function(t,n){if(G(e)&&["arguments","caller","callee"].includes(n))return!1;var r=e[n];G(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=function(){throw Error("Can not rewrite read-only method '"+n+"'")}))}))},toObjectSet:function(e,t){var n={},r=function(e){e.forEach((function(e){n[e]=!0}))};return W(e)?r(e):r(String(e).split(t)),n},toCamelCase:function(e){return e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n}))},noop:function(){},toFiniteNumber:function(e,t){return null!=e&&Number.isFinite(e=+e)?e:t},findKey:pe,global:ge,isContextDefined:we,isSpecCompliantForm:function(e){return!!(e&&G(e.append)&&"FormData"===e[L]&&e[U])},toJSONObject:function(e){var t=new WeakSet,n=function(e){if(Q(e)){if(t.has(e))return;if(V(e))return e;if(!("toJSON"in e)){var r;if(t.add(e),re(e)){r=[];var o,i=d(e);try{for(i.s();!(o=i.n()).done;){var a=o.value,u=n(a);!J(u)&&r.push(u)}}catch(e){i.e(e)}finally{i.f()}}else r=W(e)?[]:{},de(e,(function(e,t){var o=n(e);!J(o)&&(r[t]=o)}));return t.delete(e),r}}return e};return n(e)},isAsyncFn:Pe,isThenable:function(e){return e&&(Q(e)||G(e))&&G(e.then)&&G(e.catch)},setImmediate:je,asap:Ae,isIterable:Te,isSafeIterable:function(e){return null!=e&&q(e,U)&&Te(e)}},xe=ke.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),Ce=new RegExp("[\\u0000-\\u0008\\u000a-\\u001f\\u007f]+","g"),Ne=new RegExp("[^\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+","g");function De(e,t){return ke.isArray(e)?e.map((function(e){return De(e,t)})):function(e){for(var t=0,n=e.length;tt;){var o=e.charCodeAt(n-1);if(9!==o&&32!==o)break;n-=1}return 0===t&&n===e.length?e:e.slice(t,n)}(String(e).replace(t,""))}function Ue(e){var t=Object.create(null);return ke.forEach(e.toJSON(),(function(e,n){t[n]=function(e){return De(e,Ne)}(e)})),t}var Le=Symbol("internals");function Fe(e){return e&&String(e).trim().toLowerCase()}function Be(e){return!1===e||null==e?e:ke.isArray(e)?e.map(Be):function(e){return De(e,Ce)}(String(e))}var Ie=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;function qe(e){for(var t=0,n=e.length;tt;){var o=e.charCodeAt(n-1);if(9!==o&&32!==o)break;n-=1}return 0===t&&n===e.length?e:e.slice(t,n)}function Me(e,t,n,r,o){return ke.isFunction(r)?r.call(this,t,n):(o&&(t=n),ke.isString(t)?ke.isString(r)?-1!==t.indexOf(r):ke.isRegExp(r)?r.test(t):void 0:void 0)}var ze=function(){return l((function e(t){c(this,e),t&&this.set(t)}),[{key:"set",value:function(e,t,n){var r=this;function o(e,t,n){var o=Fe(t);if(o){var i=ke.findKey(r,o);(!i||void 0===r[i]||!0===n||void 0===n&&!1!==r[i])&&(r[i||t]=Be(e))}}var i=function(e,t){return ke.forEach(e,(function(e,n){return o(e,n,t)}))};if(ke.isPlainObject(e)||e instanceof this.constructor)i(e,t);else if(ke.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))i(function(e){var t,n,r,o={};return e&&e.split("\n").forEach((function(e){r=e.indexOf(":"),t=e.substring(0,r).trim().toLowerCase(),n=e.substring(r+1).trim();var i=ke.hasOwnProp(o,t);!t||i&&ke.hasOwnProp(xe,t)||("set-cookie"===t?i?o[t].push(n):o[t]=[n]:o[t]=i?o[t]+", "+n:n)})),o}(e),t);else if(ke.isObject(e)&&ke.isSafeIterable(e)){var a,u,s,c=Object.create(null),f=d(e);try{for(f.s();!(s=f.n()).done;){var l=s.value;if(!ke.isArray(l))throw new TypeError("Object iterator must return a key-value pair");u=l[0],ke.hasOwnProp(c,u)?(a=c[u],c[u]=ke.isArray(a)?[].concat(S(a),[l[1]]):[a,l[1]]):c[u]=l[1]}}catch(e){f.e(e)}finally{f.f()}i(c,t)}else null!=e&&o(t,e,n);return this}},{key:"get",value:function(e,t){if(e=Fe(e)){var n=ke.findKey(this,e);if(n){var r=this[n];if(!t)return r;if(!0===t)return function(e){for(var t,n=Object.create(null),r=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;t=r.exec(e);)n[t[1]]=t[2];return n}(r);if(ke.isFunction(t))return t.call(this,r,n);if(ke.isRegExp(t))return t.exec(r);throw new TypeError("parser must be boolean|regexp|function")}}}},{key:"has",value:function(e,t){if(e=Fe(e)){var n=ke.findKey(this,e);return!(!n||void 0===this[n]||t&&!Me(0,this[n],n,t))}return!1}},{key:"delete",value:function(e,t){var n=this,r=!1;function o(e){if(e=Fe(e)){var o=ke.findKey(n,e);!o||t&&!Me(0,n[o],o,t)||(delete n[o],r=!0)}}return ke.isArray(e)?e.forEach(o):o(e),r}},{key:"clear",value:function(e){for(var t=Object.keys(this),n=t.length,r=!1;n--;){var o=t[n];e&&!Me(0,this[o],o,e,!0)||(delete this[o],r=!0)}return r}},{key:"normalize",value:function(e){var t=this,n={};return ke.forEach(this,(function(r,o){var i=ke.findKey(n,o);if(i)return t[i]=Be(r),void delete t[o];var a=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n}))}(o):String(o).trim();a!==o&&delete t[o],t[a]=Be(r),n[a]=!0})),this}},{key:"concat",value:function(){for(var e,t=arguments.length,n=new Array(t),r=0;r=t)return e;n+=e[r]}return n}(s)}}}}for(var u=0;u1?n-1:0),o=1;o0?function(e,t){var n=new Set(t.map((function(e){return String(e).toLowerCase()}))),r=[],o=function(e){if(null===e||"object"!==P(e))return e;if(ke.isBuffer(e))return e;if(-1===r.indexOf(e)){var t;if(e instanceof ze&&(e=e.toJSON()),r.push(e),ke.isArray(e))t=[],e.forEach((function(e,n){var r=o(e);ke.isUndefined(r)||(t[n]=r)}));else{if(!ke.isPlainObject(e)&&function(e){if(ke.hasOwnProp(e,"toJSON"))return!0;for(var t=Object.getPrototypeOf(e);t&&t!==Object.prototype;){if(ke.hasOwnProp(t,"toJSON"))return!0;t=Object.getPrototypeOf(t)}return!1}(e))return r.pop(),e;t=Object.create(null);for(var i=0,a=Object.entries(e);ic)throw new Je("Object is too deeply nested ("+e+" levels). Max depth: "+c,Je.ERR_FORM_DATA_DEPTH_EXCEEDED)}function h(e,n,r){var i=e;if(ke.isReactNative(t)&&ke.isReactNativeBlob(e))return t.append(Xe(r,n,a),d(e)),!1;if(e&&!r&&"object"===P(e))if(ke.endsWith(n,"{}"))n=o?n:n.slice(0,-2),e=function(e){if(c===1/0)return JSON.stringify(e);var t=[];return JSON.stringify(e,(function(e,n){if(!ke.isObject(n))return n;for(;t.length&&t[t.length-1]!==this;)t.pop();return t.push(n),p(1+t.length-1),n}))}(e);else if(ke.isArray(e)&&function(e){return ke.isArray(e)&&!e.some(Ve)}(e)||(ke.isFileList(e)||ke.endsWith(n,"[]"))&&(i=ke.toArray(e)))return n=Ke(n),i.forEach((function(e,r){!ke.isUndefined(e)&&null!==e&&t.append(!0===u?Xe([n],r,a):null===u?n:n+"[]",d(e))})),!1;return!!Ve(e)||(t.append(Xe(r,n,a),d(e)),!1)}var v=Object.assign(Ge,{defaultVisitor:h,convertValue:d,isVisitable:Ve});if(!ke.isObject(e))throw new TypeError("data must be an object");return function e(n,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;if(!ke.isUndefined(n)){if(p(o),-1!==l.indexOf(n))throw new Error("Circular reference detected in "+r.join("."));l.push(n),ke.forEach(n,(function(n,a){!0===(!(ke.isUndefined(n)||null===n)&&i.call(t,n,ke.isString(a)?a.trim():a,r,v))&&e(n,r?r.concat(a):[a],o+1)})),l.pop()}}(e),t}function Qe(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"};return encodeURIComponent(e).replace(/[!'()~]|%20/g,(function(e){return t[e]}))}function Ze(e,t){this._pairs=[],e&&$e(e,this,t)}var Ye=Ze.prototype;function et(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function tt(e,t,n){if(!t)return e;e=e||"";var r,o=ke.isFunction(n)?{serialize:n}:n,i=ke.getSafeProp(o,"encode")||et,a=ke.getSafeProp(o,"serialize");if(r=a?a(t,o):ke.isURLSearchParams(t)?t.toString():new Ze(t,o).toString(i)){var u=e.indexOf("#");-1!==u&&(e=e.slice(0,u)),e+=(-1===e.indexOf("?")?"?":"&")+r}return e}Ye.append=function(e,t){this._pairs.push([e,t])},Ye.toString=function(e){var t=this,n=e?function(n){return e.call(t,n,Qe)}:Qe;return this._pairs.map((function(e){return n(e[0])+"="+n(e[1])}),"").join("&")};var nt=Symbol("internals");function rt(e){return e?e.length:0}function ot(e){if(e)for(;e.length&&null===e[e.length-1];)e.pop()}function it(e,t){var n=e.handlers,r=rt(n);n!==t.handlersRef?(t.handlersRef=n,t.handlerEntries.clear()):r!==t.handlersLength&&(r?t.handlerEntries.forEach((function(e,r){n[e.index]!==e.handler&&t.handlerEntries.delete(r)})):t.handlerEntries.clear()),t.handlersLength=r}var at=function(){return l((function e(){c(this,e),this.handlers=[],this[nt]={handlersRef:this.handlers,handlersLength:this.handlers.length,handlerEntries:new Map,iterationDepth:0,nextId:0}}),[{key:"use",value:function(e,t,n){var r={fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null},o=this[nt];null==this.handlers&&(this.handlers=[]),it(this,o);var i=o.nextId++;return this.handlers.push(r),o.handlerEntries.set(i,{handler:r,index:this.handlers.length-1}),o.handlersLength=this.handlers.length,i}},{key:"eject",value:function(e){var t=this[nt];it(this,t);var n=t.handlerEntries.get(e);if(n){if(t.handlerEntries.delete(e),this.handlers[n.index]!==n.handler)return;this.handlers[n.index]=null,t.iterationDepth||(ot(this.handlers),t.handlersLength=this.handlers.length)}}},{key:"clear",value:function(){this.handlers&&(this.handlers=[],it(this,this[nt]))}},{key:"forEach",value:function(e){var t=this[nt];it(this,t),t.iterationDepth++;try{ke.forEach(this.handlers,(function(t){null!==t&&e(t)}))}finally{--t.iterationDepth||(it(this,t),ot(this.handlers),t.handlersLength=rt(this.handlers))}}}])}(),ut={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0,advertiseZstdAcceptEncoding:!1,validateStatusUndefinedResolves:!0},st={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:Ze,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]},ct="undefined"!=typeof window&&"undefined"!=typeof document,ft="object"===("undefined"==typeof navigator?"undefined":P(navigator))&&navigator||void 0,lt=ct&&(!ft||["ReactNative","NativeScript","NS"].indexOf(ft.product)<0),dt="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,pt=ct&&window.location.href||"http://localhost",ht=m(m({},Object.freeze({__proto__:null,hasBrowserEnv:ct,hasStandardBrowserEnv:lt,hasStandardBrowserWebWorkerEnv:dt,navigator:ft,origin:pt})),st);function vt(e){if(e>100)throw new Je("FormData field is too deeply nested ("+e+" levels). Max depth: 100",Je.ERR_FORM_DATA_DEPTH_EXCEEDED)}function yt(e){function t(e,n,r,o){vt(o);var i=e[o++];if("__proto__"===i)return!0;var a=Number.isFinite(+i),u=o>=e.length;return i=!i&&ke.isArray(r)?r.length:i,u?(ke.hasOwnProp(r,i)?r[i]=ke.isArray(r[i])?r[i].concat(n):[r[i],n]:r[i]=n,!a):(ke.hasOwnProp(r,i)&&ke.isObject(r[i])||(r[i]=[]),t(e,n,r[i],o)&&ke.isArray(r[i])&&(r[i]=function(e){var t,n,r={},o=Object.keys(e),i=o.length;for(t=0;t-1,i=ke.isObject(e);if(i&&ke.isHTMLForm(e)&&(e=new FormData(e)),ke.isFormData(e))return o?JSON.stringify(yt(e)):e;if(ke.isArrayBuffer(e)||ke.isBuffer(e)||ke.isStream(e)||ke.isFile(e)||ke.isBlob(e)||ke.isReadableStream(e))return e;if(ke.isArrayBufferView(e))return e.buffer;if(ke.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();if(i){var a=mt(this,"formSerializer");if(r.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return $e(e,new ht.classes.URLSearchParams,m({visitor:function(e,t,n,r){return ht.isNode&&ke.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}(e,a).toString();if((n=ke.isFileList(e))||r.indexOf("multipart/form-data")>-1){var u=mt(this,"env"),s=u&&u.FormData;return $e(n?{"files[]":e}:e,s&&new s,a)}}return i||o?(t.setContentType("application/json",!1),function(e){if(ke.isString(e))try{return(0,JSON.parse)(e),ke.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(0,JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=mt(this,"transitional")||gt.transitional,n=t&&t.forcedJSONParsing,r=mt(this,"responseType"),o="json"===r;if(ke.isResponse(e)||ke.isReadableStream(e))return e;if(e&&ke.isString(e)&&(n&&!r||o)){var i=!(t&&t.silentJSONParsing)&&o;try{return JSON.parse(e,mt(this,"parseReviver"))}catch(e){if(i){if("SyntaxError"===e.name)throw Je.from(e,Je.ERR_BAD_RESPONSE,this,null,mt(this,"response"));throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:ht.classes.FormData,Blob:ht.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};function wt(e,t){var n=this||gt,r=t||n,o=ze.from(r.headers),i=r.data;return ke.forEach(e,(function(e){i=e.call(n,i,o.normalize(),t?t.status:void 0)})),o.normalize(),i}function Ot(e){return!(!e||!e.__CANCEL__)}ke.forEach(bt,(function(e){gt.headers[e]={}}));var Et=function(e){function t(e,n,r){var o;return c(this,t),(o=s(this,t,[null==e?"canceled":e,Je.ERR_CANCELED,n,r])).name="CanceledError",o.__CANCEL__=!0,o}return v(t,e),l(t)}(Je);function Rt(e,t,n){var r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new Je("Request failed with status code "+n.status,n.status>=400&&n.status<500?Je.ERR_BAD_REQUEST:Je.ERR_BAD_RESPONSE,n.config,n.request,n)):e(n)}var St=/[\t\n\r]/g;function _t(e){if("string"!=typeof e)return e;for(var t=0;t2&&void 0!==arguments[2]?arguments[2]:3,r=0,o=function(e,t){e=e||10;var n,r=new Array(e),o=new Array(e),i=0,a=0;return t=void 0!==t?t:1e3,function(u){var s=Date.now(),c=o[a];n||(n=s),r[i]=u,o[i]=s;for(var f=a,l=0;f!==i;)l+=r[f++],f%=e;if((i=(i+1)%e)===a&&(a=(a+1)%e),!(s-n1&&void 0!==arguments[1]?arguments[1]:Date.now();o=i,n=null,r&&(clearTimeout(r),r=null),e.apply(void 0,S(t))};return[function(){for(var e=Date.now(),t=e-o,u=arguments.length,s=new Array(u),c=0;c=i?a(s,e):(n=s,r||(r=setTimeout((function(){r=null,a(n)}),i-t)))},function(){return n&&a(n)},function(){for(var e=arguments.length,t=new Array(e),n=0;n1&&void 0!==arguments[1]?arguments[1]:ke.asap;return function(){for(var n=arguments.length,r=new Array(n),o=0;o2&&void 0!==arguments[2]?arguments[2]:"";return"".concat(t).concat(n).concat(He)})):t)}(n)),': missing "//" after protocol'),Je.ERR_INVALID_URL,t)}}function Dt(e,t,n,r){Nt(t,r);var o,i=!("string"==typeof(o=t)&&/^([a-z][a-z\d+\-.]*:)?\/\//i.test(o));return e&&(i||!1===n)?(Nt(e,r),function(e,t){if(!t)return e;for(var n=e.length;n>0&&47===e.charCodeAt(n-1);)n--;return e.slice(0,n)+"/"+t.replace(/^\/+/,"")}(e,t)):t}var Ut=function(e){return e instanceof ze?m({},e):e};function Lt(e,t){e=e||{},t=t||{};var n=Object.create(null);function r(e,t,n,r){return ke.isPlainObject(e)&&ke.isPlainObject(t)?ke.merge.call({caseless:r},e,t):ke.isPlainObject(t)?ke.merge({},t):ke.isArray(t)?t.slice():t}function o(e,t,n,o){return ke.isUndefined(t)?ke.isUndefined(e)?void 0:r(void 0,e,0,o):r(e,t,0,o)}function i(e,t){if(!ke.isUndefined(t))return r(void 0,t)}function a(e,t){return ke.isUndefined(t)?ke.isUndefined(e)?void 0:r(void 0,e):r(void 0,t)}function u(n,o,i){return ke.hasOwnProp(t,i)?r(n,o):ke.hasOwnProp(e,i)?r(void 0,n):void 0}Object.defineProperty(n,"hasOwnProperty",{__proto__:null,value:Object.prototype.hasOwnProperty,enumerable:!1,writable:!0,configurable:!0});var s,c={url:i,method:i,data:i,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutErrorMessage:a,withCredentials:a,withXSRFToken:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,allowedSocketPaths:a,responseEncoding:a,validateStatus:u,headers:function(e,t,n){return o(Ut(e),Ut(t),0,!0)}};return ke.forEach((s=m(m({},e),t),Object.getOwnPropertySymbols&&Object.getOwnPropertyDescriptor?Object.keys(s).concat(Object.getOwnPropertySymbols(s).filter((function(e){return Object.getOwnPropertyDescriptor(s,e).enumerable}))):Object.keys(s)),(function(r){if("__proto__"!==r&&"constructor"!==r&&"prototype"!==r){var i=ke.hasOwnProp(c,r)?c[r]:o,a=i(ke.hasOwnProp(e,r)?e[r]:void 0,ke.hasOwnProp(t,r)?t[r]:void 0,r);ke.isUndefined(a)&&i!==u||(n[r]=a)}})),ke.hasOwnProp(t,"validateStatus")&&ke.isUndefined(t.validateStatus)&&!1===function(n){var r=ke.hasOwnProp(t,"transitional")?t.transitional:void 0;if(!ke.isUndefined(r)){if(!ke.isPlainObject(r))return;if(ke.hasOwnProp(r,n))return r[n]}var o=ke.hasOwnProp(e,"transitional")?e.transitional:void 0;if(ke.isPlainObject(o)&&ke.hasOwnProp(o,n))return o[n]}("validateStatusUndefinedResolves")&&(ke.hasOwnProp(e,"validateStatus")?n.validateStatus=r(void 0,e.validateStatus):delete n.validateStatus),n}var Ft=["content-type","content-length"];function Bt(e){var t=Lt({},e),n=function(e){return ke.hasOwnProp(t,e)?t[e]:void 0},r=n("data"),o=n("withXSRFToken"),i=n("xsrfHeaderName"),a=n("xsrfCookieName"),u=n("headers"),s=n("auth"),c=n("baseURL"),f=n("allowAbsoluteUrls"),l=n("url");if(t.headers=u=ze.from(u),t.url=tt(Dt(c,l,f,t),n("params"),n("paramsSerializer")),s){var d=ke.getSafeProp(s,"username")||"",p=ke.getSafeProp(s,"password")||"";try{u.set("Authorization","Basic "+btoa(d+":"+(p?encodeURIComponent(p).replace(/%([0-9A-F]{2})/gi,(function(e,t){return String.fromCharCode(parseInt(t,16))})):"")))}catch(t){throw Je.from(t,Je.ERR_BAD_OPTION_VALUE,e)}}if(ke.isFormData(r)){var h=ke.getSafeProp(r,"getHeaders");ht.hasStandardBrowserEnv||ht.hasStandardBrowserWebWorkerEnv||ke.isReactNative(r)?u.setContentType(void 0):ke.isFunction(h)&&function(e,t,n){"content-only"===n?Object.entries(t||{}).forEach((function(t){var n=R(t,2),r=n[0],o=n[1];Ft.includes(r.toLowerCase())&&e.set(r,o)})):e.set(t)}(u,h.call(r),n("formDataHeaderPolicy"))}if(ht.hasStandardBrowserEnv&&(ke.isFunction(o)&&(o=o(t)),!0===o||null==o&&kt(t.url))){var v=i&&a&&xt.read(a);v&&u.set(i,v)}return t}var It="undefined"!=typeof XMLHttpRequest&&function(e){return new Promise((function(t,n){var r,o,i,a,u,s,c=Bt(e),f=c.data,l=ze.from(c.headers).normalize(),d=c.responseType,p=c.onUploadProgress,h=c.onDownloadProgress;function v(){a&&a(),u&&u(),c.cancelToken&&c.cancelToken.unsubscribe(r),c.signal&&c.signal.removeEventListener("abort",r)}var y=new XMLHttpRequest;function b(r){if(y){if(!(0!==y.status||"file"===(Pt(_t(c.url))||Pt(ht.origin))||y.responseURL&&y.responseURL.startsWith("file:")))return n(new Je("Request aborted",Je.ECONNABORTED,e,y)),v(),void(y=null);try{r?s&&s(r):u&&u()}catch(e){setTimeout((function(){throw e}))}if(y){var o=ze.from("getAllResponseHeaders"in y&&y.getAllResponseHeaders());Rt((function(e){t(e),v()}),(function(e){n(e),v()}),{data:d&&"text"!==d&&"json"!==d?y.response:y.responseText,status:y.status,statusText:y.statusText,headers:o,config:e,request:y}),y=null}}}if(y.open(c.method.toUpperCase(),c.url,!0),y.timeout=c.timeout,"onloadend"in y?y.onloadend=b:y.onreadystatechange=function(){y&&4===y.readyState&&(0!==y.status||y.responseURL&&y.responseURL.startsWith("file:"))&&setTimeout(b)},y.onabort=function(){y&&(n(new Je("Request aborted",Je.ECONNABORTED,e,y)),v(),y=null)},y.onerror=function(t){var r=t&&t.message?t.message:"Network Error",o=new Je(r,Je.ERR_NETWORK,e,y);o.event=t||null,n(o),v(),y=null},y.ontimeout=function(){var t=c.timeout?"timeout of "+c.timeout+"ms exceeded":"timeout exceeded",r=c.transitional||ut;c.timeoutErrorMessage&&(t=c.timeoutErrorMessage),n(new Je(t,r.clarifyTimeoutError?Je.ETIMEDOUT:Je.ECONNABORTED,e,y)),v(),y=null},void 0===f&&l.setContentType(null),"setRequestHeader"in y&&ke.forEach(Ue(l),(function(e,t){y.setRequestHeader(t,e)})),ke.isUndefined(c.withCredentials)||(y.withCredentials=!!c.withCredentials),d&&"json"!==d&&(y.responseType=c.responseType),h){var m=R(jt(h,!0),3);i=m[0],u=m[1],s=m[2],y.addEventListener("progress",i)}if(p&&y.upload){var g=R(jt(p),2);o=g[0],a=g[1],y.upload.addEventListener("progress",o),y.upload.addEventListener("loadend",a)}(c.cancelToken||c.signal)&&(r=function(t){y&&(n(!t||t.type?new Et(null,e,y):t),y.abort(),v(),y=null)},c.cancelToken&&c.cancelToken.subscribe(r),c.signal&&(c.signal.aborted?r():c.signal.addEventListener("abort",r)));var w=Pt(c.url);if(w&&!ht.protocols.includes(w))return n(new Je("Unsupported protocol "+w+":",Je.ERR_BAD_REQUEST,e)),void v();y.send(f||null)}))},qt=function(e,t){if(e=e?e.filter(Boolean):[],t||e.length){var n=new AbortController,r=!1,o=function(e){if(!r){r=!0,a();var t=e instanceof Error?e:this.reason;n.abort(t instanceof Je?t:new Et(t instanceof Error?t.message:t))}},i=t&&setTimeout((function(){i=null,o(new Je("timeout of ".concat(t,"ms exceeded"),Je.ETIMEDOUT))}),t),a=function(){e&&(i&&clearTimeout(i),i=null,e.forEach((function(e){e.unsubscribe?e.unsubscribe(o):e.removeEventListener("abort",o)})),e=null)};e.forEach((function(e){r||(e.aborted?o.call(e):e.addEventListener("abort",o,{once:!0}))}));var u=n.signal;return u.unsubscribe=function(){return ke.asap(a)},u}},Mt=g().m((function e(t,n){var r,o,i;return g().w((function(e){for(;;)switch(e.n){case 0:if(r=t.byteLength,n&&!(r=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102},Vt=function(e,t,n){return t+2=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||43===e||47===e||45===e||95===e},Gt=function(e){for(var t,n=e.length,r=0,o=0,i=!1,a=0;a0?i=!0:r++:o++)}return i||o>2||o>0&&(r+o)%4!=0||r%4==1?function(e){var t=e.length,n=0;return t>0&&61===e.charCodeAt(t-1)&&(n++,t>1&&61===e.charCodeAt(t-2)&&n++),Math.floor(3*(t-n)/4)}(e):function(e){var t=e%4;return 3*Math.floor(e/4)+(2===t?1:3===t?2:0)}(r)};function $t(e){var t="string"==typeof e?e.indexOf("#"):-1;return function(e,t){if(!e||"string"!=typeof e)return 0;if(!e.startsWith("data:"))return 0;var n=e.indexOf(",");if(n<0)return 0;var r=e.slice(5,n),o=e.slice(n+1);if(/;base64/i.test(r))return t(o);for(var i=0,a=0,u=o.length;a=55296&&s<=56319&&a+1=56320&&c<=57343?(i+=4,a++):i+=3}else i+=3}return i}(-1===t?e:e.slice(0,t),Gt)}var Qt="1.20.0",Zt={cache:"default",redirect:"follow",referrer:"about:client",referrerPolicy:"",mode:"cors",integrity:"",keepalive:!1,priority:"auto",window:null},Yt=ke.isFunction,en=function(e){if(!ke.isString(e))return e;try{return decodeURIComponent(e)}catch(t){return e}},tn=function(e){try{for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r-1,N=ke.isNumber(k)&&k>-1,D=function(e){return ke.hasOwnProp(t,e)?t[e]:void 0},U=i||fetch,S=S?(S+"").toLowerCase():"text",L=qt([l,d&&d.toAbortSignal()],h),F=null,B=L&&L.unsubscribe&&function(){L.unsubscribe()},q=null,M=function(){return new Je("Request body larger than maxBodyLength limit",Je.ERR_BAD_REQUEST,t,F)},e.p=1,z=void 0,(H=D("auth"))&&(W=ke.getSafeProp(H,"username")||"",J=ke.getSafeProp(H,"password")||"",z={username:W,password:J}),nn(o)&&(V=new URL(o,ht.origin),z||!V.username&&!V.password||(K=en(V.username),X=en(V.password),z={username:K,password:X}),(V.username||V.password)&&(V.username="",V.password="",o=V.href)),z&&(_.delete("authorization"),_.set("Authorization","Basic "+btoa((g=(z.username||"")+":"+(z.password||""),encodeURIComponent(g).replace(/%([0-9A-F]{2})/gi,(function(e,t){return String.fromCharCode(parseInt(t,16))})))))),!C||"string"!=typeof o||!o.startsWith("data:")){e.n=2;break}if(!($t(o)>T)){e.n=2;break}throw new Je("maxContentLength size of "+T+" exceeded",Je.ERR_BAD_RESPONSE,t,F);case 2:if(!N||"get"===a||"head"===a){e.n=4;break}return e.n=3,m(c);case 3:if("number"!=typeof(G=e.v)||!isFinite(G)){e.n=4;break}if(I=G,!(G>k)){e.n=4;break}throw M();case 4:if($=N&&(ke.isReadableStream(c)||ke.isStream(c)),Q=function(e,t,n){return Wt(e,65536,(function(e){if(N&&e>k)throw q=M();t&&t(e)}),n)},!v||"get"===a||"head"===a||!E&&!$){e.n=8;break}if(null!=I){e.n=6;break}return e.n=5,w(_,c);case 5:Re=e.v,e.n=7;break;case 6:Re=I;case 7:(0!==(I=Re)||$)&&(Z=new u(o,{method:"POST",body:c,duplex:"half"}),ke.isFormData(c)&&(Y=Z.headers.get("content-type"))&&_.setContentType(Y),Z.body&&(ee=E&&At(I,jt(Tt(E)))||[],te=R(ee,2),ne=te[0],re=te[1],c=Q(Z.body,ne,re))),e.n=10;break;case 8:if(!$||f||!p||"get"===a||"head"===a){e.n=9;break}c=Q(c),e.n=10;break;case 9:if(!$||!f||v||"get"===a||"head"===a){e.n=10;break}throw new Je("Stream request bodies are not supported by the current fetch implementation",Je.ERR_NOT_SUPPORT,t,F);case 10:return ke.isString(j)||(j=j?"include":"omit"),oe=f&&"credentials"in u.prototype,ke.isFormData(c)&&(ie=_.getContentType())&&/^multipart\/form-data/i.test(ie)&&!/boundary=/i.test(ie)&&_.delete("content-type"),_.set("User-Agent","axios/"+Qt,!1),(ae=null==A?A:Object.assign(Object.create(null),A))&&(delete ae.body,delete ae.headers,delete ae.method,delete ae.signal,delete ae.duplex,delete ae.credentials),ue=Object.assign(Object.create(null),ae,{signal:L,method:a.toUpperCase(),headers:Ue(_.normalize()),body:c,duplex:"half",credentials:oe?j:void 0}),f&&(ke.forEach(Zt,(function(e,t){void 0===ue[t]&&(ue[t]=e)})),void 0===ue.signal&&(ue.signal=null),void 0===ue.body&&(ue.body=null)),0===x&&(ue.redirect="manual",ae&&(ae.redirect="manual")),F=f&&new u(o,ue),e.n=11,f?U(F,ae):U(o,ue);case 11:if(se=e.v,ce=ze.from(se.headers),!C){e.n=12;break}if(!(null!=(fe=ke.toFiniteNumber(ce.getContentLength()))&&fe>T)){e.n=12;break}throw new Je("maxContentLength size of "+T+" exceeded",Je.ERR_BAD_RESPONSE,t,F);case 12:return le=y&&("stream"===S||"response"===S),y&&se.body&&(O||C||le&&B)&&(de={},["status","statusText","headers"].forEach((function(e){de[e]=se[e]})),pe=ke.toFiniteNumber(ce.getContentLength()),he=O&&At(pe,jt(Tt(O),!0))||[],ve=R(he,2),ye=ve[0],be=ve[1],me=function(e){if(C&&e>T)throw new Je("maxContentLength size of "+T+" exceeded",Je.ERR_BAD_RESPONSE,t,F);ye&&ye(e)},se=new s(Wt(se.body,65536,me,(function(){be&&be(),B&&B()})),de)),S=S||"text",e.n=13,b[ke.findKey(b,S)||"text"](se,t);case 13:if(ge=e.v,!C||y||le){e.n=14;break}if(null!=ge&&("number"==typeof ge.byteLength?we=ge.byteLength:"number"==typeof ge.size?we=ge.size:"string"==typeof ge&&(we="function"==typeof r?(new r).encode(ge).byteLength:ge.length)),!("number"==typeof we&&we>T)){e.n=14;break}throw new Je("maxContentLength size of "+T+" exceeded",Je.ERR_BAD_RESPONSE,t,F);case 14:return!le&&B&&B(),e.n=15,new Promise((function(e,n){Rt(e,n,{data:ge,headers:ze.from(se.headers),status:se.status,statusText:se.statusText,config:t,request:F})}));case 15:return e.a(2,e.v);case 16:if(e.p=16,Se=e.v,B&&B(),!(L&&L.aborted&&L.reason instanceof Je)){e.n=17;break}throw(Oe=L.reason).config=t,F&&(Oe.request=F),Se!==Oe&&Object.defineProperty(Oe,"cause",{__proto__:null,value:Se,writable:!0,enumerable:!1,configurable:!0}),Oe;case 17:if(!q){e.n=18;break}throw F&&!q.request&&(q.request=F),q;case 18:if(!(Se instanceof Je)){e.n=19;break}throw F&&!Se.request&&(Se.request=F),Se;case 19:if(!Se||"TypeError"!==Se.name||!/Load failed|fetch/i.test(Se.message)){e.n=20;break}throw Ee=new Je("Network Error",Je.ERR_NETWORK,t,F,Se&&Se.response),Object.defineProperty(Ee,"cause",{__proto__:null,value:Se.cause||Se,writable:!0,enumerable:!1,configurable:!0}),Ee;case 20:throw Je.from(Se,Se&&Se.code,t,F,Se&&Se.response);case 21:return e.a(2)}var g}),e,null,[[1,16]])})));return function(t){return e.apply(this,arguments)}}()},on=new Map,an=function(e){for(var t,n,r=e&&e.env||{},o=r.fetch,i=[r.Request,r.Response,o],a=i.length,u=on;a--;)t=i[a],void 0===(n=u.get(t))&&u.set(t,n=a?new Map:rn(r)),u=n;return n};an();var un={http:null,xhr:It,fetch:{get:an}};ke.forEach(un,(function(e,t){if(e){try{Object.defineProperty(e,"name",{__proto__:null,value:t})}catch(e){}Object.defineProperty(e,"adapterName",{__proto__:null,value:t})}}));var sn=function(e){return"- ".concat(e)},cn=function(e){return ke.isFunction(e)||null===e||!1===e},fn=function(e,t){for(var n,r,o=(e=ke.isArray(e)?e:[e]).length,i={},a=0;a1?"since :\n"+s.map(sn).join("\n"):" "+sn(s[0]):"as no adapter specified";throw new Je("There is no suitable adapter to dispatch the request "+c,Je.ERR_NOT_SUPPORT)}return r};function ln(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Et(null,e)}function dn(e){var t=ke.toSafeFlatObject(e);return ln(t),t.headers=ze.from(ke.getSafeProp(t,"headers")),t.data=wt.call(t,t.transformRequest),-1!==["post","put","patch"].indexOf(t.method)&&t.headers.setContentType("application/x-www-form-urlencoded",!1),fn(t.adapter||gt.adapter,t)(t).then((function(e){ln(t),t.response=e;try{e.data=wt.call(t,t.transformResponse,e)}finally{delete t.response}return e.headers=ze.from(e.headers),e}),(function(e){if(!Ot(e)&&(ln(t),e&&e.response)){t.response=e.response;try{e.response.data=wt.call(t,t.transformResponse,e.response)}finally{delete t.response}e.response.headers=ze.from(e.response.headers)}return Promise.reject(e)}))}var pn={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){pn[e]=function(n){return P(n)===e||"a"+(t<1?"n ":" ")+e}}));var hn={};pn.transitional=function(e,t,n){function r(e,t){return"[Axios v"+Qt+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(n,o,i){if(!1===e)throw new Je(r(o," has been removed"+(t?" in "+t:"")),Je.ERR_DEPRECATED);return t&&!hn[o]&&(hn[o]=!0,console.warn(r(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,o,i)}},pn.spelling=function(e){return function(t,n){return console.warn("".concat(n," is likely a misspelling of ").concat(e)),!0}};var vn={assertOptions:function(e,t,n){if("object"!==P(e)||null===e)throw new Je("options must be an object",Je.ERR_BAD_OPTION_VALUE);for(var r=Object.keys(e),o=r.length;o-- >0;){var i=r[o],a=Object.prototype.hasOwnProperty.call(t,i)?t[i]:void 0;if(a){var u=e[i],s=void 0===u||a(u,i,e);if(!0!==s)throw new Je("option "+i+" must be "+s,Je.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new Je("Unknown option "+i,Je.ERR_BAD_OPTION)}},validators:pn},yn=vn.validators,bn=function(){return l((function e(t){c(this,e),this.defaults=t||{},this.interceptors={request:new at,response:new at}}),[{key:"request",value:(e=a(g().m((function e(t,n){var r,o,i,a,u,s,c,f;return g().w((function(e){for(;;)switch(e.p=e.n){case 0:return e.p=0,e.n=1,this._request(t,n);case 1:return e.a(2,e.v);case 2:if(e.p=2,(f=e.v)instanceof Error)try{r={},Error.captureStackTrace?Error.captureStackTrace(r):r=new Error,o=r.stack,i="","string"==typeof o&&(a=o.indexOf("\n"),i=-1===a?"":o.slice(a+1)),f.stack?i&&(u=i.indexOf("\n"),s=-1===u?-1:i.indexOf("\n",u+1),c=-1===s?"":i.slice(s+1),String(f.stack).endsWith(c)||(f.stack+="\n"+i)):f.stack=i}catch(e){}throw f;case 3:return e.a(2)}}),e,this,[[0,2]])}))),function(t,n){return e.apply(this,arguments)})},{key:"_request",value:function(e,t){var n=this;"string"==typeof e?(t=t||{}).url=e:t=e||{};var r=t=Lt(this.defaults,t),o=r.transitional,i=r.paramsSerializer,a=r.headers;void 0!==o&&vn.assertOptions(o,{silentJSONParsing:yn.transitional(yn.boolean),forcedJSONParsing:yn.transitional(yn.boolean),clarifyTimeoutError:yn.transitional(yn.boolean),legacyInterceptorReqResOrdering:yn.transitional(yn.boolean),advertiseZstdAcceptEncoding:yn.transitional(yn.boolean),validateStatusUndefinedResolves:yn.transitional(yn.boolean)},!1),null!=i&&(ke.isFunction(i)?t.paramsSerializer={serialize:i}:vn.assertOptions(i,{encode:yn.function,serialize:yn.function},!0)),void 0!==t.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),vn.assertOptions(t,{baseUrl:yn.spelling("baseURL"),withXsrfToken:yn.spelling("withXSRFToken")},!0),t.method=(ke.getSafeProp(t,"method")||ke.getSafeProp(this.defaults,"method")||"get").toLowerCase();var u=a&&ke.merge(a.common,a[t.method]);a&&ke.forEach(bt.concat("common"),(function(e){delete a[e]})),t.headers=ze.concat(u,a);var s=[],c=!0;this.interceptors.request.forEach((function(e){if("function"!=typeof e.runWhen||!1!==e.runWhen(t)){c=c&&e.synchronous;var n=t.transitional||ut;n&&n.legacyInterceptorReqResOrdering?s.unshift(e.fulfilled,e.rejected):s.push(e.fulfilled,e.rejected)}}));var f,l=[];this.interceptors.response.forEach((function(e){l.push(e.fulfilled,e.rejected)}));var d,p=0;if(!c){var h=[dn.bind(this),void 0];for(h.unshift.apply(h,s),h.push.apply(h,l),d=h.length,f=Promise.resolve(t);p0;)r._listeners[t](e);r._listeners=null}})),this.promise.then=function(e){var t,n=new Promise((function(e){r.subscribe(e),t=e})).then(e);return n.cancel=function(){r.unsubscribe(t)},n},t((function(e,t,o){r.reason||(r.reason=new Et(e,t,o),n(r.reason))}))}return l(e,[{key:"throwIfRequested",value:function(){if(this.reason)throw this.reason}},{key:"subscribe",value:function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}},{key:"unsubscribe",value:function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}}},{key:"toAbortSignal",value:function(){var e=this,t=new AbortController,n=function(e){t.abort(e)};return this.subscribe(n),t.signal.unsubscribe=function(){return e.unsubscribe(n)},t.signal}}],[{key:"source",value:function(){var t;return{token:new e((function(e){t=e})),cancel:t}}}])}(),gn={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,ContentTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,UnprocessableContent:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerReturnsAnUnknownError:520,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(gn).forEach((function(e){var t=R(e,2),n=t[0],r=t[1];void 0===gn[r]&&(gn[r]=n)}));var wn=function e(t){var n=new bn(t),r=x(bn.prototype.request,n);return ke.extend(r,bn.prototype,n,{allOwnKeys:!0}),ke.extend(r,n,null,{allOwnKeys:!0}),r.create=function(n){return e(Lt(t,n))},r}(gt);return wn.Axios=bn,wn.CanceledError=Et,wn.CancelToken=mn,wn.isCancel=Ot,wn.VERSION=Qt,wn.toFormData=$e,wn.AxiosError=Je,wn.Cancel=wn.CanceledError,wn.all=function(e){return Promise.all(e)},wn.spread=function(e){return function(t){return e.apply(null,t)}},wn.isAxiosError=function(e){return ke.isObject(e)&&!0===e.isAxiosError},wn.mergeConfig=Lt,wn.AxiosHeaders=ze,wn.formToJSON=function(e){return yt(ke.isHTMLForm(e)?new FormData(e):e)},wn.getAdapter=fn,wn.HttpStatusCode=gn,wn.default=wn,wn})); \ No newline at end of file diff --git a/src/web/assets/axios/dist/axios.js.LICENSE.txt b/src/web/assets/axios/dist/axios.js.LICENSE.txt index 9852e3f68d6..6c3037e9005 100644 --- a/src/web/assets/axios/dist/axios.js.LICENSE.txt +++ b/src/web/assets/axios/dist/axios.js.LICENSE.txt @@ -1,3 +1,3 @@ -/*! Axios v1.17.0 Copyright (c) 2026 Matt Zabriskie and contributors */ +/*! Axios v1.20.0 Copyright (c) 2026 Matt Zabriskie and contributors */ /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ diff --git a/src/web/assets/cp/dist/cp.js b/src/web/assets/cp/dist/cp.js index 97a6414e653..237144e0544 100644 --- a/src/web/assets/cp/dist/cp.js +++ b/src/web/assets/cp/dist/cp.js @@ -1,3 +1,3 @@ /*! For license information please see cp.js.LICENSE.txt */ -(function(){var __webpack_modules__={0:function(){function t(t,n){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var n=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=n){var r,i,a,o,s=[],l=!0,c=!1;try{if(a=(n=n.call(t)).next,0===e){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=a.call(n)).done)&&(s.push(r.value),s.length!==e);l=!0);}catch(t){c=!0,i=t}finally{try{if(!l&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(c)throw i}}return s}}(t,n)||function(t,n){if(t){if("string"==typeof t)return e(t,n);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?e(t,n):void 0}}(t,n)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function e(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);nn.settings.maxFileSize&&(n._rejectedFiles.size.push("“"+t.name+"”"),i=!1),i&&"function"==typeof n.settings.canAddMoreFiles&&!n.settings.canAddMoreFiles(n._validFileCounter)&&(n._rejectedFiles.limit.push("“"+t.name+"”"),i=!1),i&&(n._validFileCounter++,e.submit()),++n._totalFileCounter===e.originalFiles.length&&(n._totalFileCounter=0,n._validFileCounter=0,n.processErrorMessages())})),!0},destroy:function(){var e=this;this.uploader.fileupload("instance")&&this.uploader.fileupload("destroy"),this.$element.off("fileuploadadd",this._onFileAdd),Object.entries(this.events).forEach((function(n){var r=t(n,2),i=r[0],a=r[1];e.$element.off(i,a)}))}},{defaults:{autoUpload:!1,sequentialUploads:!0,maxFileSize:Craft.maxUploadSize,replaceFileInput:!1,createAction:"assets/upload",replaceAction:"assets/replace-file",deleteAction:"assets/delete-asset"}})},9:function(){Craft.Structure=Garnish.Base.extend({id:null,$container:null,state:null,structureDrag:null,init:function(t,e,n){this.id=t,this.$container=$(e),this.setSettings(n,Craft.Structure.defaults),this.$container.data("structure")&&(console.warn("Double-instantiating a structure on an element"),this.$container.data("structure").destroy()),this.$container.data("structure",this),this.state={},this.settings.storageKey&&$.extend(this.state,Craft.getLocalStorage(this.settings.storageKey,{})),void 0===this.state.collapsedElementIds&&(this.state.collapsedElementIds=[]);for(var r=this.$container.find("ul").prev(".row"),i=0;i').prependTo(a);-1!==$.inArray(a.children(".element").data("id"),this.state.collapsedElementIds)&&o.addClass("collapsed"),this.initToggle(s)}this.settings.sortable&&(this.structureDrag=new Craft.StructureDrag(this,this.settings.maxLevels)),this.settings.newChildUrl&&this.initNewChildMenus(this.$container.find(".add"))},initToggle:function(t){var e=this;t.on("click",(function(t){var n=$(t.currentTarget).closest("li"),r=n.children(".row").find(".element:first").data("id"),i=$.inArray(r,e.state.collapsedElementIds);n.hasClass("collapsed")?(n.removeClass("collapsed"),-1!==i&&e.state.collapsedElementIds.splice(i,1)):(n.addClass("collapsed"),-1===i&&e.state.collapsedElementIds.push(r)),e.settings.storageKey&&Craft.setLocalStorage(e.settings.storageKey,e.state)}))},initNewChildMenus:function(t){this.addListener(t,"click","onNewChildMenuClick")},onNewChildMenuClick:function(t){var e=$(t.currentTarget);if(!e.data("menubtn")){var n=e.parent().children(".element").data("id"),r=Craft.getUrl(this.settings.newChildUrl,"parentId="+n);$('").insertAfter(e),new Garnish.MenuBtn(e).showMenu()}},getIndent:function(t){return Craft.Structure.baseIndent+(t-1)*Craft.Structure.nestedIndent},addElement:function(t){var e=$('
  • ').appendTo(this.$container),n=$('
    ').appendTo(e);if(n.append(t),this.settings.sortable&&(n.append(''),this.structureDrag.addItems(e)),this.settings.newChildUrl){var r=$('').appendTo(n);this.initNewChildMenus(r)}n.css("margin-bottom",-30),n.velocity({"margin-bottom":0},"fast")},removeElement:function(t){var e,n=this,r=t.parent().parent();this.settings.sortable&&this.structureDrag.removeItems(r),r.siblings().length||(e=r.parent()),r.css("visibility","hidden").velocity({marginBottom:-r.height()},"fast",(function(){r.remove(),void 0!==e&&n._removeUl(e)}))},_removeUl:function(t){t.siblings(".row").children(".toggle").remove(),t.remove()},destroy:function(){this.$container.removeData("structure"),this.base()}},{baseIndent:8,nestedIndent:35,defaults:{storageKey:null,sortable:!1,newChildUrl:null,maxLevels:null}})},146:function(){function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(){"use strict";e=function(){return r};var n,r={},i=Object.prototype,a=i.hasOwnProperty,o=Object.defineProperty||function(t,e,n){t[e]=n.value},s="function"==typeof Symbol?Symbol:{},l=s.iterator||"@@iterator",c=s.asyncIterator||"@@asyncIterator",u=s.toStringTag||"@@toStringTag";function h(t,e,n){return Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{h({},"")}catch(n){h=function(t,e,n){return t[e]=n}}function d(t,e,n,r){var i=e&&e.prototype instanceof b?e:b,a=Object.create(i.prototype),s=new A(r||[]);return o(a,"_invoke",{value:T(t,n,s)}),a}function f(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}r.wrap=d;var p="suspendedStart",g="suspendedYield",m="executing",v="completed",y={};function b(){}function C(){}function w(){}var $={};h($,l,(function(){return this}));var _=Object.getPrototypeOf,x=_&&_(_(P([])));x&&x!==i&&a.call(x,l)&&($=x);var S=w.prototype=b.prototype=Object.create($);function E(t){["next","throw","return"].forEach((function(e){h(t,e,(function(t){return this._invoke(e,t)}))}))}function I(e,n){function r(i,o,s,l){var c=f(e[i],e,o);if("throw"!==c.type){var u=c.arg,h=u.value;return h&&"object"==t(h)&&a.call(h,"__await")?n.resolve(h.__await).then((function(t){r("next",t,s,l)}),(function(t){r("throw",t,s,l)})):n.resolve(h).then((function(t){u.value=t,s(u)}),(function(t){return r("throw",t,s,l)}))}l(c.arg)}var i;o(this,"_invoke",{value:function(t,e){function a(){return new n((function(n,i){r(t,e,n,i)}))}return i=i?i.then(a,a):a()}})}function T(t,e,r){var i=p;return function(a,o){if(i===m)throw Error("Generator is already running");if(i===v){if("throw"===a)throw o;return{value:n,done:!0}}for(r.method=a,r.arg=o;;){var s=r.delegate;if(s){var l=D(s,r);if(l){if(l===y)continue;return l}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(i===p)throw i=v,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);i=m;var c=f(t,e,r);if("normal"===c.type){if(i=r.done?v:g,c.arg===y)continue;return{value:c.arg,done:r.done}}"throw"===c.type&&(i=v,r.method="throw",r.arg=c.arg)}}}function D(t,e){var r=e.method,i=t.iterator[r];if(i===n)return e.delegate=null,"throw"===r&&t.iterator.return&&(e.method="return",e.arg=n,D(t,e),"throw"===e.method)||"return"!==r&&(e.method="throw",e.arg=new TypeError("The iterator does not provide a '"+r+"' method")),y;var a=f(i,t.iterator,e.arg);if("throw"===a.type)return e.method="throw",e.arg=a.arg,e.delegate=null,y;var o=a.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=n),e.delegate=null,y):o:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,y)}function k(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function L(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function A(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(k,this),this.reset(!0)}function P(e){if(e||""===e){var r=e[l];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var i=-1,o=function t(){for(;++i=0;--i){var o=this.tryEntries[i],s=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var l=a.call(o,"catchLoc"),c=a.call(o,"finallyLoc");if(l&&c){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&a.call(r,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),L(n),y}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;L(n)}return i}}throw Error("illegal catch attempt")},delegateYield:function(t,e,r){return this.delegate={iterator:P(t),resultName:e,nextLoc:r},"next"===this.method&&(this.arg=n),y}},r}function n(t,e,n,r,i,a,o){try{var s=t[a](o),l=s.value}catch(t){return void n(t)}s.done?e(l):Promise.resolve(l).then(r,i)}var r,i;Craft.EntrySelectInput=Craft.BaseElementSelectInput.extend({get section(){var t=this;return this.settings.sectionId?Craft.publishableSections.find((function(e){return e.id===t.settings.sectionId})):null},canCreateElements:function(){return!!this.section},createElement:(r=e().mark((function t(n){var r,i;return e().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,Craft.sendActionRequest("POST","entries/create",{data:{siteId:this.settings.criteria.siteId,section:this.section.handle,authorId:Craft.userId,title:n}});case 2:return r=t.sent,i=r.data.entry,t.prev=4,t.next=7,this.showElementEditor(i);case 7:t.next=12;break;case 9:return t.prev=9,t.t0=t.catch(4),t.abrupt("return",null);case 12:return t.abrupt("return",i.id);case 13:case"end":return t.stop()}}),t,this,[[4,9]])})),i=function(){var t=this,e=arguments;return new Promise((function(i,a){var o=r.apply(t,e);function s(t){n(o,i,a,s,l,"next",t)}function l(t){n(o,i,a,s,l,"throw",t)}s(void 0)}))},function(t){return i.apply(this,arguments)}),showElementEditor:function(t){var e=this;return new Promise((function(n,r){var i=Craft.createElementEditor("craft\\elements\\Entry",{siteId:e.settings.criteria.siteId,elementId:t.id,draftId:t.draftId,params:{fresh:1}}),a=!1;i.on("submit",(function(){a=!0,n()})),i.on("close",(function(){a||r()}))}))}})},258:function(){function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},t(e)}function e(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function n(t){for(var n=1;n').appendTo(Garnish.$bod),this.$body=$('
    ').appendTo(this.$container),this.$footer=$('
  • ").appendTo(r);var a=new Garnish.MenuBtn(this.$selectTransformBtn,{onOptionSelect:this.onSelectTransform.bind(this)});a.disable(),this.$selectTransformBtn.data("menuButton",a)}},onSelectionChange:function(t){var e=!1;this.elementIndex.getSelectedElements().length&&this.settings.transforms.length&&(e=!0);var n=null;this.$selectTransformBtn&&(n=this.$selectTransformBtn.data("menuButton")),e?(n&&n.enable(),this.$selectTransformBtn.removeClass("disabled")):this.$selectTransformBtn&&(n&&n.disable(),this.$selectTransformBtn.addClass("disabled")),this.base()},onSelectTransform:function(t){var e=$(t).data("transform");this.selectImagesWithTransform(e)},selectImagesWithTransform:function(t){var e=this;void 0===Craft.AssetSelectorModal.transformUrls[t]&&(Craft.AssetSelectorModal.transformUrls[t]={});for(var n=this.elementIndex.getSelectedElements(),r=[],i=0;i",{class:"modal elementselectormodal","aria-labelledby":n}).appendTo(Garnish.$bod),i=$("
    ",{class:this.settings.showTitle?"header":"visually-hidden"}).appendTo(r);$("

    ",{id:n,text:this.settings.modalTitle}).appendTo(i);var a=$("
    ",{class:"body"}).append($("
    ",{class:"spinner big"})).appendTo(r);this.$footer=$("
    ",{class:"footer"}).appendTo(r),this.settings.fullscreen&&(r.addClass("fullscreen"),this.settings.minGutter=0),this.base(r,this.settings),this.$secondaryButtons=$('
    ').appendTo(this.$footer),this.$primaryButtons=$('
    ').appendTo(this.$footer),this.$cancelBtn=$("
    ").appendTo(i),o=$('
    ').appendTo(a),s=$("
    ').appendTo(this.$container),this.$cursor=$('
    ').appendTo(this.$container),this.$graduations=$('
    ').appendTo(this.$container),this.$graduationsUl=$("
      ").attr({"aria-hidden":"true"}).appendTo(this.$graduations),this.$container.attr({role:"slider",tabindex:"0","aria-valuemin":this.slideMin,"aria-valuemax":this.slideMax,"aria-valuenow":"0","aria-valuetext":Craft.t("app","{num, number} {num, plural, =1{degree} other{degrees}}",{num:0})});for(var r=this.graduationsMin;r<=this.graduationsMax;r++){var i=$('
    • '+r+"
    • ").appendTo(this.$graduationsUl);r%5==0&&i.addClass("main-graduation"),0===r&&i.addClass("selected")}this.$options=this.$container.find(".graduation"),this.addListener(this.$container,"resize",this._handleResize.bind(this)),this.addListener(this.$container,"tapstart",this._handleTapStart.bind(this)),this.addListener(Garnish.$bod,"tapmove",this._handleTapMove.bind(this)),this.addListener(Garnish.$bod,"tapend",this._handleTapEnd.bind(this)),this.addListener(this.$container,"keydown",this._handleKeypress.bind(this)),setTimeout((function(){n.graduationsCalculatedWidth=10*(n.$options.length-1),n.$graduationsUl.css("left",-n.graduationsCalculatedWidth/2+n.$container.width()/2)}),50)},_handleResize:function(){var t=this.valueToPosition(this.value);this.$graduationsUl.css("left",t)},_handleKeypress:function(t){var e=parseInt(this.$container.attr("aria-valuenow"),10);switch(t.keyCode){case Garnish.UP_KEY:case Garnish.RIGHT_KEY:this.setValue(e+1);break;case Garnish.DOWN_KEY:case Garnish.LEFT_KEY:this.setValue(e-1);break;case Garnish.PAGE_UP_KEY:this.setValue(e+10);break;case Garnish.PAGE_DOWN_KEY:this.setValue(e-10);break;case Garnish.HOME_KEY:this.setValue(this.slideMin);break;case Garnish.END_KEY:this.setValue(this.slideMax)}this.onChange()},_handleTapStart:function(t,e){t.preventDefault(),this.rotateIntent=$(t.target).is(".graduations *"),this.rotateIntent&&(this.startPositionX=e.position.x,this.startLeft=this.$graduationsUl.position().left,this.onStart())},_handleTapMove:function(t,e){this.rotateIntent&&Math.abs(e.position.x-this.startPositionX)>this.sensitivity&&(this.dragging=!0,this.$container.addClass("dragging"),t.preventDefault(),this._setValueFromTouch(e),this.onChange())},_setValueFromTouch:function(t){var e,n=this.dragging?this.startPositionX:this.$cursor.offset().left+this.$cursor.outerWidth()/2;e=this.dragging?n-t.position.x:t.position.x-n;var r=this.startLeft-e,i=this.positionToValue(r);this.setValue(i)},setValue:function(t){var e=this.valueToPosition(t);tthis.slideMax&&(t=this.slideMax,e=this.valueToPosition(t)),this.$graduationsUl.css("left",e),t>=this.slideMin&&t<=this.slideMax&&(this.$options.removeClass("selected"),$.each(this.$options,(function(e,n){$(n).data("graduation")>0&&$(n).data("graduation")<=t&&$(n).addClass("selected"),$(n).data("graduation")<0&&$(n).data("graduation")>=t&&$(n).addClass("selected"),0==$(n).data("graduation")&&$(n).addClass("selected")}))),this.$container.attr({"aria-valuenow":t,"aria-valuetext":Craft.t("app","{num, number} {num, plural, =1{degree} other{degrees}}",{num:parseInt(t,10)})}),this.value=t},_handleTapEnd:function(t,e){this.rotateIntent&&(this.dragging?(t.preventDefault(),this.dragging=!1,this.$container.removeClass("dragging")):(this._setValueFromTouch(e),this.onChange()),this.onEnd(),this.startPositionX=null,this.rotateIntent=!1)},positionToValue:function(t){var e=-1*this.graduationsMin,n=-1*(this.graduationsMin-this.graduationsMax);return(this.$graduations.width()/2+-1*t)/this.graduationsCalculatedWidth*n-e},valueToPosition:function(t){var e=-1*this.graduationsMin,n=-1*(this.graduationsMin-this.graduationsMax);return-((t+e)*this.graduationsCalculatedWidth/n-this.$graduations.width()/2)},onStart:function(){"function"==typeof this.settings.onChange&&this.settings.onStart(this)},onChange:function(){"function"==typeof this.settings.onChange&&this.settings.onChange(this)},onEnd:function(){"function"==typeof this.settings.onChange&&this.settings.onEnd(this)},defaultSettings:{onStart:$.noop,onChange:$.noop,onEnd:$.noop}})},3254:function(){},3517:function(){Craft.BaseUploader=Garnish.Base.extend({allowedKinds:null,$element:null,$fileInput:null,settings:null,fsType:null,formData:{},events:{},_rejectedFiles:{},_extensionList:null,_inProgressCounter:0,init:function(t,e){this._rejectedFiles={size:[],type:[],limit:[]},this.$element=t,this.settings=$.extend({},Craft.BaseUploader.defaults,e),this.formData=this.settings.formData,this.$fileInput=this.settings.fileInput||t,this.events=this.settings.events,this.settings.url||(this.settings.url=this.settings.replace?Craft.getActionUrl(this.settings.replaceAction):Craft.getActionUrl(this.settings.createAction)),this.settings.allowedKinds&&this.settings.allowedKinds.length&&("string"==typeof this.settings.allowedKinds&&(this.settings.allowedKinds=[this.settings.allowedKinds]),this.allowedKinds=this.settings.allowedKinds,delete this.settings.allowedKinds)},setParams:function(t){void 0!==Craft.csrfTokenName&&void 0!==Craft.csrfTokenValue&&(t[Craft.csrfTokenName]=Craft.csrfTokenValue),this.formData=t},getInProgress:function(){return this._inProgressCounter},isLastUpload:function(){return this.getInProgress()<2},processErrorMessages:function(){var t;this._rejectedFiles.type.length&&(t=1===this._rejectedFiles.type.length?"The file {files} could not be uploaded. The allowed file kinds are: {kinds}.":"The files {files} could not be uploaded. The allowed file kinds are: {kinds}.",t=Craft.t("app",t,{files:this._rejectedFiles.type.join(", "),kinds:this.allowedKinds.join(", ")}),this._rejectedFiles.type=[],Craft.cp.displayError(t)),this._rejectedFiles.size.length&&(t=1===this._rejectedFiles.size.length?"The file {files} could not be uploaded, because it exceeds the maximum upload size of {size}.":"The files {files} could not be uploaded, because they exceeded the maximum upload size of {size}.",t=Craft.t("app",t,{files:this._rejectedFiles.size.join(", "),size:this.humanFileSize(this.settings.maxFileSize)}),this._rejectedFiles.size=[],Craft.cp.displayError(t)),this._rejectedFiles.limit.length&&(t=1===this._rejectedFiles.limit.length?"The file {files} could not be uploaded, because the field limit has been reached.":"The files {files} could not be uploaded, because the field limit has been reached.",t=Craft.t("app",t,{files:this._rejectedFiles.limit.join(", ")}),this._rejectedFiles.limit=[],Craft.cp.displayError(t))},humanFileSize:function(t){var e=1024;if(t=e);return t.toFixed(1)+" "+["kB","MB","GB","TB","PB","EB","ZB","YB"][n]},_createExtensionList:function(){this._extensionList=[];for(var t=0;t=0;--i){var o=this.tryEntries[i],s=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var l=a.call(o,"catchLoc"),c=a.call(o,"finallyLoc");if(l&&c){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&a.call(r,"finallyLoc")&&this.prev=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),L(n),y}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var r=n.completion;if("throw"===r.type){var i=r.arg;L(n)}return i}}throw Error("illegal catch attempt")},delegateYield:function(t,e,r){return this.delegate={iterator:P(t),resultName:e,nextLoc:r},"next"===this.method&&(this.arg=n),y}},r}function n(t,e,n,r,i,a,o){try{var s=t[a](o),l=s.value}catch(t){return void n(t)}s.done?e(l):Promise.resolve(l).then(r,i)}Craft.AssetSelectInput=Craft.BaseElementSelectInput.extend({$uploadBtn:null,uploader:null,progressBar:null,openPreviewTimeout:null,init:function(){this.base.apply(this,arguments),this.settings.canUpload&&this._attachUploader(),this.updateAddElementsBtn(),this.addListener(this.$elementsContainer,"keydown",this._onKeyDown.bind(this))},addElements:function(t){var e=this;this.base(t);for(var n=function(){var n=t.eq(r);e.findElementActions(n,'[id*="action-image-edit"]').each((function(t,r){var i=$(r);i.off("activate").attr("id","".concat(r.id,"-").concat(Math.floor(1e6*Math.random()))),e.addListener(i,"activate",(function(){var t;null===(t=i.closest(".menu").data("disclosureMenu"))||void 0===t||t.hide(),new Craft.AssetImageEditor(n.data("id"),{allowDegreeFractions:Craft.isImagick,onSave:function(t){t.newAssetId&&e.replaceElement(n.data("id"),t.newAssetId).catch((function(){}))}})}))}))},r=0;r
      ').appendTo(this.$container)),this.$addElementBtn&&(this.$uploadBtn=$("
      ').addClass().appendTo(Garnish.$bod)),this.$prompt=$('
      ').appendTo(this.$modalContainerDiv.empty()),this.$promptMessage=$('

      ').appendTo(this.$prompt),this.$promptChoices=$('

      ').appendTo(this.$prompt),this.$promptApplyToRemainingContainer=$('
      ",{class:"entry-type-override-settings-body"}),$("
      ",{class:"fields",html:t.settingsHtml}).appendTo(n),r=$("
      ",{class:"entry-type-override-settings-footer"}),$("
      ",{class:"flex-grow"}).appendTo(r),i=Craft.ui.createButton({label:Craft.t("app","Close"),spinner:!0}).appendTo(r),Craft.ui.createSubmitButton({class:"secondary",label:Craft.t("app","Apply"),spinner:!0}).appendTo(r),a=n.add(r),(s=new Craft.Slideout(a,{containerElement:"form",containerAttributes:{action:"",method:"post",novalidate:"",class:"entry-type-override-settings"}})).on("open",(function(){Garnish.requestAnimationFrame((function(){s.$container.find(".text:first").focus()}))})),i.on("click",(function(){s.close()})),!t.headHtml){e.next=13;break}return e.next=13,Craft.appendHeadHtml(t.headHtml);case 13:if(!t.bodyHtml){e.next=16;break}return e.next=16,Craft.appendBodyHtml(t.bodyHtml);case 16:return Craft.initUiElements(s.$container),e.abrupt("return",s);case 18:case"end":return e.stop()}}),e)})))()},applySettings:function(t,e,r){var a=this;return l(o().mark((function s(){var l,c,u,h,d,f,p,g,m,v;return o().wrap((function(o){for(;;)switch(o.prev=o.next){case 0:return l=e.$container.find("button[type=submit]").addClass("loading"),e.$container.find(".field.has-errors").each((function(t,e){var n=$(e);n.removeClass("has-errors"),n.children(".input").removeClass("errors prevalidate"),n.children("ul.errors").remove()})),o.prev=2,o.prev=3,o.next=6,Craft.sendActionRequest("POST","entry-types/apply-override-settings",{data:{id:t.data("id"),settingsNamespace:r,settings:e.$container.serialize()}});case 6:u=o.sent,c=u.data,o.next=16;break;case 10:throw o.prev=10,o.t0=o.catch(3),(f=null===o.t0||void 0===o.t0||null===(h=o.t0.response)||void 0===h||null===(h=h.data)||void 0===h?void 0:h.errors)&&Object.entries(f).forEach((function(t){var n=i(t,2),r=n[0],a=n[1],o=e.$container.find('[data-error-key="'.concat(r,'"]'));o.length&&Craft.ui.addErrorsToField(o,a)})),Craft.cp.displayError(null===o.t0||void 0===o.t0||null===(d=o.t0.response)||void 0===d||null===(d=d.data)||void 0===d?void 0:d.message),o.t0;case 16:p=$(c.chipHtml),t.find(".chip-label").replaceWith(p.find(".chip-label")),g=t.find("input"),m=n({},c.config),(v=JSON.parse(g.val()).group)&&(m.group=v),g.val(JSON.stringify(m)),Craft.initUiElements(t),a.trigger("applySettings"),e.close(),e.destroy();case 27:return o.prev=27,l.removeClass("loading"),o.finish(27);case 30:case"end":return o.stop()}}),s,null,[[2,,27,30],[3,10]])})))()},renderSettings:function(t){return Object.assign(this.base(),{inputValue:this.settings.allowOverrides?JSON.stringify({id:t}):null})}},{defaults:{allowOverrides:!1}})},4004:function(){Craft.ProgressBar=Garnish.Base.extend({$progressBar:null,$innerProgressBar:null,$progressBarStatus:null,intervalManager:null,_itemCount:0,_progressPercentage:null,_processedItemCount:0,_displaySteps:!1,init:function(t,e,n){var r=this;this.setSettings(n,Craft.ProgressBar.defaults),e&&(this._displaySteps=!0),this.$progressBar=$('