From 8febfc956c2299b89f5cbbe559b76c24f5b6cc7b Mon Sep 17 00:00:00 2001 From: eabdullin Date: Wed, 15 Oct 2025 08:20:49 +0000 Subject: [PATCH] import OL 389-ds-base-3.0.6-13.el10_0 --- .389-ds-base.metadata | 3 - .gitignore | 7 +- ...nv.py-python3-magic-conflicts-with-p.patch | 53 + ...pd-mdb-max-dbs-autotuning-doesn-t-wo.patch | 311 + ...ix-dbscan-options-and-man-pages-6315.patch | 72 + ...-log-rotation-refresh-the-FD-pointer.patch | 146 + ...n-a-large-group-slow-if-substring-in.patch | 28 +- ...ugin-failure-to-handle-a-modrdn-for-.patch | 70 + ...ate-race-condition-in-paged_results_.patch | 43 + ...-an-initial-failure-subsequent-onlin.patch | 566 ++ ...g-import-of-entries-without-nsUnique.patch | 165 + ...-6596-BUG-Compilation-Regresion-6597.patch | 77 + ...upport-of-Session-Tracking-Control-i.patch | 2106 ++++++ ...6561-TLS-1.2-stickiness-in-FIPS-mode.patch | 38 + ...date-cockpit.js-code-to-the-latest-v.patch | 6214 +++++++++++++++++ 0014-Issue-6623-UI-Generic-updates-6624.patch | 138 + ...x-various-issues-with-LDAP-browser-e.patch | 1018 +++ ...Issue-6625-UI-fix-next-round-of-bugs.patch | 2900 ++++++++ 0017-Issue-6625-UI-various-fixes-part-3.patch | 2641 +++++++ ...icking-on-a-database-suffix-under-th.patch | 975 +++ ...hance-Monitor-Log-Viewer-with-Patter.patch | 1188 ++++ 0020-Issue-6568-Fix-failing-webUI-tests.patch | 159 + ...ed-to-refresh-log-settings-after-sav.patch | 255 + ...-Issue-6695-UI-fix-more-minor-issues.patch | 443 ++ ...04-UI-Add-error-log-buffering-config.patch | 116 + ...I-include-superior-objectclasses-all.patch | 474 ++ ...I-Fixed-spelling-in-cockpit-messages.patch | 701 ++ ...ports-that-are-in-use-are-used-to-up.patch | 38 + 0027-Security-fix-for-CVE-2025-2487.patch | 216 + ...e-concread-to-0.5.4-and-refactor-sta.patch | 478 ++ ...f-backend-replication-monitor-fails-.patch | 300 + ...apd-crash-during-mdb-offline-import-.patch | 47 + ...d-group-does-not-receive-memberOf-at.patch | 601 ++ ...ested-group-does-not-receive-memberO.patch | 16 +- ...-crash-with-account-policy-when-alt-.patch | 39 + ...e-enabling-user-accounts-that-reache.patch | 17 +- ...fter-configuring-invalid-filtered-ro.patch | 22 +- ...e-replica-busy-condition-in-healthch.patch | 498 ++ ...eplication-release-replica-decoding-.patch | 35 +- ...ve-error-message-when-bulk-import-co.patch | 67 + ...n-fails-when-a-user-is-member-of-mul.patch | 574 ++ ...-in-liblmdb-during-instance-shutdown.patch | 115 + ...rect-pwdpolicysubentry-returned-for-.patch | 148 + ...tion-thrown-by-dsconf-instance-repl-.patch | 114 + ...N-Access-Control-Plugin-with-wildcar.patch | 125 + ...nd-creation-cleanup-and-Database-UI-.patch | 481 ++ ...iq-allow-specifying-match-rules-in-t.patch | 6 +- ...ilter-is-not-fully-applying-matching.patch | 12 +- ...essed-log-rotation-creates-files-wit.patch | 163 + ...-if-repl-keep-alive-entry-can-not-be.patch | 98 + ...k-password-hashes-in-audit-logs-6885.patch | 814 +++ ...ss-Coverity-scan-issues-in-memberof-.patch | 76 + ...6468-CLI-Fix-default-error-log-level.patch | 31 + ...apd-crashes-when-a-referral-is-added.patch | 97 + ...y-leak-in-roles_cache_create_object_.patch | 92 + ...y-leak-in-roles_cache_create_object_.patch | 262 + ...8-AddressSanitizer-leak-in-do_search.patch | 58 + ...f-monitor-server-fails-with-ldapi-du.patch | 268 + ...e-BDB-attribute-from-MDB-DB-Monitor-.patch | 81 + ...rror-when-trying-to-display-global-D.patch | 375 + ...I-Properly-handle-disabled-NDN-cache.patch | 1201 ++++ ...-error-messages-inconsistencies-6694.patch | 533 ++ ...ser-that-is-updated-during-password-.patch | 143 + ...user-subtree-policy-creation-idempot.patch | 569 ++ ...ssSanitizer-leak-in-agmt_update_init.patch | 58 + ...est-for-numSubordinates-replication-.patch | 172 + ...bordinates-tombstoneNumSubordinates-.patch | 1448 ++++ ...arentId-attribute-is-indexed-with-im.patch | 824 +++ ...ssue-6910-Fix-latest-coverity-issues.patch | 597 ++ ...rOf-ignored-deferred-updates-with-LM.patch | 394 ++ ...deferred-memberof-update-is-enabled-.patch | 360 + ...stics-about-index-lookup-report-a-wr.patch | 225 + 389-ds-base-devel.README | 4 + 389-ds-base.spec | 1102 +++ 389-ds-base.sysusers | 3 + ...argo-1.4.3.39-3.lock => Cargo-3.0.6-3.lock | 573 +- ...an-memory-leak-in-audit-log-when-add.patch | 119 - ...nused-variable-warning-from-previous.patch | 27 - ...repl-crashes-if-enabled-while-dynami.patch | 147 - ...-5547-automember-plugin-improvements.patch | 840 --- ...rt-HAProxy-and-Instance-on-the-same-.patch | 83 - SOURCES/0006-CVE-2024-2199.patch | 108 - SOURCES/0007-CVE-2024-3657.patch | 213 - ...ve-connection-timeout-error-logging-.patch | 143 - ...onnection-timeout-error-breaks-error.patch | 44 - ...onnection-timeout-error-breaks-error.patch | 30 - ...mprove-the-performance-of-evaluation.patch | 220 - .../0012-Security-fix-for-CVE-2024-5953.patch | 163 - ...OMPACT_CL5-task-to-dsconf-replicatio.patch | 178 - ...-entry-RDN-is-identical-to-the-suffi.patch | 55 - ...ry-Could-not-open-id2entry-err-0-at-.patch | 267 - ...erge-issue-in-389-ds-base-2.1-for-ds.patch | 32 - ...e-test_referral_subsuffix-from-ds_lo.patch | 214 - ...f-an-entry-RDN-is-identical-to-the-s.patch | 90 - SOURCES/0019-Issue-6417-2nd-fix-typo.patch | 40 - ...f-an-entry-RDN-is-identical-to-the-s.patch | 75 - ...condition-with-Paged-Result-searches.patch | 297 - ...herry-pick-issue-race-condition-in-P.patch | 29 - ...hen-memberof-is-enabled-defer-update.patch | 3998 ----------- ...us-errors-when-using-extended-matchi.patch | 651 -- ...6004-idletimeout-may-be-ignored-6005.patch | 230 - ...-2nd-idletimeout-may-be-ignored-6569.patch | 69 - ...-Fix-double-free-in-USN-cleanup-task.patch | 52 - ...f-incorrectly-setting-up-Pass-Throug.patch | 38 - ...idden-v-and-j-options-to-each-CLI-su.patch | 3275 --------- ...ve-dsidm-CLI-No-Such-Entry-handling-.patch | 319 - ...e-dsidm-to-prioritize-basedn-from-.d.patch | 52 - ...agent-fails-to-start-because-of-perm.patch | 520 -- ...DAP-version-autodetection-doesn-t-wo.patch | 60 - .../0036-Issue-1925-Add-a-CI-test-5936.patch | 245 - ...arious-errors-when-using-extended-ma.patch | 75 - ...arious-errors-when-using-extended-ma.patch | 45 - ...arious-errors-when-using-extended-ma.patch | 72 - ...9-Configure-replication-for-multiple.patch | 357 - .../0042-Issue-6655-fix-merge-conflict.patch | 26 - ...d-group-does-not-receive-memberOf-at.patch | 291 - ...-to-run-replication-status-without-a.patch | 70 - SOURCES/389-ds-base-devel.README | 4 - SOURCES/389-ds-base-git.sh | 16 - SPECS/389-ds-base.spec | 1081 --- sources | 4 + 121 files changed, 35128 insertions(+), 15313 deletions(-) delete mode 100644 .389-ds-base.metadata create mode 100644 0001-Issue-6544-logconv.py-python3-magic-conflicts-with-p.patch create mode 100644 0002-Issue-6374-nsslapd-mdb-max-dbs-autotuning-doesn-t-wo.patch create mode 100644 0003-Issue-6090-Fix-dbscan-options-and-man-pages-6315.patch create mode 100644 0004-Issue-6489-After-log-rotation-refresh-the-FD-pointer.patch rename SOURCES/0024-Issue-6436-MOD-on-a-large-group-slow-if-substring-in.patch => 0005-Issue-6436-MOD-on-a-large-group-slow-if-substring-in.patch (93%) create mode 100644 0006-Issue-6566-RI-plugin-failure-to-handle-a-modrdn-for-.patch create mode 100644 0007-Issue-6258-Mitigate-race-condition-in-paged_results_.patch create mode 100644 0008-Issue-6229-After-an-initial-failure-subsequent-onlin.patch create mode 100644 0009-Issue-6554-During-import-of-entries-without-nsUnique.patch create mode 100644 0010-Issue-6596-BUG-Compilation-Regresion-6597.patch create mode 100644 0011-Issue-6367-RFE-support-of-Session-Tracking-Control-i.patch create mode 100644 0012-Issue-6561-TLS-1.2-stickiness-in-FIPS-mode.patch create mode 100644 0013-Issue-6375-UI-Update-cockpit.js-code-to-the-latest-v.patch create mode 100644 0014-Issue-6623-UI-Generic-updates-6624.patch create mode 100644 0015-Issue-6625-UI-fix-various-issues-with-LDAP-browser-e.patch create mode 100644 0016-Issue-6625-UI-fix-next-round-of-bugs.patch create mode 100644 0017-Issue-6625-UI-various-fixes-part-3.patch create mode 100644 0018-Issue-6429-UI-clicking-on-a-database-suffix-under-th.patch create mode 100644 0019-Issue-6656-UI-Enhance-Monitor-Log-Viewer-with-Patter.patch create mode 100644 0020-Issue-6568-Fix-failing-webUI-tests.patch create mode 100644 0021-Issue-6665-UI-Need-to-refresh-log-settings-after-sav.patch create mode 100644 0022-Issue-6695-UI-fix-more-minor-issues.patch create mode 100644 0023-Issue-6704-UI-Add-error-log-buffering-config.patch create mode 100644 0024-Issue-6700-CLI-UI-include-superior-objectclasses-all.patch create mode 100644 0025-Issue-6464-UI-Fixed-spelling-in-cockpit-messages.patch create mode 100644 0026-Issue-6481-When-ports-that-are-in-use-are-used-to-up.patch create mode 100644 0027-Security-fix-for-CVE-2025-2487.patch create mode 100644 0028-Issue-6553-Update-concread-to-0.5.4-and-refactor-sta.patch create mode 100644 0029-Issue-6715-dsconf-backend-replication-monitor-fails-.patch create mode 100644 0030-Issue-6713-ns-slapd-crash-during-mdb-offline-import-.patch create mode 100644 0031-Issue-6571-Nested-group-does-not-receive-memberOf-at.patch rename SOURCES/0044-Issue-6571-2nd-Nested-group-does-not-receive-memberO.patch => 0032-Issue-6571-2nd-Nested-group-does-not-receive-memberO.patch (95%) create mode 100644 0033-Issue-6288-dsidm-crash-with-account-policy-when-alt-.patch rename SOURCES/0046-Issue-6686-CLI-Re-enabling-user-accounts-that-reache.patch => 0034-Issue-6686-CLI-Re-enabling-user-accounts-that-reache.patch (97%) rename SOURCES/0045-Issue-6698-NPE-after-configuring-invalid-filtered-ro.patch => 0035-Issue-6698-NPE-after-configuring-invalid-filtered-ro.patch (90%) create mode 100644 0036-Issue-6626-Ignore-replica-busy-condition-in-healthch.patch rename SOURCES/0041-Issue-6655-fix-replication-release-replica-decoding-.patch => 0037-Issue-6655-fix-replication-release-replica-decoding-.patch (80%) create mode 100644 0038-Issue-6787-Improve-error-message-when-bulk-import-co.patch create mode 100644 0039-Issue-6641-modrdn-fails-when-a-user-is-member-of-mul.patch create mode 100644 0040-Issue-6791-crash-in-liblmdb-during-instance-shutdown.patch create mode 100644 0041-Issue-6819-Incorrect-pwdpolicysubentry-returned-for-.patch create mode 100644 0042-Issue-6736-Exception-thrown-by-dsconf-instance-repl-.patch create mode 100644 0043-Issue-6825-RootDN-Access-Control-Plugin-with-wildcar.patch create mode 100644 0044-Issue-6822-Backend-creation-cleanup-and-Database-UI-.patch rename SOURCES/0048-Issue-6857-uiduniq-allow-specifying-match-rules-in-t.patch => 0045-Issue-6857-uiduniq-allow-specifying-match-rules-in-t.patch (90%) rename SOURCES/0049-Issue-6859-str2filter-is-not-fully-applying-matching.patch => 0046-Issue-6859-str2filter-is-not-fully-applying-matching.patch (98%) create mode 100644 0047-Issue-6872-compressed-log-rotation-creates-files-wit.patch create mode 100644 0048-Issue-6895-Crash-if-repl-keep-alive-entry-can-not-be.patch create mode 100644 0049-Issue-6884-Mask-password-hashes-in-audit-logs-6885.patch create mode 100644 0050-Issue-6339-Address-Coverity-scan-issues-in-memberof-.patch create mode 100644 0051-Issue-6468-CLI-Fix-default-error-log-level.patch create mode 100644 0052-Issue-6768-ns-slapd-crashes-when-a-referral-is-added.patch create mode 100644 0053-Issue-6778-Memory-leak-in-roles_cache_create_object_.patch create mode 100644 0054-Issue-6778-Memory-leak-in-roles_cache_create_object_.patch create mode 100644 0055-Issue-6848-AddressSanitizer-leak-in-do_search.patch create mode 100644 0056-Issue-6940-dsconf-monitor-server-fails-with-ldapi-du.patch create mode 100644 0057-Issue-6720-Remove-BDB-attribute-from-MDB-DB-Monitor-.patch create mode 100644 0058-Issue-6614-CLI-Error-when-trying-to-display-global-D.patch create mode 100644 0059-Issue-6756-CLI-UI-Properly-handle-disabled-NDN-cache.patch create mode 100644 0060-Issue-6693-Fix-error-messages-inconsistencies-6694.patch create mode 100644 0061-Issue-6893-Log-user-that-is-updated-during-password-.patch create mode 100644 0062-Issue-6936-Make-user-subtree-policy-creation-idempot.patch create mode 100644 0063-Issue-6865-AddressSanitizer-leak-in-agmt_update_init.patch create mode 100644 0064-Issue-6594-Add-test-for-numSubordinates-replication-.patch create mode 100644 0065-Issue-6919-numSubordinates-tombstoneNumSubordinates-.patch create mode 100644 0066-Issue-6928-The-parentId-attribute-is-indexed-with-im.patch create mode 100644 0067-Issue-6910-Fix-latest-coverity-issues.patch create mode 100644 0068-Issue-7014-memberOf-ignored-deferred-updates-with-LM.patch create mode 100644 0069-Issue-6933-When-deferred-memberof-update-is-enabled-.patch create mode 100644 0070-Issue-6764-statistics-about-index-lookup-report-a-wr.patch create mode 100644 389-ds-base-devel.README create mode 100644 389-ds-base.spec create mode 100644 389-ds-base.sysusers rename SOURCES/Cargo-1.4.3.39-3.lock => Cargo-3.0.6-3.lock (71%) delete mode 100644 SOURCES/0001-issue-5647-covscan-memory-leak-in-audit-log-when-add.patch delete mode 100644 SOURCES/0002-Issue-5647-Fix-unused-variable-warning-from-previous.patch delete mode 100644 SOURCES/0003-Issue-5407-sync_repl-crashes-if-enabled-while-dynami.patch delete mode 100644 SOURCES/0004-Issue-5547-automember-plugin-improvements.patch delete mode 100644 SOURCES/0005-Issue-3527-Support-HAProxy-and-Instance-on-the-same-.patch delete mode 100644 SOURCES/0006-CVE-2024-2199.patch delete mode 100644 SOURCES/0007-CVE-2024-3657.patch delete mode 100644 SOURCES/0008-Issue-6096-Improve-connection-timeout-error-logging-.patch delete mode 100644 SOURCES/0009-Issue-6103-New-connection-timeout-error-breaks-error.patch delete mode 100644 SOURCES/0010-Issue-6103-New-connection-timeout-error-breaks-error.patch delete mode 100644 SOURCES/0011-Issue-6172-RFE-improve-the-performance-of-evaluation.patch delete mode 100644 SOURCES/0012-Security-fix-for-CVE-2024-5953.patch delete mode 100644 SOURCES/0013-Issue-4778-Add-COMPACT_CL5-task-to-dsconf-replicatio.patch delete mode 100644 SOURCES/0014-Issue-6417-If-an-entry-RDN-is-identical-to-the-suffi.patch delete mode 100644 SOURCES/0015-Issue-6224-d2entry-Could-not-open-id2entry-err-0-at-.patch delete mode 100644 SOURCES/0016-Issue-6224-Fix-merge-issue-in-389-ds-base-2.1-for-ds.patch delete mode 100644 SOURCES/0017-Issue-6224-Remove-test_referral_subsuffix-from-ds_lo.patch delete mode 100644 SOURCES/0018-Issue-6417-2nd-If-an-entry-RDN-is-identical-to-the-s.patch delete mode 100644 SOURCES/0019-Issue-6417-2nd-fix-typo.patch delete mode 100644 SOURCES/0020-Issue-6417-3rd-If-an-entry-RDN-is-identical-to-the-s.patch delete mode 100644 SOURCES/0021-Issue-6509-Race-condition-with-Paged-Result-searches.patch delete mode 100644 SOURCES/0022-Issue-6509-Fix-cherry-pick-issue-race-condition-in-P.patch delete mode 100644 SOURCES/0023-Issue-6304-RFE-when-memberof-is-enabled-defer-update.patch delete mode 100644 SOURCES/0025-Issue-6494-Various-errors-when-using-extended-matchi.patch delete mode 100644 SOURCES/0026-Issue-6004-idletimeout-may-be-ignored-6005.patch delete mode 100644 SOURCES/0027-Issue-6004-2nd-idletimeout-may-be-ignored-6569.patch delete mode 100644 SOURCES/0028-Issue-6485-Fix-double-free-in-USN-cleanup-task.patch delete mode 100644 SOURCES/0030-Issue-5841-dsconf-incorrectly-setting-up-Pass-Throug.patch delete mode 100644 SOURCES/0031-Issue-6067-Add-hidden-v-and-j-options-to-each-CLI-su.patch delete mode 100644 SOURCES/0032-Issue-6067-Improve-dsidm-CLI-No-Such-Entry-handling-.patch delete mode 100644 SOURCES/0033-Issue-6067-Update-dsidm-to-prioritize-basedn-from-.d.patch delete mode 100644 SOURCES/0034-Issue-6155-ldap-agent-fails-to-start-because-of-perm.patch delete mode 100644 SOURCES/0035-Issue-5305-OpenLDAP-version-autodetection-doesn-t-wo.patch delete mode 100644 SOURCES/0036-Issue-1925-Add-a-CI-test-5936.patch delete mode 100644 SOURCES/0037-Issue-6494-2nd-Various-errors-when-using-extended-ma.patch delete mode 100644 SOURCES/0038-Issue-6494-3rd-Various-errors-when-using-extended-ma.patch delete mode 100644 SOURCES/0039-Issue-6494-4th-Various-errors-when-using-extended-ma.patch delete mode 100644 SOURCES/0040-Issue-6497-lib389-Configure-replication-for-multiple.patch delete mode 100644 SOURCES/0042-Issue-6655-fix-merge-conflict.patch delete mode 100644 SOURCES/0043-Issue-6571-Nested-group-does-not-receive-memberOf-at.patch delete mode 100644 SOURCES/0047-Issue-6302-Allow-to-run-replication-status-without-a.patch delete mode 100644 SOURCES/389-ds-base-devel.README delete mode 100644 SOURCES/389-ds-base-git.sh delete mode 100644 SPECS/389-ds-base.spec create mode 100644 sources diff --git a/.389-ds-base.metadata b/.389-ds-base.metadata deleted file mode 100644 index fcd3114..0000000 --- a/.389-ds-base.metadata +++ /dev/null @@ -1,3 +0,0 @@ -bd9aab32d9cbf9231058d585479813f3420dc872 SOURCES/389-ds-base-1.4.3.39.tar.bz2 -1c8f2d0dfbf39fa8cd86363bf3314351ab21f8d4 SOURCES/jemalloc-5.3.0.tar.bz2 -8d3275209f2f8e1a69053340930ad1fb037d61fb SOURCES/vendor-1.4.3.39-3.tar.gz diff --git a/.gitignore b/.gitignore index f182e5a..e31433e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ -SOURCES/389-ds-base-1.4.3.39.tar.bz2 -SOURCES/jemalloc-5.3.0.tar.bz2 -SOURCES/vendor-1.4.3.39-3.tar.gz +389-ds-base-3.0.6.tar.bz2 +jemalloc-5.3.0.tar.bz2 +libdb-5.3.28-59.tar.bz2 +vendor-3.0.6-3.tar.gz diff --git a/0001-Issue-6544-logconv.py-python3-magic-conflicts-with-p.patch b/0001-Issue-6544-logconv.py-python3-magic-conflicts-with-p.patch new file mode 100644 index 0000000..6657c79 --- /dev/null +++ b/0001-Issue-6544-logconv.py-python3-magic-conflicts-with-p.patch @@ -0,0 +1,53 @@ +From fc7f5aa01e245c7c2e35b01d171dbd5a6dc75db4 Mon Sep 17 00:00:00 2001 +From: Viktor Ashirov +Date: Sat, 25 Jan 2025 13:54:33 +0100 +Subject: [PATCH] Issue 6544 - logconv.py: python3-magic conflicts with + python3-file-magic + +Bug Description: +python3-magic and python3-file-magic can't be installed simultaneously, +python3-magic is not packaged for EL10. + +Fix Description: +Use python3-file-magic instead. + +Issue identified and fix suggested by Adam Williamson. + +Fixes: https://github.com/389ds/389-ds-base/issues/6544 + +Reviewed by: @mreynolds389 (Thanks!) +--- + ldap/admin/src/logconv.py | 3 +-- + rpm/389-ds-base.spec.in | 2 +- + 2 files changed, 2 insertions(+), 3 deletions(-) + +diff --git a/ldap/admin/src/logconv.py b/ldap/admin/src/logconv.py +index 566f9af38..2fb5bb8c1 100755 +--- a/ldap/admin/src/logconv.py ++++ b/ldap/admin/src/logconv.py +@@ -1798,8 +1798,7 @@ class logAnalyser: + return None + + try: +- mime = magic.Magic(mime=True) +- filetype = mime.from_file(filepath) ++ filetype = magic.detect_from_filename(filepath).mime_type + + # List of supported compression types + compressed_mime_types = [ +diff --git a/rpm/389-ds-base.spec.in b/rpm/389-ds-base.spec.in +index 3146b9186..3c6e95938 100644 +--- a/rpm/389-ds-base.spec.in ++++ b/rpm/389-ds-base.spec.in +@@ -298,7 +298,7 @@ Requires: json-c + # Log compression + Requires: zlib-devel + # logconv.py, MIME type +-Requires: python-magic ++Requires: python3-file-magic + # Picks up our systemd deps. + %{?systemd_requires} + +-- +2.48.0 + diff --git a/0002-Issue-6374-nsslapd-mdb-max-dbs-autotuning-doesn-t-wo.patch b/0002-Issue-6374-nsslapd-mdb-max-dbs-autotuning-doesn-t-wo.patch new file mode 100644 index 0000000..da75320 --- /dev/null +++ b/0002-Issue-6374-nsslapd-mdb-max-dbs-autotuning-doesn-t-wo.patch @@ -0,0 +1,311 @@ +From 1aabba9b17f99eb1a460be3305aad4b7099b9fe6 Mon Sep 17 00:00:00 2001 +From: progier389 +Date: Wed, 13 Nov 2024 15:31:35 +0100 +Subject: [PATCH] Issue 6374 - nsslapd-mdb-max-dbs autotuning doesn't work + properly (#6400) + +* Issue 6374 - nsslapd-mdb-max-dbs autotuning doesn't work properly + +Several issues: + +After restarting the server nsslapd-mdb-max-dbs may not be high enough to add a new backend +because the value computation is wrong. +dbscan fails to open the database if nsslapd-mdb-max-dbs has been increased. +dbscan crashes when closing the database (typically when using -S) +When starting the instance the nsslapd-mdb-max-dbs parameter is increased to ensure that a new backend may be added. +When dse.ldif path is not specified, the db environment is now open using the INFO.mdb data instead of using the default values. +synchronization between thread closure and database context destruction is hardened +Issue: #6374 + +Reviewed by: @tbordaz , @vashirov (Thanks!) + +(cherry picked from commit 56cd3389da608a3f6eeee58d20dffbcd286a8033) +--- + .../tests/suites/config/config_test.py | 86 +++++++++++++++++++ + ldap/servers/slapd/back-ldbm/back-ldbm.h | 2 + + .../slapd/back-ldbm/db-mdb/mdb_config.c | 17 ++-- + .../back-ldbm/db-mdb/mdb_import_threads.c | 9 +- + .../slapd/back-ldbm/db-mdb/mdb_instance.c | 8 ++ + ldap/servers/slapd/back-ldbm/dbimpl.c | 2 +- + ldap/servers/slapd/back-ldbm/import.c | 14 ++- + 7 files changed, 128 insertions(+), 10 deletions(-) + +diff --git a/dirsrvtests/tests/suites/config/config_test.py b/dirsrvtests/tests/suites/config/config_test.py +index c3e26eed4..08544594f 100644 +--- a/dirsrvtests/tests/suites/config/config_test.py ++++ b/dirsrvtests/tests/suites/config/config_test.py +@@ -17,6 +17,7 @@ from lib389.topologies import topology_m2, topology_st as topo + from lib389.utils import * + from lib389._constants import DN_CONFIG, DEFAULT_SUFFIX, DEFAULT_BENAME + from lib389._mapped_object import DSLdapObjects ++from lib389.agreement import Agreements + from lib389.cli_base import FakeArgs + from lib389.cli_conf.backend import db_config_set + from lib389.idm.user import UserAccounts, TEST_USER_PROPERTIES +@@ -27,6 +28,8 @@ from lib389.cos import CosPointerDefinitions, CosTemplates + from lib389.backend import Backends, DatabaseConfig + from lib389.monitor import MonitorLDBM, Monitor + from lib389.plugins import ReferentialIntegrityPlugin ++from lib389.replica import BootstrapReplicationManager, Replicas ++from lib389.passwd import password_generate + + pytestmark = pytest.mark.tier0 + +@@ -36,6 +39,8 @@ PSTACK_CMD = '/usr/bin/pstack' + logging.getLogger(__name__).setLevel(logging.INFO) + log = logging.getLogger(__name__) + ++DEBUGGING = os.getenv("DEBUGGING", default=False) ++ + @pytest.fixture(scope="module") + def big_file(): + TEMP_BIG_FILE = '' +@@ -813,6 +818,87 @@ def test_numlisteners_limit(topo): + assert numlisteners[0] == '4' + + ++def bootstrap_replication(inst_from, inst_to, creds): ++ manager = BootstrapReplicationManager(inst_to) ++ rdn_val = 'replication manager' ++ if manager.exists(): ++ manager.delete() ++ manager.create(properties={ ++ 'cn': rdn_val, ++ 'uid': rdn_val, ++ 'userPassword': creds ++ }) ++ for replica in Replicas(inst_to).list(): ++ replica.remove_all('nsDS5ReplicaBindDNGroup') ++ replica.replace('nsDS5ReplicaBindDN', manager.dn) ++ for agmt in Agreements(inst_from).list(): ++ agmt.replace('nsDS5ReplicaBindDN', manager.dn) ++ agmt.replace('nsDS5ReplicaCredentials', creds) ++ ++ ++@pytest.mark.skipif(get_default_db_lib() != "mdb", reason="This test requires lmdb") ++def test_lmdb_autotuned_maxdbs(topology_m2, request): ++ """Verify that after restart, nsslapd-mdb-max-dbs is large enough to add a new backend. ++ ++ :id: 0272d432-9080-11ef-8f40-482ae39447e5 ++ :setup: Two suppliers configuration ++ :steps: ++ 1. loop 20 times ++ 3. In 1 loop: restart instance ++ 3. In 1 loop: add a new backend ++ 4. In 1 loop: check that instance is still alive ++ :expectedresults: ++ 1. Success ++ 2. Success ++ 3. Success ++ 4. Success ++ """ ++ ++ s1 = topology_m2.ms["supplier1"] ++ s2 = topology_m2.ms["supplier2"] ++ ++ backends = Backends(s1) ++ db_config = DatabaseConfig(s1) ++ # Generate the teardown finalizer ++ belist = [] ++ creds=password_generate() ++ bootstrap_replication(s2, s1, creds) ++ bootstrap_replication(s1, s2, creds) ++ ++ def fin(): ++ s1.start() ++ for be in belist: ++ be.delete() ++ ++ if not DEBUGGING: ++ request.addfinalizer(fin) ++ ++ # 1. Set autotuning (off-line to be able to decrease the value) ++ s1.stop() ++ dse_ldif = DSEldif(s1) ++ dse_ldif.replace(db_config.dn, 'nsslapd-mdb-max-dbs', '0') ++ os.remove(f'{s1.dbdir}/data.mdb') ++ s1.start() ++ ++ # 2. Reinitialize the db: ++ log.info("Bulk import...") ++ agmt = Agreements(s2).list()[0] ++ agmt.begin_reinit() ++ (done, error) = agmt.wait_reinit() ++ log.info(f'Bulk importresult is ({done}, {error})') ++ assert done is True ++ assert error is False ++ ++ # 3. loop 20 times ++ for idx in range(20): ++ s1.restart() ++ log.info(f'Adding backend test{idx}') ++ belist.append(backends.create(properties={'cn': f'test{idx}', ++ 'nsslapd-suffix': f'dc=test{idx}'})) ++ assert s1.status() ++ ++ ++ + if __name__ == '__main__': + # Run isolated + # -s for DEBUG mode +diff --git a/ldap/servers/slapd/back-ldbm/back-ldbm.h b/ldap/servers/slapd/back-ldbm/back-ldbm.h +index 8fea63e35..35d0ece04 100644 +--- a/ldap/servers/slapd/back-ldbm/back-ldbm.h ++++ b/ldap/servers/slapd/back-ldbm/back-ldbm.h +@@ -896,4 +896,6 @@ typedef struct _back_search_result_set + ((L)->size == (R)->size && !memcmp((L)->data, (R)->data, (L)->size)) + + typedef int backend_implement_init_fn(struct ldbminfo *li, config_info *config_array); ++ ++pthread_mutex_t *get_import_ctx_mutex(); + #endif /* _back_ldbm_h_ */ +diff --git a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_config.c b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_config.c +index 351f54037..1f7b71442 100644 +--- a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_config.c ++++ b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_config.c +@@ -83,7 +83,7 @@ dbmdb_compute_limits(struct ldbminfo *li) + uint64_t total_space = 0; + uint64_t avail_space = 0; + uint64_t cur_dbsize = 0; +- int nbchangelogs = 0; ++ int nbvlvs = 0; + int nbsuffixes = 0; + int nbindexes = 0; + int nbagmt = 0; +@@ -99,8 +99,8 @@ dbmdb_compute_limits(struct ldbminfo *li) + * But some tunable may be autotuned. + */ + if (dbmdb_count_config_entries("(objectClass=nsMappingTree)", &nbsuffixes) || +- dbmdb_count_config_entries("(objectClass=nsIndex)", &nbsuffixes) || +- dbmdb_count_config_entries("(&(objectClass=nsds5Replica)(nsDS5Flags=1))", &nbchangelogs) || ++ dbmdb_count_config_entries("(objectClass=nsIndex)", &nbindexes) || ++ dbmdb_count_config_entries("(objectClass=vlvIndex)", &nbvlvs) || + dbmdb_count_config_entries("(objectClass=nsds5replicationagreement)", &nbagmt)) { + /* error message is already logged */ + return 1; +@@ -120,8 +120,15 @@ dbmdb_compute_limits(struct ldbminfo *li) + + info->pagesize = sysconf(_SC_PAGE_SIZE); + limits->min_readers = config_get_threadnumber() + nbagmt + DBMDB_READERS_MARGIN; +- /* Default indexes are counted in "nbindexes" so we should always have enough resource to add 1 new suffix */ +- limits->min_dbs = nbsuffixes + nbindexes + nbchangelogs + DBMDB_DBS_MARGIN; ++ /* ++ * For each suffix there are 4 databases instances: ++ * long-entryrdn, replication_changelog, id2entry and ancestorid ++ * then the indexes and the vlv and vlv cache ++ * ++ * Default indexes are counted in "nbindexes" so we should always have enough ++ * resource to add 1 new suffix ++ */ ++ limits->min_dbs = 4*nbsuffixes + nbindexes + 2*nbvlvs + DBMDB_DBS_MARGIN; + + total_space = ((uint64_t)(buf.f_blocks)) * ((uint64_t)(buf.f_bsize)); + avail_space = ((uint64_t)(buf.f_bavail)) * ((uint64_t)(buf.f_bsize)); +diff --git a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c +index 8c879da31..707a110c5 100644 +--- a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c ++++ b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c +@@ -4312,9 +4312,12 @@ dbmdb_import_init_writer(ImportJob *job, ImportRole_t role) + void + dbmdb_free_import_ctx(ImportJob *job) + { +- if (job->writer_ctx) { +- ImportCtx_t *ctx = job->writer_ctx; +- job->writer_ctx = NULL; ++ ImportCtx_t *ctx = NULL; ++ pthread_mutex_lock(get_import_ctx_mutex()); ++ ctx = job->writer_ctx; ++ job->writer_ctx = NULL; ++ pthread_mutex_unlock(get_import_ctx_mutex()); ++ if (ctx) { + pthread_mutex_destroy(&ctx->workerq.mutex); + pthread_cond_destroy(&ctx->workerq.cv); + slapi_ch_free((void**)&ctx->workerq.slots); +diff --git a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_instance.c b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_instance.c +index 6386ecf06..05f1e348d 100644 +--- a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_instance.c ++++ b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_instance.c +@@ -287,6 +287,13 @@ int add_dbi(dbi_open_ctx_t *octx, backend *be, const char *fname, int flags) + slapi_ch_free((void**)&treekey.dbname); + return octx->rc; + } ++ if (treekey.dbi >= ctx->dsecfg.max_dbs) { ++ octx->rc = MDB_DBS_FULL; ++ slapi_log_err(SLAPI_LOG_ERR, "add_dbi", "Failed to open database instance %s slots: %d/%d. Error is %d: %s.\n", ++ treekey.dbname, treekey.dbi, ctx->dsecfg.max_dbs, octx->rc, mdb_strerror(octx->rc)); ++ slapi_ch_free((void**)&treekey.dbname); ++ return octx->rc; ++ } + if (octx->ai && octx->ai->ai_key_cmp_fn) { + octx->rc = dbmdb_update_dbi_cmp_fn(ctx, &treekey, octx->ai->ai_key_cmp_fn, octx->txn); + if (octx->rc) { +@@ -689,6 +696,7 @@ int dbmdb_make_env(dbmdb_ctx_t *ctx, int readOnly, mdb_mode_t mode) + rc = dbmdb_write_infofile(ctx); + } else { + /* No Config ==> read it from info file */ ++ ctx->dsecfg = ctx->startcfg; + } + if (rc) { + return rc; +diff --git a/ldap/servers/slapd/back-ldbm/dbimpl.c b/ldap/servers/slapd/back-ldbm/dbimpl.c +index 86df986bd..f3bf68a9f 100644 +--- a/ldap/servers/slapd/back-ldbm/dbimpl.c ++++ b/ldap/servers/slapd/back-ldbm/dbimpl.c +@@ -505,7 +505,7 @@ int dblayer_show_statistics(const char *dbimpl_name, const char *dbhome, FILE *f + li->li_plugin = be->be_database; + li->li_plugin->plg_name = (char*) "back-ldbm-dbimpl"; + li->li_plugin->plg_libpath = (char*) "libback-ldbm"; +- li->li_directory = (char*)dbhome; ++ li->li_directory = get_li_directory(dbhome); + + /* Initialize database plugin */ + rc = dbimpl_setup(li, dbimpl_name); +diff --git a/ldap/servers/slapd/back-ldbm/import.c b/ldap/servers/slapd/back-ldbm/import.c +index 2bb8cb581..30ec462fa 100644 +--- a/ldap/servers/slapd/back-ldbm/import.c ++++ b/ldap/servers/slapd/back-ldbm/import.c +@@ -27,6 +27,9 @@ + #define NEED_DN_NORM_SP -25 + #define NEED_DN_NORM_BT -26 + ++/* Protect against import context destruction */ ++static pthread_mutex_t import_ctx_mutex = PTHREAD_MUTEX_INITIALIZER; ++ + + /********** routines to manipulate the entry fifo **********/ + +@@ -143,6 +146,14 @@ ldbm_back_wire_import(Slapi_PBlock *pb) + + /* Threads management */ + ++/* Return the mutex that protects against import context destruction */ ++pthread_mutex_t * ++get_import_ctx_mutex() ++{ ++ return &import_ctx_mutex; ++} ++ ++ + /* tell all the threads to abort */ + void + import_abort_all(ImportJob *job, int wait_for_them) +@@ -151,7 +162,7 @@ import_abort_all(ImportJob *job, int wait_for_them) + + /* tell all the worker threads to abort */ + job->flags |= FLAG_ABORT; +- ++ pthread_mutex_lock(&import_ctx_mutex); + for (worker = job->worker_list; worker; worker = worker->next) + worker->command = ABORT; + +@@ -167,6 +178,7 @@ import_abort_all(ImportJob *job, int wait_for_them) + } + } + } ++ pthread_mutex_unlock(&import_ctx_mutex); + } + + +-- +2.48.0 + diff --git a/0003-Issue-6090-Fix-dbscan-options-and-man-pages-6315.patch b/0003-Issue-6090-Fix-dbscan-options-and-man-pages-6315.patch new file mode 100644 index 0000000..db5eb9a --- /dev/null +++ b/0003-Issue-6090-Fix-dbscan-options-and-man-pages-6315.patch @@ -0,0 +1,72 @@ +From 6b80ba631161219093267e8e4c885bfc392d3d61 Mon Sep 17 00:00:00 2001 +From: progier389 +Date: Fri, 6 Sep 2024 14:45:06 +0200 +Subject: [PATCH] Issue 6090 - Fix dbscan options and man pages (#6315) + +* Issue 6090 - Fix dbscan options and man pages + +dbscan -d option is dangerously confusing as it removes a database instance while in db_stat it identify the database +(cf issue #5609 ). +This fix implements long options in dbscan, rename -d in --remove, and requires a new --do-it option for action that change the database content. +The fix should also align both the usage and the dbscan man page with the new set of options + +Issue: #6090 + +Reviewed by: @tbordaz, @droideck (Thanks!) + +(cherry picked from commit 25e1d16887ebd299dfe0088080b9ee0deec1e41f) +--- + ldap/servers/slapd/back-ldbm/dbimpl.c | 5 ++++- + src/lib389/lib389/cli_ctl/dblib.py | 13 ++++++++++++- + 2 files changed, 16 insertions(+), 2 deletions(-) + +diff --git a/ldap/servers/slapd/back-ldbm/dbimpl.c b/ldap/servers/slapd/back-ldbm/dbimpl.c +index f3bf68a9f..83662df8c 100644 +--- a/ldap/servers/slapd/back-ldbm/dbimpl.c ++++ b/ldap/servers/slapd/back-ldbm/dbimpl.c +@@ -481,7 +481,10 @@ int dblayer_private_close(Slapi_Backend **be, dbi_env_t **env, dbi_db_t **db) + slapi_ch_free_string(&li->li_directory); + slapi_ch_free((void**)&li->li_dblayer_private); + slapi_ch_free((void**)&li->li_dblayer_config); +- ldbm_config_destroy(li); ++ if (dblayer_is_lmdb(*be)) { ++ /* Generate use after free and double free in bdb case */ ++ ldbm_config_destroy(li); ++ } + slapi_ch_free((void**)&(*be)->be_database); + slapi_ch_free((void**)&(*be)->be_instance_info); + slapi_ch_free((void**)be); +diff --git a/src/lib389/lib389/cli_ctl/dblib.py b/src/lib389/lib389/cli_ctl/dblib.py +index 053a72d61..318ae5ae9 100644 +--- a/src/lib389/lib389/cli_ctl/dblib.py ++++ b/src/lib389/lib389/cli_ctl/dblib.py +@@ -199,6 +199,14 @@ def run_dbscan(args): + return output + + ++def does_dbscan_need_do_it(): ++ prefix = os.environ.get('PREFIX', "") ++ prog = f'{prefix}/bin/dbscan' ++ args = [ prog, '-h' ] ++ output = subprocess.run(args, encoding='utf-8', stdout=subprocess.PIPE, stderr=subprocess.STDOUT) ++ return '--do-it' in output.stdout ++ ++ + def export_changelog(be, dblib): + # Export backend changelog + if not be['has_changelog']: +@@ -217,7 +225,10 @@ def import_changelog(be, dblib): + try: + cl5dbname = be['eccl5dbname'] if dblib == "bdb" else be['cl5dbname'] + _log.info(f"Importing changelog {cl5dbname} from {be['cl5name']}") +- run_dbscan(['-D', dblib, '-f', cl5dbname, '--import', be['cl5name'], '--do-it']) ++ if does_dbscan_need_do_it(): ++ run_dbscan(['-D', dblib, '-f', cl5dbname, '-I', be['cl5name'], '--do-it']) ++ else: ++ run_dbscan(['-D', dblib, '-f', cl5dbname, '-I', be['cl5name']]) + return True + except subprocess.CalledProcessError as e: + return False +-- +2.48.0 + diff --git a/0004-Issue-6489-After-log-rotation-refresh-the-FD-pointer.patch b/0004-Issue-6489-After-log-rotation-refresh-the-FD-pointer.patch new file mode 100644 index 0000000..61c21ff --- /dev/null +++ b/0004-Issue-6489-After-log-rotation-refresh-the-FD-pointer.patch @@ -0,0 +1,146 @@ +From dc8032856d51c382e266eea72f66284e70a0e40c Mon Sep 17 00:00:00 2001 +From: Mark Reynolds +Date: Fri, 31 Jan 2025 08:54:27 -0500 +Subject: [PATCH] Issue 6489 - After log rotation refresh the FD pointer + +Description: + +When flushing a log buffer we get a FD for log prior to checking if the +log should be rotated. If the log is rotated that FD reference is now +invalid, and it needs to be refrehed before proceeding + +Relates: https://github.com/389ds/389-ds-base/issues/6489 + +Reviewed by: tbordaz(Thanks!) +--- + .../suites/logging/log_flush_rotation_test.py | 81 +++++++++++++++++++ + ldap/servers/slapd/log.c | 18 +++++ + 2 files changed, 99 insertions(+) + create mode 100644 dirsrvtests/tests/suites/logging/log_flush_rotation_test.py + +diff --git a/dirsrvtests/tests/suites/logging/log_flush_rotation_test.py b/dirsrvtests/tests/suites/logging/log_flush_rotation_test.py +new file mode 100644 +index 000000000..b33a622e1 +--- /dev/null ++++ b/dirsrvtests/tests/suites/logging/log_flush_rotation_test.py +@@ -0,0 +1,81 @@ ++# --- BEGIN COPYRIGHT BLOCK --- ++# Copyright (C) 2025 Red Hat, Inc. ++# All rights reserved. ++# ++# License: GPL (version 3 or any later version). ++# See LICENSE for details. ++# --- END COPYRIGHT BLOCK --- ++# ++import os ++import logging ++import time ++import pytest ++from lib389._constants import DEFAULT_SUFFIX, PW_DM ++from lib389.tasks import ImportTask ++from lib389.idm.user import UserAccounts ++from lib389.topologies import topology_st as topo ++ ++ ++log = logging.getLogger(__name__) ++ ++ ++def test_log_flush_and_rotation_crash(topo): ++ """Make sure server does not crash whening flushing a buffer and rotating ++ the log at the same time ++ ++ :id: d4b0af2f-48b2-45f5-ae8b-f06f692c3133 ++ :setup: Standalone Instance ++ :steps: ++ 1. Enable all logs ++ 2. Enable log buffering for all logs ++ 3. Set rotation time unit to 1 minute ++ 4. Make sure server is still running after 1 minute ++ :expectedresults: ++ 1. Success ++ 2. Success ++ 3. Success ++ 4. Success ++ """ ++ ++ inst = topo.standalone ++ ++ # Enable logging and buffering ++ inst.config.set("nsslapd-auditlog-logging-enabled", "on") ++ inst.config.set("nsslapd-accesslog-logbuffering", "on") ++ inst.config.set("nsslapd-auditlog-logbuffering", "on") ++ inst.config.set("nsslapd-errorlog-logbuffering", "on") ++ inst.config.set("nsslapd-securitylog-logbuffering", "on") ++ ++ # Set rotation policy to trigger rotation asap ++ inst.config.set("nsslapd-accesslog-logrotationtimeunit", "minute") ++ inst.config.set("nsslapd-auditlog-logrotationtimeunit", "minute") ++ inst.config.set("nsslapd-errorlog-logrotationtimeunit", "minute") ++ inst.config.set("nsslapd-securitylog-logrotationtimeunit", "minute") ++ ++ # ++ # Performs ops to populate all the logs ++ # ++ # Access & audit log ++ users = UserAccounts(topo.standalone, DEFAULT_SUFFIX) ++ user = users.create_test_user() ++ user.set("userPassword", PW_DM) ++ # Security log ++ user.bind(PW_DM) ++ # Error log ++ import_task = ImportTask(inst) ++ import_task.import_suffix_from_ldif(ldiffile="/not/here", ++ suffix=DEFAULT_SUFFIX) ++ ++ # Wait a minute and make sure the server did not crash ++ log.info("Sleep until logs are flushed and rotated") ++ time.sleep(61) ++ ++ assert inst.status() ++ ++ ++if __name__ == '__main__': ++ # Run isolated ++ # -s for DEBUG mode ++ CURRENT_FILE = os.path.realpath(__file__) ++ pytest.main(["-s", CURRENT_FILE]) ++ +diff --git a/ldap/servers/slapd/log.c b/ldap/servers/slapd/log.c +index 76f2b6768..7e2c980a4 100644 +--- a/ldap/servers/slapd/log.c ++++ b/ldap/servers/slapd/log.c +@@ -6746,6 +6746,23 @@ log_refresh_state(int32_t log_type) + return 0; + } + } ++static LOGFD ++log_refresh_fd(int32_t log_type) ++{ ++ switch (log_type) { ++ case SLAPD_ACCESS_LOG: ++ return loginfo.log_access_fdes; ++ case SLAPD_SECURITY_LOG: ++ return loginfo.log_security_fdes; ++ case SLAPD_AUDIT_LOG: ++ return loginfo.log_audit_fdes; ++ case SLAPD_AUDITFAIL_LOG: ++ return loginfo.log_auditfail_fdes; ++ case SLAPD_ERROR_LOG: ++ return loginfo.log_error_fdes; ++ } ++ return NULL; ++} + + /* this function assumes the lock is already acquired */ + /* if sync_now is non-zero, data is flushed to physical storage */ +@@ -6857,6 +6874,7 @@ log_flush_buffer(LogBufferInfo *lbi, int log_type, int sync_now, int locked) + rotationtime_secs); + } + log_state = log_refresh_state(log_type); ++ fd = log_refresh_fd(log_type); + } + + if (log_state & LOGGING_NEED_TITLE) { +-- +2.48.0 + diff --git a/SOURCES/0024-Issue-6436-MOD-on-a-large-group-slow-if-substring-in.patch b/0005-Issue-6436-MOD-on-a-large-group-slow-if-substring-in.patch similarity index 93% rename from SOURCES/0024-Issue-6436-MOD-on-a-large-group-slow-if-substring-in.patch rename to 0005-Issue-6436-MOD-on-a-large-group-slow-if-substring-in.patch index b0951a8..067a418 100644 --- a/SOURCES/0024-Issue-6436-MOD-on-a-large-group-slow-if-substring-in.patch +++ b/0005-Issue-6436-MOD-on-a-large-group-slow-if-substring-in.patch @@ -1,4 +1,4 @@ -From 1845aed98becaba6b975342229cb5e0de79d208d Mon Sep 17 00:00:00 2001 +From 90460bfa66fb77118967927963572f69e097c4eb Mon Sep 17 00:00:00 2001 From: James Chapman Date: Wed, 29 Jan 2025 17:41:55 +0000 Subject: [PATCH] Issue 6436 - MOD on a large group slow if substring index is @@ -23,10 +23,10 @@ Reviewed by: @Firstyear, @tbordaz, @droideck (Thanks) 3 files changed, 137 insertions(+), 4 deletions(-) diff --git a/dirsrvtests/tests/suites/healthcheck/health_config_test.py b/dirsrvtests/tests/suites/healthcheck/health_config_test.py -index 6d3d08bfa..747699486 100644 +index e1e5398ab..f09bc8bb8 100644 --- a/dirsrvtests/tests/suites/healthcheck/health_config_test.py +++ b/dirsrvtests/tests/suites/healthcheck/health_config_test.py -@@ -212,6 +212,7 @@ def test_healthcheck_RI_plugin_missing_indexes(topology_st): +@@ -167,6 +167,7 @@ def test_healthcheck_RI_plugin_missing_indexes(topology_st): MEMBER_DN = 'cn=member,cn=index,cn=userroot,cn=ldbm database,cn=plugins,cn=config' standalone = topology_st.standalone @@ -34,7 +34,7 @@ index 6d3d08bfa..747699486 100644 log.info('Enable RI plugin') plugin = ReferentialIntegrityPlugin(standalone) -@@ -233,7 +234,7 @@ def test_healthcheck_RI_plugin_missing_indexes(topology_st): +@@ -188,7 +189,7 @@ def test_healthcheck_RI_plugin_missing_indexes(topology_st): def test_healthcheck_MO_plugin_missing_indexes(topology_st): @@ -43,7 +43,7 @@ index 6d3d08bfa..747699486 100644 :id: 236b0ec2-13da-48fb-b65a-db7406d56d5d :setup: Standalone instance -@@ -248,8 +249,8 @@ def test_healthcheck_MO_plugin_missing_indexes(topology_st): +@@ -203,8 +204,8 @@ def test_healthcheck_MO_plugin_missing_indexes(topology_st): :expectedresults: 1. Success 2. Success @@ -54,7 +54,7 @@ index 6d3d08bfa..747699486 100644 5. Success 6. Healthcheck reports no issue found 7. Healthcheck reports no issue found -@@ -259,6 +260,7 @@ def test_healthcheck_MO_plugin_missing_indexes(topology_st): +@@ -214,6 +215,7 @@ def test_healthcheck_MO_plugin_missing_indexes(topology_st): MO_GROUP_ATTR = 'creatorsname' standalone = topology_st.standalone @@ -62,8 +62,8 @@ index 6d3d08bfa..747699486 100644 log.info('Enable MO plugin') plugin = MemberOfPlugin(standalone) -@@ -279,6 +281,87 @@ def test_healthcheck_MO_plugin_missing_indexes(topology_st): - run_healthcheck_and_flush_log(topology_st, standalone, json=True, searched_code=JSON_OUTPUT) +@@ -236,6 +238,87 @@ def test_healthcheck_MO_plugin_missing_indexes(topology_st): + standalone.restart() +def test_healthcheck_MO_plugin_substring_index(topology_st): @@ -147,14 +147,14 @@ index 6d3d08bfa..747699486 100644 + standalone.restart() + + - @pytest.mark.ds50873 - @pytest.mark.bz1685160 @pytest.mark.xfail(ds_is_older("1.4.1"), reason="Not implemented") + def test_healthcheck_virtual_attr_incorrectly_indexed(topology_st): + """Check if HealthCheck returns DSVIRTLE0001 code diff --git a/src/lib389/lib389/lint.py b/src/lib389/lib389/lint.py -index 4d9cbb666..3d3c79ea3 100644 +index d0747f0f4..460bf64fc 100644 --- a/src/lib389/lib389/lint.py +++ b/src/lib389/lib389/lint.py -@@ -231,6 +231,21 @@ database after adding the missing index type. Here is an example using dsconf: +@@ -270,6 +270,21 @@ database after adding the missing index type. Here is an example using dsconf: """ } @@ -177,7 +177,7 @@ index 4d9cbb666..3d3c79ea3 100644 DSDSLE0001 = { 'dsle': 'DSDSLE0001', diff --git a/src/lib389/lib389/plugins.py b/src/lib389/lib389/plugins.py -index 6bf1843ad..185398e5b 100644 +index 67af93a14..31bbfa502 100644 --- a/src/lib389/lib389/plugins.py +++ b/src/lib389/lib389/plugins.py @@ -12,7 +12,7 @@ import copy @@ -232,5 +232,5 @@ index 6bf1843ad..185398e5b 100644 """Get memberofattr attribute""" -- -2.48.1 +2.48.0 diff --git a/0006-Issue-6566-RI-plugin-failure-to-handle-a-modrdn-for-.patch b/0006-Issue-6566-RI-plugin-failure-to-handle-a-modrdn-for-.patch new file mode 100644 index 0000000..5173452 --- /dev/null +++ b/0006-Issue-6566-RI-plugin-failure-to-handle-a-modrdn-for-.patch @@ -0,0 +1,70 @@ +From dcb6298db5bfef4b2541f7c52682d153b424bfa7 Mon Sep 17 00:00:00 2001 +From: James Chapman +Date: Tue, 4 Feb 2025 15:40:16 +0000 +Subject: [PATCH] Issue 6566 - RI plugin failure to handle a modrdn for rename + of member of multiple groups (#6567) + +Bug description: +With AM and RI plugins enabled, the rename of a user that is part of multiple groups +fails with a "value exists" error. + +Fix description: +For a modrdn the RI plugin creates a new DN, before a modify is attempted check +if the new DN already exists in the attr being updated. + +Fixes: https://github.com/389ds/389-ds-base/issues/6566 + +Reviewed by: @progier389 , @tbordaz (Thank you) +--- + ldap/servers/plugins/referint/referint.c | 15 ++++++++++++--- + 1 file changed, 12 insertions(+), 3 deletions(-) + +diff --git a/ldap/servers/plugins/referint/referint.c b/ldap/servers/plugins/referint/referint.c +index 468fdc239..218863ea5 100644 +--- a/ldap/servers/plugins/referint/referint.c ++++ b/ldap/servers/plugins/referint/referint.c +@@ -924,6 +924,7 @@ _update_all_per_mod(Slapi_DN *entrySDN, /* DN of the searched entry */ + { + Slapi_Mods *smods = NULL; + char *newDN = NULL; ++ struct berval bv = {0}; + char **dnParts = NULL; + char *sval = NULL; + char *newvalue = NULL; +@@ -1026,22 +1027,30 @@ _update_all_per_mod(Slapi_DN *entrySDN, /* DN of the searched entry */ + } + /* else: normalize_rc < 0) Ignore the DN normalization error for now. */ + ++ bv.bv_val = newDN; ++ bv.bv_len = strlen(newDN); + p = PL_strstr(sval, slapi_sdn_get_ndn(origDN)); + if (p == sval) { + /* (case 1) */ + slapi_mods_add_string(smods, LDAP_MOD_DELETE, attrName, sval); +- slapi_mods_add_string(smods, LDAP_MOD_ADD, attrName, newDN); +- ++ /* Add only if the attr value does not exist */ ++ if (VALUE_PRESENT != attr_value_find_wsi(attr, &bv, &v)) { ++ slapi_mods_add_string(smods, LDAP_MOD_ADD, attrName, newDN); ++ } + } else if (p) { + /* (case 2) */ + slapi_mods_add_string(smods, LDAP_MOD_DELETE, attrName, sval); + *p = '\0'; + newvalue = slapi_ch_smprintf("%s%s", sval, newDN); +- slapi_mods_add_string(smods, LDAP_MOD_ADD, attrName, newvalue); ++ /* Add only if the attr value does not exist */ ++ if (VALUE_PRESENT != attr_value_find_wsi(attr, &bv, &v)) { ++ slapi_mods_add_string(smods, LDAP_MOD_ADD, attrName, newvalue); ++ } + slapi_ch_free_string(&newvalue); + } + /* else: value does not include the modified DN. Ignore it. */ + slapi_ch_free_string(&sval); ++ bv = (struct berval){0}; + } + rc = _do_modify(mod_pb, entrySDN, slapi_mods_get_ldapmods_byref(smods)); + if (rc) { +-- +2.48.0 + diff --git a/0007-Issue-6258-Mitigate-race-condition-in-paged_results_.patch b/0007-Issue-6258-Mitigate-race-condition-in-paged_results_.patch new file mode 100644 index 0000000..1e97bca --- /dev/null +++ b/0007-Issue-6258-Mitigate-race-condition-in-paged_results_.patch @@ -0,0 +1,43 @@ +From be57ea839934c29b3f4db450a65281aa30a72caf Mon Sep 17 00:00:00 2001 +From: Masahiro Matsuya +Date: Wed, 5 Feb 2025 11:38:28 +0900 +Subject: [PATCH] Issue 6258 - Mitigate race condition in paged_results_test.py + (#6433) + +The regression test dirsrvtests/tests/suites/paged_results/paged_results_test.py::test_multi_suffix_search has a race condition causing it to fail due to multiple queries potentially writing their logs out of chronological order. + +This failure is mitigated by sorting the retrieved access_log_lines by their "op" value. This ensures the log lines are in chronological order, as expected by the assertions at the end of test_multi_suffix_search(). + +Helps fix: #6258 + +Reviewed by: @droideck , @progier389 (Thanks!) + +Co-authored-by: Anuar Beisembayev <111912342+abeisemb@users.noreply.github.com> +--- + dirsrvtests/tests/suites/paged_results/paged_results_test.py | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/dirsrvtests/tests/suites/paged_results/paged_results_test.py b/dirsrvtests/tests/suites/paged_results/paged_results_test.py +index eaf0e0da9..fca48db0f 100644 +--- a/dirsrvtests/tests/suites/paged_results/paged_results_test.py ++++ b/dirsrvtests/tests/suites/paged_results/paged_results_test.py +@@ -7,6 +7,7 @@ + # --- END COPYRIGHT BLOCK --- + # + import socket ++import re + from random import sample, randrange + + import pytest +@@ -1126,6 +1127,8 @@ def test_multi_suffix_search(topology_st, create_user, new_suffixes): + topology_st.standalone.restart(timeout=10) + + access_log_lines = topology_st.standalone.ds_access_log.match('.*pr_cookie=.*') ++ # Sort access_log_lines by op number to mitigate race condition effects. ++ access_log_lines.sort(key=lambda x: int(re.search(r"op=(\d+) RESULT", x).group(1))) + pr_cookie_list = ([line.rsplit('=', 1)[-1] for line in access_log_lines]) + pr_cookie_list = [int(pr_cookie) for pr_cookie in pr_cookie_list] + log.info('Assert that last pr_cookie == -1 and others pr_cookie == 0') +-- +2.48.0 + diff --git a/0008-Issue-6229-After-an-initial-failure-subsequent-onlin.patch b/0008-Issue-6229-After-an-initial-failure-subsequent-onlin.patch new file mode 100644 index 0000000..d9528d1 --- /dev/null +++ b/0008-Issue-6229-After-an-initial-failure-subsequent-onlin.patch @@ -0,0 +1,566 @@ +From 8e3a484f88fc9f9a3fcdfdd685d4ad2ed3cbe5d9 Mon Sep 17 00:00:00 2001 +From: progier389 +Date: Fri, 28 Jun 2024 18:56:49 +0200 +Subject: [PATCH] Issue 6229 - After an initial failure, subsequent online + backups fail (#6230) + +* Issue 6229 - After an initial failure, subsequent online backups will not work + +Several issues related to backup task error handling: +Backends stay busy after the failure +Exit code is 0 in some cases +Crash if failing to open the backup directory +And a more general one: +lib389 Task DN collision + +Solutions: +Always reset the busy flags that have been set +Ensure that 0 is not returned in error case +Avoid closing NULL directory descriptor +Use a timestamp having milliseconds precision to create the task DN + +Issue: #6229 + +Reviewed by: @droideck (Thanks!) + +(cherry picked from commit 04a0b6ac776a1d588ec2e10ff651e5015078ad21) +--- + ldap/servers/slapd/back-ldbm/archive.c | 45 +++++----- + .../slapd/back-ldbm/db-mdb/mdb_layer.c | 3 + + src/lib389/lib389/__init__.py | 10 +-- + src/lib389/lib389/tasks.py | 82 +++++++++---------- + 4 files changed, 70 insertions(+), 70 deletions(-) + +diff --git a/ldap/servers/slapd/back-ldbm/archive.c b/ldap/servers/slapd/back-ldbm/archive.c +index 0460a42f6..6658cc80a 100644 +--- a/ldap/servers/slapd/back-ldbm/archive.c ++++ b/ldap/servers/slapd/back-ldbm/archive.c +@@ -16,6 +16,8 @@ + #include "back-ldbm.h" + #include "dblayer.h" + ++#define NO_OBJECT ((Object*)-1) ++ + int + ldbm_temporary_close_all_instances(Slapi_PBlock *pb) + { +@@ -270,6 +272,7 @@ ldbm_back_ldbm2archive(Slapi_PBlock *pb) + int run_from_cmdline = 0; + Slapi_Task *task; + struct stat sbuf; ++ Object *last_busy_inst_obj = NO_OBJECT; + + slapi_pblock_get(pb, SLAPI_PLUGIN_PRIVATE, &li); + slapi_pblock_get(pb, SLAPI_SEQ_VAL, &rawdirectory); +@@ -380,13 +383,12 @@ ldbm_back_ldbm2archive(Slapi_PBlock *pb) + + /* to avoid conflict w/ import, do this check for commandline, as well */ + { +- Object *inst_obj, *inst_obj2; + ldbm_instance *inst = NULL; + + /* server is up -- mark all backends busy */ +- for (inst_obj = objset_first_obj(li->li_instance_set); inst_obj; +- inst_obj = objset_next_obj(li->li_instance_set, inst_obj)) { +- inst = (ldbm_instance *)object_get_data(inst_obj); ++ for (last_busy_inst_obj = objset_first_obj(li->li_instance_set); last_busy_inst_obj; ++ last_busy_inst_obj = objset_next_obj(li->li_instance_set, last_busy_inst_obj)) { ++ inst = (ldbm_instance *)object_get_data(last_busy_inst_obj); + + /* check if an import/restore is already ongoing... */ + if (instance_set_busy(inst) != 0 || dblayer_in_import(inst) != 0) { +@@ -400,20 +402,6 @@ ldbm_back_ldbm2archive(Slapi_PBlock *pb) + "another task and cannot be disturbed.", + inst->inst_name); + } +- +- /* painfully, we have to clear the BUSY flags on the +- * backends we'd already marked... +- */ +- for (inst_obj2 = objset_first_obj(li->li_instance_set); +- inst_obj2 && (inst_obj2 != inst_obj); +- inst_obj2 = objset_next_obj(li->li_instance_set, +- inst_obj2)) { +- inst = (ldbm_instance *)object_get_data(inst_obj2); +- instance_set_not_busy(inst); +- } +- if (inst_obj2 && inst_obj2 != inst_obj) +- object_release(inst_obj2); +- object_release(inst_obj); + goto err; + } + } +@@ -427,18 +415,26 @@ ldbm_back_ldbm2archive(Slapi_PBlock *pb) + goto err; + } + +- if (!run_from_cmdline) { ++err: ++ /* Clear all BUSY flags that have been previously set */ ++ if (last_busy_inst_obj != NO_OBJECT) { + ldbm_instance *inst; + Object *inst_obj; + +- /* none of these backends are busy anymore */ +- for (inst_obj = objset_first_obj(li->li_instance_set); inst_obj; ++ for (inst_obj = objset_first_obj(li->li_instance_set); ++ inst_obj && (inst_obj != last_busy_inst_obj); + inst_obj = objset_next_obj(li->li_instance_set, inst_obj)) { + inst = (ldbm_instance *)object_get_data(inst_obj); + instance_set_not_busy(inst); + } ++ if (last_busy_inst_obj != NULL) { ++ /* release last seen object for aborted objset_next_obj iterations */ ++ if (inst_obj != NULL) { ++ object_release(inst_obj); ++ } ++ object_release(last_busy_inst_obj); ++ } + } +-err: + if (return_value) { + if (dir_bak) { + slapi_log_err(SLAPI_LOG_ERR, +@@ -727,7 +723,10 @@ ldbm_archive_config(char *bakdir, Slapi_Task *task) + } + + error: +- PR_CloseDir(dirhandle); ++ if (NULL != dirhandle) { ++ PR_CloseDir(dirhandle); ++ dirhandle = NULL; ++ } + dse_backup_unlock(); + slapi_ch_free_string(&backup_config_dir); + slapi_ch_free_string(&dse_file); +diff --git a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_layer.c b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_layer.c +index 4a7beedeb..3ecc47170 100644 +--- a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_layer.c ++++ b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_layer.c +@@ -983,6 +983,9 @@ dbmdb_backup(struct ldbminfo *li, char *dest_dir, Slapi_Task *task) + if (ldbm_archive_config(dest_dir, task) != 0) { + slapi_log_err(SLAPI_LOG_ERR, "dbmdb_backup", + "Backup of config files failed or is incomplete\n"); ++ if (0 == return_value) { ++ return_value = -1; ++ } + } + + goto bail; +diff --git a/src/lib389/lib389/__init__.py b/src/lib389/lib389/__init__.py +index 368741a66..cb372c138 100644 +--- a/src/lib389/lib389/__init__.py ++++ b/src/lib389/lib389/__init__.py +@@ -69,7 +69,7 @@ from lib389.utils import ( + get_user_is_root) + from lib389.paths import Paths + from lib389.nss_ssl import NssSsl +-from lib389.tasks import BackupTask, RestoreTask ++from lib389.tasks import BackupTask, RestoreTask, Task + from lib389.dseldif import DSEldif + + # mixin +@@ -1424,7 +1424,7 @@ class DirSrv(SimpleLDAPObject, object): + name, self.ds_paths.prefix) + + # create the archive +- name = "backup_%s_%s.tar.gz" % (self.serverid, time.strftime("%m%d%Y_%H%M%S")) ++ name = "backup_%s_%s.tar.gz" % (self.serverid, Task.get_timestamp()) + backup_file = os.path.join(backup_dir, name) + tar = tarfile.open(backup_file, "w:gz") + tar.extraction_filter = (lambda member, path: member) +@@ -2810,7 +2810,7 @@ class DirSrv(SimpleLDAPObject, object): + else: + # No output file specified. Use the default ldif location/name + cmd.append('-a') +- tnow = datetime.now().strftime("%Y_%m_%d_%H_%M_%S") ++ tnow = Task.get_timestamp() + if bename: + ldifname = os.path.join(self.ds_paths.ldif_dir, "%s-%s-%s.ldif" % (self.serverid, bename, tnow)) + else: +@@ -2881,7 +2881,7 @@ class DirSrv(SimpleLDAPObject, object): + + if archive_dir is None: + # Use the instance name and date/time as the default backup name +- tnow = datetime.now().strftime("%Y_%m_%d_%H_%M_%S") ++ tnow = Task.get_timestamp() + archive_dir = os.path.join(self.ds_paths.backup_dir, "%s-%s" % (self.serverid, tnow)) + elif not archive_dir.startswith("/"): + # Relative path, append it to the bak directory +@@ -3506,7 +3506,7 @@ class DirSrv(SimpleLDAPObject, object): + + if archive is None: + # Use the instance name and date/time as the default backup name +- tnow = datetime.now().strftime("%Y_%m_%d_%H_%M_%S") ++ tnow = Task.get_timestamp() + if self.serverid is not None: + backup_dir_name = "%s-%s" % (self.serverid, tnow) + else: +diff --git a/src/lib389/lib389/tasks.py b/src/lib389/lib389/tasks.py +index 6c2adb5b2..6bf302862 100644 +--- a/src/lib389/lib389/tasks.py ++++ b/src/lib389/lib389/tasks.py +@@ -118,7 +118,7 @@ class Task(DSLdapObject): + return super(Task, self).create(rdn, properties, basedn) + + @staticmethod +- def _get_task_date(): ++ def get_timestamp(): + """Return a timestamp to use in naming new task entries.""" + + return datetime.now().isoformat() +@@ -132,7 +132,7 @@ class AutomemberRebuildMembershipTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'automember_rebuild_' + Task._get_task_date() ++ self.cn = 'automember_rebuild_' + Task.get_timestamp() + dn = "cn=" + self.cn + "," + DN_AUTOMEMBER_REBUILD_TASK + + super(AutomemberRebuildMembershipTask, self).__init__(instance, dn) +@@ -147,7 +147,7 @@ class AutomemberAbortRebuildTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'automember_abort_' + Task._get_task_date() ++ self.cn = 'automember_abort_' + Task.get_timestamp() + dn = "cn=" + self.cn + "," + DN_AUTOMEMBER_ABORT_REBUILD_TASK + + super(AutomemberAbortRebuildTask, self).__init__(instance, dn) +@@ -161,7 +161,7 @@ class FixupLinkedAttributesTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'fixup_linked_attrs_' + Task._get_task_date() ++ self.cn = 'fixup_linked_attrs_' + Task.get_timestamp() + dn = "cn=" + self.cn + "," + DN_FIXUP_LINKED_ATTIBUTES + + super(FixupLinkedAttributesTask, self).__init__(instance, dn) +@@ -175,7 +175,7 @@ class MemberUidFixupTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'memberUid_fixup_' + Task._get_task_date() ++ self.cn = 'memberUid_fixup_' + Task.get_timestamp() + dn = f"cn={self.cn},cn=memberuid task,cn=tasks,cn=config" + + super(MemberUidFixupTask, self).__init__(instance, dn) +@@ -190,7 +190,7 @@ class MemberOfFixupTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'memberOf_fixup_' + Task._get_task_date() ++ self.cn = 'memberOf_fixup_' + Task.get_timestamp() + dn = "cn=" + self.cn + "," + DN_MBO_TASK + + super(MemberOfFixupTask, self).__init__(instance, dn) +@@ -205,7 +205,7 @@ class USNTombstoneCleanupTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'usn_cleanup_' + Task._get_task_date() ++ self.cn = 'usn_cleanup_' + Task.get_timestamp() + dn = "cn=" + self.cn + ",cn=USN tombstone cleanup task," + DN_TASKS + + super(USNTombstoneCleanupTask, self).__init__(instance, dn) +@@ -225,7 +225,7 @@ class csngenTestTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'csngenTest_' + Task._get_task_date() ++ self.cn = 'csngenTest_' + Task.get_timestamp() + dn = "cn=" + self.cn + ",cn=csngen_test," + DN_TASKS + super(csngenTestTask, self).__init__(instance, dn) + +@@ -238,7 +238,7 @@ class EntryUUIDFixupTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'entryuuid_fixup_' + Task._get_task_date() ++ self.cn = 'entryuuid_fixup_' + Task.get_timestamp() + dn = "cn=" + self.cn + "," + DN_EUUID_TASK + super(EntryUUIDFixupTask, self).__init__(instance, dn) + self._must_attributes.extend(['basedn']) +@@ -252,7 +252,7 @@ class DBCompactTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'compact_db_' + Task._get_task_date() ++ self.cn = 'compact_db_' + Task.get_timestamp() + dn = "cn=" + self.cn + "," + DN_COMPACTDB_TASK + super(DBCompactTask, self).__init__(instance, dn) + +@@ -265,7 +265,7 @@ class SchemaReloadTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'schema_reload_' + Task._get_task_date() ++ self.cn = 'schema_reload_' + Task.get_timestamp() + dn = "cn=" + self.cn + ",cn=schema reload task," + DN_TASKS + super(SchemaReloadTask, self).__init__(instance, dn) + +@@ -278,7 +278,7 @@ class SyntaxValidateTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'syntax_validate_' + Task._get_task_date() ++ self.cn = 'syntax_validate_' + Task.get_timestamp() + dn = f"cn={self.cn},cn=syntax validate,cn=tasks,cn=config" + + super(SyntaxValidateTask, self).__init__(instance, dn) +@@ -295,7 +295,7 @@ class AbortCleanAllRUVTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'abortcleanallruv_' + Task._get_task_date() ++ self.cn = 'abortcleanallruv_' + Task.get_timestamp() + dn = "cn=" + self.cn + ",cn=abort cleanallruv," + DN_TASKS + + super(AbortCleanAllRUVTask, self).__init__(instance, dn) +@@ -312,7 +312,7 @@ class CleanAllRUVTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'cleanallruv_' + Task._get_task_date() ++ self.cn = 'cleanallruv_' + Task.get_timestamp() + dn = "cn=" + self.cn + ",cn=cleanallruv," + DN_TASKS + self._properties = None + +@@ -359,7 +359,7 @@ class ImportTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'import_' + Task._get_task_date() ++ self.cn = 'import_' + Task.get_timestamp() + dn = "cn=%s,%s" % (self.cn, DN_IMPORT_TASK) + self._properties = None + +@@ -388,7 +388,7 @@ class ExportTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'export_' + Task._get_task_date() ++ self.cn = 'export_' + Task.get_timestamp() + dn = "cn=%s,%s" % (self.cn, DN_EXPORT_TASK) + self._properties = None + +@@ -411,7 +411,7 @@ class BackupTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'backup_' + Task._get_task_date() ++ self.cn = 'backup_' + Task.get_timestamp() + dn = "cn=" + self.cn + ",cn=backup," + DN_TASKS + self._properties = None + +@@ -426,7 +426,7 @@ class RestoreTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'restore_' + Task._get_task_date() ++ self.cn = 'restore_' + Task.get_timestamp() + dn = "cn=" + self.cn + ",cn=restore," + DN_TASKS + self._properties = None + +@@ -513,7 +513,7 @@ class Tasks(object): + raise ValueError("Import file (%s) does not exist" % input_file) + + # Prepare the task entry +- cn = "import_" + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = "import_" + Task.get_timestamp() + dn = "cn=%s,%s" % (cn, DN_IMPORT_TASK) + entry = Entry(dn) + entry.setValues('objectclass', 'top', 'extensibleObject') +@@ -581,7 +581,7 @@ class Tasks(object): + raise ValueError("output_file is mandatory") + + # Prepare the task entry +- cn = "export_" + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = "export_" + Task.get_timestamp() + dn = "cn=%s,%s" % (cn, DN_EXPORT_TASK) + entry = Entry(dn) + entry.update({ +@@ -637,7 +637,7 @@ class Tasks(object): + raise ValueError("You must specify a backup directory.") + + # build the task entry +- cn = "backup_" + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = "backup_" + Task.get_timestamp() + dn = "cn=%s,%s" % (cn, DN_BACKUP_TASK) + entry = Entry(dn) + entry.update({ +@@ -694,7 +694,7 @@ class Tasks(object): + raise ValueError("Backup file (%s) does not exist" % backup_dir) + + # build the task entry +- cn = "restore_" + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = "restore_" + Task.get_timestamp() + dn = "cn=%s,%s" % (cn, DN_RESTORE_TASK) + entry = Entry(dn) + entry.update({ +@@ -789,7 +789,7 @@ class Tasks(object): + attrs.append(attr) + else: + attrs.append(attrname) +- cn = "index_vlv_%s" % (time.strftime("%m%d%Y_%H%M%S", time.localtime())) ++ cn = "index_vlv_%s" % (Task.get_timestamp()) + dn = "cn=%s,%s" % (cn, DN_INDEX_TASK) + entry = Entry(dn) + entry.update({ +@@ -803,7 +803,7 @@ class Tasks(object): + # + # Reindex all attributes - gather them first... + # +- cn = "index_all_%s" % (time.strftime("%m%d%Y_%H%M%S", time.localtime())) ++ cn = "index_all_%s" % (Task.get_timestamp()) + dn = ('cn=%s,cn=ldbm database,cn=plugins,cn=config' % backend) + try: + indexes = self.conn.search_s(dn, ldap.SCOPE_SUBTREE, '(objectclass=nsIndex)') +@@ -815,7 +815,7 @@ class Tasks(object): + # + # Reindex specific attributes + # +- cn = "index_attrs_%s" % (time.strftime("%m%d%Y_%H%M%S", time.localtime())) ++ cn = "index_attrs_%s" % (Task.get_timestamp()) + if isinstance(attrname, (tuple, list)): + # Need to guarantee this is a list (and not a tuple) + for attr in attrname: +@@ -903,8 +903,7 @@ class Tasks(object): + + suffix = ents[0].getValue(attr) + +- cn = "fixupmemberof_" + time.strftime("%m%d%Y_%H%M%S", +- time.localtime()) ++ cn = "fixupmemberof_" + Task.get_timestamp() + dn = "cn=%s,%s" % (cn, DN_MBO_TASK) + entry = Entry(dn) + entry.setValues('objectclass', 'top', 'extensibleObject') +@@ -965,8 +964,7 @@ class Tasks(object): + if len(ents) != 1: + raise ValueError("invalid backend name: %s" % bename) + +- cn = "fixupTombstone_" + time.strftime("%m%d%Y_%H%M%S", +- time.localtime()) ++ cn = "fixupTombstone_" + Task.get_timestamp() + dn = "cn=%s,%s" % (cn, DN_TOMB_FIXUP_TASK) + entry = Entry(dn) + entry.setValues('objectclass', 'top', 'extensibleObject') +@@ -1019,7 +1017,7 @@ class Tasks(object): + @return exit code + ''' + +- cn = 'task-' + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = 'task-' + Task.get_timestamp() + dn = ('cn=%s,cn=automember rebuild membership,cn=tasks,cn=config' % cn) + + entry = Entry(dn) +@@ -1077,7 +1075,7 @@ class Tasks(object): + if not ldif_out: + raise ValueError("Missing ldif_out") + +- cn = 'task-' + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = 'task-' + Task.get_timestamp() + dn = ('cn=%s,cn=automember export updates,cn=tasks,cn=config' % cn) + entry = Entry(dn) + entry.setValues('objectclass', 'top', 'extensibleObject') +@@ -1129,7 +1127,7 @@ class Tasks(object): + if not ldif_out or not ldif_in: + raise ValueError("Missing ldif_out and/or ldif_in") + +- cn = 'task-' + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = 'task-' + Task.get_timestamp() + dn = ('cn=%s,cn=automember map updates,cn=tasks,cn=config' % cn) + + entry = Entry(dn) +@@ -1175,7 +1173,7 @@ class Tasks(object): + @return exit code + ''' + +- cn = 'task-' + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = 'task-' + Task.get_timestamp() + dn = ('cn=%s,cn=fixup linked attributes,cn=tasks,cn=config' % cn) + entry = Entry(dn) + entry.setValues('objectclass', 'top', 'extensibleObject') +@@ -1219,7 +1217,7 @@ class Tasks(object): + @return exit code + ''' + +- cn = 'task-' + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = 'task-' + Task.get_timestamp() + dn = ('cn=%s,cn=schema reload task,cn=tasks,cn=config' % cn) + entry = Entry(dn) + entry.setValues('objectclass', 'top', 'extensibleObject') +@@ -1264,7 +1262,7 @@ class Tasks(object): + @return exit code + ''' + +- cn = 'task-' + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = 'task-' + Task.get_timestamp() + dn = ('cn=%s,cn=memberuid task,cn=tasks,cn=config' % cn) + entry = Entry(dn) + entry.setValues('objectclass', 'top', 'extensibleObject') +@@ -1311,7 +1309,7 @@ class Tasks(object): + @return exit code + ''' + +- cn = 'task-' + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = 'task-' + Task.get_timestamp() + dn = ('cn=%s,cn=syntax validate,cn=tasks,cn=config' % cn) + entry = Entry(dn) + entry.setValues('objectclass', 'top', 'extensibleObject') +@@ -1358,7 +1356,7 @@ class Tasks(object): + @return exit code + ''' + +- cn = 'task-' + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = 'task-' + Task.get_timestamp() + dn = ('cn=%s,cn=USN tombstone cleanup task,cn=tasks,cn=config' % cn) + entry = Entry(dn) + entry.setValues('objectclass', 'top', 'extensibleObject') +@@ -1413,7 +1411,7 @@ class Tasks(object): + if not configfile: + raise ValueError("Missing required paramter: configfile") + +- cn = 'task-' + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = 'task-' + Task.get_timestamp() + dn = ('cn=%s,cn=sysconfig reload,cn=tasks,cn=config' % cn) + entry = Entry(dn) + entry.setValues('objectclass', 'top', 'extensibleObject') +@@ -1464,7 +1462,7 @@ class Tasks(object): + if not suffix: + raise ValueError("Missing required paramter: suffix") + +- cn = 'task-' + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = 'task-' + Task.get_timestamp() + dn = ('cn=%s,cn=cleanallruv,cn=tasks,cn=config' % cn) + entry = Entry(dn) + entry.setValues('objectclass', 'top', 'extensibleObject') +@@ -1516,7 +1514,7 @@ class Tasks(object): + if not suffix: + raise ValueError("Missing required paramter: suffix") + +- cn = 'task-' + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = 'task-' + Task.get_timestamp() + dn = ('cn=%s,cn=abort cleanallruv,cn=tasks,cn=config' % cn) + entry = Entry(dn) + entry.setValues('objectclass', 'top', 'extensibleObject') +@@ -1571,7 +1569,7 @@ class Tasks(object): + if not nsArchiveDir: + raise ValueError("Missing required paramter: nsArchiveDir") + +- cn = 'task-' + time.strftime("%m%d%Y_%H%M%S", time.localtime()) ++ cn = 'task-' + Task.get_timestamp() + dn = ('cn=%s,cn=upgradedb,cn=tasks,cn=config' % cn) + entry = Entry(dn) + entry.setValues('objectclass', 'top', 'extensibleObject') +@@ -1616,6 +1614,6 @@ class LDAPIMappingReloadTask(Task): + """ + + def __init__(self, instance, dn=None): +- self.cn = 'reload-' + Task._get_task_date() ++ self.cn = 'reload-' + Task.get_timestamp() + dn = f'cn={self.cn},cn=reload ldapi mappings,cn=tasks,cn=config' + super(LDAPIMappingReloadTask, self).__init__(instance, dn) +-- +2.48.0 + diff --git a/0009-Issue-6554-During-import-of-entries-without-nsUnique.patch b/0009-Issue-6554-During-import-of-entries-without-nsUnique.patch new file mode 100644 index 0000000..90a7c52 --- /dev/null +++ b/0009-Issue-6554-During-import-of-entries-without-nsUnique.patch @@ -0,0 +1,165 @@ +From 2b1b2db90c9d337166fa28e313f60828cd43de09 Mon Sep 17 00:00:00 2001 +From: tbordaz +Date: Thu, 6 Feb 2025 18:25:36 +0100 +Subject: [PATCH] Issue 6554 - During import of entries without nsUniqueId, a + supplier generates duplicate nsUniqueId (LMDB only) (#6582) + +Bug description: + During an import the entry is prepared (schema, operational + attributes, password encryption,...) before starting the + update of the database and indexes. + A step of the preparation is to assign a value to 'nsuniqueid' + operational attribute. 'nsuniqueid' must be unique. + In LMDB the preparation is done by multiple threads (workers). + In such case the 'nsuniqueid' are generated in parallel and + as it is time based several values can be duplicated. + +Fix description: + To prevent that the routine dbmdb_import_generate_uniqueid + should make sure to synchronize the workers. + +fixes: #6554 + +Reviewed by: Pierre Rogier +--- + .../tests/suites/import/import_test.py | 79 ++++++++++++++++++- + .../back-ldbm/db-mdb/mdb_import_threads.c | 11 +++ + 2 files changed, 89 insertions(+), 1 deletion(-) + +diff --git a/dirsrvtests/tests/suites/import/import_test.py b/dirsrvtests/tests/suites/import/import_test.py +index dbd921924..54d304753 100644 +--- a/dirsrvtests/tests/suites/import/import_test.py ++++ b/dirsrvtests/tests/suites/import/import_test.py +@@ -14,11 +14,13 @@ import os + import pytest + import time + import glob ++import re + import logging + import subprocess + from datetime import datetime + from lib389.topologies import topology_st as topo +-from lib389._constants import DEFAULT_SUFFIX, TaskWarning ++from lib389.topologies import topology_m2 as topo_m2 ++from lib389._constants import DEFAULT_BENAME, DEFAULT_SUFFIX, TaskWarning + from lib389.dbgen import dbgen_users + from lib389.tasks import ImportTask + from lib389.index import Indexes +@@ -688,6 +690,81 @@ def test_online_import_under_load(topo): + assert import_task.get_exit_code() == 0 + + ++def test_duplicate_nsuniqueid(topo_m2, request): ++ """Test that after an offline import all ++ nsuniqueid are different ++ ++ :id: a2541677-a288-4633-bacf-4050cc56016d ++ :setup: MMR with 2 suppliers ++ :steps: ++ 1. stop the instance to do offline operations ++ 2. Generate a 5K users LDIF file ++ 3. Check that no uniqueid are present in the generated file ++ 4. import the generated LDIF ++ 5. export the database ++ 6. Check that that exported LDIF contains more than 5K nsuniqueid ++ 7. Check that there is no duplicate nsuniqued in exported LDIF ++ :expectedresults: ++ 1. Should succeeds ++ 2. Should succeeds ++ 3. Should succeeds ++ 4. Should succeeds ++ 5. Should succeeds ++ 6. Should succeeds ++ 7. Should succeeds ++ """ ++ m1 = topo_m2.ms["supplier1"] ++ ++ # Stop the instance ++ m1.stop() ++ ++ # Generate a test ldif (5k entries) ++ log.info("Generating LDIF...") ++ ldif_dir = m1.get_ldif_dir() ++ import_ldif = ldif_dir + '/5k_users_import.ldif' ++ dbgen_users(m1, 5000, import_ldif, DEFAULT_SUFFIX) ++ ++ # Check that the generated LDIF does not contain nsuniqueid ++ all_nsuniqueid = [] ++ with open(import_ldif, 'r') as file: ++ for line in file: ++ if line.lower().startswith("nsuniqueid: "): ++ all_nsuniqueid.append(line.split(': ')[1]) ++ log.info("import file contains " + str(len(all_nsuniqueid)) + " nsuniqueid") ++ assert len(all_nsuniqueid) == 0 ++ ++ # Import the "nsuniquied free" LDIF file ++ if not m1.ldif2db('userRoot', None, None, None, import_ldif): ++ assert False ++ ++ # Export the DB that now should contain nsuniqueid ++ export_ldif = ldif_dir + '/5k_user_export.ldif' ++ log.info("export to file " + export_ldif) ++ m1.db2ldif(bename=DEFAULT_BENAME, suffixes=[DEFAULT_SUFFIX], ++ excludeSuffixes=None, repl_data=False, ++ outputfile=export_ldif, encrypt=False) ++ ++ # Check that the export LDIF contain nsuniqueid ++ all_nsuniqueid = [] ++ with open(export_ldif, 'r') as file: ++ for line in file: ++ if line.lower().startswith("nsuniqueid: "): ++ all_nsuniqueid.append(line.split(': ')[1]) ++ log.info("export file " + export_ldif + " contains " + str(len(all_nsuniqueid)) + " nsuniqueid") ++ assert len(all_nsuniqueid) >= 5000 ++ ++ # Check that the nsuniqueid are unique ++ assert len(set(all_nsuniqueid)) == len(all_nsuniqueid) ++ ++ def fin(): ++ if os.path.exists(import_ldif): ++ os.remove(import_ldif) ++ if os.path.exists(export_ldif): ++ os.remove(export_ldif) ++ m1.start ++ ++ request.addfinalizer(fin) ++ + if __name__ == '__main__': + # Run isolated + # -s for DEBUG mode +diff --git a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c +index 707a110c5..0f445bb56 100644 +--- a/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c ++++ b/ldap/servers/slapd/back-ldbm/db-mdb/mdb_import_threads.c +@@ -610,10 +610,20 @@ dbmdb_import_generate_uniqueid(ImportJob *job, Slapi_Entry *e) + { + const char *uniqueid = slapi_entry_get_uniqueid(e); + int rc = UID_SUCCESS; ++ static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + + if (!uniqueid && (job->uuid_gen_type != SLAPI_UNIQUEID_GENERATE_NONE)) { + char *newuniqueid; + ++ /* With 'mdb' we have several workers generating nsuniqueid ++ * we need to serialize them to prevent generating duplicate value ++ * From performance pov it only impacts import ++ * The default value is SLAPI_UNIQUEID_GENERATE_TIME_BASED so ++ * the only syscall is clock_gettime and then string formating ++ * that should limit contention ++ */ ++ pthread_mutex_lock(&mutex); ++ + /* generate id based on dn */ + if (job->uuid_gen_type == SLAPI_UNIQUEID_GENERATE_NAME_BASED) { + char *dn = slapi_entry_get_dn(e); +@@ -624,6 +634,7 @@ dbmdb_import_generate_uniqueid(ImportJob *job, Slapi_Entry *e) + /* time based */ + rc = slapi_uniqueIDGenerateString(&newuniqueid); + } ++ pthread_mutex_unlock(&mutex); + + if (rc == UID_SUCCESS) { + slapi_entry_set_uniqueid(e, newuniqueid); +-- +2.48.0 + diff --git a/0010-Issue-6596-BUG-Compilation-Regresion-6597.patch b/0010-Issue-6596-BUG-Compilation-Regresion-6597.patch new file mode 100644 index 0000000..7a0ef58 --- /dev/null +++ b/0010-Issue-6596-BUG-Compilation-Regresion-6597.patch @@ -0,0 +1,77 @@ +From e638e801afd51ca44523222a90a9f69f4be82ae3 Mon Sep 17 00:00:00 2001 +From: Firstyear +Date: Fri, 7 Feb 2025 14:47:29 +1000 +Subject: [PATCH] Issue 6596 - BUG - Compilation Regresion (#6597) + +Bug Description: The addition of the json auditlog feature caused +a regresion in compilation due to the use of labels in a declaration. + +Fix Description: Enclose the switch/case in braces to resolve the +compilation issue. + +fixes: https://github.com/389ds/389-ds-base/issues/6596 + +Author: William Brown + +Review by: @droideck Thanks! +--- + ldap/servers/slapd/auditlog.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +diff --git a/ldap/servers/slapd/auditlog.c b/ldap/servers/slapd/auditlog.c +index c288a1a7f..ff9a6fdde 100644 +--- a/ldap/servers/slapd/auditlog.c ++++ b/ldap/servers/slapd/auditlog.c +@@ -456,7 +456,7 @@ write_audit_file_json(Slapi_PBlock *pb, Slapi_Entry *entry, int logtype, + add_entry_attrs_json(entry, log_json); + + switch (optype) { +- case SLAPI_OPERATION_MODIFY: ++ case SLAPI_OPERATION_MODIFY: { + json_object *mod_list = json_object_new_array(); + mods = change; + for (size_t j = 0; (mods != NULL) && (mods[j] != NULL); j++) { +@@ -511,8 +511,8 @@ write_audit_file_json(Slapi_PBlock *pb, Slapi_Entry *entry, int logtype, + /* Add entire mod list to the main object */ + json_object_object_add(log_json, "modify", mod_list); + break; +- +- case SLAPI_OPERATION_ADD: ++ } ++ case SLAPI_OPERATION_ADD: { + int len; + e = change; + tmp = slapi_entry2str(e, &len); +@@ -526,8 +526,8 @@ write_audit_file_json(Slapi_PBlock *pb, Slapi_Entry *entry, int logtype, + json_object_object_add(log_json, "add", json_object_new_string(tmp)); + slapi_ch_free_string(&tmpsave); + break; +- +- case SLAPI_OPERATION_DELETE: ++ } ++ case SLAPI_OPERATION_DELETE: { + tmp = change; + del_obj = json_object_new_object(); + if (tmp && tmp[0]) { +@@ -538,8 +538,8 @@ write_audit_file_json(Slapi_PBlock *pb, Slapi_Entry *entry, int logtype, + json_object_object_add(log_json, "delete", del_obj); + } + break; +- +- case SLAPI_OPERATION_MODDN: ++ } ++ case SLAPI_OPERATION_MODDN: { + newrdn = ((char **)change)[0]; + modrdn_obj = json_object_new_object(); + json_object_object_add(modrdn_obj, attr_newrdn, json_object_new_string(newrdn)); +@@ -551,6 +551,7 @@ write_audit_file_json(Slapi_PBlock *pb, Slapi_Entry *entry, int logtype, + } + json_object_object_add(log_json, "modrdn", modrdn_obj); + break; ++ } + } + + msg = (char *)json_object_to_json_string_ext(log_json, log_format); +-- +2.48.0 + diff --git a/0011-Issue-6367-RFE-support-of-Session-Tracking-Control-i.patch b/0011-Issue-6367-RFE-support-of-Session-Tracking-Control-i.patch new file mode 100644 index 0000000..2feceba --- /dev/null +++ b/0011-Issue-6367-RFE-support-of-Session-Tracking-Control-i.patch @@ -0,0 +1,2106 @@ +From 8cbd49a7aa59f42856d31e79ba09ce14bbc5c51a Mon Sep 17 00:00:00 2001 +From: tbordaz +Date: Fri, 29 Nov 2024 18:27:57 +0100 +Subject: [PATCH] Issue 6367 - RFE support of Session Tracking Control internet + draft (#6403) + +Bug description: + This RFE is to support https://datatracker.ietf.org/doc/html/draft-wahl-ldap-session-03 + In short, it allows a client to send strings in a control. + Those strings are added to the operation result logged in the + access logs. + Those strings are meaningful for the client (debug, + kmonitoring,...). + +Fix description: + The design is https://www.port389.org/docs/389ds/design/session-identifier-in-logs.html + +fixes: #6367 + +Reviewed by: William Brown, Pierre Rogier (Thanks !!!) +--- + .../suites/session_tracking/session_test.py | 1576 +++++++++++++++++ + ldap/servers/slapd/abandon.c | 42 +- + ldap/servers/slapd/control.c | 127 ++ + ldap/servers/slapd/pblock.c | 12 + + ldap/servers/slapd/pblock_v3.h | 3 + + ldap/servers/slapd/result.c | 57 +- + ldap/servers/slapd/slapi-plugin.h | 1 + + 7 files changed, 1794 insertions(+), 24 deletions(-) + create mode 100644 dirsrvtests/tests/suites/session_tracking/session_test.py + +diff --git a/dirsrvtests/tests/suites/session_tracking/session_test.py b/dirsrvtests/tests/suites/session_tracking/session_test.py +new file mode 100644 +index 000000000..452ca04fb +--- /dev/null ++++ b/dirsrvtests/tests/suites/session_tracking/session_test.py +@@ -0,0 +1,1576 @@ ++# --- BEGIN COPYRIGHT BLOCK --- ++# Copyright (C) 2024 RED Hat, Inc. ++# All rights reserved. ++# ++# License: GPL (version 3 or any later version). ++# See LICENSE for details. ++# --- END COPYRIGHT BLOCK ---- ++ ++import pytest, os, re, time ++from lib389.tasks import * ++from lib389.utils import * ++from lib389 import Entry ++from ldap import SCOPE_SUBTREE, ALREADY_EXISTS ++from ldap.controls import SimplePagedResultsControl ++from ldap.controls.sessiontrack import SessionTrackingControl, SESSION_TRACKING_CONTROL_OID ++from ldap.extop import ExtendedRequest ++ ++from lib389._constants import DEFAULT_SUFFIX, PW_DM, PLUGIN_MEMBER_OF ++from lib389.topologies import topology_st ++from lib389.plugins import MemberOfPlugin ++ ++from lib389.schema import Schema ++from lib389.idm.user import UserAccount, UserAccounts ++from lib389.idm.account import Accounts ++from lib389.idm.account import Anonymous ++ ++SESSION_SOURCE_IP = '10.0.0.10' ++SESSION_SOURCE_NAME = 'host.example.com' ++SESSION_TRACKING_FORMAT_OID = SESSION_TRACKING_CONTROL_OID + ".1234" ++ ++pytestmark = pytest.mark.tier0 ++ ++def test_short_session_tracking_srch(topology_st, request): ++ """Verify that a short session_tracking string ++ is added (not truncate) during a search ++ ++ :id: c9efc1cc-03c7-42b7-801c-440f7a11ee13 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Do a search with a short session tracking string ++ 2. Restart the instance to flush the log ++ 3. Check the exact same string is present in the access log ++ :expectedresults: ++ 1. Search should succeed ++ 2. success ++ 3. Log should contain one log with that session ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER = "SRCH short" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ ++ topology_st.standalone.search_ext_s(DEFAULT_SUFFIX, ++ ldap.SCOPE_SUBTREE, ++ '(uid=*)', ++ serverctrls=[st_ctrl]) ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=101.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_short_session_tracking_add(topology_st, request): ++ """Verify that a short session_tracking string ++ is added (not truncate) during a add ++ ++ :id: 04afd3de-365e-485f-9e00-913d913af931 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry with a short session tracking ++ 2. Restart the instance to flush the log ++ 3. Check the exact same string is present in the access log ++ :expectedresults: ++ 1. Add should succeed ++ 2. success ++ 3. Log should contain one log with that session ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER = "ADD short" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_add," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_add'), ++ ('cn', b'test_add'), ++ ('userPassword', b'test_add'), ++ ], ++ serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_short_session_tracking_del(topology_st, request): ++ """Verify that a short session_tracking string ++ is added (not truncate) during a del ++ ++ :id: a1391fbc-2107-4474-aaaf-088c393767a6 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry ++ 2. Delete the test entry with a short session tracking ++ 3. Restart the instance to flush the log ++ 4. Check the exact same string is not present in the access log for the ADD ++ 5. Check the exact same string is present in the access log for the DEL ++ :expectedresults: ++ 1. Add should succeed ++ 2. DEL should succeed ++ 3. success ++ 4. Log should not contain a log with that session for the ADD ++ 5. Log should contain one log with that session for the DEL ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER = "DEL short" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_del," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_del'), ++ ('cn', b'test_del'), ++ ('userPassword', b'test_del'), ++ ]) ++ topology_st.standalone.delete_ext_s(TEST_DN, ++ serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=107.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_short_session_tracking_mod(topology_st, request): ++ """Verify that a short session_tracking string ++ is added (not truncate) during a MOD ++ ++ :id: 00c91efc-071d-4187-8185-6cca27b5bf63 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry ++ 2. Modify the test entry with a short session tracking ++ 3. Restart the instance to flush the log ++ 4. Check the exact same string is not present in the access log for the ADD ++ 5. Check the exact same string is present in the access log for the MOD ++ :expectedresults: ++ 1. Add should succeed ++ 2. Mod should succeed ++ 3. success ++ 4. Log should not contain a log with that session for the ADD ++ 5. Log should contain one log with that session for the MOD ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER = "MOD short" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_mod," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_del'), ++ ('cn', b'test_del'), ++ ('userPassword', b'test_del'), ++ ]) ++ topology_st.standalone.modify_ext_s(TEST_DN, ++ [(ldap.MOD_REPLACE, 'sn', b'new_sn')], ++ serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=103.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_short_session_tracking_compare(topology_st, request): ++ """Verify that a short session_tracking string ++ is added (not truncate) during a compare ++ ++ :id: 6f2090fd-a960-48e5-b7f1-04ddef4a85af ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry ++ 2. compare an attribute with a short session tracking ++ 3. Restart the instance to flush the log ++ 4. Check the exact same string is not present in the access log for the ADD ++ 5. Check the exact same string is present in the access log for the COMPARE ++ :expectedresults: ++ 1. Add should succeed ++ 2. Compare should succeed ++ 3. success ++ 4. Log should not contain a log with that session for the ADD ++ 5. Log should contain one log with that session for the COMPARE ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER = "COMPARE short" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_compare," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_compare'), ++ ('cn', b'test_compare'), ++ ('userPassword', b'test_compare'), ++ ]) ++ topology_st.standalone.compare_ext_s(TEST_DN, 'sn', b'test_compare', serverctrls=[st_ctrl]) ++ topology_st.standalone.compare_ext_s(TEST_DN, 'sn', b'test_fail_compare', serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*err=6 tag=111.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*err=5 tag=111.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_short_session_tracking_abandon(topology_st, request): ++ """Verify that a short session_tracking string ++ is added (not truncate) during an abandon ++ ++ :id: 58f54ada-e05c-411b-a1c6-8b19fd99843c ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add 10 test entries ++ 2. Launch Page Search with a window of 3 ++ 3. Abandon the Page Search with a short session tracking ++ 4. Restart the instance to flush the log ++ 5. Check the exact same string is not present in the access log for the ADD ++ 6. Check the exact same string is present in the access log for the ABANDON ++ :expectedresults: ++ 1. Add should succeed ++ 2. success ++ 3. success ++ 4. success ++ 5. Log should not contain log with that session for the ADDs ++ 6. Log should contain one log with that session for the abandon ++ """ ++ ++ SESSION_TRACKING_IDENTIFIER = "ABANDON short" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ ++ # provision more entries than the page search will fetch ++ entries = [] ++ for i in range(10): ++ TEST_DN = "cn=test_abandon_%d,%s" % (i, DEFAULT_SUFFIX) ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_abandon'), ++ ('cn', b'test_abandon_%d' % i), ++ ('userPassword', b'test_abandon'), ++ ]) ++ entries.append(TEST_DN) ++ ++ # run a page search (with the session) using a small window. So we can abandon it. ++ req_ctrl = SimplePagedResultsControl(True, size=3, cookie='') ++ msgid = topology_st.standalone.search_ext(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, r'(objectclass=*)', ['cn'], serverctrls=[req_ctrl]) ++ time.sleep(1) ++ topology_st.standalone.abandon_ext(msgid, serverctrls=[st_ctrl]) ++ ++ ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*ABANDON.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ for ent in entries: ++ try: ++ topology_st.standalone.delete_s(ent) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_short_session_tracking_extop(topology_st, request): ++ """Verify that a short session_tracking string ++ is added (not truncate) during an extended operation ++ ++ :id: 65c2d014-d798-46f3-8168-b6f56b43d069 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. run whoami extop ++ 2. Check the exact same string is present in the access log for the EXTOP ++ :expectedresults: ++ 1. success ++ 2. Log should contain one log with that session for the EXTOP ++ """ ++ SESSION_TRACKING_IDENTIFIER = "Extop short" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ ++ extop = ExtendedRequest(requestName = '1.3.6.1.4.1.4203.1.11.3', requestValue=None) ++ (oid_response, res) = topology_st.standalone.extop_s(extop, serverctrls=[st_ctrl]) ++ ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=120.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_exact_max_lgth_session_tracking_srch(topology_st, request): ++ """Verify that a exact max length session_tracking string ++ is added (not truncate) during a search ++ ++ :id: 2c8c86f9-4896-4ccc-a727-6a4033f6f44a ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Do a search with a exact max length session tracking string ++ 2. Restart the instance to flush the log ++ 3. Check the exact same string is present in the access log (without '.') ++ :expectedresults: ++ 1. Search should succeed ++ 2. success ++ 3. Log should contain one log with that session ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER = "SRCH long ---->" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ ++ topology_st.standalone.search_ext_s(DEFAULT_SUFFIX, ++ ldap.SCOPE_SUBTREE, ++ '(uid=*)', ++ serverctrls=[st_ctrl]) ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=101.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_exact_max_lgth_session_tracking_add(topology_st, request): ++ """Verify that a exact max length of session_tracking string ++ is added (not truncate) during a add ++ ++ :id: 41c0b4f3-5e75-404b-98af-98cc98b742c7 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry with a exact max lenght (15) session tracking ++ 2. Restart the instance to flush the log ++ 3. Check the exact same string is present in the access log ++ :expectedresults: ++ 1. Add should succeed ++ 2. success ++ 3. Log should contain one log with that session ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER = "ADD long ----->" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_add," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_add'), ++ ('cn', b'test_add'), ++ ('userPassword', b'test_add'), ++ ], ++ serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_exact_max_lgth_session_tracking_del(topology_st, request): ++ """Verify that a exact max lgth session_tracking string ++ is added (not truncate) during a del ++ ++ :id: b8dca6c9-7cd4-4950-bcb5-7e9e6bb9202f ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry ++ 2. Delete the test entry with a exact max length (15) session tracking ++ 3. Restart the instance to flush the log ++ 4. Check the exact same string is not present in the access log for the ADD ++ 5. Check the exact same string is present in the access log for the DEL ++ :expectedresults: ++ 1. Add should succeed ++ 2. DEL should succeed ++ 3. success ++ 4. Log should not contain a log with that session for the ADD ++ 5. Log should contain one log with that session for the DEL ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER = "DEL long ----->" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_del," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_del'), ++ ('cn', b'test_del'), ++ ('userPassword', b'test_del'), ++ ]) ++ topology_st.standalone.delete_ext_s(TEST_DN, ++ serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=107.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_exact_max_lgth_session_tracking_mod(topology_st, request): ++ """Verify that an exact max length session_tracking string ++ is added (not truncate) during a MOD ++ ++ :id: 3bd1205f-a035-48a7-94c2-f8774e24ae91 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry ++ 2. Modify the test entry with an exact max length (15) session tracking ++ 3. Restart the instance to flush the log ++ 4. Check the exact same string is not present in the access log for the ADD ++ 5. Check the exact same string is present in the access log for the MOD ++ :expectedresults: ++ 1. Add should succeed ++ 2. Mod should succeed ++ 3. success ++ 4. Log should not contain a log with that session for the ADD ++ 5. Log should contain one log with that session for the MOD ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER = "MOD long ----->" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_mod," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_del'), ++ ('cn', b'test_del'), ++ ('userPassword', b'test_del'), ++ ]) ++ topology_st.standalone.modify_ext_s(TEST_DN, ++ [(ldap.MOD_REPLACE, 'sn', b'new_sn')], ++ serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=103.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_exact_max_lgth_session_tracking_compare(topology_st, request): ++ """Verify that an exact max length session_tracking string ++ is added (not truncate) during a compare ++ ++ :id: a6c8ad60-7edb-4ee4-b0e3-06727870687c ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry ++ 2. compare an attribute with an exact max length session tracking ++ 3. Restart the instance to flush the log ++ 4. Check the exact same string is not present in the access log for the ADD ++ 5. Check the exact same string is present in the access log for the COMPARE ++ :expectedresults: ++ 1. Add should succeed ++ 2. Compare should succeed ++ 3. success ++ 4. Log should not contain a log with that session for the ADD ++ 5. Log should contain one log with that session for the COMPARE ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER = "COMPARE long ->" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_compare," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_compare'), ++ ('cn', b'test_compare'), ++ ('userPassword', b'test_compare'), ++ ]) ++ topology_st.standalone.compare_ext_s(TEST_DN, 'sn', b'test_compare', serverctrls=[st_ctrl]) ++ topology_st.standalone.compare_ext_s(TEST_DN, 'sn', b'test_fail_compare', serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*err=6 tag=111.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*err=5 tag=111.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_exact_max_lgth_session_tracking_abandon(topology_st, request): ++ """Verify that an exact max length session_tracking string ++ is added (not truncate) during an abandon ++ ++ :id: 708554b9-8403-411c-90b5-d9ecc2d3830f ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add 10 test entries ++ 2. Launch Page Search with a window of 3 ++ 3. Abandon the Page Search with an exact max length session tracking ++ 4. Restart the instance to flush the log ++ 5. Check the exact same string is not present in the access log for the ADD ++ 6. Check the exact same string is present in the access log for the ABANDON ++ :expectedresults: ++ 1. Add should succeed ++ 2. success ++ 3. success ++ 4. success ++ 5. Log should not contain log with that session for the ADDs ++ 6. Log should contain one log with that session for the abandon ++ """ ++ ++ SESSION_TRACKING_IDENTIFIER = "ABANDON long ->" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ ++ # provision more entries than the page search will fetch ++ entries = [] ++ for i in range(10): ++ TEST_DN = "cn=test_abandon_%d,%s" % (i, DEFAULT_SUFFIX) ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_abandon'), ++ ('cn', b'test_abandon_%d' % i), ++ ('userPassword', b'test_abandon'), ++ ]) ++ entries.append(TEST_DN) ++ ++ # run a page search (with the session) using a small window. So we can abandon it. ++ req_ctrl = SimplePagedResultsControl(True, size=3, cookie='') ++ msgid = topology_st.standalone.search_ext(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, r'(objectclass=*)', ['cn'], serverctrls=[req_ctrl]) ++ time.sleep(1) ++ topology_st.standalone.abandon_ext(msgid, serverctrls=[st_ctrl]) ++ ++ ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*ABANDON.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ for ent in entries: ++ try: ++ topology_st.standalone.delete_s(ent) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_exact_max_lgth_session_tracking_extop(topology_st, request): ++ """Verify that an exact max length session_tracking string ++ is added (not truncate) during an extended operation ++ ++ :id: 078d33c4-9124-4766-966e-2e3eebdf0e18 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. run whoami extop ++ 2. Check the exact same string (max length 15) ++ is present in the access log for the EXTOP ++ :expectedresults: ++ 1. success ++ 2. Log should contain one log with that session for the EXTOP ++ """ ++ SESSION_TRACKING_IDENTIFIER = "Extop long --->" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ ++ extop = ExtendedRequest(requestName = '1.3.6.1.4.1.4203.1.11.3', requestValue=None) ++ (oid_response, res) = topology_st.standalone.extop_s(extop, serverctrls=[st_ctrl]) ++ ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=120.* sid="%s".*' % SESSION_TRACKING_IDENTIFIER) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_long_session_tracking_srch(topology_st, request): ++ """Verify that a long session_tracking string ++ is added (truncate) during a search ++ ++ :id: 56118d13-c0b1-401f-aaa4-6dc233156e36 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Do a search with a long session tracking string ++ 2. Restart the instance to flush the log ++ 3. Check the exact same string is present in the access log (with '.') ++ :expectedresults: ++ 1. Search should succeed ++ 2. success ++ 3. Log should contain one log with that session ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER_MAX = "SRCH long ---->" ++ SESSION_TRACKING_IDENTIFIER = SESSION_TRACKING_IDENTIFIER_MAX + "xxxxxxxx" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ ++ topology_st.standalone.search_ext_s(DEFAULT_SUFFIX, ++ ldap.SCOPE_SUBTREE, ++ '(uid=*)', ++ serverctrls=[st_ctrl]) ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=101.* sid="%s...".*' % SESSION_TRACKING_IDENTIFIER_MAX) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_long_session_tracking_add(topology_st, request): ++ """Verify that a long session_tracking string ++ is added (truncate) during a add ++ ++ :id: ac97bc6b-f2c5-41e2-9ab6-df05afb2757c ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry with a long session tracking ++ 2. Restart the instance to flush the log ++ 3. Check the exact same string is present in the access log (with '.') ++ :expectedresults: ++ 1. Add should succeed ++ 2. success ++ 3. Log should contain one log with that session ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER_MAX = "ADD long ----->" ++ SESSION_TRACKING_IDENTIFIER = SESSION_TRACKING_IDENTIFIER_MAX + "xxxxxxxx" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_add," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_add'), ++ ('cn', b'test_add'), ++ ('userPassword', b'test_add'), ++ ], ++ serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s...".*' % SESSION_TRACKING_IDENTIFIER_MAX) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_long_session_tracking_del(topology_st, request): ++ """Verify that a long session_tracking string ++ is added (truncate) during a del ++ ++ :id: 283152b8-ba6b-4153-b2de-17070911bf18 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry ++ 2. Delete the test entry with a long session tracking ++ 3. Restart the instance to flush the log ++ 4. Check the exact same string is not present in the access log for the ADD ++ 5. Check the exact same string is present in the access log for the DEL (with '.') ++ :expectedresults: ++ 1. Add should succeed ++ 2. DEL should succeed ++ 3. success ++ 4. Log should not contain a log with that session for the ADD ++ 5. Log should contain one log with that session for the DEL ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER_MAX = "DEL long ----->" ++ SESSION_TRACKING_IDENTIFIER = SESSION_TRACKING_IDENTIFIER_MAX + "xxxxxxxx" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_del," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_del'), ++ ('cn', b'test_del'), ++ ('userPassword', b'test_del'), ++ ]) ++ topology_st.standalone.delete_ext_s(TEST_DN, ++ serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s...".*' % SESSION_TRACKING_IDENTIFIER_MAX) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=107.* sid="%s...".*' % SESSION_TRACKING_IDENTIFIER_MAX) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_long_session_tracking_mod(topology_st, request): ++ """Verify that a long session_tracking string ++ is added (truncate) during a MOD ++ ++ :id: 6bfcca4b-40b4-4288-9b77-cfa0d4f15c14 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry ++ 2. Modify the test entry with an long session tracking ++ 3. Restart the instance to flush the log ++ 4. Check the exact same string is not present in the access log for the ADD ++ 5. Check the exact same string is present in the access log for the MOD (with '.') ++ :expectedresults: ++ 1. Add should succeed ++ 2. Mod should succeed ++ 3. success ++ 4. Log should not contain a log with that session for the ADD ++ 5. Log should contain one log with that session for the MOD ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER_MAX = "MOD long ----->" ++ SESSION_TRACKING_IDENTIFIER = SESSION_TRACKING_IDENTIFIER_MAX + "xxxxxxxx" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_mod," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_del'), ++ ('cn', b'test_del'), ++ ('userPassword', b'test_del'), ++ ]) ++ topology_st.standalone.modify_ext_s(TEST_DN, ++ [(ldap.MOD_REPLACE, 'sn', b'new_sn')], ++ serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s...".*' % SESSION_TRACKING_IDENTIFIER_MAX) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=103.* sid="%s...".*' % SESSION_TRACKING_IDENTIFIER_MAX) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_long_session_tracking_compare(topology_st, request): ++ """Verify that a long session_tracking string ++ is added (truncate) during a compare ++ ++ :id: 840ad60b-d2c5-4375-a50d-1553701d3c22 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry ++ 2. compare an attribute with an exact max length session tracking ++ 3. Restart the instance to flush the log ++ 4. Check the exact same string is not present in the access log for the ADD ++ 5. Check the exact same string is present in the access log for the COMPARE (with '.') ++ :expectedresults: ++ 1. Add should succeed ++ 2. Compare should succeed ++ 3. success ++ 4. Log should not contain a log with that session for the ADD ++ 5. Log should contain one log with that session for the COMPARE ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER_MAX = "COMPARE long ->" ++ SESSION_TRACKING_IDENTIFIER = SESSION_TRACKING_IDENTIFIER_MAX + "xxxxxxxx" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_compare," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_compare'), ++ ('cn', b'test_compare'), ++ ('userPassword', b'test_compare'), ++ ]) ++ topology_st.standalone.compare_ext_s(TEST_DN, 'sn', b'test_compare', serverctrls=[st_ctrl]) ++ topology_st.standalone.compare_ext_s(TEST_DN, 'sn', b'test_fail_compare', serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s...".*' % SESSION_TRACKING_IDENTIFIER_MAX) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*err=6 tag=111.* sid="%s...".*' % SESSION_TRACKING_IDENTIFIER_MAX) ++ assert len(access_log_lines) == 1 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*err=5 tag=111.* sid="%s...".*' % SESSION_TRACKING_IDENTIFIER_MAX) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_long_session_tracking_abandon(topology_st, request): ++ """Verify that long session_tracking string ++ is added (truncate) during an abandon ++ ++ :id: bded1fbb-b123-42c5-8d28-9fcf9f19af94 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add 10 test entries ++ 2. Launch Page Search with a window of 3 ++ 3. Abandon the Page Search with long session tracking ++ 4. Restart the instance to flush the log ++ 5. Check the exact same string is not present in the access log for the ADD ++ 6. Check the exact same string is present in the access log for the ABANDON (with '.') ++ :expectedresults: ++ 1. Add should succeed ++ 2. success ++ 3. success ++ 4. success ++ 5. Log should not contain log with that session for the ADDs ++ 6. Log should contain one log with that session for the abandon ++ """ ++ ++ SESSION_TRACKING_IDENTIFIER_MAX = "ABANDON long ->" ++ SESSION_TRACKING_IDENTIFIER = SESSION_TRACKING_IDENTIFIER_MAX + "xxxxxxxx" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ ++ # provision more entries than the page search will fetch ++ entries = [] ++ for i in range(10): ++ TEST_DN = "cn=test_abandon_%d,%s" % (i, DEFAULT_SUFFIX) ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_abandon'), ++ ('cn', b'test_abandon_%d' % i), ++ ('userPassword', b'test_abandon'), ++ ]) ++ entries.append(TEST_DN) ++ ++ # run a page search (with the session) using a small window. So we can abandon it. ++ req_ctrl = SimplePagedResultsControl(True, size=3, cookie='') ++ msgid = topology_st.standalone.search_ext(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, r'(objectclass=*)', ['cn'], serverctrls=[req_ctrl]) ++ time.sleep(1) ++ topology_st.standalone.abandon_ext(msgid, serverctrls=[st_ctrl]) ++ ++ ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s...".*' % SESSION_TRACKING_IDENTIFIER_MAX) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*ABANDON.* sid="%s...".*' % SESSION_TRACKING_IDENTIFIER_MAX) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ for ent in entries: ++ try: ++ topology_st.standalone.delete_s(ent) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_long_session_tracking_extop(topology_st, request): ++ """Verify that long session_tracking string ++ is added (truncate) during an extended operation ++ ++ :id: a7aa65d2-eed8-4bdd-9786-2379997ff0b7 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. run whoami extop ++ 2. Check the truncated long session string ++ is present in the access log for the EXTOP ++ :expectedresults: ++ 1. success ++ 2. Log should contain one log with that session for the EXTOP ++ """ ++ SESSION_TRACKING_IDENTIFIER_MAX = "Extop long --->" ++ SESSION_TRACKING_IDENTIFIER = SESSION_TRACKING_IDENTIFIER_MAX + "xxxxxxxx" ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ ++ extop = ExtendedRequest(requestName = '1.3.6.1.4.1.4203.1.11.3', requestValue=None) ++ (oid_response, res) = topology_st.standalone.extop_s(extop, serverctrls=[st_ctrl]) ++ ++ topology_st.standalone.restart(timeout=10) ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=120.* sid="%s...".*' % SESSION_TRACKING_IDENTIFIER_MAX) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_escaped_session_tracking_srch(topology_st, request): ++ """Verify that a session_tracking string containing escaped character ++ is added (not truncate) during a search ++ ++ :id: dce83631-7a3f-4af8-a79a-ee81df4b0595 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Do a search with a session tracking string containing escaped character ++ 2. Restart the instance to flush the log ++ 3. Check the exact same string is present in the access log ++ :expectedresults: ++ 1. Search should succeed ++ 2. success ++ 3. Log should contain one log with that session ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER_START = "SRCH" ++ SESSION_TRACKING_IDENTIFIER_ORIGINAL = "  " ++ SESSION_TRACKING_IDENTIFIER_ESCAPED = " \\\\06 " ++ SESSION_TRACKING_IDENTIFIER_END = "escape" ++ SESSION_TRACKING_IDENTIFIER = SESSION_TRACKING_IDENTIFIER_START + SESSION_TRACKING_IDENTIFIER_ORIGINAL + SESSION_TRACKING_IDENTIFIER_END ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ ++ topology_st.standalone.search_ext_s(DEFAULT_SUFFIX, ++ ldap.SCOPE_SUBTREE, ++ '(uid=*)', ++ serverctrls=[st_ctrl]) ++ topology_st.standalone.restart(timeout=10) ++ sid_escaped = SESSION_TRACKING_IDENTIFIER_START + SESSION_TRACKING_IDENTIFIER_ESCAPED + SESSION_TRACKING_IDENTIFIER_END ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=101.* sid="%s".*' % sid_escaped) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_escaped_session_tracking_add(topology_st, request): ++ """Verify that a session_tracking string containing escaped character ++ is added (not truncate) during a add ++ ++ :id: df40e5b3-20d9-4a85-a7ad-246e3ec25f4f ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry with a session tracking containing escaped character ++ 2. Restart the instance to flush the log ++ 3. Check the exact same string is present in the access log ++ :expectedresults: ++ 1. Add should succeed ++ 2. success ++ 3. Log should contain one log with that session ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER_START = "ADD" ++ SESSION_TRACKING_IDENTIFIER_ORIGINAL = "  " ++ SESSION_TRACKING_IDENTIFIER_ESCAPED = " \\\\07 " ++ SESSION_TRACKING_IDENTIFIER_END = "escape" ++ SESSION_TRACKING_IDENTIFIER = SESSION_TRACKING_IDENTIFIER_START + SESSION_TRACKING_IDENTIFIER_ORIGINAL + SESSION_TRACKING_IDENTIFIER_END ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_add," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_add'), ++ ('cn', b'test_add'), ++ ('userPassword', b'test_add'), ++ ], ++ serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ sid_escaped = SESSION_TRACKING_IDENTIFIER_START + SESSION_TRACKING_IDENTIFIER_ESCAPED + SESSION_TRACKING_IDENTIFIER_END ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s".*' % sid_escaped) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_escaped_session_tracking_del(topology_st, request): ++ """Verify that a session_tracking string containing escaped character ++ is added (not truncate) during a DEL ++ ++ :id: 561c75fc-ae24-42ed-b062-9c994f71e3fc ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry ++ 2. Delete the test entry with a session tracking containing escaped character ++ 3. Restart the instance to flush the log ++ 4. Check the exact same string is not present in the access log for the ADD ++ 5. Check the exact same string is present in the access log for the DEL ++ :expectedresults: ++ 1. Add should succeed ++ 2. DEL should succeed ++ 3. success ++ 4. Log should not contain a log with that session for the ADD ++ 5. Log should contain one log with that session for the DEL ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER_START = "DEL" ++ SESSION_TRACKING_IDENTIFIER_ORIGINAL = "  " ++ SESSION_TRACKING_IDENTIFIER_ESCAPED = " \\\\14 " ++ SESSION_TRACKING_IDENTIFIER_END = "escape" ++ SESSION_TRACKING_IDENTIFIER = SESSION_TRACKING_IDENTIFIER_START + SESSION_TRACKING_IDENTIFIER_ORIGINAL + SESSION_TRACKING_IDENTIFIER_END ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_del," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_del'), ++ ('cn', b'test_del'), ++ ('userPassword', b'test_del'), ++ ]) ++ topology_st.standalone.delete_ext_s(TEST_DN, ++ serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ sid_escaped = SESSION_TRACKING_IDENTIFIER_START + SESSION_TRACKING_IDENTIFIER_ESCAPED + SESSION_TRACKING_IDENTIFIER_END ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s".*' % sid_escaped) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=107.* sid="%s".*' % sid_escaped) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_escaped_session_tracking_mod(topology_st, request): ++ """Verify that a session_tracking string containing escaped character ++ is added (not truncate) during a MOD ++ ++ :id: ca2ca411-32b4-4a9f-845d-e596f08a849c ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry ++ 2. Modify the test entry with a session tracking containing escaped character ++ 3. Restart the instance to flush the log ++ 4. Check the exact same string is not present in the access log for the ADD ++ 5. Check the exact same string is present in the access log for the MOD ++ :expectedresults: ++ 1. Add should succeed ++ 2. Mod should succeed ++ 3. success ++ 4. Log should not contain a log with that session for the ADD ++ 5. Log should contain one log with that session for the MOD ++ """ ++ ++ ++ SESSION_TRACKING_IDENTIFIER_START = "MOD" ++ SESSION_TRACKING_IDENTIFIER_ORIGINAL = "  " ++ SESSION_TRACKING_IDENTIFIER_ESCAPED = " \\\\10 " ++ SESSION_TRACKING_IDENTIFIER_END = "escape" ++ SESSION_TRACKING_IDENTIFIER = SESSION_TRACKING_IDENTIFIER_START + SESSION_TRACKING_IDENTIFIER_ORIGINAL + SESSION_TRACKING_IDENTIFIER_END ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_mod," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_del'), ++ ('cn', b'test_del'), ++ ('userPassword', b'test_del'), ++ ]) ++ topology_st.standalone.modify_ext_s(TEST_DN, ++ [(ldap.MOD_REPLACE, 'sn', b'new_sn')], ++ serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ sid_escaped = SESSION_TRACKING_IDENTIFIER_START + SESSION_TRACKING_IDENTIFIER_ESCAPED + SESSION_TRACKING_IDENTIFIER_END ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s".*' % sid_escaped) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=103.* sid="%s".*' % sid_escaped) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_escaped_session_tracking_compare(topology_st, request): ++ """Verify that a session_tracking string containing escaped character ++ is added (not truncate) during a COMPARE ++ ++ :id: 93c13457-5c51-4bec-8e8a-0c6320cd970b ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add a test entry ++ 2. compare an attribute with a session tracking containing escaped character ++ 3. Restart the instance to flush the log ++ 4. Check the exact same string is not present in the access log for the ADD ++ 5. Check the exact same string is present in the access log for the COMPARE ++ :expectedresults: ++ 1. Add should succeed ++ 2. Compare should succeed ++ 3. success ++ 4. Log should not contain a log with that session for the ADD ++ 5. Log should contain one log with that session for the COMPARE ++ """ ++ ++ ++ # be careful that the complete string is less than 15 chars ++ SESSION_TRACKING_IDENTIFIER_START = "COMPARE" ++ SESSION_TRACKING_IDENTIFIER_ORIGINAL = "  " ++ SESSION_TRACKING_IDENTIFIER_ESCAPED = " \\\\11 " ++ SESSION_TRACKING_IDENTIFIER_END = "esc" ++ SESSION_TRACKING_IDENTIFIER = SESSION_TRACKING_IDENTIFIER_START + SESSION_TRACKING_IDENTIFIER_ORIGINAL + SESSION_TRACKING_IDENTIFIER_END ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ TEST_DN = "cn=test_compare," + DEFAULT_SUFFIX ++ try: ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_compare'), ++ ('cn', b'test_compare'), ++ ('userPassword', b'test_compare'), ++ ]) ++ topology_st.standalone.compare_ext_s(TEST_DN, 'sn', b'test_compare', serverctrls=[st_ctrl]) ++ topology_st.standalone.compare_ext_s(TEST_DN, 'sn', b'test_fail_compare', serverctrls=[st_ctrl]) ++ except ldap.LDAPError as e: ++ log.fatal('Failed to add user1 entry, error: ' + e.message['desc']) ++ assert False ++ ++ topology_st.standalone.restart(timeout=10) ++ ++ sid_escaped = SESSION_TRACKING_IDENTIFIER_START + SESSION_TRACKING_IDENTIFIER_ESCAPED + SESSION_TRACKING_IDENTIFIER_END ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s".*' % sid_escaped) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*err=6 tag=111.* sid="%s".*' % sid_escaped) ++ assert len(access_log_lines) == 1 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*err=5 tag=111.* sid="%s".*' % sid_escaped) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ try: ++ topology_st.standalone.delete_s(TEST_DN) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++ ++def test_escaped_session_tracking_abandon(topology_st, request): ++ """Verify that a session_tracking string containing escaped character ++ is added (not truncate) during an abandon ++ ++ :id: 37a9d1db-ec19-4381-88f3-48eae477cb81 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. Add 10 test entries ++ 2. Launch Page Search with a window of 3 ++ 3. Abandon the Page Search with a session tracking containing escaped character ++ 4. Restart the instance to flush the log ++ 5. Check the exact same string is not present in the access log for the ADD ++ 6. Check the exact same string is present in the access log for the ABANDON ++ :expectedresults: ++ 1. Add should succeed ++ 2. success ++ 3. success ++ 4. success ++ 5. Log should not contain log with that session for the ADDs ++ 6. Log should contain one log with that session for the abandon ++ """ ++ ++ # be careful that the complete string is less than 15 chars ++ SESSION_TRACKING_IDENTIFIER_START = "ABANDON" ++ SESSION_TRACKING_IDENTIFIER_ORIGINAL = "  " ++ SESSION_TRACKING_IDENTIFIER_ESCAPED = " \\\\12 " ++ SESSION_TRACKING_IDENTIFIER_END = "es" ++ SESSION_TRACKING_IDENTIFIER = SESSION_TRACKING_IDENTIFIER_START + SESSION_TRACKING_IDENTIFIER_ORIGINAL + SESSION_TRACKING_IDENTIFIER_END ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ ++ # provision more entries than the page search will fetch ++ entries = [] ++ for i in range(10): ++ TEST_DN = "cn=test_abandon_%d,%s" % (i, DEFAULT_SUFFIX) ++ ent = topology_st.standalone.add_ext_s(TEST_DN, ++ [ ++ ('objectClass', b'person'), ++ ('sn', b'test_abandon'), ++ ('cn', b'test_abandon_%d' % i), ++ ('userPassword', b'test_abandon'), ++ ]) ++ entries.append(TEST_DN) ++ ++ # run a page search (with the session) using a small window. So we can abandon it. ++ req_ctrl = SimplePagedResultsControl(True, size=3, cookie='') ++ msgid = topology_st.standalone.search_ext(DEFAULT_SUFFIX, ldap.SCOPE_SUBTREE, r'(objectclass=*)', ['cn'], serverctrls=[req_ctrl]) ++ time.sleep(1) ++ topology_st.standalone.abandon_ext(msgid, serverctrls=[st_ctrl]) ++ ++ ++ topology_st.standalone.restart(timeout=10) ++ sid_escaped = SESSION_TRACKING_IDENTIFIER_START + SESSION_TRACKING_IDENTIFIER_ESCAPED + SESSION_TRACKING_IDENTIFIER_END ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=105.* sid="%s".*' % sid_escaped) ++ assert len(access_log_lines) == 0 ++ ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*ABANDON.* sid="%s".*' % sid_escaped) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ for ent in entries: ++ try: ++ topology_st.standalone.delete_s(ent) ++ except: ++ pass ++ ++ request.addfinalizer(fin) ++ ++def test_escaped_session_tracking_extop(topology_st, request): ++ """Verify that a session_tracking string containing escaped character ++ is added (not truncate) during an extended operation ++ ++ :id: fd3afce9-86c9-4d87-ab05-9d19f2d733c3 ++ :customerscenario: False ++ :setup: Standalone instance, default backend ++ :steps: ++ 1. run whoami extop ++ 2. Check the exact same string is present in the access log for the EXTOP ++ :expectedresults: ++ 1. success ++ 2. Log should contain one log with that session for the EXTOP ++ """ ++ ++ # be careful that the complete string is less than 15 chars ++ SESSION_TRACKING_IDENTIFIER_START = "EXTOP" ++ SESSION_TRACKING_IDENTIFIER_ORIGINAL = "  " ++ SESSION_TRACKING_IDENTIFIER_ESCAPED = " \\\\13 " ++ SESSION_TRACKING_IDENTIFIER_END = "escap" ++ SESSION_TRACKING_IDENTIFIER = SESSION_TRACKING_IDENTIFIER_START + SESSION_TRACKING_IDENTIFIER_ORIGINAL + SESSION_TRACKING_IDENTIFIER_END ++ st_ctrl = SessionTrackingControl( ++ SESSION_SOURCE_IP, ++ SESSION_SOURCE_NAME, ++ SESSION_TRACKING_FORMAT_OID, ++ SESSION_TRACKING_IDENTIFIER ++ ) ++ ++ extop = ExtendedRequest(requestName = '1.3.6.1.4.1.4203.1.11.3', requestValue=None) ++ (oid_response, res) = topology_st.standalone.extop_s(extop, serverctrls=[st_ctrl]) ++ ++ topology_st.standalone.restart(timeout=10) ++ sid_escaped = SESSION_TRACKING_IDENTIFIER_START + SESSION_TRACKING_IDENTIFIER_ESCAPED + SESSION_TRACKING_IDENTIFIER_END ++ access_log_lines = topology_st.standalone.ds_access_log.match('.*tag=120.* sid="%s".*' % sid_escaped) ++ assert len(access_log_lines) == 1 ++ ++ def fin(): ++ pass ++ ++ request.addfinalizer(fin) ++ ++if __name__ == "__main__": ++ CURRENT_FILE = os.path.realpath(__file__) ++ pytest.main("-s -v %s" % CURRENT_FILE) +diff --git a/ldap/servers/slapd/abandon.c b/ldap/servers/slapd/abandon.c +index 8e0ab009b..ba42cf0bc 100644 +--- a/ldap/servers/slapd/abandon.c ++++ b/ldap/servers/slapd/abandon.c +@@ -40,6 +40,13 @@ do_abandon(Slapi_PBlock *pb) + Operation *o; + int32_t log_format = config_get_accesslog_log_format(); + slapd_log_pblock logpb = {0}; ++ char *sessionTrackingId; ++ /* Should fit ++ * - ~10chars for ' sid=\"..\"' ++ * - 15+3 for the truncated sessionID ++ * Need to sync with SESSION_ID_STR_SZ ++ */ ++ char session_str[30] = {0}; + /* Keep a copy of some data because o may vanish once conn is unlocked */ + struct { + struct timespec hr_time_end; +@@ -89,6 +96,25 @@ do_abandon(Slapi_PBlock *pb) + + slapi_log_err(SLAPI_LOG_ARGS, "do_abandon", "id %d\n", id); + ++ slapi_pblock_get(pb, SLAPI_SESSION_TRACKING, &sessionTrackingId); ++ ++ /* prepare session_str to be logged */ ++ if (sessionTrackingId) { ++ if (sizeof(session_str) < (strlen(sessionTrackingId) + 10 + 1)) { ++ /* The session tracking string is too large to fit in 'session_str' ++ * Likely SESSION_ID_STR_SZ was changed without increasing the size of session_str. ++ * Just ignore the session string. ++ */ ++ session_str[0] = '\0'; ++ slapi_log_err(SLAPI_LOG_ERR, "do_abandon", "Too large session tracking string (%ld) - It is ignored\n", ++ strlen(sessionTrackingId)); ++ } else { ++ snprintf(session_str, sizeof(session_str), " sid=\"%s\"", sessionTrackingId); ++ } ++ } else { ++ session_str[0] = '\0'; ++ } ++ + /* + * find the operation being abandoned and set the o_abandon + * flag. We don't allow the operation to abandon itself. +@@ -158,8 +184,8 @@ do_abandon(Slapi_PBlock *pb) + slapd_log_access_abandon(&logpb); + } else { + slapi_log_access(LDAP_DEBUG_STATS, "conn=%" PRIu64 +- " op=%d ABANDON targetop=Simple Paged Results msgid=%d\n", +- pb_conn->c_connid, pb_op->o_opid, id); ++ " op=%d ABANDON targetop=Simple Paged Results msgid=%d%s\n", ++ pb_conn->c_connid, pb_op->o_opid, id, session_str); + } + } else if (NULL == o) { + if (log_format != LOG_FORMAT_DEFAULT) { +@@ -168,8 +194,8 @@ do_abandon(Slapi_PBlock *pb) + slapd_log_access_abandon(&logpb); + } else { + slapi_log_access(LDAP_DEBUG_STATS, "conn=%" PRIu64 " op=%d ABANDON" +- " targetop=NOTFOUND msgid=%d\n", +- pb_conn->c_connid, pb_op->o_opid, id); ++ " targetop=NOTFOUND msgid=%d%s\n", ++ pb_conn->c_connid, pb_op->o_opid, id, session_str); + } + } else if (suppressed_by_plugin) { + if (log_format != LOG_FORMAT_DEFAULT) { +@@ -178,8 +204,8 @@ do_abandon(Slapi_PBlock *pb) + slapd_log_access_abandon(&logpb); + } else { + slapi_log_access(LDAP_DEBUG_STATS, "conn=%" PRIu64 " op=%d ABANDON" +- " targetop=SUPPRESSED-BY-PLUGIN msgid=%d\n", +- pb_conn->c_connid, pb_op->o_opid, id); ++ " targetop=SUPPRESSED-BY-PLUGIN msgid=%d%s\n", ++ pb_conn->c_connid, pb_op->o_opid, id, session_str); + } + } else { + if (log_format != LOG_FORMAT_DEFAULT) { +@@ -194,10 +220,10 @@ do_abandon(Slapi_PBlock *pb) + slapd_log_access_abandon(&logpb); + } else { + slapi_log_access(LDAP_DEBUG_STATS, "conn=%" PRIu64 " op=%d ABANDON" +- " targetop=%d msgid=%d nentries=%d etime=%" PRId64 ".%010" PRId64 "\n", ++ " targetop=%d msgid=%d nentries=%d etime=%" PRId64 ".%010" PRId64 "%s\n", + pb_conn->c_connid, pb_op->o_opid, o_copy.opid, id, + o_copy.nentries, (int64_t)o_copy.hr_time_end.tv_sec, +- (int64_t)o_copy.hr_time_end.tv_nsec); ++ (int64_t)o_copy.hr_time_end.tv_nsec, session_str); + } + } + /* +diff --git a/ldap/servers/slapd/control.c b/ldap/servers/slapd/control.c +index fa60c18dd..538a387da 100644 +--- a/ldap/servers/slapd/control.c ++++ b/ldap/servers/slapd/control.c +@@ -91,6 +91,10 @@ init_controls(void) + /* LDAP_CONTROL_PAGEDRESULTS is shared by request and response */ + slapi_register_supported_control(LDAP_CONTROL_PAGEDRESULTS, + SLAPI_OPERATION_SEARCH); ++ ++ /* LDAP_CONTROL_X_SESSION_TRACKING only supported by request */ ++ slapi_register_supported_control(LDAP_CONTROL_X_SESSION_TRACKING, ++ SLAPI_OPERATION_BIND | SLAPI_OPERATION_UNBIND | SLAPI_OPERATION_ABANDON | SLAPI_OPERATION_EXTENDED | SLAPI_OPERATION_SEARCH | SLAPI_OPERATION_COMPARE | SLAPI_OPERATION_ADD | SLAPI_OPERATION_DELETE | SLAPI_OPERATION_MODIFY | SLAPI_OPERATION_MODDN); + } + + +@@ -162,6 +166,97 @@ slapi_get_supported_controls_copy(char ***ctrloidsp, unsigned long **ctrlopsp) + return (0); + } + ++/* Parse the Session Tracking control ++ * see https://datatracker.ietf.org/doc/html/draft-wahl-ldap-session-03 ++ * LDAPString ::= OCTET STRING -- UTF-8 encoded ++ * LDAPOID ::= OCTET STRING -- Constrained to numericoid ++ * ++ * SessionIdentifierControlValue ::= SEQUENCE { ++ * sessionSourceIp LDAPString, ++ * sessionSourceName LDAPString, ++ * formatOID LDAPOID, ++ * sessionTrackingIdentifier LDAPString ++ * } ++ * ++ * design https://www.port389.org/docs/389ds/design/session-identifier-in-logs.html ++ * ++ * It ignores sessionSourceIp, sessionSourceName and formatOID. ++ * It extracts the 15 first chars from sessionTrackingIdentifier (escaped) ++ * and return them in session_tracking_id (allocated buffer) ++ * The caller is responsible of the free of session_tracking_id ++ */ ++static int ++parse_sessiontracking_ctrl(struct berval *session_tracking_spec, char **session_tracking_id) ++{ ++ BerElement *ber = NULL; ++ ber_tag_t ber_rc; ++ struct berval sessionTrackingIdentifier = {0}; ++#define SESSION_ID_STR_SZ 15 ++#define NB_DOTS 3 ++ char buf_sid_orig[SESSION_ID_STR_SZ + 2] = {0}; ++ int32_t sid_orig_sz; /* size of the original sid that we retain */ ++ const char *buf_sid_escaped; ++ int32_t sid_escaped_sz; /* size of the escaped sid that we retain */ ++ char buf[BUFSIZ]; ++ char *sid; ++ int rc = LDAP_SUCCESS; ++ ++ if (!BV_HAS_DATA(session_tracking_spec)) { ++ return LDAP_PROTOCOL_ERROR; ++ } ++ ber = ber_init(session_tracking_spec); ++ if ((ber == NULL) || (session_tracking_id == NULL)) { ++ return LDAP_OPERATIONS_ERROR; ++ } ++ ++ *session_tracking_id = NULL; ++ ++ /* Discard sessionSourceIp, sessionSourceName and formatOID ++ * Then only get sessionTrackingIdentifier and truncate it if needed */ ++ ber_rc = ber_scanf(ber, "{xxxo}", &sessionTrackingIdentifier); ++ if ((ber_rc == LBER_ERROR) || (sessionTrackingIdentifier.bv_len > 65536)) { ++ rc = LDAP_PROTOCOL_ERROR; ++ goto free_and_return; ++ } ++ ++ /* Make sure the interesting part of the provided SID is escaped */ ++ if (sessionTrackingIdentifier.bv_len > SESSION_ID_STR_SZ) { ++ sid_orig_sz = SESSION_ID_STR_SZ + 1; ++ } else { ++ sid_orig_sz = sessionTrackingIdentifier.bv_len; ++ memcpy(buf_sid_orig, sessionTrackingIdentifier.bv_val, sessionTrackingIdentifier.bv_len); ++ } ++ memcpy(buf_sid_orig, sessionTrackingIdentifier.bv_val, sid_orig_sz); ++ buf_sid_escaped = escape_string(buf_sid_orig, buf); ++ ++ /* Allocate the buffer that contains the heading portion ++ * of the escaped SID ++ */ ++ sid_escaped_sz = strlen(buf_sid_escaped); ++ if (sid_escaped_sz > SESSION_ID_STR_SZ) { ++ /* Take only a portion of it plus some '.' */ ++ sid_escaped_sz = SESSION_ID_STR_SZ + NB_DOTS; ++ } ++ sid = (char *) slapi_ch_calloc(1, sid_escaped_sz + 1); ++ ++ /* Lets copy the escaped SID into the buffer */ ++ if (sid_escaped_sz > SESSION_ID_STR_SZ) { ++ memcpy(sid, buf_sid_escaped, SESSION_ID_STR_SZ); ++ memset(sid + SESSION_ID_STR_SZ, '.', NB_DOTS); /* ending the string with "..." */ ++ } else { ++ memcpy(sid, buf_sid_escaped, sid_escaped_sz); ++ } ++ sid[sid_escaped_sz] = '\0'; ++ ++ *session_tracking_id = sid; ++ return rc; ++ ++free_and_return: ++ slapi_ch_free_string(&sessionTrackingIdentifier.bv_val); ++ ++ return rc; ++} ++ + /* + * RFC 4511 section 4.1.11. Controls says that the UnbindRequest + * MUST ignore the criticality field of controls +@@ -346,9 +441,16 @@ get_ldapmessage_controls_ext( + slapi_pblock_set(pb, SLAPI_REQCONTROLS, NULL); + slapi_pblock_set(pb, SLAPI_MANAGEDSAIT, &ctrl_not_found); + slapi_pblock_set(pb, SLAPI_PWPOLICY, &ctrl_not_found); ++ slapi_pblock_set(pb, SLAPI_SESSION_TRACKING, NULL); + slapi_log_err(SLAPI_LOG_CONNS, "get_ldapmessage_controls_ext", "Warning: conn=%" PRIu64 " op=%d contains an empty list of controls\n", + pb_conn ? pb_conn->c_connid : -1, pb_op ? pb_op->o_opid : -1); + } else { ++ struct berval *session_tracking_spec = NULL; ++ int iscritical = 0; ++ char *session_tracking_id = NULL; ++ char *old_sid; ++ int parse_rc = 0; ++ + /* len, ber_len_t is uint, not int, cannot be != -1, may be better to remove this check. */ + if ((tag != LBER_END_OF_SEQORSET) && (len != -1)) { + goto free_and_return; +@@ -358,6 +460,31 @@ get_ldapmessage_controls_ext( + managedsait = slapi_control_present(ctrls, + LDAP_CONTROL_MANAGEDSAIT, NULL, NULL); + slapi_pblock_set(pb, SLAPI_MANAGEDSAIT, &managedsait); ++ if (slapi_control_present(ctrls, ++ LDAP_CONTROL_X_SESSION_TRACKING, &session_tracking_spec, &iscritical)) { ++ Operation *pb_op = NULL; ++ slapi_pblock_get(pb, SLAPI_OPERATION, &pb_op); ++ ++ if (iscritical) { ++ /* It must not be critical */ ++ slapi_log_err(SLAPI_LOG_ERR, "get_ldapmessage_controls_ext", "conn=%" PRIu64 " op=%d SessionTracking critical flag must be unset\n", ++ pb_conn ? pb_conn->c_connid : -1, pb_op ? pb_op->o_opid : -1); ++ rc = LDAP_UNAVAILABLE_CRITICAL_EXTENSION; ++ goto free_and_return; ++ } ++ parse_rc = parse_sessiontracking_ctrl(session_tracking_spec, &session_tracking_id); ++ if (parse_rc != LDAP_SUCCESS) { ++ slapi_log_err(SLAPI_LOG_WARNING, "get_ldapmessage_controls_ext", "Warning: conn=%" PRIu64 " op=%d failed to parse SessionTracking control (%d)\n", ++ pb_conn ? pb_conn->c_connid : -1, pb_op ? pb_op->o_opid : -1, parse_rc); ++ slapi_ch_free_string(&session_tracking_id); ++ } else { ++ /* now replace the sid (if any) in the pblock */ ++ slapi_pblock_get(pb, SLAPI_SESSION_TRACKING, &old_sid); ++ slapi_ch_free_string(&old_sid); ++ slapi_pblock_set(pb, SLAPI_SESSION_TRACKING, session_tracking_id); ++ } ++ } ++ slapi_pblock_set(pb, SLAPI_SESSION_TRACKING, session_tracking_id); + pwpolicy_ctrl = slapi_control_present(ctrls, + LDAP_X_CONTROL_PWPOLICY_REQUEST, NULL, NULL); + slapi_pblock_set(pb, SLAPI_PWPOLICY, &pwpolicy_ctrl); +diff --git a/ldap/servers/slapd/pblock.c b/ldap/servers/slapd/pblock.c +index ec820ec70..bedb4f6ff 100644 +--- a/ldap/servers/slapd/pblock.c ++++ b/ldap/servers/slapd/pblock.c +@@ -218,6 +218,7 @@ pblock_done(Slapi_PBlock *pb) + if (pb->pb_intop != NULL) { + delete_passwdPolicy(&pb->pb_intop->pwdpolicy); + slapi_ch_free((void **)&(pb->pb_intop->pb_result_text)); ++ slapi_ch_free_string(&pb->pb_intop->pb_session_tracking_id); + } + slapi_ch_free((void **)&(pb->pb_intop)); + if (pb->pb_intplugin != NULL) { +@@ -1552,6 +1553,13 @@ slapi_pblock_get(Slapi_PBlock *pblock, int arg, void *value) + (*(int *)value) = 0; + } + break; ++ case SLAPI_SESSION_TRACKING: ++ if (pblock->pb_intop != NULL) { ++ (*(char **)value) = pblock->pb_intop->pb_session_tracking_id; ++ } else { ++ (*(char **)value) = 0; ++ } ++ break; + case SLAPI_PWPOLICY: + if (pblock->pb_intop != NULL) { + (*(int *)value) = pblock->pb_intop->pb_pwpolicy_ctrl; +@@ -3485,6 +3493,10 @@ slapi_pblock_set(Slapi_PBlock *pblock, int arg, void *value) + _pblock_assert_pb_intop(pblock); + pblock->pb_intop->pb_managedsait = *((int *)value); + break; ++ case SLAPI_SESSION_TRACKING: ++ _pblock_assert_pb_intop(pblock); ++ pblock->pb_intop->pb_session_tracking_id = (char *)value; ++ break; + case SLAPI_PWPOLICY: + _pblock_assert_pb_intop(pblock); + pblock->pb_intop->pb_pwpolicy_ctrl = *((int *)value); +diff --git a/ldap/servers/slapd/pblock_v3.h b/ldap/servers/slapd/pblock_v3.h +index ef15ee457..1b4996c48 100644 +--- a/ldap/servers/slapd/pblock_v3.h ++++ b/ldap/servers/slapd/pblock_v3.h +@@ -161,6 +161,9 @@ typedef struct _slapi_pblock_intop + /* For password policy control */ + int pb_pwpolicy_ctrl; + ++ /* For Session Tracking control */ ++ char *pb_session_tracking_id; ++ + int pb_paged_results_index; /* stash SLAPI_PAGED_RESULTS_INDEX */ + int pb_paged_results_cookie; /* stash SLAPI_PAGED_RESULTS_COOKIE */ + int32_t pb_usn_tombstone_incremented; /* stash SLAPI_PAGED_RESULTS_COOKIE */ +diff --git a/ldap/servers/slapd/result.c b/ldap/servers/slapd/result.c +index 98c01d8d0..c0abbeef1 100644 +--- a/ldap/servers/slapd/result.c ++++ b/ldap/servers/slapd/result.c +@@ -2184,10 +2184,35 @@ log_result(Slapi_PBlock *pb, Operation *op, int err, ber_tag_t tag, int nentries + time_t start_time; + int32_t log_format = config_get_accesslog_log_format(); + slapd_log_pblock logpb = {0}; ++ char *sessionTrackingId; ++ /* Should fit ++ * - ~10chars for ' sid=\"..\"' ++ * - 15+3 for the truncated sessionID ++ * Need to sync with SESSION_ID_STR_SZ ++ */ ++ char session_str[30] = {0}; + + get_internal_conn_op(&connid, &op_id, &op_internal_id, &op_nested_count, &start_time); + slapi_pblock_get(pb, SLAPI_PAGED_RESULTS_INDEX, &pr_idx); + slapi_pblock_get(pb, SLAPI_PAGED_RESULTS_COOKIE, &pr_cookie); ++ slapi_pblock_get(pb, SLAPI_SESSION_TRACKING, &sessionTrackingId); ++ ++ /* prepare session_str to be logged */ ++ if (sessionTrackingId) { ++ if (sizeof(session_str) < (strlen(sessionTrackingId) + 10 + 1)) { ++ /* The session tracking string is too large to fit in 'session_str' ++ * Likely SESSION_ID_STR_SZ was changed without increasing the size of session_str. ++ * Just ignore the session string. ++ */ ++ session_str[0] = '\0'; ++ slapi_log_err(SLAPI_LOG_ERR, "log_result", "Too large session tracking string (%ld) - It is ignored\n", ++ strlen(sessionTrackingId)); ++ } else { ++ snprintf(session_str, sizeof(session_str), " sid=\"%s\"", sessionTrackingId); ++ } ++ } else { ++ session_str[0] = '\0'; ++ } + internal_op = operation_is_flag_set(op, OP_FLAG_INTERNAL); + + /* total elapsed time */ +@@ -2251,13 +2276,13 @@ log_result(Slapi_PBlock *pb, Operation *op, int err, ber_tag_t tag, int nentries + } else { + slapi_log_access(LDAP_DEBUG_STATS, + "conn=%" PRIu64 " op=%d RESULT err=%d" +- " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s" ++ " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s%s" + ", SASL bind in progress\n", + op->o_connid, + op->o_opid, + err, tag, nentries, + wtime, optime, etime, +- notes_str, csn_str); ++ notes_str, csn_str, session_str); + } + } else { + if (log_format != LOG_FORMAT_DEFAULT) { +@@ -2267,7 +2292,7 @@ log_result(Slapi_PBlock *pb, Operation *op, int err, ber_tag_t tag, int nentries + logpb.msg = "SASL bind in progress"; + slapd_log_access_result(&logpb); + } else { +-#define LOG_SASLMSG_FMT " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s, SASL bind in progress\n" ++#define LOG_SASLMSG_FMT " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s%s, SASL bind in progress\n" + slapi_log_access(LDAP_DEBUG_ARGS, + connid == 0 ? LOG_CONN_OP_FMT_INT_INT LOG_SASLMSG_FMT : + LOG_CONN_OP_FMT_EXT_INT LOG_SASLMSG_FMT, +@@ -2277,7 +2302,7 @@ log_result(Slapi_PBlock *pb, Operation *op, int err, ber_tag_t tag, int nentries + op_nested_count, + err, tag, nentries, + wtime, optime, etime, +- notes_str, csn_str); ++ notes_str, csn_str, session_str); + } + } + } else if (op->o_tag == LDAP_REQ_BIND && err == LDAP_SUCCESS) { +@@ -2296,13 +2321,13 @@ log_result(Slapi_PBlock *pb, Operation *op, int err, ber_tag_t tag, int nentries + slapi_pblock_get(pb, SLAPI_CONN_DN, &dn); + slapi_log_access(LDAP_DEBUG_STATS, + "conn=%" PRIu64 " op=%d RESULT err=%d" +- " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s" ++ " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s%s" + " dn=\"%s\"\n", + op->o_connid, + op->o_opid, + err, tag, nentries, + wtime, optime, etime, +- notes_str, csn_str, dn ? dn : ""); ++ notes_str, csn_str, session_str, dn ? dn : ""); + slapi_ch_free_string(&dn); + } + } else { +@@ -2314,7 +2339,7 @@ log_result(Slapi_PBlock *pb, Operation *op, int err, ber_tag_t tag, int nentries + slapd_log_access_result(&logpb); + } else { + slapi_pblock_get(pb, SLAPI_CONN_DN, &dn); +-#define LOG_BINDMSG_FMT " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s dn=\"%s\"\n" ++#define LOG_BINDMSG_FMT " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s%s dn=\"%s\"\n" + slapi_log_access(LDAP_DEBUG_ARGS, + connid == 0 ? LOG_CONN_OP_FMT_INT_INT LOG_BINDMSG_FMT : + LOG_CONN_OP_FMT_EXT_INT LOG_BINDMSG_FMT, +@@ -2324,7 +2349,7 @@ log_result(Slapi_PBlock *pb, Operation *op, int err, ber_tag_t tag, int nentries + op_nested_count, + err, tag, nentries, + wtime, optime, etime, +- notes_str, csn_str, dn ? dn : ""); ++ notes_str, csn_str, session_str, dn ? dn : ""); + slapi_ch_free_string(&dn); + } + } +@@ -2339,13 +2364,13 @@ log_result(Slapi_PBlock *pb, Operation *op, int err, ber_tag_t tag, int nentries + } else { + slapi_log_access(LDAP_DEBUG_STATS, + "conn=%" PRIu64 " op=%d RESULT err=%d" +- " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s" ++ " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s%s" + " pr_idx=%d pr_cookie=%d\n", + op->o_connid, + op->o_opid, + err, tag, nentries, + wtime, optime, etime, +- notes_str, csn_str, pr_idx, pr_cookie); ++ notes_str, csn_str, session_str, pr_idx, pr_cookie); + } + } else { + if (log_format != LOG_FORMAT_DEFAULT) { +@@ -2356,7 +2381,7 @@ log_result(Slapi_PBlock *pb, Operation *op, int err, ber_tag_t tag, int nentries + logpb.pr_cookie = pr_cookie; + slapd_log_access_result(&logpb); + } else { +-#define LOG_PRMSG_FMT " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s pr_idx=%d pr_cookie=%d \n" ++#define LOG_PRMSG_FMT " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s%s pr_idx=%d pr_cookie=%d \n" + slapi_log_access(LDAP_DEBUG_ARGS, + connid == 0 ? LOG_CONN_OP_FMT_INT_INT LOG_PRMSG_FMT : + LOG_CONN_OP_FMT_EXT_INT LOG_PRMSG_FMT, +@@ -2366,7 +2391,7 @@ log_result(Slapi_PBlock *pb, Operation *op, int err, ber_tag_t tag, int nentries + op_nested_count, + err, tag, nentries, + wtime, optime, etime, +- notes_str, csn_str, pr_idx, pr_cookie); ++ notes_str, csn_str, session_str, pr_idx, pr_cookie); + } + } + } else if (!internal_op) { +@@ -2387,12 +2412,12 @@ log_result(Slapi_PBlock *pb, Operation *op, int err, ber_tag_t tag, int nentries + } else { + slapi_log_access(LDAP_DEBUG_STATS, + "conn=%" PRIu64 " op=%d RESULT err=%d" +- " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s%s\n", ++ " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s%s%s\n", + op->o_connid, + op->o_opid, + err, tag, nentries, + wtime, optime, etime, +- notes_str, csn_str, ext_str); ++ notes_str, csn_str, ext_str, session_str); + } + if (pbtxt) { + /* if !pbtxt ==> ext_str == "". Don't free ext_str. */ +@@ -2408,7 +2433,7 @@ log_result(Slapi_PBlock *pb, Operation *op, int err, ber_tag_t tag, int nentries + logpb.op_nested_count = op_nested_count; + slapd_log_access_result(&logpb); + } else { +-#define LOG_MSG_FMT " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s\n" ++#define LOG_MSG_FMT " tag=%" BERTAG_T " nentries=%d wtime=%s optime=%s etime=%s%s%s%s\n" + slapi_log_access(LDAP_DEBUG_ARGS, + connid == 0 ? LOG_CONN_OP_FMT_INT_INT LOG_MSG_FMT : + LOG_CONN_OP_FMT_EXT_INT LOG_MSG_FMT, +@@ -2418,7 +2443,7 @@ log_result(Slapi_PBlock *pb, Operation *op, int err, ber_tag_t tag, int nentries + op_nested_count, + err, tag, nentries, + wtime, optime, etime, +- notes_str, csn_str); ++ notes_str, csn_str, session_str); + } + /* + * If this is an unindexed search we should log it in the error log if +diff --git a/ldap/servers/slapd/slapi-plugin.h b/ldap/servers/slapd/slapi-plugin.h +index 18b4cbc67..de461706c 100644 +--- a/ldap/servers/slapd/slapi-plugin.h ++++ b/ldap/servers/slapd/slapi-plugin.h +@@ -7284,6 +7284,7 @@ typedef struct slapi_plugindesc + /* controls we know about */ + #define SLAPI_MANAGEDSAIT 1000 + #define SLAPI_PWPOLICY 1001 ++#define SLAPI_SESSION_TRACKING 1002 + + /* arguments that are common to all operation */ + #define SLAPI_TARGET_SDN 47 /* target sdn of the operation */ +-- +2.48.0 + diff --git a/0012-Issue-6561-TLS-1.2-stickiness-in-FIPS-mode.patch b/0012-Issue-6561-TLS-1.2-stickiness-in-FIPS-mode.patch new file mode 100644 index 0000000..8c410dc --- /dev/null +++ b/0012-Issue-6561-TLS-1.2-stickiness-in-FIPS-mode.patch @@ -0,0 +1,38 @@ +From 35f9253d6e988ccbf68e790404f05451a9c0708e Mon Sep 17 00:00:00 2001 +From: Viktor Ashirov +Date: Thu, 13 Feb 2025 16:37:43 +0100 +Subject: [PATCH] Issue 6561 - TLS 1.2 stickiness in FIPS mode + +Description: +TLS 1.3 works with NSS in FIPS mode for quite some time now, +this restriction is no longer needed. + +Fixes: https://github.com/389ds/389-ds-base/issues/6561 + +Reviewed by: @mreynolds389 (Thanks!) +--- + ldap/servers/slapd/ssl.c | 8 -------- + 1 file changed, 8 deletions(-) + +diff --git a/ldap/servers/slapd/ssl.c b/ldap/servers/slapd/ssl.c +index 94259efe7..84a7fb004 100644 +--- a/ldap/servers/slapd/ssl.c ++++ b/ldap/servers/slapd/ssl.c +@@ -1929,14 +1929,6 @@ slapd_ssl_init2(PRFileDesc **fd, int startTLS) + */ + sslStatus = SSL_VersionRangeGet(pr_sock, &slapdNSSVersions); + if (sslStatus == SECSuccess) { +- if (slapdNSSVersions.max > LDAP_OPT_X_TLS_PROTOCOL_TLS1_2 && fipsMode) { +- /* +- * FIPS & NSS currently only support a max version of TLS1.2 +- * (although NSS advertises 1.3 as a max range in FIPS mode), +- * hopefully this code block can be removed soon... +- */ +- slapdNSSVersions.max = LDAP_OPT_X_TLS_PROTOCOL_TLS1_2; +- } + /* Reset request range */ + sslStatus = SSL_VersionRangeSet(pr_sock, &slapdNSSVersions); + if (sslStatus == SECSuccess) { +-- +2.48.1 + diff --git a/0013-Issue-6375-UI-Update-cockpit.js-code-to-the-latest-v.patch b/0013-Issue-6375-UI-Update-cockpit.js-code-to-the-latest-v.patch new file mode 100644 index 0000000..b495b83 --- /dev/null +++ b/0013-Issue-6375-UI-Update-cockpit.js-code-to-the-latest-v.patch @@ -0,0 +1,6214 @@ +From f10f611b858f098946afb5acafaa084594bb6fa8 Mon Sep 17 00:00:00 2001 +From: Simon Pichugin +Date: Mon, 2 Dec 2024 18:55:00 -0500 +Subject: [PATCH] Issue 6375 - UI - Update cockpit.js code to the latest + version (#6376) + +Description: Update src/cockpit/389-console/pkg/lib/cockpit.js to the latest version. +Update the entire src/cockpit/389-console/pkg/lib directory from Cockpit's repository. +Update package.json. +Update 389 DS UI components to PF5. + +Fixes: https://github.com/389ds/389-ds-base/issues/6375 + +Reviewed by: @progier389, @mreynolds389 (Thanks!!) +--- + src/cockpit/389-console/package-lock.json | 4065 +++++------------ + .../src/lib/database/globalPwp.jsx | 2 +- + .../389-console/src/lib/server/accessLog.jsx | 8 +- + 3 files changed, 1273 insertions(+), 2802 deletions(-) + +diff --git a/src/cockpit/389-console/package-lock.json b/src/cockpit/389-console/package-lock.json +index 6cd3055b1..9f3afc656 100644 +--- a/src/cockpit/389-console/package-lock.json ++++ b/src/cockpit/389-console/package-lock.json +@@ -98,9 +98,9 @@ + } + }, + "node_modules/@bufbuild/protobuf": { +- "version": "2.2.3", +- "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.3.tgz", +- "integrity": "sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==", ++ "version": "2.2.2", ++ "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.2.tgz", ++ "integrity": "sha512-UNtPCbrwrenpmrXuRwn9jYpPoweNXj8X5sMvYgsqYyaH8jQ6LfUJSk3dJLnBK+6sfYPrF4iAIo5sd5HQ+tg75A==", + "dev": true, + "peer": true + }, +@@ -200,262 +200,6 @@ + "url": "https://github.com/sponsors/wooorm" + } + }, +- "node_modules/@esbuild/aix-ppc64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", +- "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", +- "cpu": [ +- "ppc64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "aix" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/android-arm": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", +- "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", +- "cpu": [ +- "arm" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "android" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/android-arm64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", +- "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", +- "cpu": [ +- "arm64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "android" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/android-x64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", +- "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", +- "cpu": [ +- "x64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "android" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/darwin-arm64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", +- "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", +- "cpu": [ +- "arm64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "darwin" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/darwin-x64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", +- "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", +- "cpu": [ +- "x64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "darwin" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/freebsd-arm64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", +- "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", +- "cpu": [ +- "arm64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "freebsd" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/freebsd-x64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", +- "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", +- "cpu": [ +- "x64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "freebsd" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/linux-arm": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", +- "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", +- "cpu": [ +- "arm" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/linux-arm64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", +- "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", +- "cpu": [ +- "arm64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/linux-ia32": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", +- "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", +- "cpu": [ +- "ia32" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/linux-loong64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", +- "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", +- "cpu": [ +- "loong64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/linux-mips64el": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", +- "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", +- "cpu": [ +- "mips64el" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/linux-ppc64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", +- "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", +- "cpu": [ +- "ppc64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/linux-riscv64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", +- "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", +- "cpu": [ +- "riscv64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/linux-s390x": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", +- "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", +- "cpu": [ +- "s390x" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], +- "engines": { +- "node": ">=18" +- } +- }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", +@@ -472,118 +216,6 @@ + "node": ">=18" + } + }, +- "node_modules/@esbuild/netbsd-x64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", +- "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", +- "cpu": [ +- "x64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "netbsd" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/openbsd-arm64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", +- "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", +- "cpu": [ +- "arm64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "openbsd" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/openbsd-x64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", +- "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", +- "cpu": [ +- "x64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "openbsd" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/sunos-x64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", +- "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", +- "cpu": [ +- "x64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "sunos" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/win32-arm64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", +- "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", +- "cpu": [ +- "arm64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "win32" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/win32-ia32": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", +- "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", +- "cpu": [ +- "ia32" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "win32" +- ], +- "engines": { +- "node": ">=18" +- } +- }, +- "node_modules/@esbuild/win32-x64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", +- "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", +- "cpu": [ +- "x64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "win32" +- ], +- "engines": { +- "node": ">=18" +- } +- }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", +@@ -980,17 +612,17 @@ + } + }, + "node_modules/@types/d3-shape": { +- "version": "3.1.7", +- "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", +- "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", ++ "version": "3.1.6", ++ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", ++ "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { +- "version": "3.0.4", +- "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", +- "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==" ++ "version": "3.0.3", ++ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", ++ "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", +@@ -1004,9 +636,9 @@ + "dev": true + }, + "node_modules/@types/prop-types": { +- "version": "15.7.14", +- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", +- "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", ++ "version": "15.7.13", ++ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", ++ "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "dev": true + }, + "node_modules/@types/qunit": { +@@ -1068,16 +700,16 @@ + } + }, + "node_modules/@typescript-eslint/parser": { +- "version": "8.19.1", +- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.19.1.tgz", +- "integrity": "sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==", ++ "version": "8.13.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.13.0.tgz", ++ "integrity": "sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==", + "dev": true, + "peer": true, + "dependencies": { +- "@typescript-eslint/scope-manager": "8.19.1", +- "@typescript-eslint/types": "8.19.1", +- "@typescript-eslint/typescript-estree": "8.19.1", +- "@typescript-eslint/visitor-keys": "8.19.1", ++ "@typescript-eslint/scope-manager": "8.13.0", ++ "@typescript-eslint/types": "8.13.0", ++ "@typescript-eslint/typescript-estree": "8.13.0", ++ "@typescript-eslint/visitor-keys": "8.13.0", + "debug": "^4.3.4" + }, + "engines": { +@@ -1088,19 +720,23 @@ + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { +- "eslint": "^8.57.0 || ^9.0.0", +- "typescript": ">=4.8.4 <5.8.0" ++ "eslint": "^8.57.0 || ^9.0.0" ++ }, ++ "peerDependenciesMeta": { ++ "typescript": { ++ "optional": true ++ } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { +- "version": "8.19.1", +- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.1.tgz", +- "integrity": "sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==", ++ "version": "8.13.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz", ++ "integrity": "sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==", + "dev": true, + "peer": true, + "dependencies": { +- "@typescript-eslint/types": "8.19.1", +- "@typescript-eslint/visitor-keys": "8.19.1" ++ "@typescript-eslint/types": "8.13.0", ++ "@typescript-eslint/visitor-keys": "8.13.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" +@@ -1111,14 +747,14 @@ + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { +- "version": "8.19.1", +- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.1.tgz", +- "integrity": "sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==", ++ "version": "8.13.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", ++ "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", + "dev": true, + "peer": true, + "dependencies": { +- "@typescript-eslint/types": "8.19.1", +- "eslint-visitor-keys": "^4.2.0" ++ "@typescript-eslint/types": "8.13.0", ++ "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" +@@ -1128,19 +764,6 @@ + "url": "https://opencollective.com/typescript-eslint" + } + }, +- "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { +- "version": "4.2.0", +- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", +- "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", +- "dev": true, +- "peer": true, +- "engines": { +- "node": "^18.18.0 || ^20.9.0 || >=21.1.0" +- }, +- "funding": { +- "url": "https://opencollective.com/eslint" +- } +- }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.0.tgz", +@@ -1237,9 +860,9 @@ + } + }, + "node_modules/@typescript-eslint/types": { +- "version": "8.19.1", +- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.1.tgz", +- "integrity": "sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==", ++ "version": "8.13.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz", ++ "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==", + "dev": true, + "peer": true, + "engines": { +@@ -1251,20 +874,20 @@ + } + }, + "node_modules/@typescript-eslint/typescript-estree": { +- "version": "8.19.1", +- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.1.tgz", +- "integrity": "sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==", ++ "version": "8.13.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz", ++ "integrity": "sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==", + "dev": true, + "peer": true, + "dependencies": { +- "@typescript-eslint/types": "8.19.1", +- "@typescript-eslint/visitor-keys": "8.19.1", ++ "@typescript-eslint/types": "8.13.0", ++ "@typescript-eslint/visitor-keys": "8.13.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", +- "ts-api-utils": "^2.0.0" ++ "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" +@@ -1273,19 +896,21 @@ + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, +- "peerDependencies": { +- "typescript": ">=4.8.4 <5.8.0" ++ "peerDependenciesMeta": { ++ "typescript": { ++ "optional": true ++ } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { +- "version": "8.19.1", +- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.1.tgz", +- "integrity": "sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==", ++ "version": "8.13.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", ++ "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", + "dev": true, + "peer": true, + "dependencies": { +- "@typescript-eslint/types": "8.19.1", +- "eslint-visitor-keys": "^4.2.0" ++ "@typescript-eslint/types": "8.13.0", ++ "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" +@@ -1295,32 +920,6 @@ + "url": "https://opencollective.com/typescript-eslint" + } + }, +- "node_modules/@typescript-eslint/typescript-estree/node_modules/eslint-visitor-keys": { +- "version": "4.2.0", +- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", +- "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", +- "dev": true, +- "peer": true, +- "engines": { +- "node": "^18.18.0 || ^20.9.0 || >=21.1.0" +- }, +- "funding": { +- "url": "https://opencollective.com/eslint" +- } +- }, +- "node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { +- "version": "2.0.0", +- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", +- "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", +- "dev": true, +- "peer": true, +- "engines": { +- "node": ">=18.12" +- }, +- "peerDependencies": { +- "typescript": ">=4.8.4" +- } +- }, + "node_modules/@typescript-eslint/utils": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.0.tgz", +@@ -1415,9 +1014,9 @@ + } + }, + "node_modules/@ungap/structured-clone": { +- "version": "1.2.1", +- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", +- "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", ++ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@xterm/addon-canvas": { +@@ -1538,13 +1137,13 @@ + } + }, + "node_modules/array-buffer-byte-length": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", +- "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", ++ "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.3", +- "is-array-buffer": "^3.0.5" ++ "call-bind": "^1.0.5", ++ "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" +@@ -1623,15 +1222,15 @@ + } + }, + "node_modules/array.prototype.flat": { +- "version": "1.3.3", +- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", +- "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", ++ "version": "1.3.2", ++ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", ++ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.8", +- "define-properties": "^1.2.1", +- "es-abstract": "^1.23.5", +- "es-shim-unscopables": "^1.0.2" ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.2.0", ++ "es-abstract": "^1.22.1", ++ "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -1641,15 +1240,15 @@ + } + }, + "node_modules/array.prototype.flatmap": { +- "version": "1.3.3", +- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", +- "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", ++ "version": "1.3.2", ++ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", ++ "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.8", +- "define-properties": "^1.2.1", +- "es-abstract": "^1.23.5", +- "es-shim-unscopables": "^1.0.2" ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.2.0", ++ "es-abstract": "^1.22.1", ++ "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -1675,18 +1274,19 @@ + } + }, + "node_modules/arraybuffer.prototype.slice": { +- "version": "1.0.4", +- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", +- "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", ++ "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", +- "call-bind": "^1.0.8", ++ "call-bind": "^1.0.5", + "define-properties": "^1.2.1", +- "es-abstract": "^1.23.5", +- "es-errors": "^1.3.0", +- "get-intrinsic": "^1.2.6", +- "is-array-buffer": "^3.0.4" ++ "es-abstract": "^1.22.3", ++ "es-errors": "^1.2.1", ++ "get-intrinsic": "^1.2.3", ++ "is-array-buffer": "^3.0.4", ++ "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" +@@ -1711,9 +1311,9 @@ + } + }, + "node_modules/attr-accept": { +- "version": "2.2.5", +- "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", +- "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==", ++ "version": "2.2.4", ++ "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.4.tgz", ++ "integrity": "sha512-2pA6xFIbdTUDCAwjN8nQwI+842VwzbDUXO2IYlpPXQIORgKnavorcr4Ce3rwh+zsNg9zK7QPsdvDj3Lum4WX4w==", + "engines": { + "node": ">=4" + } +@@ -1829,44 +1429,16 @@ + } + }, + "node_modules/call-bind": { +- "version": "1.0.8", +- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", +- "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", ++ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { +- "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", +- "get-intrinsic": "^1.2.4", +- "set-function-length": "^1.2.2" +- }, +- "engines": { +- "node": ">= 0.4" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" +- } +- }, +- "node_modules/call-bind-apply-helpers": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", +- "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", +- "dev": true, +- "dependencies": { + "es-errors": "^1.3.0", +- "function-bind": "^1.1.2" +- }, +- "engines": { +- "node": ">= 0.4" +- } +- }, +- "node_modules/call-bound": { +- "version": "1.0.3", +- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", +- "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", +- "dev": true, +- "dependencies": { +- "call-bind-apply-helpers": "^1.0.1", +- "get-intrinsic": "^1.2.6" ++ "function-bind": "^1.1.2", ++ "get-intrinsic": "^1.2.4", ++ "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" +@@ -2182,14 +1754,14 @@ + "dev": true + }, + "node_modules/data-view-buffer": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", +- "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", ++ "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.6", + "es-errors": "^1.3.0", +- "is-data-view": "^1.0.2" ++ "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" +@@ -2199,29 +1771,29 @@ + } + }, + "node_modules/data-view-byte-length": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", +- "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", ++ "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.7", + "es-errors": "^1.3.0", +- "is-data-view": "^1.0.2" ++ "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { +- "url": "https://github.com/sponsors/inspect-js" ++ "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", +- "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", ++ "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.2", ++ "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, +@@ -2233,9 +1805,9 @@ + } + }, + "node_modules/debug": { +- "version": "4.4.0", +- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", +- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", ++ "version": "4.3.7", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", ++ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" +@@ -2366,20 +1938,6 @@ + "node": ">=6.0.0" + } + }, +- "node_modules/dunder-proto": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", +- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", +- "dev": true, +- "dependencies": { +- "call-bind-apply-helpers": "^1.0.1", +- "es-errors": "^1.3.0", +- "gopd": "^1.2.0" +- }, +- "engines": { +- "node": ">= 0.4" +- } +- }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", +@@ -2431,62 +1989,57 @@ + } + }, + "node_modules/es-abstract": { +- "version": "1.23.9", +- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", +- "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", ++ "version": "1.23.3", ++ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", ++ "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { +- "array-buffer-byte-length": "^1.0.2", +- "arraybuffer.prototype.slice": "^1.0.4", ++ "array-buffer-byte-length": "^1.0.1", ++ "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", +- "data-view-buffer": "^1.0.2", +- "data-view-byte-length": "^1.0.2", +- "data-view-byte-offset": "^1.0.1", +- "es-define-property": "^1.0.1", ++ "call-bind": "^1.0.7", ++ "data-view-buffer": "^1.0.1", ++ "data-view-byte-length": "^1.0.1", ++ "data-view-byte-offset": "^1.0.0", ++ "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", +- "es-set-tostringtag": "^2.1.0", +- "es-to-primitive": "^1.3.0", +- "function.prototype.name": "^1.1.8", +- "get-intrinsic": "^1.2.7", +- "get-proto": "^1.0.0", +- "get-symbol-description": "^1.1.0", +- "globalthis": "^1.0.4", +- "gopd": "^1.2.0", ++ "es-set-tostringtag": "^2.0.3", ++ "es-to-primitive": "^1.2.1", ++ "function.prototype.name": "^1.1.6", ++ "get-intrinsic": "^1.2.4", ++ "get-symbol-description": "^1.0.2", ++ "globalthis": "^1.0.3", ++ "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", +- "has-proto": "^1.2.0", +- "has-symbols": "^1.1.0", ++ "has-proto": "^1.0.3", ++ "has-symbols": "^1.0.3", + "hasown": "^2.0.2", +- "internal-slot": "^1.1.0", +- "is-array-buffer": "^3.0.5", ++ "internal-slot": "^1.0.7", ++ "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", +- "is-data-view": "^1.0.2", +- "is-regex": "^1.2.1", +- "is-shared-array-buffer": "^1.0.4", +- "is-string": "^1.1.1", +- "is-typed-array": "^1.1.15", +- "is-weakref": "^1.1.0", +- "math-intrinsics": "^1.1.0", +- "object-inspect": "^1.13.3", ++ "is-data-view": "^1.0.1", ++ "is-negative-zero": "^2.0.3", ++ "is-regex": "^1.1.4", ++ "is-shared-array-buffer": "^1.0.3", ++ "is-string": "^1.0.7", ++ "is-typed-array": "^1.1.13", ++ "is-weakref": "^1.0.2", ++ "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", +- "object.assign": "^4.1.7", +- "own-keys": "^1.0.1", +- "regexp.prototype.flags": "^1.5.3", +- "safe-array-concat": "^1.1.3", +- "safe-push-apply": "^1.0.0", +- "safe-regex-test": "^1.1.0", +- "set-proto": "^1.0.0", +- "string.prototype.trim": "^1.2.10", +- "string.prototype.trimend": "^1.0.9", ++ "object.assign": "^4.1.5", ++ "regexp.prototype.flags": "^1.5.2", ++ "safe-array-concat": "^1.1.2", ++ "safe-regex-test": "^1.0.3", ++ "string.prototype.trim": "^1.2.9", ++ "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", +- "typed-array-buffer": "^1.0.3", +- "typed-array-byte-length": "^1.0.3", +- "typed-array-byte-offset": "^1.0.4", +- "typed-array-length": "^1.0.7", +- "unbox-primitive": "^1.1.0", +- "which-typed-array": "^1.1.18" ++ "typed-array-buffer": "^1.0.2", ++ "typed-array-byte-length": "^1.0.1", ++ "typed-array-byte-offset": "^1.0.2", ++ "typed-array-length": "^1.0.6", ++ "unbox-primitive": "^1.0.2", ++ "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" +@@ -2496,10 +2049,13 @@ + } + }, + "node_modules/es-define-property": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", +- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", ++ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, ++ "dependencies": { ++ "get-intrinsic": "^1.2.4" ++ }, + "engines": { + "node": ">= 0.4" + } +@@ -2534,27 +2090,26 @@ + } + }, + "node_modules/es-iterator-helpers": { +- "version": "1.2.1", +- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", +- "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", ++ "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.7", + "define-properties": "^1.2.1", +- "es-abstract": "^1.23.6", ++ "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", +- "get-intrinsic": "^1.2.6", ++ "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", +- "gopd": "^1.2.0", ++ "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", +- "has-proto": "^1.2.0", +- "has-symbols": "^1.1.0", +- "internal-slot": "^1.1.0", +- "iterator.prototype": "^1.1.4", +- "safe-array-concat": "^1.1.3" ++ "has-proto": "^1.0.3", ++ "has-symbols": "^1.0.3", ++ "internal-slot": "^1.0.7", ++ "iterator.prototype": "^1.1.3", ++ "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" +@@ -2573,15 +2128,14 @@ + } + }, + "node_modules/es-set-tostringtag": { +- "version": "2.1.0", +- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", +- "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", ++ "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { +- "es-errors": "^1.3.0", +- "get-intrinsic": "^1.2.6", ++ "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", +- "hasown": "^2.0.2" ++ "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" +@@ -2597,14 +2151,14 @@ + } + }, + "node_modules/es-to-primitive": { +- "version": "1.3.0", +- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", +- "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", ++ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { +- "is-callable": "^1.2.7", +- "is-date-object": "^1.0.5", +- "is-symbol": "^1.0.4" ++ "is-callable": "^1.1.4", ++ "is-date-object": "^1.0.1", ++ "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" +@@ -3464,16 +3018,16 @@ + "dev": true + }, + "node_modules/fast-glob": { +- "version": "3.3.3", +- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", +- "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", ++ "version": "3.3.2", ++ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", ++ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", +- "micromatch": "^4.0.8" ++ "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" +@@ -3492,20 +3046,10 @@ + "dev": true + }, + "node_modules/fast-uri": { +- "version": "3.0.5", +- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", +- "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", +- "dev": true, +- "funding": [ +- { +- "type": "github", +- "url": "https://github.com/sponsors/fastify" +- }, +- { +- "type": "opencollective", +- "url": "https://opencollective.com/fastify" +- } +- ] ++ "version": "3.0.3", ++ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", ++ "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", ++ "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", +@@ -3517,9 +3061,9 @@ + } + }, + "node_modules/fastq": { +- "version": "1.18.0", +- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", +- "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", ++ "version": "1.17.1", ++ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", ++ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" +@@ -3538,9 +3082,9 @@ + } + }, + "node_modules/file-selector": { +- "version": "2.1.2", +- "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", +- "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.0.tgz", ++ "integrity": "sha512-ZuXAqGePcSPz4JuerOY06Dzzq0hrmQ6VGoXVzGyFI1npeOfBgqGIKKpznfYWRkSLJlXutkqVC5WvGZtkFVhu9Q==", + "dependencies": { + "tslib": "^2.7.0" + }, +@@ -3591,9 +3135,9 @@ + } + }, + "node_modules/flatted": { +- "version": "3.3.2", +- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", +- "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", ++ "version": "3.3.1", ++ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", ++ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/focus-trap": { +@@ -3649,20 +3193,6 @@ + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, +- "node_modules/fsevents": { +- "version": "2.3.3", +- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", +- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", +- "dev": true, +- "hasInstallScript": true, +- "optional": true, +- "os": [ +- "darwin" +- ], +- "engines": { +- "node": "^8.16.0 || ^10.6.0 || >=11.0.0" +- } +- }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", +@@ -3673,17 +3203,15 @@ + } + }, + "node_modules/function.prototype.name": { +- "version": "1.1.8", +- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", +- "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", ++ "version": "1.1.6", ++ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", ++ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", +- "define-properties": "^1.2.1", +- "functions-have-names": "^1.2.3", +- "hasown": "^2.0.2", +- "is-callable": "^1.2.7" ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.2.0", ++ "es-abstract": "^1.22.1", ++ "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" +@@ -3714,21 +3242,16 @@ + } + }, + "node_modules/get-intrinsic": { +- "version": "1.2.7", +- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", +- "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", ++ "version": "1.2.4", ++ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", ++ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { +- "call-bind-apply-helpers": "^1.0.1", +- "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", +- "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", +- "get-proto": "^1.0.0", +- "gopd": "^1.2.0", +- "has-symbols": "^1.1.0", +- "hasown": "^2.0.2", +- "math-intrinsics": "^1.1.0" ++ "has-proto": "^1.0.1", ++ "has-symbols": "^1.0.3", ++ "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -3737,28 +3260,15 @@ + "url": "https://github.com/sponsors/ljharb" + } + }, +- "node_modules/get-proto": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", +- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", +- "dev": true, +- "dependencies": { +- "dunder-proto": "^1.0.1", +- "es-object-atoms": "^1.0.0" +- }, +- "engines": { +- "node": ">= 0.4" +- } +- }, + "node_modules/get-symbol-description": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", +- "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", ++ "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.5", + "es-errors": "^1.3.0", +- "get-intrinsic": "^1.2.6" ++ "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" +@@ -3970,12 +3480,12 @@ + "dev": true + }, + "node_modules/gopd": { +- "version": "1.2.0", +- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", +- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", ++ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, +- "engines": { +- "node": ">= 0.4" ++ "dependencies": { ++ "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" +@@ -3994,13 +3504,10 @@ + "dev": true + }, + "node_modules/has-bigints": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", +- "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", ++ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, +- "engines": { +- "node": ">= 0.4" +- }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } +@@ -4027,13 +3534,10 @@ + } + }, + "node_modules/has-proto": { +- "version": "1.2.0", +- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", +- "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", ++ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, +- "dependencies": { +- "dunder-proto": "^1.0.0" +- }, + "engines": { + "node": ">= 0.4" + }, +@@ -4042,9 +3546,9 @@ + } + }, + "node_modules/has-symbols": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", +- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", ++ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" +@@ -4183,14 +3687,14 @@ + "dev": true + }, + "node_modules/internal-slot": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", +- "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", ++ "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", +- "hasown": "^2.0.2", +- "side-channel": "^1.1.0" ++ "hasown": "^2.0.0", ++ "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" +@@ -4214,13 +3718,13 @@ + } + }, + "node_modules/is-arguments": { +- "version": "1.2.0", +- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", +- "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", ++ "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.2", +- "has-tostringtag": "^1.0.2" ++ "call-bind": "^1.0.2", ++ "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -4230,14 +3734,13 @@ + } + }, + "node_modules/is-array-buffer": { +- "version": "3.0.5", +- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", +- "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", ++ "version": "3.0.4", ++ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", ++ "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", +- "get-intrinsic": "^1.2.6" ++ "call-bind": "^1.0.2", ++ "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" +@@ -4253,15 +3756,12 @@ + "dev": true + }, + "node_modules/is-async-function": { +- "version": "2.1.0", +- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.0.tgz", +- "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==", ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", ++ "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.3", +- "get-proto": "^1.0.1", +- "has-tostringtag": "^1.0.2", +- "safe-regex-test": "^1.1.0" ++ "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -4271,15 +3771,12 @@ + } + }, + "node_modules/is-bigint": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", +- "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", ++ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { +- "has-bigints": "^1.0.2" +- }, +- "engines": { +- "node": ">= 0.4" ++ "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" +@@ -4298,13 +3795,13 @@ + } + }, + "node_modules/is-boolean-object": { +- "version": "1.2.1", +- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", +- "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", ++ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.2", +- "has-tostringtag": "^1.0.2" ++ "call-bind": "^1.0.2", ++ "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -4342,9 +3839,9 @@ + } + }, + "node_modules/is-core-module": { +- "version": "2.16.1", +- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", +- "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", ++ "version": "2.15.1", ++ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", ++ "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" +@@ -4357,13 +3854,11 @@ + } + }, + "node_modules/is-data-view": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", +- "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", ++ "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.2", +- "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { +@@ -4374,13 +3869,12 @@ + } + }, + "node_modules/is-date-object": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", +- "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", ++ "version": "1.0.5", ++ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", ++ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.2", +- "has-tostringtag": "^1.0.2" ++ "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -4399,15 +3893,12 @@ + } + }, + "node_modules/is-finalizationregistry": { +- "version": "1.1.1", +- "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", +- "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", ++ "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.3" +- }, +- "engines": { +- "node": ">= 0.4" ++ "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" +@@ -4423,15 +3914,12 @@ + } + }, + "node_modules/is-generator-function": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", +- "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", ++ "version": "1.0.10", ++ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", ++ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.3", +- "get-proto": "^1.0.0", +- "has-tostringtag": "^1.0.2", +- "safe-regex-test": "^1.1.0" ++ "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -4464,6 +3952,18 @@ + "url": "https://github.com/sponsors/ljharb" + } + }, ++ "node_modules/is-negative-zero": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", ++ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", ++ "dev": true, ++ "engines": { ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" ++ } ++ }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", +@@ -4474,13 +3974,12 @@ + } + }, + "node_modules/is-number-object": { +- "version": "1.1.1", +- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", +- "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", ++ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.3", +- "has-tostringtag": "^1.0.2" ++ "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -4508,15 +4007,13 @@ + } + }, + "node_modules/is-regex": { +- "version": "1.2.1", +- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", +- "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", ++ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.2", +- "gopd": "^1.2.0", +- "has-tostringtag": "^1.0.2", +- "hasown": "^2.0.2" ++ "call-bind": "^1.0.2", ++ "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -4538,12 +4035,12 @@ + } + }, + "node_modules/is-shared-array-buffer": { +- "version": "1.0.4", +- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", +- "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", ++ "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.3" ++ "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" +@@ -4553,13 +4050,12 @@ + } + }, + "node_modules/is-string": { +- "version": "1.1.1", +- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", +- "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", ++ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.3", +- "has-tostringtag": "^1.0.2" ++ "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -4569,14 +4065,12 @@ + } + }, + "node_modules/is-symbol": { +- "version": "1.1.1", +- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", +- "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", ++ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.2", +- "has-symbols": "^1.1.0", +- "safe-regex-test": "^1.1.0" ++ "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" +@@ -4586,12 +4080,12 @@ + } + }, + "node_modules/is-typed-array": { +- "version": "1.1.15", +- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", +- "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", ++ "version": "1.1.13", ++ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", ++ "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { +- "which-typed-array": "^1.1.16" ++ "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" +@@ -4625,28 +4119,25 @@ + } + }, + "node_modules/is-weakref": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", +- "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", ++ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.2" +- }, +- "engines": { +- "node": ">= 0.4" ++ "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { +- "version": "2.0.4", +- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", +- "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", ++ "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.3", +- "get-intrinsic": "^1.2.6" ++ "call-bind": "^1.0.7", ++ "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" +@@ -4668,17 +4159,16 @@ + "dev": true + }, + "node_modules/iterator.prototype": { +- "version": "1.1.5", +- "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", +- "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", ++ "version": "1.1.3", ++ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", ++ "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "dev": true, + "dependencies": { +- "define-data-property": "^1.1.4", +- "es-object-atoms": "^1.0.0", +- "get-intrinsic": "^1.2.6", +- "get-proto": "^1.0.0", +- "has-symbols": "^1.1.0", +- "set-function-name": "^2.0.2" ++ "define-properties": "^1.2.1", ++ "get-intrinsic": "^1.2.1", ++ "has-symbols": "^1.0.3", ++ "reflect.getprototypeof": "^1.0.4", ++ "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" +@@ -4937,15 +4427,6 @@ + "sourcemap-codec": "^1.4.8" + } + }, +- "node_modules/math-intrinsics": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", +- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", +- "dev": true, +- "engines": { +- "node": ">= 0.4" +- } +- }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", +@@ -5046,6 +4527,7 @@ + "url": "https://github.com/sponsors/ai" + } + ], ++ "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, +@@ -5086,9 +4568,9 @@ + } + }, + "node_modules/object-inspect": { +- "version": "1.13.3", +- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", +- "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", ++ "version": "1.13.2", ++ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", ++ "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" +@@ -5123,16 +4605,14 @@ + } + }, + "node_modules/object.assign": { +- "version": "4.1.7", +- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", +- "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", ++ "version": "4.1.5", ++ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", ++ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.5", + "define-properties": "^1.2.1", +- "es-object-atoms": "^1.0.0", +- "has-symbols": "^1.1.0", ++ "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { +@@ -5189,13 +4669,12 @@ + } + }, + "node_modules/object.values": { +- "version": "1.2.1", +- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", +- "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", ++ "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, +@@ -5232,23 +4711,6 @@ + "node": ">= 0.8.0" + } + }, +- "node_modules/own-keys": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", +- "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", +- "dev": true, +- "dependencies": { +- "get-intrinsic": "^1.2.6", +- "object-keys": "^1.1.1", +- "safe-push-apply": "^1.0.0" +- }, +- "engines": { +- "node": ">= 0.4" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" +- } +- }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", +@@ -5457,9 +4919,9 @@ + } + }, + "node_modules/postcss": { +- "version": "8.4.49", +- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", +- "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", ++ "version": "8.4.47", ++ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", ++ "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "funding": [ + { +@@ -5477,7 +4939,7 @@ + ], + "dependencies": { + "nanoid": "^3.3.7", +- "picocolors": "^1.1.1", ++ "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { +@@ -5577,9 +5039,9 @@ + } + }, + "node_modules/prettier": { +- "version": "3.4.2", +- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", +- "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", ++ "version": "3.3.3", ++ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", ++ "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "bin": { + "prettier": "bin/prettier.cjs" + }, +@@ -5758,19 +5220,18 @@ + } + }, + "node_modules/reflect.getprototypeof": { +- "version": "1.0.10", +- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", +- "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", ++ "version": "1.0.6", ++ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", ++ "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.8", ++ "call-bind": "^1.0.7", + "define-properties": "^1.2.1", +- "es-abstract": "^1.23.9", ++ "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", +- "es-object-atoms": "^1.0.0", +- "get-intrinsic": "^1.2.7", +- "get-proto": "^1.0.1", +- "which-builtin-type": "^1.2.1" ++ "get-intrinsic": "^1.2.4", ++ "globalthis": "^1.0.3", ++ "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" +@@ -5780,16 +5241,14 @@ + } + }, + "node_modules/regexp.prototype.flags": { +- "version": "1.5.4", +- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", +- "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", ++ "version": "1.5.3", ++ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", ++ "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.8", ++ "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", +- "get-proto": "^1.0.1", +- "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { +@@ -5844,21 +5303,18 @@ + } + }, + "node_modules/resolve": { +- "version": "1.22.10", +- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", +- "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", ++ "version": "1.22.8", ++ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", ++ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { +- "is-core-module": "^2.16.0", ++ "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, +- "engines": { +- "node": ">= 0.4" +- }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } +@@ -5985,15 +5441,14 @@ + } + }, + "node_modules/safe-array-concat": { +- "version": "1.1.3", +- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", +- "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", ++ "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.2", +- "get-intrinsic": "^1.2.6", +- "has-symbols": "^1.1.0", ++ "call-bind": "^1.0.7", ++ "get-intrinsic": "^1.2.4", ++ "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { +@@ -6026,350 +5481,95 @@ + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", + "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", +- "dev": true +- }, +- "node_modules/safe-push-apply": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", +- "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", +- "dev": true, +- "dependencies": { +- "es-errors": "^1.3.0", +- "isarray": "^2.0.5" +- }, +- "engines": { +- "node": ">= 0.4" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" +- } +- }, +- "node_modules/safe-regex-test": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", +- "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", +- "dev": true, +- "dependencies": { +- "call-bound": "^1.0.2", +- "es-errors": "^1.3.0", +- "is-regex": "^1.2.1" +- }, +- "engines": { +- "node": ">= 0.4" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" +- } +- }, +- "node_modules/safer-buffer": { +- "version": "2.1.2", +- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", +- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" +- }, +- "node_modules/sass": { +- "version": "1.79.4", +- "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", +- "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", +- "dev": true, +- "dependencies": { +- "chokidar": "^4.0.0", +- "immutable": "^4.0.0", +- "source-map-js": ">=0.6.2 <2.0.0" +- }, +- "bin": { +- "sass": "sass.js" +- }, +- "engines": { +- "node": ">=14.0.0" +- } +- }, +- "node_modules/sass-embedded": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.83.1.tgz", +- "integrity": "sha512-LdKG6nxLEzpXbMUt0if12PhUNonGvy91n7IWHOZRZjvA6AWm9oVdhpO+KEXN/Sc+jjGvQeQcav9+Z8DwmII/pA==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "@bufbuild/protobuf": "^2.0.0", +- "buffer-builder": "^0.2.0", +- "colorjs.io": "^0.5.0", +- "immutable": "^5.0.2", +- "rxjs": "^7.4.0", +- "supports-color": "^8.1.1", +- "sync-child-process": "^1.0.2", +- "varint": "^6.0.0" +- }, +- "bin": { +- "sass": "dist/bin/sass.js" +- }, +- "engines": { +- "node": ">=16.0.0" +- }, +- "optionalDependencies": { +- "sass-embedded-android-arm": "1.83.1", +- "sass-embedded-android-arm64": "1.83.1", +- "sass-embedded-android-ia32": "1.83.1", +- "sass-embedded-android-riscv64": "1.83.1", +- "sass-embedded-android-x64": "1.83.1", +- "sass-embedded-darwin-arm64": "1.83.1", +- "sass-embedded-darwin-x64": "1.83.1", +- "sass-embedded-linux-arm": "1.83.1", +- "sass-embedded-linux-arm64": "1.83.1", +- "sass-embedded-linux-ia32": "1.83.1", +- "sass-embedded-linux-musl-arm": "1.83.1", +- "sass-embedded-linux-musl-arm64": "1.83.1", +- "sass-embedded-linux-musl-ia32": "1.83.1", +- "sass-embedded-linux-musl-riscv64": "1.83.1", +- "sass-embedded-linux-musl-x64": "1.83.1", +- "sass-embedded-linux-riscv64": "1.83.1", +- "sass-embedded-linux-x64": "1.83.1", +- "sass-embedded-win32-arm64": "1.83.1", +- "sass-embedded-win32-ia32": "1.83.1", +- "sass-embedded-win32-x64": "1.83.1" +- } +- }, +- "node_modules/sass-embedded-android-arm": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.83.1.tgz", +- "integrity": "sha512-FKfrmwDG84L5cfn8fmIew47qnCFFUdcoOTCzOw8ROItkRhLLH0hnIm6gEpG5T6OFf6kxzUxvE9D0FvYQUznZrw==", +- "cpu": [ +- "arm" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "android" +- ], +- "peer": true, +- "engines": { +- "node": ">=14.0.0" +- } +- }, +- "node_modules/sass-embedded-android-arm64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.83.1.tgz", +- "integrity": "sha512-S63rlLPGCA9FCqYYOobDJrwcuBX0zbSOl7y0jT9DlfqeqNOkC6NIT1id6RpMFCs3uhd4gbBS2E/5WPv5J5qwbw==", +- "cpu": [ +- "arm64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "android" +- ], +- "peer": true, +- "engines": { +- "node": ">=14.0.0" +- } +- }, +- "node_modules/sass-embedded-android-ia32": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.83.1.tgz", +- "integrity": "sha512-AGlY2vFLJhF2hN0qOz12f4eDs6x0b5BUapOpgfRrqQLHIfJhxkvi39bInsiBgQ57U0jb4I7AaS2e2e+sj7+Rqw==", +- "cpu": [ +- "ia32" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "android" +- ], +- "peer": true, +- "engines": { +- "node": ">=14.0.0" +- } +- }, +- "node_modules/sass-embedded-android-riscv64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.83.1.tgz", +- "integrity": "sha512-OyU4AnfAUVd/wBaT60XvHidmQdaEsVUnxvI71oyPM/id1v97aWTZX3SmGkwGb7uA/q6Soo2uNalgvOSNJn7PwA==", +- "cpu": [ +- "riscv64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "android" +- ], +- "peer": true, +- "engines": { +- "node": ">=14.0.0" +- } +- }, +- "node_modules/sass-embedded-android-x64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.83.1.tgz", +- "integrity": "sha512-NY5rwffhF4TnhXVErZnfFIjHqU3MNoWxCuSHumRN3dDI8hp8+IF59W5+Qw9AARlTXvyb+D0u5653aLSea5F40w==", +- "cpu": [ +- "x64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "android" +- ], +- "peer": true, +- "engines": { +- "node": ">=14.0.0" +- } +- }, +- "node_modules/sass-embedded-darwin-arm64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.83.1.tgz", +- "integrity": "sha512-w1SBcSkIgIWgUfB7IKcPoTbSwnS3Kag5PVv3e3xfW6ZCsDweYZLQntUd2WGgaoekdm1uIbVuvPxnDH2t880iGQ==", +- "cpu": [ +- "arm64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "darwin" +- ], +- "peer": true, +- "engines": { +- "node": ">=14.0.0" +- } +- }, +- "node_modules/sass-embedded-darwin-x64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.83.1.tgz", +- "integrity": "sha512-RWrmLtUhEP5kvcGOAFdr99/ebZ/eW9z3FAktLldvgl2k96WSTC1Zr2ctL0E+Y+H3uLahEZsshIFk6RkVIRKIsA==", +- "cpu": [ +- "x64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "darwin" +- ], +- "peer": true, +- "engines": { +- "node": ">=14.0.0" +- } +- }, +- "node_modules/sass-embedded-linux-arm": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.83.1.tgz", +- "integrity": "sha512-y7rHuRgjg2YM284rin068PsEdthPljSGb653Slut5Wba4A2IP11UNVraSl6Je2AYTuoPRjQX0g7XdsrjXlzC3g==", +- "cpu": [ +- "arm" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], +- "peer": true, +- "engines": { +- "node": ">=14.0.0" +- } +- }, +- "node_modules/sass-embedded-linux-arm64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.83.1.tgz", +- "integrity": "sha512-HVIytzj8OO18fmBY6SVRIYErcJ+Nd9a5RNF6uArav/CqvwPLATlUV8dwqSyWQIzSsQUhDF/vFIlJIoNLKKzD3A==", +- "cpu": [ +- "arm64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], +- "peer": true, +- "engines": { +- "node": ">=14.0.0" +- } +- }, +- "node_modules/sass-embedded-linux-ia32": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.83.1.tgz", +- "integrity": "sha512-/pc+jHllyvfaYYLTRCoXseRc4+V3Z7IDPqsviTcfVdICAoR9mgK2RtIuIZanhm1NP/lDylDOgvj1NtjcA2dNvg==", +- "cpu": [ +- "ia32" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], +- "peer": true, +- "engines": { +- "node": ">=14.0.0" +- } +- }, +- "node_modules/sass-embedded-linux-musl-arm": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.83.1.tgz", +- "integrity": "sha512-sFM8GXOVoeR91j9MiwNRcFXRpTA7u4185SaGuvUjcRMb84mHvtWOJPGDvgZqbWdVClBRJp6J7+CShliWngy/og==", +- "cpu": [ +- "arm" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], +- "peer": true, +- "engines": { +- "node": ">=14.0.0" +- } ++ "dev": true + }, +- "node_modules/sass-embedded-linux-musl-arm64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.83.1.tgz", +- "integrity": "sha512-wjSIYYqdIQp3DjliSTYNFg04TVqQf/3Up/Stahol0Qf/TTjLkjHHtT2jnDaZI5GclHi2PVJqQF3wEGB8bGJMzQ==", +- "cpu": [ +- "arm64" +- ], ++ "node_modules/safe-regex-test": { ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", ++ "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], +- "peer": true, ++ "dependencies": { ++ "call-bind": "^1.0.6", ++ "es-errors": "^1.3.0", ++ "is-regex": "^1.1.4" ++ }, + "engines": { +- "node": ">=14.0.0" ++ "node": ">= 0.4" ++ }, ++ "funding": { ++ "url": "https://github.com/sponsors/ljharb" + } + }, +- "node_modules/sass-embedded-linux-musl-ia32": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.83.1.tgz", +- "integrity": "sha512-iwhTH5gwmoGt3VH6dn4WV8N6eWvthKAvUX5XPURq7e9KEsc7QP8YNHagwaAJh7TAPopb32buyEg6oaUmzxUI+Q==", +- "cpu": [ +- "ia32" +- ], ++ "node_modules/safer-buffer": { ++ "version": "2.1.2", ++ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", ++ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" ++ }, ++ "node_modules/sass": { ++ "version": "1.79.4", ++ "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", ++ "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", + "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], +- "peer": true, ++ "dependencies": { ++ "chokidar": "^4.0.0", ++ "immutable": "^4.0.0", ++ "source-map-js": ">=0.6.2 <2.0.0" ++ }, ++ "bin": { ++ "sass": "sass.js" ++ }, + "engines": { + "node": ">=14.0.0" + } + }, +- "node_modules/sass-embedded-linux-musl-riscv64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.83.1.tgz", +- "integrity": "sha512-FjFNWHU1n0Q6GpK1lAHQL5WmzlPjL8DTVLkYW2A/dq8EsutAdi3GfpeyWZk9bte8kyWdmPUWG3BHlnQl22xdoA==", +- "cpu": [ +- "riscv64" +- ], ++ "node_modules/sass-embedded": { ++ "version": "1.80.6", ++ "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.80.6.tgz", ++ "integrity": "sha512-Og4aqBnaA3oJfIpHaLuNATAqzBRgUJDYJy2X15V59cot2wYOtiT/ciPnyuq1o7vpDEeOkHhEd+mSviSlXoETug==", + "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], + "peer": true, ++ "dependencies": { ++ "@bufbuild/protobuf": "^2.0.0", ++ "buffer-builder": "^0.2.0", ++ "colorjs.io": "^0.5.0", ++ "immutable": "^4.0.0", ++ "rxjs": "^7.4.0", ++ "supports-color": "^8.1.1", ++ "varint": "^6.0.0" ++ }, ++ "bin": { ++ "sass": "dist/bin/sass.js" ++ }, + "engines": { +- "node": ">=14.0.0" ++ "node": ">=16.0.0" ++ }, ++ "optionalDependencies": { ++ "sass-embedded-android-arm": "1.80.6", ++ "sass-embedded-android-arm64": "1.80.6", ++ "sass-embedded-android-ia32": "1.80.6", ++ "sass-embedded-android-riscv64": "1.80.6", ++ "sass-embedded-android-x64": "1.80.6", ++ "sass-embedded-darwin-arm64": "1.80.6", ++ "sass-embedded-darwin-x64": "1.80.6", ++ "sass-embedded-linux-arm": "1.80.6", ++ "sass-embedded-linux-arm64": "1.80.6", ++ "sass-embedded-linux-ia32": "1.80.6", ++ "sass-embedded-linux-musl-arm": "1.80.6", ++ "sass-embedded-linux-musl-arm64": "1.80.6", ++ "sass-embedded-linux-musl-ia32": "1.80.6", ++ "sass-embedded-linux-musl-riscv64": "1.80.6", ++ "sass-embedded-linux-musl-x64": "1.80.6", ++ "sass-embedded-linux-riscv64": "1.80.6", ++ "sass-embedded-linux-x64": "1.80.6", ++ "sass-embedded-win32-arm64": "1.80.6", ++ "sass-embedded-win32-ia32": "1.80.6", ++ "sass-embedded-win32-x64": "1.80.6" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.83.1.tgz", +- "integrity": "sha512-BUfYR5TIDvgGHWhxSIKwTJocXU88ECZ0BW89RJqtvr7m83fKdf5ylTFCOieU7BwcA7SORUeZzcQzVFIdPUM3BQ==", ++ "version": "1.80.6", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.80.6.tgz", ++ "integrity": "sha512-DzeNqU/SN0mWFznoOH4RtVGcrg3Eoa41pUQhKMtrhNbCmIE1zNDunUiAEVTNpdHJF4nxf7ELUPXWmStM31CbUQ==", + "cpu": [ + "x64" + ], +@@ -6383,27 +5583,10 @@ + "node": ">=14.0.0" + } + }, +- "node_modules/sass-embedded-linux-riscv64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.83.1.tgz", +- "integrity": "sha512-KOBGSpMrJi8y+H+za3vAAVQImPUvQa5eUrvTbbOl+wkU7WAGhOu8xrxgmYYiz3pZVBBcfRjz4I2jBcDFKJmWSw==", +- "cpu": [ +- "riscv64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "linux" +- ], +- "peer": true, +- "engines": { +- "node": ">=14.0.0" +- } +- }, + "node_modules/sass-embedded-linux-x64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.83.1.tgz", +- "integrity": "sha512-swUsMHKqlEU9dZQ/I5WADDaXz+QkmJS27x/Oeh+oz41YgZ0ppKd0l4Vwjn0LgOQn+rxH1zLFv6xXDycvj68F/w==", ++ "version": "1.80.6", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.80.6.tgz", ++ "integrity": "sha512-EohsE9CEqx0ycylnsEj/0DNPG99Tb0qAVZspiAs5xHFCJjXOFfp3cRQu0BRf+lZ1b72IhPFXymzVtojvzUHb7g==", + "cpu": [ + "x64" + ], +@@ -6417,64 +5600,6 @@ + "node": ">=14.0.0" + } + }, +- "node_modules/sass-embedded-win32-arm64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.83.1.tgz", +- "integrity": "sha512-6lONEBN5TaFD5L/y68zUugryXqm4RAFuLdaOPeZQRu+7ay/AmfhtFYfE5gRssnIcIx1nlcoq7zA3UX+SN2jo1Q==", +- "cpu": [ +- "arm64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "win32" +- ], +- "peer": true, +- "engines": { +- "node": ">=14.0.0" +- } +- }, +- "node_modules/sass-embedded-win32-ia32": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.83.1.tgz", +- "integrity": "sha512-HxZDkAE9n6Gb8Rz6xd67VHuo5FkUSQ4xPb7cHKa4pE0ndwH5Oc0uEhbqjJobpgmnuTm1rQYNU2nof1sFhy2MFA==", +- "cpu": [ +- "ia32" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "win32" +- ], +- "peer": true, +- "engines": { +- "node": ">=14.0.0" +- } +- }, +- "node_modules/sass-embedded-win32-x64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.83.1.tgz", +- "integrity": "sha512-5Q0aPfUaqRek8Ee1AqTUIC0o6yQSA8QwyhCgh7upsnHG3Ltm8pkJOYjzm+UgYPJeoMNppDjdDlRGQISE7qzd4g==", +- "cpu": [ +- "x64" +- ], +- "dev": true, +- "optional": true, +- "os": [ +- "win32" +- ], +- "peer": true, +- "engines": { +- "node": ">=14.0.0" +- } +- }, +- "node_modules/sass-embedded/node_modules/immutable": { +- "version": "5.0.3", +- "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", +- "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", +- "dev": true, +- "peer": true +- }, + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", +@@ -6492,9 +5617,9 @@ + } + }, + "node_modules/sass/node_modules/chokidar": { +- "version": "4.0.3", +- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", +- "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", ++ "version": "4.0.1", ++ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", ++ "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, + "dependencies": { + "readdirp": "^4.0.1" +@@ -6571,20 +5696,6 @@ + "node": ">= 0.4" + } + }, +- "node_modules/set-proto": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", +- "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", +- "dev": true, +- "dependencies": { +- "dunder-proto": "^1.0.1", +- "es-errors": "^1.3.0", +- "es-object-atoms": "^1.0.0" +- }, +- "engines": { +- "node": ">= 0.4" +- } +- }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", +@@ -6607,69 +5718,15 @@ + } + }, + "node_modules/side-channel": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", +- "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", +- "dev": true, +- "dependencies": { +- "es-errors": "^1.3.0", +- "object-inspect": "^1.13.3", +- "side-channel-list": "^1.0.0", +- "side-channel-map": "^1.0.1", +- "side-channel-weakmap": "^1.0.2" +- }, +- "engines": { +- "node": ">= 0.4" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" +- } +- }, +- "node_modules/side-channel-list": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", +- "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", +- "dev": true, +- "dependencies": { +- "es-errors": "^1.3.0", +- "object-inspect": "^1.13.3" +- }, +- "engines": { +- "node": ">= 0.4" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" +- } +- }, +- "node_modules/side-channel-map": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", +- "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", +- "dev": true, +- "dependencies": { +- "call-bound": "^1.0.2", +- "es-errors": "^1.3.0", +- "get-intrinsic": "^1.2.5", +- "object-inspect": "^1.13.3" +- }, +- "engines": { +- "node": ">= 0.4" +- }, +- "funding": { +- "url": "https://github.com/sponsors/ljharb" +- } +- }, +- "node_modules/side-channel-weakmap": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", +- "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", ++ "version": "1.0.6", ++ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", ++ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.2", ++ "call-bind": "^1.0.7", + "es-errors": "^1.3.0", +- "get-intrinsic": "^1.2.5", +- "object-inspect": "^1.13.3", +- "side-channel-map": "^1.0.1" ++ "get-intrinsic": "^1.2.4", ++ "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" +@@ -6744,13 +5801,12 @@ + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/stop-iteration-iterator": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", +- "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", ++ "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { +- "es-errors": "^1.3.0", +- "internal-slot": "^1.1.0" ++ "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" +@@ -6849,24 +5905,23 @@ + } + }, + "node_modules/string.prototype.matchall": { +- "version": "4.0.12", +- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", +- "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", ++ "version": "4.0.11", ++ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", ++ "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.7", + "define-properties": "^1.2.1", +- "es-abstract": "^1.23.6", ++ "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", +- "get-intrinsic": "^1.2.6", +- "gopd": "^1.2.0", +- "has-symbols": "^1.1.0", +- "internal-slot": "^1.1.0", +- "regexp.prototype.flags": "^1.5.3", ++ "get-intrinsic": "^1.2.4", ++ "gopd": "^1.0.1", ++ "has-symbols": "^1.0.3", ++ "internal-slot": "^1.0.7", ++ "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", +- "side-channel": "^1.1.0" ++ "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" +@@ -6886,18 +5941,15 @@ + } + }, + "node_modules/string.prototype.trim": { +- "version": "1.2.10", +- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", +- "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", ++ "version": "1.2.9", ++ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", ++ "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.2", +- "define-data-property": "^1.1.4", ++ "call-bind": "^1.0.7", + "define-properties": "^1.2.1", +- "es-abstract": "^1.23.5", +- "es-object-atoms": "^1.0.0", +- "has-property-descriptors": "^1.0.2" ++ "es-abstract": "^1.23.0", ++ "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -6907,19 +5959,15 @@ + } + }, + "node_modules/string.prototype.trimend": { +- "version": "1.0.9", +- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", +- "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", ++ "version": "1.0.8", ++ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", ++ "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.2", ++ "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, +- "engines": { +- "node": ">= 0.4" +- }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } +@@ -7223,18 +6271,18 @@ + } + }, + "node_modules/stylelint-scss": { +- "version": "6.10.0", +- "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.10.0.tgz", +- "integrity": "sha512-y03if6Qw9xBMoVaf7tzp5BbnYhYvudIKzURkhSHzcHG0bW0fAYvQpTUVJOe7DyhHaxeThBil4ObEMvGbV7+M+w==", ++ "version": "6.8.1", ++ "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.8.1.tgz", ++ "integrity": "sha512-al+5eRb72bKrFyVAY+CLWKUMX+k+wsDCgyooSfhISJA2exqnJq1PX1iIIpdrvhu3GtJgNJZl9/BIW6EVSMCxdg==", + "dev": true, + "dependencies": { +- "css-tree": "^3.0.1", ++ "css-tree": "^3.0.0", + "is-plain-object": "^5.0.0", +- "known-css-properties": "^0.35.0", +- "mdn-data": "^2.12.2", ++ "known-css-properties": "^0.34.0", ++ "mdn-data": "^2.11.1", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.6", +- "postcss-selector-parser": "^7.0.0", ++ "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { +@@ -7245,12 +6293,12 @@ + } + }, + "node_modules/stylelint-scss/node_modules/css-tree": { +- "version": "3.1.0", +- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", +- "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.0.1.tgz", ++ "integrity": "sha512-8Fxxv+tGhORlshCdCwnNJytvlvq46sOLSYEx2ZIGurahWvMucSRnyjPA3AmrMq4VPRYbHVpWj5VkiVasrM2H4Q==", + "dev": true, + "dependencies": { +- "mdn-data": "2.12.2", ++ "mdn-data": "2.12.1", + "source-map-js": "^1.0.1" + }, + "engines": { +@@ -7258,36 +6306,17 @@ + } + }, + "node_modules/stylelint-scss/node_modules/css-tree/node_modules/mdn-data": { +- "version": "2.12.2", +- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", +- "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", +- "dev": true +- }, +- "node_modules/stylelint-scss/node_modules/known-css-properties": { +- "version": "0.35.0", +- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", +- "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", ++ "version": "2.12.1", ++ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.1.tgz", ++ "integrity": "sha512-rsfnCbOHjqrhWxwt5/wtSLzpoKTzW7OXdT5lLOIH1OTYhWu9rRJveGq0sKvDZODABH7RX+uoR+DYcpFnq4Tf6Q==", + "dev": true + }, + "node_modules/stylelint-scss/node_modules/mdn-data": { +- "version": "2.14.0", +- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.14.0.tgz", +- "integrity": "sha512-QjcSiIvUHjmXp5wNLClRjQeU0Zp+I2Dag+AhtQto0nyKYZ3IF/pUzCuHe7Bv77EC92XE5t3EXeEiEv/to2Bwig==", ++ "version": "2.12.2", ++ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", ++ "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true + }, +- "node_modules/stylelint-scss/node_modules/postcss-selector-parser": { +- "version": "7.0.0", +- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", +- "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", +- "dev": true, +- "dependencies": { +- "cssesc": "^3.0.0", +- "util-deprecate": "^1.0.2" +- }, +- "engines": { +- "node": ">=4" +- } +- }, + "node_modules/stylelint-use-logical-spec": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/stylelint-use-logical-spec/-/stylelint-use-logical-spec-5.0.1.tgz", +@@ -7445,38 +6474,15 @@ + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, +- "node_modules/sync-child-process": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", +- "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", +- "dev": true, +- "peer": true, +- "dependencies": { +- "sync-message-port": "^1.0.0" +- }, +- "engines": { +- "node": ">=16.0.0" +- } +- }, +- "node_modules/sync-message-port": { +- "version": "1.1.3", +- "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz", +- "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", +- "dev": true, +- "peer": true, +- "engines": { +- "node": ">=16.0.0" +- } +- }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, + "node_modules/table": { +- "version": "6.9.0", +- "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", +- "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", ++ "version": "6.8.2", ++ "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", ++ "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", +@@ -7568,9 +6574,9 @@ + } + }, + "node_modules/ts-api-utils": { +- "version": "1.4.3", +- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", +- "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", ++ "version": "1.4.0", ++ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", ++ "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", + "dev": true, + "engines": { + "node": ">=16" +@@ -7621,30 +6627,30 @@ + } + }, + "node_modules/typed-array-buffer": { +- "version": "1.0.3", +- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", +- "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", ++ "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.7", + "es-errors": "^1.3.0", +- "is-typed-array": "^1.1.14" ++ "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { +- "version": "1.0.3", +- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", +- "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", ++ "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { +- "call-bind": "^1.0.8", ++ "call-bind": "^1.0.7", + "for-each": "^0.3.3", +- "gopd": "^1.2.0", +- "has-proto": "^1.2.0", +- "is-typed-array": "^1.1.14" ++ "gopd": "^1.0.1", ++ "has-proto": "^1.0.3", ++ "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" +@@ -7654,18 +6660,17 @@ + } + }, + "node_modules/typed-array-byte-offset": { +- "version": "1.0.4", +- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", +- "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", ++ "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", +- "call-bind": "^1.0.8", ++ "call-bind": "^1.0.7", + "for-each": "^0.3.3", +- "gopd": "^1.2.0", +- "has-proto": "^1.2.0", +- "is-typed-array": "^1.1.15", +- "reflect.getprototypeof": "^1.0.9" ++ "gopd": "^1.0.1", ++ "has-proto": "^1.0.3", ++ "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" +@@ -7675,17 +6680,17 @@ + } + }, + "node_modules/typed-array-length": { +- "version": "1.0.7", +- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", +- "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", ++ "version": "1.0.6", ++ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", ++ "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", ++ "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", +- "possible-typed-array-names": "^1.0.0", +- "reflect.getprototypeof": "^1.0.6" ++ "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" +@@ -7695,9 +6700,9 @@ + } + }, + "node_modules/typescript": { +- "version": "5.7.2", +- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", +- "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", ++ "version": "5.6.3", ++ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", ++ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", +@@ -7708,18 +6713,15 @@ + } + }, + "node_modules/unbox-primitive": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", +- "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", ++ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", +- "has-symbols": "^1.1.0", +- "which-boxed-primitive": "^1.1.1" +- }, +- "engines": { +- "node": ">= 0.4" ++ "has-symbols": "^1.0.3", ++ "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" +@@ -7768,259 +6770,259 @@ + "peer": true + }, + "node_modules/victory-area": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-37.3.5.tgz", +- "integrity": "sha512-MP5+dm8ThQVsSDQhmU4K93mjPZ4hir1QkoM8kYT0PsJcoFYI6J2ceTxoyJUUgrgO0Kf63PcYChR5RLu34bhFlw==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-37.3.1.tgz", ++ "integrity": "sha512-+D0I64HRe0hXCP8HsQIpsDmxkBsqPTZDImOfndjr/2JCXo9T/PLkUlbh/RjyOtHM66iUPjwjGJ513H3kfT4nYw==", + "dependencies": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5", +- "victory-vendor": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-vendor": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-axis": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-37.3.5.tgz", +- "integrity": "sha512-hd40FVZvWw26CHr6XfmVGhKgPd4I4Yqxtnl27P6aLVGv1gL46UuNVdDVFozr9rpxO+lGUepYz6Wh4OuzImpDEQ==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-37.3.1.tgz", ++ "integrity": "sha512-hLLr4yAaVizGG+k50LZl7C/YJ+IUGkTFTO9cZqXJQS0c1WNYYxUC1pmDq1dugPpJLKJcbKOXHLLgswzYKAk6Jw==", + "dependencies": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-bar": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-37.3.5.tgz", +- "integrity": "sha512-9HXxM/+9jyv6SIcJv90yqyImgXLSEGhaPBnDJg5CvHcR1zdGAdQp2pDxDV6EivUrfxiIyj1NeSWyCZpM0ZJddQ==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-37.3.1.tgz", ++ "integrity": "sha512-DRfy/adNB9tl6/WNBqbWhnTXVrGraq8fsqf9SXkhtaYaQqyOAqmSZmfAiqATQWkONPXrkMKJC1urQJxJvHGLMQ==", + "dependencies": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5", +- "victory-vendor": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-vendor": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-box-plot": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-box-plot/-/victory-box-plot-37.3.5.tgz", +- "integrity": "sha512-jIV8k4XViLBWh5XvYBSELYGsWo55vYBoNqGkVUKhcXM4sS9mumc2XgDQ6nltTO88gs8uOyZpb2vBFp+1zOauyA==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-box-plot/-/victory-box-plot-37.3.1.tgz", ++ "integrity": "sha512-9KjILr5wuVkdB8C9gqYUPoqcAirDRTQ0hdjxfD627hQf0U6Uaju+FrEiigC4+Kr/HUQhQtxvklGwDypjxzj6Ng==", + "dependencies": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5", +- "victory-vendor": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-vendor": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-brush-container": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-37.3.5.tgz", +- "integrity": "sha512-n4Ozb5I/Pz/dcWnxAfqBhnsq6Q2gIC7Phjbau3cIBTPcq/rrkRIWzpiPPWhoAT+OTirgB9vOfe3JX4LBDk17FA==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-37.3.1.tgz", ++ "integrity": "sha512-hJlbjKQqqHEM29v7qauKuMy/UfdeqBlydM5yzMgauDEenWfs09rRO3CgJCVyu0SVEAem5Aaa7ovk5mI4/HGR6g==", + "dependencies": { + "lodash": "^4.17.19", + "react-fast-compare": "^3.2.0", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-chart": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-37.3.5.tgz", +- "integrity": "sha512-Lsbmp5rG3ESzQAr76M4WJ0FKraltAzuQY1D3e7CmqzQlLKpsMS/j2Ty+5OCBDmC3qQ+PHObBLVavgn3TJSRJLg==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-37.3.1.tgz", ++ "integrity": "sha512-mtTxmGUexmlX+IDh9GrBRIbFTFziUu08pbG9hz/io8UfBQ3f//ewPq8z8qI3apx7f/rvS6HD6NJyAew8t+nzyg==", + "dependencies": { + "lodash": "^4.17.19", + "react-fast-compare": "^3.2.0", +- "victory-axis": "37.3.5", +- "victory-core": "37.3.5", +- "victory-polar-axis": "37.3.5", +- "victory-shared-events": "37.3.5" ++ "victory-axis": "37.3.1", ++ "victory-core": "37.3.1", ++ "victory-polar-axis": "37.3.1", ++ "victory-shared-events": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-core": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.3.5.tgz", +- "integrity": "sha512-PXY+9Lx1ohCX+ZzkWdm+VY7T+2Pd/YKdv3yVkuflzMQ52kQMYbcgwGI49yPuzVqB3m1eBJ5dYdAD53ww53GTHw==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.3.1.tgz", ++ "integrity": "sha512-jFjqF7AVjc8OF1wuL9hFbPS+4mEH/C8LKI1/V0EJQcu5VimppF2BkbCH5+Y2lEwNNzNaqrXJnQ3Z0bzXjtplbw==", + "dependencies": { + "lodash": "^4.17.21", + "react-fast-compare": "^3.2.0", +- "victory-vendor": "37.3.5" ++ "victory-vendor": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-create-container": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-37.3.5.tgz", +- "integrity": "sha512-VcHhnw35e+xU96LWwAuCZQ7YLS9NSSlGU0pgtiUUx0ymCJDWtY8G+ZijZL+DKQ5byU/8+DvaK3iNUhxdpBAHQw==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-37.3.1.tgz", ++ "integrity": "sha512-9tkSHgt2NI28uFwcfwvcXNVVhhYQIyqk9du2AwwBdPpQUIK8GNjZvtgddZ3IdU1n9WmVqqb/Ne1l2aX+s2G0Aw==", + "dependencies": { + "lodash": "^4.17.19", +- "victory-brush-container": "37.3.5", +- "victory-core": "37.3.5", +- "victory-cursor-container": "37.3.5", +- "victory-selection-container": "37.3.5", +- "victory-voronoi-container": "37.3.5", +- "victory-zoom-container": "37.3.5" ++ "victory-brush-container": "37.3.1", ++ "victory-core": "37.3.1", ++ "victory-cursor-container": "37.3.1", ++ "victory-selection-container": "37.3.1", ++ "victory-voronoi-container": "37.3.1", ++ "victory-zoom-container": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-cursor-container": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-37.3.5.tgz", +- "integrity": "sha512-/G9zpYkeJA0uBk3khGNJBUNHOZ25EPoFfVZqwSSjpVRRI3JLMVNvv1LWhZvFZDkK0KMrT8pi8AZr04jCZxCoPg==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-37.3.1.tgz", ++ "integrity": "sha512-PYJzGJL0tnNQrUHXHj0lP1TXYA5XUyNvfPMjUrII74BS2T6t85+gjc++s0pugpyc/NqyXwNaulJxPnjePwR1MA==", + "dependencies": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-group": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-37.3.5.tgz", +- "integrity": "sha512-0GEtrG2Vl7uv1fkmWlHRO6U8JBhXJ3cB1KJPP2k5QKblfYd0QgDCtlSeMuaTUB+yRnQR5OlUv6bvkwwRio4bSg==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-37.3.1.tgz", ++ "integrity": "sha512-jLAYAHtMwqLulGujirar9kIUZmxw1M1slM/5DBzDJLamTAb7OJaagDmcIiLdnC08ziV8v/MgGkgS6e3/qIe2iw==", + "dependencies": { + "lodash": "^4.17.19", + "react-fast-compare": "^3.2.0", +- "victory-core": "37.3.5", +- "victory-shared-events": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-shared-events": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-legend": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-37.3.5.tgz", +- "integrity": "sha512-TW/OeKP8LgZp93nJVoAltTwl5T0q1MWeH1HqZim2oGqwqX0E8o0BeJXv+2TGkXdp5ITiWi2nxGGQ77vSg8KZhQ==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-37.3.1.tgz", ++ "integrity": "sha512-R7mU4VXbT9toff9oVFfNErAxg6QziWbSiy4IzPYlqgOI+3OPOvBRi1Sbyizk28BcHVIq53iAT8YWwDXxdGwSzQ==", + "dependencies": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-line": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-37.3.5.tgz", +- "integrity": "sha512-q1L2aSG28Z7ousRckf8zut7HdLQ7kWiNakOatsdfAqnce/n52F0E8c3qSIwbRmkdHHSe3SHhTLNyzLtnDzYQjQ==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-37.3.1.tgz", ++ "integrity": "sha512-6FtKiWcCpo4rshOHyE31fO8nog9nRakujAIpdAJk/96621RqBiLQjP1jBhQmjbKCEQCTepHvLGLgx1jdUlb/9A==", + "dependencies": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5", +- "victory-vendor": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-vendor": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-pie": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-37.3.5.tgz", +- "integrity": "sha512-JjKE5QhlatZkl/YbiN2KrF+tXIHRZ0ZYua5yWl8JYcg5/UTE3IFn/Y+2HIQIGghzEa98ZMMC/lNfZ3CEwK1yaw==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-37.3.1.tgz", ++ "integrity": "sha512-Oc5lPvPbtzVqbLtjMEMiyIRbjwHXxAqIdfiVRkr9Sv36Q53rMr9a44CNuUcFeL8eR/794RKm8v5feieOPeGLaQ==", + "dependencies": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5", +- "victory-vendor": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-vendor": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-polar-axis": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-37.3.5.tgz", +- "integrity": "sha512-6aZiaMGLtYDeh3uCB9wHKVVyvRsdbo5+WTp6S8lvyuHxyYOEn4JcxtpORzHHnGMWFkhZs4MmLSORrp/TBOi+7g==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-37.3.1.tgz", ++ "integrity": "sha512-Lxn911XYG2D+LX4ijhFGEXUEx5o2I1eOBlgOYmgvbRldgdCFkZGY6E6uwPbWhPnk2ZUMHVpZGXcZs/hvypC/bw==", + "dependencies": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-scatter": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-37.3.5.tgz", +- "integrity": "sha512-YEXm9D1novmUjk44eFyj+UQIxUw50v3yAa/772nb8yzR9ys9xPjM9+yyIsJSbRwdSiEAPmcbj6qwcYlyvJz1bQ==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-37.3.1.tgz", ++ "integrity": "sha512-xALMB+Kufw0U9ePCNHaHNuFN0Ili+9kWy/6qjm9QKo92HiGkDQeNPWAFHFbyAErFmKkaAdVuEPx3FiU9Novb4A==", + "dependencies": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-selection-container": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-37.3.5.tgz", +- "integrity": "sha512-cGqlZwV3HAWjrXjhGUsUkyFtWn+lsph2dcUzMlzTKs+e1sDFEHIVjpe3ZX4XsThu23dK//lrmIXFvbWtpLhy+Q==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-37.3.1.tgz", ++ "integrity": "sha512-flkh0QUbuKYSZ7t6mogKVaP3upXP5Ej9O1Dvpsn2h8CYzo933veAGVeBfOoguWieuGQbS7JbSkYjrzneXoQMyA==", + "dependencies": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-shared-events": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-37.3.5.tgz", +- "integrity": "sha512-Juq/5Y9WsFaD/4ivk7/y786EwNgLUjp3hkhpIGhiQOM2VaL5H7Xb1pX4ASjibkCkWIQUMBM+JaprtNcKEDylpQ==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-37.3.1.tgz", ++ "integrity": "sha512-fmZZBZEw3jBYO1aD5enOljEN1cRVZBCFxMYhR5of1DGOFc2ZVhq/FK1Lhe3zd2dYGNC8IAP69kth1A+p+VZo0A==", + "dependencies": { + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.19", + "react-fast-compare": "^3.2.0", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-stack": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-37.3.5.tgz", +- "integrity": "sha512-PL23dKKlr30Y77mw3JuIUYUhvOF66r3LhKQXqoymkV6DGMBhkQ2p7h+klek3xleRPBBTSz3o8EbfM8H2eZ/Umg==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-37.3.1.tgz", ++ "integrity": "sha512-VxTnIFhilG2Umg+JJXgeXEm6QbGgmXSYnAIsZT0ejp94IVsfl+f8IOrJHzUrytEeMK4t7JA/StaRlyfWShqthg==", + "dependencies": { + "lodash": "^4.17.19", + "react-fast-compare": "^3.2.0", +- "victory-core": "37.3.5", +- "victory-shared-events": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-shared-events": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-tooltip": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-37.3.5.tgz", +- "integrity": "sha512-IbvD37PGehP3K5BLL9xAK+6d/UEaNcLH/cdKKzeXeqOvoefQLIxxB1DJHYr542Ll8cxkeqtdsgtJ16pRCUgCSA==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-37.3.1.tgz", ++ "integrity": "sha512-C0wyyAj332XpZ5jloMCr8FEDHp6eD76vfwlif+ZcjLVhzNOxTnpjaW988wFNfJaZRgxXcq50TEJkHWvuBnHviQ==", + "dependencies": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-vendor": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.5.tgz", +- "integrity": "sha512-+K2VBMmB7peKG3Gjp79XjgsbfsYgD0eZRSmKz7p5a4V0NhYq43eM/b0gpSLq+Dhwag96QaWsU75/6bFVBjVE7A==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.1.tgz", ++ "integrity": "sha512-ik/nlt3GgTGwyt29f2zd5Y68nNJnxtUJ2CulepE4nWTzbrbFkqhrNDTf3k+yb5ZUQBK1BLkyE79UWVNzTRCByw==", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", +@@ -8039,27 +7041,27 @@ + } + }, + "node_modules/victory-voronoi-container": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-37.3.5.tgz", +- "integrity": "sha512-GF35HQn8ACMcr7yJAFmaSKAS6w9GOsxxWoR6gtuQtBUwSBciZ5LNWpR6718nFxeOYDhkk/FVn7tnKqQTBv6XUw==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-37.3.1.tgz", ++ "integrity": "sha512-QDA533raAk4VUvYnHNeYZY5adMcj9/zUaMFwcNkRoWH7WL8/bZR12as5hlOPLwDa3Wm0jxEYQfaqwRANaoWDyA==", + "dependencies": { + "delaunay-find": "0.0.6", + "lodash": "^4.17.19", + "react-fast-compare": "^3.2.0", +- "victory-core": "37.3.5", +- "victory-tooltip": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-tooltip": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" + } + }, + "node_modules/victory-zoom-container": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-37.3.5.tgz", +- "integrity": "sha512-LlRp2Ulodu3rhIrM1XilgR72223+qlhXE9mzBCYVoHQ+uo8uTKt27T0iOBkvY5kRwNiXQzshn01uxUAwxyBppw==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-37.3.1.tgz", ++ "integrity": "sha512-cVNSMe0q+ut8pLkJDXg31HBjnkJhehOhs7Z4x+fDM6LSESrJn2Zibp8Vn1g7fDs6kNCzqkXcpvmU3yUGFB8oWA==", + "dependencies": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + }, + "peerDependencies": { + "react": ">=16.6.0" +@@ -8081,43 +7083,39 @@ + } + }, + "node_modules/which-boxed-primitive": { +- "version": "1.1.1", +- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", +- "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", ++ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { +- "is-bigint": "^1.1.0", +- "is-boolean-object": "^1.2.1", +- "is-number-object": "^1.1.1", +- "is-string": "^1.1.1", +- "is-symbol": "^1.1.1" +- }, +- "engines": { +- "node": ">= 0.4" ++ "is-bigint": "^1.0.1", ++ "is-boolean-object": "^1.1.0", ++ "is-number-object": "^1.0.4", ++ "is-string": "^1.0.5", ++ "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { +- "version": "1.2.1", +- "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", +- "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", ++ "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "dependencies": { +- "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", +- "is-date-object": "^1.1.0", +- "is-finalizationregistry": "^1.1.0", ++ "is-date-object": "^1.0.5", ++ "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", +- "is-regex": "^1.2.1", ++ "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", +- "which-boxed-primitive": "^1.1.0", ++ "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", +- "which-typed-array": "^1.1.16" ++ "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" +@@ -8145,16 +7143,15 @@ + } + }, + "node_modules/which-typed-array": { +- "version": "1.1.18", +- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", +- "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", ++ "version": "1.1.15", ++ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", ++ "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.7", + "for-each": "^0.3.3", +- "gopd": "^1.2.0", ++ "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { +@@ -8351,9 +7348,9 @@ + "dev": true + }, + "@bufbuild/protobuf": { +- "version": "2.2.3", +- "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.3.tgz", +- "integrity": "sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==", ++ "version": "2.2.2", ++ "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.2.tgz", ++ "integrity": "sha512-UNtPCbrwrenpmrXuRwn9jYpPoweNXj8X5sMvYgsqYyaH8jQ6LfUJSk3dJLnBK+6sfYPrF4iAIo5sd5HQ+tg75A==", + "dev": true, + "peer": true + }, +@@ -8390,118 +7387,6 @@ + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true + }, +- "@esbuild/aix-ppc64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", +- "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/android-arm": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", +- "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/android-arm64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", +- "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/android-x64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", +- "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/darwin-arm64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", +- "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/darwin-x64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", +- "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/freebsd-arm64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", +- "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/freebsd-x64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", +- "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/linux-arm": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", +- "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/linux-arm64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", +- "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/linux-ia32": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", +- "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/linux-loong64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", +- "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/linux-mips64el": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", +- "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/linux-ppc64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", +- "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/linux-riscv64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", +- "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/linux-s390x": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", +- "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", +- "dev": true, +- "optional": true +- }, + "@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", +@@ -8509,55 +7394,6 @@ + "dev": true, + "optional": true + }, +- "@esbuild/netbsd-x64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", +- "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/openbsd-arm64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", +- "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/openbsd-x64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", +- "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/sunos-x64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", +- "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/win32-arm64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", +- "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/win32-ia32": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", +- "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", +- "dev": true, +- "optional": true +- }, +- "@esbuild/win32-x64": { +- "version": "0.24.0", +- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", +- "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", +- "dev": true, +- "optional": true +- }, + "@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", +@@ -8866,17 +7702,17 @@ + } + }, + "@types/d3-shape": { +- "version": "3.1.7", +- "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", +- "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", ++ "version": "3.1.6", ++ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", ++ "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "requires": { + "@types/d3-path": "*" + } + }, + "@types/d3-time": { +- "version": "3.0.4", +- "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", +- "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==" ++ "version": "3.0.3", ++ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", ++ "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + }, + "@types/d3-timer": { + "version": "3.0.2", +@@ -8890,9 +7726,9 @@ + "dev": true + }, + "@types/prop-types": { +- "version": "15.7.14", +- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", +- "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", ++ "version": "15.7.13", ++ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", ++ "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "dev": true + }, + "@types/qunit": { +@@ -8938,47 +7774,40 @@ + } + }, + "@typescript-eslint/parser": { +- "version": "8.19.1", +- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.19.1.tgz", +- "integrity": "sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==", ++ "version": "8.13.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.13.0.tgz", ++ "integrity": "sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==", + "dev": true, + "peer": true, + "requires": { +- "@typescript-eslint/scope-manager": "8.19.1", +- "@typescript-eslint/types": "8.19.1", +- "@typescript-eslint/typescript-estree": "8.19.1", +- "@typescript-eslint/visitor-keys": "8.19.1", ++ "@typescript-eslint/scope-manager": "8.13.0", ++ "@typescript-eslint/types": "8.13.0", ++ "@typescript-eslint/typescript-estree": "8.13.0", ++ "@typescript-eslint/visitor-keys": "8.13.0", + "debug": "^4.3.4" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { +- "version": "8.19.1", +- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.19.1.tgz", +- "integrity": "sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==", ++ "version": "8.13.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz", ++ "integrity": "sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==", + "dev": true, + "peer": true, + "requires": { +- "@typescript-eslint/types": "8.19.1", +- "@typescript-eslint/visitor-keys": "8.19.1" ++ "@typescript-eslint/types": "8.13.0", ++ "@typescript-eslint/visitor-keys": "8.13.0" + } + }, + "@typescript-eslint/visitor-keys": { +- "version": "8.19.1", +- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.1.tgz", +- "integrity": "sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==", ++ "version": "8.13.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", ++ "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", + "dev": true, + "peer": true, + "requires": { +- "@typescript-eslint/types": "8.19.1", +- "eslint-visitor-keys": "^4.2.0" ++ "@typescript-eslint/types": "8.13.0", ++ "eslint-visitor-keys": "^3.4.3" + } +- }, +- "eslint-visitor-keys": { +- "version": "4.2.0", +- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", +- "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", +- "dev": true, +- "peer": true + } + } + }, +@@ -9037,54 +7866,39 @@ + } + }, + "@typescript-eslint/types": { +- "version": "8.19.1", +- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.19.1.tgz", +- "integrity": "sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==", ++ "version": "8.13.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz", ++ "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==", + "dev": true, + "peer": true + }, + "@typescript-eslint/typescript-estree": { +- "version": "8.19.1", +- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.19.1.tgz", +- "integrity": "sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==", ++ "version": "8.13.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz", ++ "integrity": "sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==", + "dev": true, + "peer": true, + "requires": { +- "@typescript-eslint/types": "8.19.1", +- "@typescript-eslint/visitor-keys": "8.19.1", ++ "@typescript-eslint/types": "8.13.0", ++ "@typescript-eslint/visitor-keys": "8.13.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", +- "ts-api-utils": "^2.0.0" ++ "ts-api-utils": "^1.3.0" + }, + "dependencies": { + "@typescript-eslint/visitor-keys": { +- "version": "8.19.1", +- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.19.1.tgz", +- "integrity": "sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==", ++ "version": "8.13.0", ++ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", ++ "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", + "dev": true, + "peer": true, + "requires": { +- "@typescript-eslint/types": "8.19.1", +- "eslint-visitor-keys": "^4.2.0" ++ "@typescript-eslint/types": "8.13.0", ++ "eslint-visitor-keys": "^3.4.3" + } +- }, +- "eslint-visitor-keys": { +- "version": "4.2.0", +- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", +- "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", +- "dev": true, +- "peer": true +- }, +- "ts-api-utils": { +- "version": "2.0.0", +- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.0.tgz", +- "integrity": "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==", +- "dev": true, +- "peer": true, +- "requires": {} + } + } + }, +@@ -9143,9 +7957,9 @@ + } + }, + "@ungap/structured-clone": { +- "version": "1.2.1", +- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", +- "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==", ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", ++ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "@xterm/addon-canvas": { +@@ -9234,13 +8048,13 @@ + } + }, + "array-buffer-byte-length": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", +- "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", ++ "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "requires": { +- "call-bound": "^1.0.3", +- "is-array-buffer": "^3.0.5" ++ "call-bind": "^1.0.5", ++ "is-array-buffer": "^3.0.4" + } + }, + "array-includes": { +@@ -9292,27 +8106,27 @@ + } + }, + "array.prototype.flat": { +- "version": "1.3.3", +- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", +- "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", ++ "version": "1.3.2", ++ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", ++ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "requires": { +- "call-bind": "^1.0.8", +- "define-properties": "^1.2.1", +- "es-abstract": "^1.23.5", +- "es-shim-unscopables": "^1.0.2" ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.2.0", ++ "es-abstract": "^1.22.1", ++ "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { +- "version": "1.3.3", +- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", +- "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", ++ "version": "1.3.2", ++ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", ++ "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "requires": { +- "call-bind": "^1.0.8", +- "define-properties": "^1.2.1", +- "es-abstract": "^1.23.5", +- "es-shim-unscopables": "^1.0.2" ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.2.0", ++ "es-abstract": "^1.22.1", ++ "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.tosorted": { +@@ -9329,18 +8143,19 @@ + } + }, + "arraybuffer.prototype.slice": { +- "version": "1.0.4", +- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", +- "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", ++ "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", +- "call-bind": "^1.0.8", ++ "call-bind": "^1.0.5", + "define-properties": "^1.2.1", +- "es-abstract": "^1.23.5", +- "es-errors": "^1.3.0", +- "get-intrinsic": "^1.2.6", +- "is-array-buffer": "^3.0.4" ++ "es-abstract": "^1.22.3", ++ "es-errors": "^1.2.1", ++ "get-intrinsic": "^1.2.3", ++ "is-array-buffer": "^3.0.4", ++ "is-shared-array-buffer": "^1.0.2" + } + }, + "ast-types-flow": { +@@ -9356,9 +8171,9 @@ + "dev": true + }, + "attr-accept": { +- "version": "2.2.5", +- "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", +- "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==" ++ "version": "2.2.4", ++ "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.4.tgz", ++ "integrity": "sha512-2pA6xFIbdTUDCAwjN8nQwI+842VwzbDUXO2IYlpPXQIORgKnavorcr4Ce3rwh+zsNg9zK7QPsdvDj3Lum4WX4w==" + }, + "autolinker": { + "version": "3.16.2", +@@ -9444,35 +8259,16 @@ + } + }, + "call-bind": { +- "version": "1.0.8", +- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", +- "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", ++ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "requires": { +- "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", +- "get-intrinsic": "^1.2.4", +- "set-function-length": "^1.2.2" +- } +- }, +- "call-bind-apply-helpers": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", +- "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", +- "dev": true, +- "requires": { + "es-errors": "^1.3.0", +- "function-bind": "^1.1.2" +- } +- }, +- "call-bound": { +- "version": "1.0.3", +- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", +- "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", +- "dev": true, +- "requires": { +- "call-bind-apply-helpers": "^1.0.1", +- "get-intrinsic": "^1.2.6" ++ "function-bind": "^1.1.2", ++ "get-intrinsic": "^1.2.4", ++ "set-function-length": "^1.2.1" + } + }, + "callsites": { +@@ -9697,42 +8493,42 @@ + "dev": true + }, + "data-view-buffer": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", +- "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", ++ "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "requires": { +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.6", + "es-errors": "^1.3.0", +- "is-data-view": "^1.0.2" ++ "is-data-view": "^1.0.1" + } + }, + "data-view-byte-length": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", +- "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", ++ "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "requires": { +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.7", + "es-errors": "^1.3.0", +- "is-data-view": "^1.0.2" ++ "is-data-view": "^1.0.1" + } + }, + "data-view-byte-offset": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", +- "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", ++ "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "requires": { +- "call-bound": "^1.0.2", ++ "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, + "debug": { +- "version": "4.4.0", +- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", +- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", ++ "version": "4.3.7", ++ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", ++ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "requires": { + "ms": "^2.1.3" +@@ -9828,17 +8624,6 @@ + "esutils": "^2.0.2" + } + }, +- "dunder-proto": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", +- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", +- "dev": true, +- "requires": { +- "call-bind-apply-helpers": "^1.0.1", +- "es-errors": "^1.3.0", +- "gopd": "^1.2.0" +- } +- }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", +@@ -9881,69 +8666,67 @@ + } + }, + "es-abstract": { +- "version": "1.23.9", +- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", +- "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", ++ "version": "1.23.3", ++ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", ++ "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "requires": { +- "array-buffer-byte-length": "^1.0.2", +- "arraybuffer.prototype.slice": "^1.0.4", ++ "array-buffer-byte-length": "^1.0.1", ++ "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", +- "data-view-buffer": "^1.0.2", +- "data-view-byte-length": "^1.0.2", +- "data-view-byte-offset": "^1.0.1", +- "es-define-property": "^1.0.1", ++ "call-bind": "^1.0.7", ++ "data-view-buffer": "^1.0.1", ++ "data-view-byte-length": "^1.0.1", ++ "data-view-byte-offset": "^1.0.0", ++ "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", +- "es-set-tostringtag": "^2.1.0", +- "es-to-primitive": "^1.3.0", +- "function.prototype.name": "^1.1.8", +- "get-intrinsic": "^1.2.7", +- "get-proto": "^1.0.0", +- "get-symbol-description": "^1.1.0", +- "globalthis": "^1.0.4", +- "gopd": "^1.2.0", ++ "es-set-tostringtag": "^2.0.3", ++ "es-to-primitive": "^1.2.1", ++ "function.prototype.name": "^1.1.6", ++ "get-intrinsic": "^1.2.4", ++ "get-symbol-description": "^1.0.2", ++ "globalthis": "^1.0.3", ++ "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", +- "has-proto": "^1.2.0", +- "has-symbols": "^1.1.0", ++ "has-proto": "^1.0.3", ++ "has-symbols": "^1.0.3", + "hasown": "^2.0.2", +- "internal-slot": "^1.1.0", +- "is-array-buffer": "^3.0.5", ++ "internal-slot": "^1.0.7", ++ "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", +- "is-data-view": "^1.0.2", +- "is-regex": "^1.2.1", +- "is-shared-array-buffer": "^1.0.4", +- "is-string": "^1.1.1", +- "is-typed-array": "^1.1.15", +- "is-weakref": "^1.1.0", +- "math-intrinsics": "^1.1.0", +- "object-inspect": "^1.13.3", ++ "is-data-view": "^1.0.1", ++ "is-negative-zero": "^2.0.3", ++ "is-regex": "^1.1.4", ++ "is-shared-array-buffer": "^1.0.3", ++ "is-string": "^1.0.7", ++ "is-typed-array": "^1.1.13", ++ "is-weakref": "^1.0.2", ++ "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", +- "object.assign": "^4.1.7", +- "own-keys": "^1.0.1", +- "regexp.prototype.flags": "^1.5.3", +- "safe-array-concat": "^1.1.3", +- "safe-push-apply": "^1.0.0", +- "safe-regex-test": "^1.1.0", +- "set-proto": "^1.0.0", +- "string.prototype.trim": "^1.2.10", +- "string.prototype.trimend": "^1.0.9", ++ "object.assign": "^4.1.5", ++ "regexp.prototype.flags": "^1.5.2", ++ "safe-array-concat": "^1.1.2", ++ "safe-regex-test": "^1.0.3", ++ "string.prototype.trim": "^1.2.9", ++ "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", +- "typed-array-buffer": "^1.0.3", +- "typed-array-byte-length": "^1.0.3", +- "typed-array-byte-offset": "^1.0.4", +- "typed-array-length": "^1.0.7", +- "unbox-primitive": "^1.1.0", +- "which-typed-array": "^1.1.18" ++ "typed-array-buffer": "^1.0.2", ++ "typed-array-byte-length": "^1.0.1", ++ "typed-array-byte-offset": "^1.0.2", ++ "typed-array-length": "^1.0.6", ++ "unbox-primitive": "^1.0.2", ++ "which-typed-array": "^1.1.15" + } + }, + "es-define-property": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", +- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", +- "dev": true ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", ++ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", ++ "dev": true, ++ "requires": { ++ "get-intrinsic": "^1.2.4" ++ } + }, + "es-errors": { + "version": "1.3.0", +@@ -9969,27 +8752,26 @@ + } + }, + "es-iterator-helpers": { +- "version": "1.2.1", +- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", +- "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", ++ "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", + "dev": true, + "requires": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.7", + "define-properties": "^1.2.1", +- "es-abstract": "^1.23.6", ++ "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", +- "get-intrinsic": "^1.2.6", ++ "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", +- "gopd": "^1.2.0", ++ "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", +- "has-proto": "^1.2.0", +- "has-symbols": "^1.1.0", +- "internal-slot": "^1.1.0", +- "iterator.prototype": "^1.1.4", +- "safe-array-concat": "^1.1.3" ++ "has-proto": "^1.0.3", ++ "has-symbols": "^1.0.3", ++ "internal-slot": "^1.0.7", ++ "iterator.prototype": "^1.1.3", ++ "safe-array-concat": "^1.1.2" + } + }, + "es-object-atoms": { +@@ -10002,15 +8784,14 @@ + } + }, + "es-set-tostringtag": { +- "version": "2.1.0", +- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", +- "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", ++ "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "requires": { +- "es-errors": "^1.3.0", +- "get-intrinsic": "^1.2.6", ++ "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", +- "hasown": "^2.0.2" ++ "hasown": "^2.0.1" + } + }, + "es-shim-unscopables": { +@@ -10023,14 +8804,14 @@ + } + }, + "es-to-primitive": { +- "version": "1.3.0", +- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", +- "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", ++ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { +- "is-callable": "^1.2.7", +- "is-date-object": "^1.0.5", +- "is-symbol": "^1.0.4" ++ "is-callable": "^1.1.4", ++ "is-date-object": "^1.0.1", ++ "is-symbol": "^1.0.2" + } + }, + "esbuild": { +@@ -10649,16 +9430,16 @@ + "dev": true + }, + "fast-glob": { +- "version": "3.3.3", +- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", +- "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", ++ "version": "3.3.2", ++ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", ++ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", +- "micromatch": "^4.0.8" ++ "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { +@@ -10674,9 +9455,9 @@ + "dev": true + }, + "fast-uri": { +- "version": "3.0.5", +- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.5.tgz", +- "integrity": "sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==", ++ "version": "3.0.3", ++ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", ++ "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + }, + "fastest-levenshtein": { +@@ -10686,9 +9467,9 @@ + "dev": true + }, + "fastq": { +- "version": "1.18.0", +- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", +- "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", ++ "version": "1.17.1", ++ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", ++ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "requires": { + "reusify": "^1.0.4" +@@ -10704,9 +9485,9 @@ + } + }, + "file-selector": { +- "version": "2.1.2", +- "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", +- "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", ++ "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.0.tgz", ++ "integrity": "sha512-ZuXAqGePcSPz4JuerOY06Dzzq0hrmQ6VGoXVzGyFI1npeOfBgqGIKKpznfYWRkSLJlXutkqVC5WvGZtkFVhu9Q==", + "requires": { + "tslib": "^2.7.0" + } +@@ -10742,9 +9523,9 @@ + } + }, + "flatted": { +- "version": "3.3.2", +- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", +- "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", ++ "version": "3.3.1", ++ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", ++ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "focus-trap": { +@@ -10791,13 +9572,6 @@ + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, +- "fsevents": { +- "version": "2.3.3", +- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", +- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", +- "dev": true, +- "optional": true +- }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", +@@ -10805,17 +9579,15 @@ + "dev": true + }, + "function.prototype.name": { +- "version": "1.1.8", +- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", +- "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", ++ "version": "1.1.6", ++ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", ++ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "requires": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", +- "define-properties": "^1.2.1", +- "functions-have-names": "^1.2.3", +- "hasown": "^2.0.2", +- "is-callable": "^1.2.7" ++ "call-bind": "^1.0.2", ++ "define-properties": "^1.2.0", ++ "es-abstract": "^1.22.1", ++ "functions-have-names": "^1.2.3" + } + }, + "functions-have-names": { +@@ -10831,42 +9603,27 @@ + "dev": true + }, + "get-intrinsic": { +- "version": "1.2.7", +- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", +- "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", ++ "version": "1.2.4", ++ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", ++ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "requires": { +- "call-bind-apply-helpers": "^1.0.1", +- "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", +- "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", +- "get-proto": "^1.0.0", +- "gopd": "^1.2.0", +- "has-symbols": "^1.1.0", +- "hasown": "^2.0.2", +- "math-intrinsics": "^1.1.0" +- } +- }, +- "get-proto": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", +- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", +- "dev": true, +- "requires": { +- "dunder-proto": "^1.0.1", +- "es-object-atoms": "^1.0.0" ++ "has-proto": "^1.0.1", ++ "has-symbols": "^1.0.3", ++ "hasown": "^2.0.0" + } + }, + "get-symbol-description": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", +- "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", ++ "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "requires": { +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.5", + "es-errors": "^1.3.0", +- "get-intrinsic": "^1.2.6" ++ "get-intrinsic": "^1.2.4" + } + }, + "get-tsconfig": { +@@ -11027,10 +9784,13 @@ + "dev": true + }, + "gopd": { +- "version": "1.2.0", +- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", +- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", +- "dev": true ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", ++ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", ++ "dev": true, ++ "requires": { ++ "get-intrinsic": "^1.1.3" ++ } + }, + "graceful-fs": { + "version": "4.2.11", +@@ -11045,9 +9805,9 @@ + "dev": true + }, + "has-bigints": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", +- "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", ++ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { +@@ -11066,18 +9826,15 @@ + } + }, + "has-proto": { +- "version": "1.2.0", +- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", +- "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", +- "dev": true, +- "requires": { +- "dunder-proto": "^1.0.0" +- } ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", ++ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", ++ "dev": true + }, + "has-symbols": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", +- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", ++ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { +@@ -11176,14 +9933,14 @@ + "dev": true + }, + "internal-slot": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", +- "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", ++ "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", +- "hasown": "^2.0.2", +- "side-channel": "^1.1.0" ++ "hasown": "^2.0.0", ++ "side-channel": "^1.0.4" + } + }, + "internmap": { +@@ -11198,24 +9955,23 @@ + "dev": true + }, + "is-arguments": { +- "version": "1.2.0", +- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", +- "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", ++ "version": "1.1.1", ++ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", ++ "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { +- "call-bound": "^1.0.2", +- "has-tostringtag": "^1.0.2" ++ "call-bind": "^1.0.2", ++ "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { +- "version": "3.0.5", +- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", +- "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", ++ "version": "3.0.4", ++ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", ++ "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "requires": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", +- "get-intrinsic": "^1.2.6" ++ "call-bind": "^1.0.2", ++ "get-intrinsic": "^1.2.1" + } + }, + "is-arrayish": { +@@ -11225,24 +9981,21 @@ + "dev": true + }, + "is-async-function": { +- "version": "2.1.0", +- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.0.tgz", +- "integrity": "sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==", ++ "version": "2.0.0", ++ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", ++ "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "requires": { +- "call-bound": "^1.0.3", +- "get-proto": "^1.0.1", +- "has-tostringtag": "^1.0.2", +- "safe-regex-test": "^1.1.0" ++ "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", +- "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", ++ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { +- "has-bigints": "^1.0.2" ++ "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { +@@ -11255,13 +10008,13 @@ + } + }, + "is-boolean-object": { +- "version": "1.2.1", +- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", +- "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", ++ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { +- "call-bound": "^1.0.2", +- "has-tostringtag": "^1.0.2" ++ "call-bind": "^1.0.2", ++ "has-tostringtag": "^1.0.0" + } + }, + "is-builtin-module": { +@@ -11281,33 +10034,30 @@ + "dev": true + }, + "is-core-module": { +- "version": "2.16.1", +- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", +- "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", ++ "version": "2.15.1", ++ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", ++ "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "requires": { + "hasown": "^2.0.2" + } + }, + "is-data-view": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", +- "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", ++ "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "requires": { +- "call-bound": "^1.0.2", +- "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + } + }, + "is-date-object": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", +- "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", ++ "version": "1.0.5", ++ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", ++ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { +- "call-bound": "^1.0.2", +- "has-tostringtag": "^1.0.2" ++ "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { +@@ -11317,12 +10067,12 @@ + "dev": true + }, + "is-finalizationregistry": { +- "version": "1.1.1", +- "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", +- "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", ++ "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "requires": { +- "call-bound": "^1.0.3" ++ "call-bind": "^1.0.2" + } + }, + "is-fullwidth-code-point": { +@@ -11332,15 +10082,12 @@ + "dev": true + }, + "is-generator-function": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", +- "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", ++ "version": "1.0.10", ++ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", ++ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { +- "call-bound": "^1.0.3", +- "get-proto": "^1.0.0", +- "has-tostringtag": "^1.0.2", +- "safe-regex-test": "^1.1.0" ++ "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { +@@ -11358,6 +10105,12 @@ + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true + }, ++ "is-negative-zero": { ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", ++ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", ++ "dev": true ++ }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", +@@ -11365,13 +10118,12 @@ + "dev": true + }, + "is-number-object": { +- "version": "1.1.1", +- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", +- "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", ++ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { +- "call-bound": "^1.0.3", +- "has-tostringtag": "^1.0.2" ++ "has-tostringtag": "^1.0.0" + } + }, + "is-path-inside": { +@@ -11387,15 +10139,13 @@ + "dev": true + }, + "is-regex": { +- "version": "1.2.1", +- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", +- "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", ++ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { +- "call-bound": "^1.0.2", +- "gopd": "^1.2.0", +- "has-tostringtag": "^1.0.2", +- "hasown": "^2.0.2" ++ "call-bind": "^1.0.2", ++ "has-tostringtag": "^1.0.0" + } + }, + "is-set": { +@@ -11405,42 +10155,39 @@ + "dev": true + }, + "is-shared-array-buffer": { +- "version": "1.0.4", +- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", +- "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", ++ "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "requires": { +- "call-bound": "^1.0.3" ++ "call-bind": "^1.0.7" + } + }, + "is-string": { +- "version": "1.1.1", +- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", +- "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", ++ "version": "1.0.7", ++ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", ++ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { +- "call-bound": "^1.0.3", +- "has-tostringtag": "^1.0.2" ++ "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { +- "version": "1.1.1", +- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", +- "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", ++ "version": "1.0.4", ++ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", ++ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { +- "call-bound": "^1.0.2", +- "has-symbols": "^1.1.0", +- "safe-regex-test": "^1.1.0" ++ "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { +- "version": "1.1.15", +- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", +- "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", ++ "version": "1.1.13", ++ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", ++ "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "requires": { +- "which-typed-array": "^1.1.16" ++ "which-typed-array": "^1.1.14" + } + }, + "is-unicode-supported": { +@@ -11456,22 +10203,22 @@ + "dev": true + }, + "is-weakref": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", +- "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", ++ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { +- "call-bound": "^1.0.2" ++ "call-bind": "^1.0.2" + } + }, + "is-weakset": { +- "version": "2.0.4", +- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", +- "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", ++ "version": "2.0.3", ++ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", ++ "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "requires": { +- "call-bound": "^1.0.3", +- "get-intrinsic": "^1.2.6" ++ "call-bind": "^1.0.7", ++ "get-intrinsic": "^1.2.4" + } + }, + "isarray": { +@@ -11487,17 +10234,16 @@ + "dev": true + }, + "iterator.prototype": { +- "version": "1.1.5", +- "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", +- "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", ++ "version": "1.1.3", ++ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", ++ "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "dev": true, + "requires": { +- "define-data-property": "^1.1.4", +- "es-object-atoms": "^1.0.0", +- "get-intrinsic": "^1.2.6", +- "get-proto": "^1.0.0", +- "has-symbols": "^1.1.0", +- "set-function-name": "^2.0.2" ++ "define-properties": "^1.2.1", ++ "get-intrinsic": "^1.2.1", ++ "has-symbols": "^1.0.3", ++ "reflect.getprototypeof": "^1.0.4", ++ "set-function-name": "^2.0.1" + } + }, + "jackspeak": { +@@ -11709,12 +10455,6 @@ + "sourcemap-codec": "^1.4.8" + } + }, +- "math-intrinsics": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", +- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", +- "dev": true +- }, + "mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", +@@ -11806,9 +10546,9 @@ + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { +- "version": "1.13.3", +- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", +- "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", ++ "version": "1.13.2", ++ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", ++ "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true + }, + "object-is": { +@@ -11828,16 +10568,14 @@ + "dev": true + }, + "object.assign": { +- "version": "4.1.7", +- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", +- "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", ++ "version": "4.1.5", ++ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", ++ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "requires": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.5", + "define-properties": "^1.2.1", +- "es-object-atoms": "^1.0.0", +- "has-symbols": "^1.1.0", ++ "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, +@@ -11876,13 +10614,12 @@ + } + }, + "object.values": { +- "version": "1.2.1", +- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", +- "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", ++ "version": "1.2.0", ++ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", ++ "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "requires": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } +@@ -11910,17 +10647,6 @@ + "word-wrap": "^1.2.5" + } + }, +- "own-keys": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", +- "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", +- "dev": true, +- "requires": { +- "get-intrinsic": "^1.2.6", +- "object-keys": "^1.1.1", +- "safe-push-apply": "^1.0.0" +- } +- }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", +@@ -12063,13 +10789,13 @@ + "dev": true + }, + "postcss": { +- "version": "8.4.49", +- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", +- "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", ++ "version": "8.4.47", ++ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", ++ "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "requires": { + "nanoid": "^3.3.7", +- "picocolors": "^1.1.1", ++ "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + } + }, +@@ -12122,9 +10848,9 @@ + "dev": true + }, + "prettier": { +- "version": "3.4.2", +- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", +- "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==" ++ "version": "3.3.3", ++ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", ++ "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==" + }, + "process-nextick-args": { + "version": "2.0.1", +@@ -12251,32 +10977,29 @@ + } + }, + "reflect.getprototypeof": { +- "version": "1.0.10", +- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", +- "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", ++ "version": "1.0.6", ++ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", ++ "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "requires": { +- "call-bind": "^1.0.8", ++ "call-bind": "^1.0.7", + "define-properties": "^1.2.1", +- "es-abstract": "^1.23.9", ++ "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", +- "es-object-atoms": "^1.0.0", +- "get-intrinsic": "^1.2.7", +- "get-proto": "^1.0.1", +- "which-builtin-type": "^1.2.1" ++ "get-intrinsic": "^1.2.4", ++ "globalthis": "^1.0.3", ++ "which-builtin-type": "^1.1.3" + } + }, + "regexp.prototype.flags": { +- "version": "1.5.4", +- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", +- "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", ++ "version": "1.5.3", ++ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", ++ "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dev": true, + "requires": { +- "call-bind": "^1.0.8", ++ "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", +- "get-proto": "^1.0.1", +- "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + } + }, +@@ -12312,12 +11035,12 @@ + "dev": true + }, + "resolve": { +- "version": "1.22.10", +- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", +- "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", ++ "version": "1.22.8", ++ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", ++ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "requires": { +- "is-core-module": "^2.16.0", ++ "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } +@@ -12405,15 +11128,14 @@ + } + }, + "safe-array-concat": { +- "version": "1.1.3", +- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", +- "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", ++ "version": "1.1.2", ++ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", ++ "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "requires": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.2", +- "get-intrinsic": "^1.2.6", +- "has-symbols": "^1.1.0", ++ "call-bind": "^1.0.7", ++ "get-intrinsic": "^1.2.4", ++ "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, +@@ -12428,25 +11150,15 @@ + "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", + "dev": true + }, +- "safe-push-apply": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", +- "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", +- "dev": true, +- "requires": { +- "es-errors": "^1.3.0", +- "isarray": "^2.0.5" +- } +- }, + "safe-regex-test": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", +- "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", ++ "version": "1.0.3", ++ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", ++ "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "requires": { +- "call-bound": "^1.0.2", ++ "call-bind": "^1.0.6", + "es-errors": "^1.3.0", +- "is-regex": "^1.2.1" ++ "is-regex": "^1.1.4" + } + }, + "safer-buffer": { +@@ -12466,9 +11178,9 @@ + }, + "dependencies": { + "chokidar": { +- "version": "4.0.3", +- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", +- "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", ++ "version": "4.0.1", ++ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", ++ "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, + "requires": { + "readdirp": "^4.0.1" +@@ -12483,49 +11195,41 @@ + } + }, + "sass-embedded": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.83.1.tgz", +- "integrity": "sha512-LdKG6nxLEzpXbMUt0if12PhUNonGvy91n7IWHOZRZjvA6AWm9oVdhpO+KEXN/Sc+jjGvQeQcav9+Z8DwmII/pA==", ++ "version": "1.80.6", ++ "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.80.6.tgz", ++ "integrity": "sha512-Og4aqBnaA3oJfIpHaLuNATAqzBRgUJDYJy2X15V59cot2wYOtiT/ciPnyuq1o7vpDEeOkHhEd+mSviSlXoETug==", + "dev": true, + "peer": true, + "requires": { + "@bufbuild/protobuf": "^2.0.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", +- "immutable": "^5.0.2", ++ "immutable": "^4.0.0", + "rxjs": "^7.4.0", +- "sass-embedded-android-arm": "1.83.1", +- "sass-embedded-android-arm64": "1.83.1", +- "sass-embedded-android-ia32": "1.83.1", +- "sass-embedded-android-riscv64": "1.83.1", +- "sass-embedded-android-x64": "1.83.1", +- "sass-embedded-darwin-arm64": "1.83.1", +- "sass-embedded-darwin-x64": "1.83.1", +- "sass-embedded-linux-arm": "1.83.1", +- "sass-embedded-linux-arm64": "1.83.1", +- "sass-embedded-linux-ia32": "1.83.1", +- "sass-embedded-linux-musl-arm": "1.83.1", +- "sass-embedded-linux-musl-arm64": "1.83.1", +- "sass-embedded-linux-musl-ia32": "1.83.1", +- "sass-embedded-linux-musl-riscv64": "1.83.1", +- "sass-embedded-linux-musl-x64": "1.83.1", +- "sass-embedded-linux-riscv64": "1.83.1", +- "sass-embedded-linux-x64": "1.83.1", +- "sass-embedded-win32-arm64": "1.83.1", +- "sass-embedded-win32-ia32": "1.83.1", +- "sass-embedded-win32-x64": "1.83.1", ++ "sass-embedded-android-arm": "1.80.6", ++ "sass-embedded-android-arm64": "1.80.6", ++ "sass-embedded-android-ia32": "1.80.6", ++ "sass-embedded-android-riscv64": "1.80.6", ++ "sass-embedded-android-x64": "1.80.6", ++ "sass-embedded-darwin-arm64": "1.80.6", ++ "sass-embedded-darwin-x64": "1.80.6", ++ "sass-embedded-linux-arm": "1.80.6", ++ "sass-embedded-linux-arm64": "1.80.6", ++ "sass-embedded-linux-ia32": "1.80.6", ++ "sass-embedded-linux-musl-arm": "1.80.6", ++ "sass-embedded-linux-musl-arm64": "1.80.6", ++ "sass-embedded-linux-musl-ia32": "1.80.6", ++ "sass-embedded-linux-musl-riscv64": "1.80.6", ++ "sass-embedded-linux-musl-x64": "1.80.6", ++ "sass-embedded-linux-riscv64": "1.80.6", ++ "sass-embedded-linux-x64": "1.80.6", ++ "sass-embedded-win32-arm64": "1.80.6", ++ "sass-embedded-win32-ia32": "1.80.6", ++ "sass-embedded-win32-x64": "1.80.6", + "supports-color": "^8.1.1", +- "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "dependencies": { +- "immutable": { +- "version": "5.0.3", +- "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", +- "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", +- "dev": true, +- "peer": true +- }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", +@@ -12538,162 +11242,18 @@ + } + } + }, +- "sass-embedded-android-arm": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.83.1.tgz", +- "integrity": "sha512-FKfrmwDG84L5cfn8fmIew47qnCFFUdcoOTCzOw8ROItkRhLLH0hnIm6gEpG5T6OFf6kxzUxvE9D0FvYQUznZrw==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-android-arm64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.83.1.tgz", +- "integrity": "sha512-S63rlLPGCA9FCqYYOobDJrwcuBX0zbSOl7y0jT9DlfqeqNOkC6NIT1id6RpMFCs3uhd4gbBS2E/5WPv5J5qwbw==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-android-ia32": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.83.1.tgz", +- "integrity": "sha512-AGlY2vFLJhF2hN0qOz12f4eDs6x0b5BUapOpgfRrqQLHIfJhxkvi39bInsiBgQ57U0jb4I7AaS2e2e+sj7+Rqw==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-android-riscv64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.83.1.tgz", +- "integrity": "sha512-OyU4AnfAUVd/wBaT60XvHidmQdaEsVUnxvI71oyPM/id1v97aWTZX3SmGkwGb7uA/q6Soo2uNalgvOSNJn7PwA==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-android-x64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.83.1.tgz", +- "integrity": "sha512-NY5rwffhF4TnhXVErZnfFIjHqU3MNoWxCuSHumRN3dDI8hp8+IF59W5+Qw9AARlTXvyb+D0u5653aLSea5F40w==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-darwin-arm64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.83.1.tgz", +- "integrity": "sha512-w1SBcSkIgIWgUfB7IKcPoTbSwnS3Kag5PVv3e3xfW6ZCsDweYZLQntUd2WGgaoekdm1uIbVuvPxnDH2t880iGQ==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-darwin-x64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.83.1.tgz", +- "integrity": "sha512-RWrmLtUhEP5kvcGOAFdr99/ebZ/eW9z3FAktLldvgl2k96WSTC1Zr2ctL0E+Y+H3uLahEZsshIFk6RkVIRKIsA==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-linux-arm": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.83.1.tgz", +- "integrity": "sha512-y7rHuRgjg2YM284rin068PsEdthPljSGb653Slut5Wba4A2IP11UNVraSl6Je2AYTuoPRjQX0g7XdsrjXlzC3g==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-linux-arm64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.83.1.tgz", +- "integrity": "sha512-HVIytzj8OO18fmBY6SVRIYErcJ+Nd9a5RNF6uArav/CqvwPLATlUV8dwqSyWQIzSsQUhDF/vFIlJIoNLKKzD3A==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-linux-ia32": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.83.1.tgz", +- "integrity": "sha512-/pc+jHllyvfaYYLTRCoXseRc4+V3Z7IDPqsviTcfVdICAoR9mgK2RtIuIZanhm1NP/lDylDOgvj1NtjcA2dNvg==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-linux-musl-arm": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.83.1.tgz", +- "integrity": "sha512-sFM8GXOVoeR91j9MiwNRcFXRpTA7u4185SaGuvUjcRMb84mHvtWOJPGDvgZqbWdVClBRJp6J7+CShliWngy/og==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-linux-musl-arm64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.83.1.tgz", +- "integrity": "sha512-wjSIYYqdIQp3DjliSTYNFg04TVqQf/3Up/Stahol0Qf/TTjLkjHHtT2jnDaZI5GclHi2PVJqQF3wEGB8bGJMzQ==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-linux-musl-ia32": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.83.1.tgz", +- "integrity": "sha512-iwhTH5gwmoGt3VH6dn4WV8N6eWvthKAvUX5XPURq7e9KEsc7QP8YNHagwaAJh7TAPopb32buyEg6oaUmzxUI+Q==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-linux-musl-riscv64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.83.1.tgz", +- "integrity": "sha512-FjFNWHU1n0Q6GpK1lAHQL5WmzlPjL8DTVLkYW2A/dq8EsutAdi3GfpeyWZk9bte8kyWdmPUWG3BHlnQl22xdoA==", +- "dev": true, +- "optional": true, +- "peer": true +- }, + "sass-embedded-linux-musl-x64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.83.1.tgz", +- "integrity": "sha512-BUfYR5TIDvgGHWhxSIKwTJocXU88ECZ0BW89RJqtvr7m83fKdf5ylTFCOieU7BwcA7SORUeZzcQzVFIdPUM3BQ==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-linux-riscv64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.83.1.tgz", +- "integrity": "sha512-KOBGSpMrJi8y+H+za3vAAVQImPUvQa5eUrvTbbOl+wkU7WAGhOu8xrxgmYYiz3pZVBBcfRjz4I2jBcDFKJmWSw==", ++ "version": "1.80.6", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.80.6.tgz", ++ "integrity": "sha512-DzeNqU/SN0mWFznoOH4RtVGcrg3Eoa41pUQhKMtrhNbCmIE1zNDunUiAEVTNpdHJF4nxf7ELUPXWmStM31CbUQ==", + "dev": true, + "optional": true, + "peer": true + }, + "sass-embedded-linux-x64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.83.1.tgz", +- "integrity": "sha512-swUsMHKqlEU9dZQ/I5WADDaXz+QkmJS27x/Oeh+oz41YgZ0ppKd0l4Vwjn0LgOQn+rxH1zLFv6xXDycvj68F/w==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-win32-arm64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.83.1.tgz", +- "integrity": "sha512-6lONEBN5TaFD5L/y68zUugryXqm4RAFuLdaOPeZQRu+7ay/AmfhtFYfE5gRssnIcIx1nlcoq7zA3UX+SN2jo1Q==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-win32-ia32": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.83.1.tgz", +- "integrity": "sha512-HxZDkAE9n6Gb8Rz6xd67VHuo5FkUSQ4xPb7cHKa4pE0ndwH5Oc0uEhbqjJobpgmnuTm1rQYNU2nof1sFhy2MFA==", +- "dev": true, +- "optional": true, +- "peer": true +- }, +- "sass-embedded-win32-x64": { +- "version": "1.83.1", +- "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.83.1.tgz", +- "integrity": "sha512-5Q0aPfUaqRek8Ee1AqTUIC0o6yQSA8QwyhCgh7upsnHG3Ltm8pkJOYjzm+UgYPJeoMNppDjdDlRGQISE7qzd4g==", ++ "version": "1.80.6", ++ "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.80.6.tgz", ++ "integrity": "sha512-EohsE9CEqx0ycylnsEj/0DNPG99Tb0qAVZspiAs5xHFCJjXOFfp3cRQu0BRf+lZ1b72IhPFXymzVtojvzUHb7g==", + "dev": true, + "optional": true, + "peer": true +@@ -12738,17 +11298,6 @@ + "has-property-descriptors": "^1.0.2" + } + }, +- "set-proto": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", +- "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", +- "dev": true, +- "requires": { +- "dunder-proto": "^1.0.1", +- "es-errors": "^1.3.0", +- "es-object-atoms": "^1.0.0" +- } +- }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", +@@ -12765,51 +11314,15 @@ + "dev": true + }, + "side-channel": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", +- "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", +- "dev": true, +- "requires": { +- "es-errors": "^1.3.0", +- "object-inspect": "^1.13.3", +- "side-channel-list": "^1.0.0", +- "side-channel-map": "^1.0.1", +- "side-channel-weakmap": "^1.0.2" +- } +- }, +- "side-channel-list": { +- "version": "1.0.0", +- "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", +- "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", +- "dev": true, +- "requires": { +- "es-errors": "^1.3.0", +- "object-inspect": "^1.13.3" +- } +- }, +- "side-channel-map": { +- "version": "1.0.1", +- "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", +- "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", +- "dev": true, +- "requires": { +- "call-bound": "^1.0.2", +- "es-errors": "^1.3.0", +- "get-intrinsic": "^1.2.5", +- "object-inspect": "^1.13.3" +- } +- }, +- "side-channel-weakmap": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", +- "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", ++ "version": "1.0.6", ++ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", ++ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "requires": { +- "call-bound": "^1.0.2", ++ "call-bind": "^1.0.7", + "es-errors": "^1.3.0", +- "get-intrinsic": "^1.2.5", +- "object-inspect": "^1.13.3", +- "side-channel-map": "^1.0.1" ++ "get-intrinsic": "^1.2.4", ++ "object-inspect": "^1.13.1" + } + }, + "signal-exit": { +@@ -12859,13 +11372,12 @@ + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "stop-iteration-iterator": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", +- "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", ++ "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "requires": { +- "es-errors": "^1.3.0", +- "internal-slot": "^1.1.0" ++ "internal-slot": "^1.0.4" + } + }, + "string_decoder": { +@@ -12942,24 +11454,23 @@ + } + }, + "string.prototype.matchall": { +- "version": "4.0.12", +- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", +- "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", ++ "version": "4.0.11", ++ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", ++ "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "requires": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.7", + "define-properties": "^1.2.1", +- "es-abstract": "^1.23.6", ++ "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", +- "get-intrinsic": "^1.2.6", +- "gopd": "^1.2.0", +- "has-symbols": "^1.1.0", +- "internal-slot": "^1.1.0", +- "regexp.prototype.flags": "^1.5.3", ++ "get-intrinsic": "^1.2.4", ++ "gopd": "^1.0.1", ++ "has-symbols": "^1.0.3", ++ "internal-slot": "^1.0.7", ++ "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", +- "side-channel": "^1.1.0" ++ "side-channel": "^1.0.6" + } + }, + "string.prototype.repeat": { +@@ -12973,28 +11484,24 @@ + } + }, + "string.prototype.trim": { +- "version": "1.2.10", +- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", +- "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", ++ "version": "1.2.9", ++ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", ++ "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "requires": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.2", +- "define-data-property": "^1.1.4", ++ "call-bind": "^1.0.7", + "define-properties": "^1.2.1", +- "es-abstract": "^1.23.5", +- "es-object-atoms": "^1.0.0", +- "has-property-descriptors": "^1.0.2" ++ "es-abstract": "^1.23.0", ++ "es-object-atoms": "^1.0.0" + } + }, + "string.prototype.trimend": { +- "version": "1.0.9", +- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", +- "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", ++ "version": "1.0.8", ++ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", ++ "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "requires": { +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.2", ++ "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } +@@ -13251,60 +11758,44 @@ + } + }, + "stylelint-scss": { +- "version": "6.10.0", +- "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.10.0.tgz", +- "integrity": "sha512-y03if6Qw9xBMoVaf7tzp5BbnYhYvudIKzURkhSHzcHG0bW0fAYvQpTUVJOe7DyhHaxeThBil4ObEMvGbV7+M+w==", ++ "version": "6.8.1", ++ "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.8.1.tgz", ++ "integrity": "sha512-al+5eRb72bKrFyVAY+CLWKUMX+k+wsDCgyooSfhISJA2exqnJq1PX1iIIpdrvhu3GtJgNJZl9/BIW6EVSMCxdg==", + "dev": true, + "requires": { +- "css-tree": "^3.0.1", ++ "css-tree": "^3.0.0", + "is-plain-object": "^5.0.0", +- "known-css-properties": "^0.35.0", +- "mdn-data": "^2.12.2", ++ "known-css-properties": "^0.34.0", ++ "mdn-data": "^2.11.1", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.6", +- "postcss-selector-parser": "^7.0.0", ++ "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0" + }, + "dependencies": { + "css-tree": { +- "version": "3.1.0", +- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", +- "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", ++ "version": "3.0.1", ++ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.0.1.tgz", ++ "integrity": "sha512-8Fxxv+tGhORlshCdCwnNJytvlvq46sOLSYEx2ZIGurahWvMucSRnyjPA3AmrMq4VPRYbHVpWj5VkiVasrM2H4Q==", + "dev": true, + "requires": { +- "mdn-data": "2.12.2", ++ "mdn-data": "2.12.1", + "source-map-js": "^1.0.1" + }, + "dependencies": { + "mdn-data": { +- "version": "2.12.2", +- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", +- "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", ++ "version": "2.12.1", ++ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.1.tgz", ++ "integrity": "sha512-rsfnCbOHjqrhWxwt5/wtSLzpoKTzW7OXdT5lLOIH1OTYhWu9rRJveGq0sKvDZODABH7RX+uoR+DYcpFnq4Tf6Q==", + "dev": true + } + } + }, +- "known-css-properties": { +- "version": "0.35.0", +- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", +- "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", +- "dev": true +- }, + "mdn-data": { +- "version": "2.14.0", +- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.14.0.tgz", +- "integrity": "sha512-QjcSiIvUHjmXp5wNLClRjQeU0Zp+I2Dag+AhtQto0nyKYZ3IF/pUzCuHe7Bv77EC92XE5t3EXeEiEv/to2Bwig==", ++ "version": "2.12.2", ++ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", ++ "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true +- }, +- "postcss-selector-parser": { +- "version": "7.0.0", +- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", +- "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", +- "dev": true, +- "requires": { +- "cssesc": "^3.0.0", +- "util-deprecate": "^1.0.2" +- } + } + } + }, +@@ -13346,32 +11837,15 @@ + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, +- "sync-child-process": { +- "version": "1.0.2", +- "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", +- "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", +- "dev": true, +- "peer": true, +- "requires": { +- "sync-message-port": "^1.0.0" +- } +- }, +- "sync-message-port": { +- "version": "1.1.3", +- "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz", +- "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", +- "dev": true, +- "peer": true +- }, + "tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, + "table": { +- "version": "6.9.0", +- "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", +- "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", ++ "version": "6.8.2", ++ "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", ++ "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "dev": true, + "requires": { + "ajv": "^8.0.1", +@@ -13449,9 +11923,9 @@ + } + }, + "ts-api-utils": { +- "version": "1.4.3", +- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", +- "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", ++ "version": "1.4.0", ++ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", ++ "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", + "dev": true, + "requires": {} + }, +@@ -13488,74 +11962,73 @@ + "dev": true + }, + "typed-array-buffer": { +- "version": "1.0.3", +- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", +- "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", ++ "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "requires": { +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.7", + "es-errors": "^1.3.0", +- "is-typed-array": "^1.1.14" ++ "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-length": { +- "version": "1.0.3", +- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", +- "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", ++ "version": "1.0.1", ++ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", ++ "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "requires": { +- "call-bind": "^1.0.8", ++ "call-bind": "^1.0.7", + "for-each": "^0.3.3", +- "gopd": "^1.2.0", +- "has-proto": "^1.2.0", +- "is-typed-array": "^1.1.14" ++ "gopd": "^1.0.1", ++ "has-proto": "^1.0.3", ++ "is-typed-array": "^1.1.13" + } + }, + "typed-array-byte-offset": { +- "version": "1.0.4", +- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", +- "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", ++ "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", +- "call-bind": "^1.0.8", ++ "call-bind": "^1.0.7", + "for-each": "^0.3.3", +- "gopd": "^1.2.0", +- "has-proto": "^1.2.0", +- "is-typed-array": "^1.1.15", +- "reflect.getprototypeof": "^1.0.9" ++ "gopd": "^1.0.1", ++ "has-proto": "^1.0.3", ++ "is-typed-array": "^1.1.13" + } + }, + "typed-array-length": { +- "version": "1.0.7", +- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", +- "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", ++ "version": "1.0.6", ++ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", ++ "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", ++ "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", +- "possible-typed-array-names": "^1.0.0", +- "reflect.getprototypeof": "^1.0.6" ++ "possible-typed-array-names": "^1.0.0" + } + }, + "typescript": { +- "version": "5.7.2", +- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", +- "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", ++ "version": "5.6.3", ++ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", ++ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true + }, + "unbox-primitive": { +- "version": "1.1.0", +- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", +- "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", ++ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", +- "has-symbols": "^1.1.0", +- "which-boxed-primitive": "^1.1.1" ++ "has-symbols": "^1.0.3", ++ "which-boxed-primitive": "^1.0.2" + } + }, + "universalify": { +@@ -13591,202 +12064,202 @@ + "peer": true + }, + "victory-area": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-37.3.5.tgz", +- "integrity": "sha512-MP5+dm8ThQVsSDQhmU4K93mjPZ4hir1QkoM8kYT0PsJcoFYI6J2ceTxoyJUUgrgO0Kf63PcYChR5RLu34bhFlw==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-37.3.1.tgz", ++ "integrity": "sha512-+D0I64HRe0hXCP8HsQIpsDmxkBsqPTZDImOfndjr/2JCXo9T/PLkUlbh/RjyOtHM66iUPjwjGJ513H3kfT4nYw==", + "requires": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5", +- "victory-vendor": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-vendor": "37.3.1" + } + }, + "victory-axis": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-37.3.5.tgz", +- "integrity": "sha512-hd40FVZvWw26CHr6XfmVGhKgPd4I4Yqxtnl27P6aLVGv1gL46UuNVdDVFozr9rpxO+lGUepYz6Wh4OuzImpDEQ==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-37.3.1.tgz", ++ "integrity": "sha512-hLLr4yAaVizGG+k50LZl7C/YJ+IUGkTFTO9cZqXJQS0c1WNYYxUC1pmDq1dugPpJLKJcbKOXHLLgswzYKAk6Jw==", + "requires": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + } + }, + "victory-bar": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-37.3.5.tgz", +- "integrity": "sha512-9HXxM/+9jyv6SIcJv90yqyImgXLSEGhaPBnDJg5CvHcR1zdGAdQp2pDxDV6EivUrfxiIyj1NeSWyCZpM0ZJddQ==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-37.3.1.tgz", ++ "integrity": "sha512-DRfy/adNB9tl6/WNBqbWhnTXVrGraq8fsqf9SXkhtaYaQqyOAqmSZmfAiqATQWkONPXrkMKJC1urQJxJvHGLMQ==", + "requires": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5", +- "victory-vendor": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-vendor": "37.3.1" + } + }, + "victory-box-plot": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-box-plot/-/victory-box-plot-37.3.5.tgz", +- "integrity": "sha512-jIV8k4XViLBWh5XvYBSELYGsWo55vYBoNqGkVUKhcXM4sS9mumc2XgDQ6nltTO88gs8uOyZpb2vBFp+1zOauyA==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-box-plot/-/victory-box-plot-37.3.1.tgz", ++ "integrity": "sha512-9KjILr5wuVkdB8C9gqYUPoqcAirDRTQ0hdjxfD627hQf0U6Uaju+FrEiigC4+Kr/HUQhQtxvklGwDypjxzj6Ng==", + "requires": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5", +- "victory-vendor": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-vendor": "37.3.1" + } + }, + "victory-brush-container": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-37.3.5.tgz", +- "integrity": "sha512-n4Ozb5I/Pz/dcWnxAfqBhnsq6Q2gIC7Phjbau3cIBTPcq/rrkRIWzpiPPWhoAT+OTirgB9vOfe3JX4LBDk17FA==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-37.3.1.tgz", ++ "integrity": "sha512-hJlbjKQqqHEM29v7qauKuMy/UfdeqBlydM5yzMgauDEenWfs09rRO3CgJCVyu0SVEAem5Aaa7ovk5mI4/HGR6g==", + "requires": { + "lodash": "^4.17.19", + "react-fast-compare": "^3.2.0", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + } + }, + "victory-chart": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-37.3.5.tgz", +- "integrity": "sha512-Lsbmp5rG3ESzQAr76M4WJ0FKraltAzuQY1D3e7CmqzQlLKpsMS/j2Ty+5OCBDmC3qQ+PHObBLVavgn3TJSRJLg==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-37.3.1.tgz", ++ "integrity": "sha512-mtTxmGUexmlX+IDh9GrBRIbFTFziUu08pbG9hz/io8UfBQ3f//ewPq8z8qI3apx7f/rvS6HD6NJyAew8t+nzyg==", + "requires": { + "lodash": "^4.17.19", + "react-fast-compare": "^3.2.0", +- "victory-axis": "37.3.5", +- "victory-core": "37.3.5", +- "victory-polar-axis": "37.3.5", +- "victory-shared-events": "37.3.5" ++ "victory-axis": "37.3.1", ++ "victory-core": "37.3.1", ++ "victory-polar-axis": "37.3.1", ++ "victory-shared-events": "37.3.1" + } + }, + "victory-core": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.3.5.tgz", +- "integrity": "sha512-PXY+9Lx1ohCX+ZzkWdm+VY7T+2Pd/YKdv3yVkuflzMQ52kQMYbcgwGI49yPuzVqB3m1eBJ5dYdAD53ww53GTHw==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-37.3.1.tgz", ++ "integrity": "sha512-jFjqF7AVjc8OF1wuL9hFbPS+4mEH/C8LKI1/V0EJQcu5VimppF2BkbCH5+Y2lEwNNzNaqrXJnQ3Z0bzXjtplbw==", + "requires": { + "lodash": "^4.17.21", + "react-fast-compare": "^3.2.0", +- "victory-vendor": "37.3.5" ++ "victory-vendor": "37.3.1" + } + }, + "victory-create-container": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-37.3.5.tgz", +- "integrity": "sha512-VcHhnw35e+xU96LWwAuCZQ7YLS9NSSlGU0pgtiUUx0ymCJDWtY8G+ZijZL+DKQ5byU/8+DvaK3iNUhxdpBAHQw==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-37.3.1.tgz", ++ "integrity": "sha512-9tkSHgt2NI28uFwcfwvcXNVVhhYQIyqk9du2AwwBdPpQUIK8GNjZvtgddZ3IdU1n9WmVqqb/Ne1l2aX+s2G0Aw==", + "requires": { + "lodash": "^4.17.19", +- "victory-brush-container": "37.3.5", +- "victory-core": "37.3.5", +- "victory-cursor-container": "37.3.5", +- "victory-selection-container": "37.3.5", +- "victory-voronoi-container": "37.3.5", +- "victory-zoom-container": "37.3.5" ++ "victory-brush-container": "37.3.1", ++ "victory-core": "37.3.1", ++ "victory-cursor-container": "37.3.1", ++ "victory-selection-container": "37.3.1", ++ "victory-voronoi-container": "37.3.1", ++ "victory-zoom-container": "37.3.1" + } + }, + "victory-cursor-container": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-37.3.5.tgz", +- "integrity": "sha512-/G9zpYkeJA0uBk3khGNJBUNHOZ25EPoFfVZqwSSjpVRRI3JLMVNvv1LWhZvFZDkK0KMrT8pi8AZr04jCZxCoPg==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-37.3.1.tgz", ++ "integrity": "sha512-PYJzGJL0tnNQrUHXHj0lP1TXYA5XUyNvfPMjUrII74BS2T6t85+gjc++s0pugpyc/NqyXwNaulJxPnjePwR1MA==", + "requires": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + } + }, + "victory-group": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-37.3.5.tgz", +- "integrity": "sha512-0GEtrG2Vl7uv1fkmWlHRO6U8JBhXJ3cB1KJPP2k5QKblfYd0QgDCtlSeMuaTUB+yRnQR5OlUv6bvkwwRio4bSg==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-37.3.1.tgz", ++ "integrity": "sha512-jLAYAHtMwqLulGujirar9kIUZmxw1M1slM/5DBzDJLamTAb7OJaagDmcIiLdnC08ziV8v/MgGkgS6e3/qIe2iw==", + "requires": { + "lodash": "^4.17.19", + "react-fast-compare": "^3.2.0", +- "victory-core": "37.3.5", +- "victory-shared-events": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-shared-events": "37.3.1" + } + }, + "victory-legend": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-37.3.5.tgz", +- "integrity": "sha512-TW/OeKP8LgZp93nJVoAltTwl5T0q1MWeH1HqZim2oGqwqX0E8o0BeJXv+2TGkXdp5ITiWi2nxGGQ77vSg8KZhQ==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-37.3.1.tgz", ++ "integrity": "sha512-R7mU4VXbT9toff9oVFfNErAxg6QziWbSiy4IzPYlqgOI+3OPOvBRi1Sbyizk28BcHVIq53iAT8YWwDXxdGwSzQ==", + "requires": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + } + }, + "victory-line": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-37.3.5.tgz", +- "integrity": "sha512-q1L2aSG28Z7ousRckf8zut7HdLQ7kWiNakOatsdfAqnce/n52F0E8c3qSIwbRmkdHHSe3SHhTLNyzLtnDzYQjQ==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-37.3.1.tgz", ++ "integrity": "sha512-6FtKiWcCpo4rshOHyE31fO8nog9nRakujAIpdAJk/96621RqBiLQjP1jBhQmjbKCEQCTepHvLGLgx1jdUlb/9A==", + "requires": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5", +- "victory-vendor": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-vendor": "37.3.1" + } + }, + "victory-pie": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-37.3.5.tgz", +- "integrity": "sha512-JjKE5QhlatZkl/YbiN2KrF+tXIHRZ0ZYua5yWl8JYcg5/UTE3IFn/Y+2HIQIGghzEa98ZMMC/lNfZ3CEwK1yaw==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-37.3.1.tgz", ++ "integrity": "sha512-Oc5lPvPbtzVqbLtjMEMiyIRbjwHXxAqIdfiVRkr9Sv36Q53rMr9a44CNuUcFeL8eR/794RKm8v5feieOPeGLaQ==", + "requires": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5", +- "victory-vendor": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-vendor": "37.3.1" + } + }, + "victory-polar-axis": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-37.3.5.tgz", +- "integrity": "sha512-6aZiaMGLtYDeh3uCB9wHKVVyvRsdbo5+WTp6S8lvyuHxyYOEn4JcxtpORzHHnGMWFkhZs4MmLSORrp/TBOi+7g==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-37.3.1.tgz", ++ "integrity": "sha512-Lxn911XYG2D+LX4ijhFGEXUEx5o2I1eOBlgOYmgvbRldgdCFkZGY6E6uwPbWhPnk2ZUMHVpZGXcZs/hvypC/bw==", + "requires": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + } + }, + "victory-scatter": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-37.3.5.tgz", +- "integrity": "sha512-YEXm9D1novmUjk44eFyj+UQIxUw50v3yAa/772nb8yzR9ys9xPjM9+yyIsJSbRwdSiEAPmcbj6qwcYlyvJz1bQ==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-37.3.1.tgz", ++ "integrity": "sha512-xALMB+Kufw0U9ePCNHaHNuFN0Ili+9kWy/6qjm9QKo92HiGkDQeNPWAFHFbyAErFmKkaAdVuEPx3FiU9Novb4A==", + "requires": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + } + }, + "victory-selection-container": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-37.3.5.tgz", +- "integrity": "sha512-cGqlZwV3HAWjrXjhGUsUkyFtWn+lsph2dcUzMlzTKs+e1sDFEHIVjpe3ZX4XsThu23dK//lrmIXFvbWtpLhy+Q==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-37.3.1.tgz", ++ "integrity": "sha512-flkh0QUbuKYSZ7t6mogKVaP3upXP5Ej9O1Dvpsn2h8CYzo933veAGVeBfOoguWieuGQbS7JbSkYjrzneXoQMyA==", + "requires": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + } + }, + "victory-shared-events": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-37.3.5.tgz", +- "integrity": "sha512-Juq/5Y9WsFaD/4ivk7/y786EwNgLUjp3hkhpIGhiQOM2VaL5H7Xb1pX4ASjibkCkWIQUMBM+JaprtNcKEDylpQ==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-37.3.1.tgz", ++ "integrity": "sha512-fmZZBZEw3jBYO1aD5enOljEN1cRVZBCFxMYhR5of1DGOFc2ZVhq/FK1Lhe3zd2dYGNC8IAP69kth1A+p+VZo0A==", + "requires": { + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.19", + "react-fast-compare": "^3.2.0", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + } + }, + "victory-stack": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-37.3.5.tgz", +- "integrity": "sha512-PL23dKKlr30Y77mw3JuIUYUhvOF66r3LhKQXqoymkV6DGMBhkQ2p7h+klek3xleRPBBTSz3o8EbfM8H2eZ/Umg==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-37.3.1.tgz", ++ "integrity": "sha512-VxTnIFhilG2Umg+JJXgeXEm6QbGgmXSYnAIsZT0ejp94IVsfl+f8IOrJHzUrytEeMK4t7JA/StaRlyfWShqthg==", + "requires": { + "lodash": "^4.17.19", + "react-fast-compare": "^3.2.0", +- "victory-core": "37.3.5", +- "victory-shared-events": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-shared-events": "37.3.1" + } + }, + "victory-tooltip": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-37.3.5.tgz", +- "integrity": "sha512-IbvD37PGehP3K5BLL9xAK+6d/UEaNcLH/cdKKzeXeqOvoefQLIxxB1DJHYr542Ll8cxkeqtdsgtJ16pRCUgCSA==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-37.3.1.tgz", ++ "integrity": "sha512-C0wyyAj332XpZ5jloMCr8FEDHp6eD76vfwlif+ZcjLVhzNOxTnpjaW988wFNfJaZRgxXcq50TEJkHWvuBnHviQ==", + "requires": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + } + }, + "victory-vendor": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.5.tgz", +- "integrity": "sha512-+K2VBMmB7peKG3Gjp79XjgsbfsYgD0eZRSmKz7p5a4V0NhYq43eM/b0gpSLq+Dhwag96QaWsU75/6bFVBjVE7A==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.1.tgz", ++ "integrity": "sha512-ik/nlt3GgTGwyt29f2zd5Y68nNJnxtUJ2CulepE4nWTzbrbFkqhrNDTf3k+yb5ZUQBK1BLkyE79UWVNzTRCByw==", + "requires": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", +@@ -13805,24 +12278,24 @@ + } + }, + "victory-voronoi-container": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-37.3.5.tgz", +- "integrity": "sha512-GF35HQn8ACMcr7yJAFmaSKAS6w9GOsxxWoR6gtuQtBUwSBciZ5LNWpR6718nFxeOYDhkk/FVn7tnKqQTBv6XUw==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-37.3.1.tgz", ++ "integrity": "sha512-QDA533raAk4VUvYnHNeYZY5adMcj9/zUaMFwcNkRoWH7WL8/bZR12as5hlOPLwDa3Wm0jxEYQfaqwRANaoWDyA==", + "requires": { + "delaunay-find": "0.0.6", + "lodash": "^4.17.19", + "react-fast-compare": "^3.2.0", +- "victory-core": "37.3.5", +- "victory-tooltip": "37.3.5" ++ "victory-core": "37.3.1", ++ "victory-tooltip": "37.3.1" + } + }, + "victory-zoom-container": { +- "version": "37.3.5", +- "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-37.3.5.tgz", +- "integrity": "sha512-LlRp2Ulodu3rhIrM1XilgR72223+qlhXE9mzBCYVoHQ+uo8uTKt27T0iOBkvY5kRwNiXQzshn01uxUAwxyBppw==", ++ "version": "37.3.1", ++ "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-37.3.1.tgz", ++ "integrity": "sha512-cVNSMe0q+ut8pLkJDXg31HBjnkJhehOhs7Z4x+fDM6LSESrJn2Zibp8Vn1g7fDs6kNCzqkXcpvmU3yUGFB8oWA==", + "requires": { + "lodash": "^4.17.19", +- "victory-core": "37.3.5" ++ "victory-core": "37.3.1" + } + }, + "which": { +@@ -13835,37 +12308,36 @@ + } + }, + "which-boxed-primitive": { +- "version": "1.1.1", +- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", +- "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", ++ "version": "1.0.2", ++ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", ++ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { +- "is-bigint": "^1.1.0", +- "is-boolean-object": "^1.2.1", +- "is-number-object": "^1.1.1", +- "is-string": "^1.1.1", +- "is-symbol": "^1.1.1" ++ "is-bigint": "^1.0.1", ++ "is-boolean-object": "^1.1.0", ++ "is-number-object": "^1.0.4", ++ "is-string": "^1.0.5", ++ "is-symbol": "^1.0.3" + } + }, + "which-builtin-type": { +- "version": "1.2.1", +- "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", +- "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", ++ "version": "1.1.4", ++ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", ++ "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "dev": true, + "requires": { +- "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", +- "is-date-object": "^1.1.0", +- "is-finalizationregistry": "^1.1.0", ++ "is-date-object": "^1.0.5", ++ "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", +- "is-regex": "^1.2.1", ++ "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", +- "which-boxed-primitive": "^1.1.0", ++ "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", +- "which-typed-array": "^1.1.16" ++ "which-typed-array": "^1.1.15" + } + }, + "which-collection": { +@@ -13881,16 +12353,15 @@ + } + }, + "which-typed-array": { +- "version": "1.1.18", +- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", +- "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", ++ "version": "1.1.15", ++ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", ++ "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", +- "call-bind": "^1.0.8", +- "call-bound": "^1.0.3", ++ "call-bind": "^1.0.7", + "for-each": "^0.3.3", +- "gopd": "^1.2.0", ++ "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + } + }, +diff --git a/src/cockpit/389-console/src/lib/database/globalPwp.jsx b/src/cockpit/389-console/src/lib/database/globalPwp.jsx +index 868158467..37cd70cf2 100644 +--- a/src/cockpit/389-console/src/lib/database/globalPwp.jsx ++++ b/src/cockpit/389-console/src/lib/database/globalPwp.jsx +@@ -721,7 +721,7 @@ export class GlobalPwPolicy extends React.Component { + 'nsslapd-pwdpbkdf2numiterations': '', + '_nsslapd-pwdpbkdf2numiterations': '' + }; +- ++ + if (!skipLoading) { + stateUpdates["loading"] = false + } +diff --git a/src/cockpit/389-console/src/lib/server/accessLog.jsx b/src/cockpit/389-console/src/lib/server/accessLog.jsx +index b18b8e920..827029509 100644 +--- a/src/cockpit/389-console/src/lib/server/accessLog.jsx ++++ b/src/cockpit/389-console/src/lib/server/accessLog.jsx +@@ -598,7 +598,7 @@ export class ServerAccessLog extends React.Component { + id="nsslapd-accesslog-time-format" + aria-describedby="horizontal-form-name-helper" + name="nsslapd-accesslog-time-format" +- onChange={(str, e) => { ++ onChange={(e, str) => { + this.handleChange(e, "settings"); + }} + /> +@@ -611,7 +611,7 @@ export class ServerAccessLog extends React.Component { + { ++ onChange={(e, str) => { + this.handleChange(e, "settings"); + }} + aria-label="FormSelect Input" +@@ -652,7 +652,7 @@ export class ServerAccessLog extends React.Component { + ++ onSelect: (_event, isSelecting) => + this.handleOnSelect(_event, isSelecting, rowIndex), + isSelected: row.selected + }} +@@ -930,7 +930,7 @@ export class ServerAccessLog extends React.Component { + + + {_("Access Log Settings")} +- + ]} + > +- {_("You cannot modify the RDN ( Relative Distinguished Name ) in the Quick Update mode.")} ++ {_("You cannot modify the RDN ( Relative Distinguished Name ) in the edit mode.")} +
+- {_("If you want to modify the RDN, please use the Quick Update action option")} ++ {_("If you want to modify the RDN, please use the Rename action option")} + } + + {isPasswordField && +@@ -1023,7 +1023,7 @@ class EditableTable extends React.Component { + + {row.cells.map((cell, cellIndex) => ( + +- {typeof cell.title === 'function' ++ {typeof cell.title === 'function' + ? cell.title(cell.props.value, rowIndex, cellIndex, cell.props) + : cell.title} + +diff --git a/src/cockpit/389-console/src/lib/ldap_editor/wizards/deleteOperation.jsx b/src/cockpit/389-console/src/lib/ldap_editor/wizards/deleteOperation.jsx +index 614987264..ec00ef80d 100644 +--- a/src/cockpit/389-console/src/lib/ldap_editor/wizards/deleteOperation.jsx ++++ b/src/cockpit/389-console/src/lib/ldap_editor/wizards/deleteOperation.jsx +@@ -79,7 +79,9 @@ class DeleteOperationWizard extends React.Component { + this.state.numSubordinates, + (result) => { + this.setState({ +- commandOutput: result.errorCode === 0 ? _("Successfully deleted entry") : _("Failed to delete entry, error: ") + result.errorCode, ++ commandOutput: result.errorCode === 0 ? ++ _("Successfully deleted entry") : ++ _("Failed to delete entry: ") + result.output, + resultVariant: result.errorCode === 0 ? 'success' : 'danger', + deleting: false, + }, () => { +@@ -234,7 +236,7 @@ class DeleteOperationWizard extends React.Component { + ); + + let reviewInfo = ''; +- if (commandOutput === '') { ++ if (commandOutput === '' || commandOutput === "Successfully deleted entry") { + reviewInfo = numSubordinates > 0 + ? _("The entries were") + : _("The entry was"); +diff --git a/src/cockpit/389-console/src/lib/ldap_editor/wizards/newEntry.jsx b/src/cockpit/389-console/src/lib/ldap_editor/wizards/newEntry.jsx +index 760949868..8af7ecfab 100644 +--- a/src/cockpit/389-console/src/lib/ldap_editor/wizards/newEntry.jsx ++++ b/src/cockpit/389-console/src/lib/ldap_editor/wizards/newEntry.jsx +@@ -33,6 +33,10 @@ class NewEntryWizard extends React.Component { + this.setState({ getStartedStepRadio: event.currentTarget.value }); + }; + ++ onToggleWizard = () => { ++ this.props.handleToggleWizard(); ++ }; ++ + createInitialLayout = () => { + // console.log(`this.props.createRootEntry = ${this.props.createRootEntry}`); + // Creation of a root entry. +@@ -130,10 +134,6 @@ variant="custom" isInline + ]); + }; + +- onToggleWizard () { +- this.props.handleToggleWizard(); +- } +- + render () { + const { + getStartedStepRadio +diff --git a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/aciNew.jsx b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/aciNew.jsx +index 82845037f..9a427ab8f 100644 +--- a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/aciNew.jsx ++++ b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/aciNew.jsx +@@ -594,7 +594,9 @@ class AddNewAci extends React.Component { + modifyLdapEntry(params, ldifArray, (result) => { + this.props.refreshAciTable(); + this.setState({ +- commandOutput: result.errorCode === 0 ? _("Successfully added ACI!") : _("Failed to add ACI, error: ") + result.errorCode, ++ commandOutput: result.errorCode === 0 ? ++ _("Successfully added ACI!") : ++ _("Failed to add ACI: ") + result.output, + resultVariant: result.errorCode === 0 ? 'success' : 'danger', + adding: false + }, () => { this.props.onReload() }); // refreshes tableView +@@ -967,7 +969,7 @@ class AddNewAci extends React.Component { + + + +- = 9, +- hideBackButton: true, ++ hideBackButton: this.state.resultVariant === "success" ? true : false, + enableNext: !this.state.adding, + }]; + +diff --git a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addCosDefinition.jsx b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addCosDefinition.jsx +index 2028e5815..961f5030e 100644 +--- a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addCosDefinition.jsx ++++ b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addCosDefinition.jsx +@@ -217,7 +217,9 @@ class AddCosDefinition extends React.Component { + (result) => { + const myDn = myLdifArray[0].substring(4); + this.setState({ +- commandOutput: result.errorCode === 0 ? _("CoS Definition successfully created!") : _("Failed to create cos: ") + result.errorCode, ++ commandOutput: result.errorCode === 0 ? ++ _("CoS Definition successfully created!") : ++ _("Failed to create cos: ") + result.output, + resultVariant: result.errorCode === 0 ? 'success' : 'danger', + adding: false, + createdDefiniton: myDn, +@@ -1224,7 +1226,7 @@ class AddCosDefinition extends React.Component { + ); + + const ldifListItems = ldifArray.map((line, index) => +- ++ + {line} + + ); +@@ -1374,7 +1376,7 @@ class AddCosDefinition extends React.Component { + component: cosReviewStep, + nextButtonText: _("Finish"), + canJumpTo: stepIdReached >= 8 && stepIdReached < 9, +- hideBackButton: true, ++ hideBackButton: this.state.resultVariant === "success" ? true : false, + enableNext: !this.state.adding + }, + ...((this.state.cosType === 'classic') && (resultVariant !== 'danger') +@@ -1385,7 +1387,7 @@ class AddCosDefinition extends React.Component { + component: cosReviewStep, + nextButtonText: _("Finish"), + canJumpTo: stepIdReached > 9, +- hideBackButton: true, ++ hideBackButton: this.state.resultVariant === "success" ? true : false, + enableNext: !this.state.adding + } + ] +diff --git a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addCosTemplate.jsx b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addCosTemplate.jsx +index 539522d12..b27998130 100644 +--- a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addCosTemplate.jsx ++++ b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addCosTemplate.jsx +@@ -177,7 +177,9 @@ class AddCosTemplate extends React.Component { + (result) => { + const myDn = this.state.ldifArray[0].substring(4); + this.setState({ +- commandOutput: result.errorCode === 0 ? _("Successfully added entry!") : _("Failed to add entry, error: ") + result.errorCode, ++ commandOutput: result.errorCode === 0 ? ++ _("Successfully added entry!") : ++ _("Failed to add entry, error: ") + result.output, + resultVariant: result.errorCode === 0 ? 'success' : 'danger', + adding: false, + createdTemplate: myDn, +@@ -987,16 +989,16 @@ class AddCosTemplate extends React.Component { + position="left" + onSelect={this.handleOCDropDownSelect} + toggle={ +- 0 ? "ds-badge-bgcolor" : undefined, + isRead: selectedObjectClasses.length === 0 + }} + onToggle={(_event, isOpen) => this.handleOCDropDownToggle(isOpen)} + > +- {selectedObjectClasses.length > 0 ? +- `${selectedObjectClasses.length} ${_("selected")}` : ++ {selectedObjectClasses.length > 0 ? ++ `${selectedObjectClasses.length} ${_("selected")}` : + `0 ${_("selected")}`} + + } +@@ -1060,7 +1062,7 @@ class AddCosTemplate extends React.Component { + }} + /> + {row.cells.map((cell, cellIndex) => ( +-
+@@ -1089,16 +1091,16 @@ class AddCosTemplate extends React.Component { + position="left" + onSelect={this.handleAttrDropDownSelect} + toggle={ +- 0 ? "ds-badge-bgcolor" : undefined, + isRead: selectedAttributes.length === 0 + }} + onToggle={(_event, isOpen) => this.handleAttrDropDownToggle(isOpen)} + > +- {selectedAttributes.length > 0 ? +- `${selectedAttributes.length} ${_("selected")}` : ++ {selectedAttributes.length > 0 ? ++ `${selectedAttributes.length} ${_("selected")}` : + `0 ${_("selected")}`} + + } +@@ -1153,7 +1155,7 @@ class AddCosTemplate extends React.Component { + }} + /> + {row.cells.map((cell, cellIndex) => ( +- +@@ -1201,7 +1203,7 @@ class AddCosTemplate extends React.Component { + ); + + const ldifListItems = cleanLdifArray.map((line, index) => +- ++ + {line} + + ); +@@ -1352,7 +1354,7 @@ class AddCosTemplate extends React.Component { + component: entryReviewStep, + nextButtonText: finishButtonName, + canJumpTo: stepIdReached >= 7 && stepIdReached < 8, +- hideBackButton: true, ++ hideBackButton: this.state.resultVariant === "success" ? true : false, + enableNext: !this.state.adding, + }, + ...((this.props.definitionWizardEntryDn !== '') || (this.props.cosDefCreateMoreTemplate) +@@ -1363,7 +1365,7 @@ class AddCosTemplate extends React.Component { + component: entryReviewStep, + nextButtonText: _("Finish"), + canJumpTo: stepIdReached >= 7 && stepIdReached < 8, +- hideBackButton: true, ++ hideBackButton: this.state.resultVariant === "success" ? true : false, + }, + ] + : []), +diff --git a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addGroup.jsx b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addGroup.jsx +index d53581bd1..fd58ee20b 100644 +--- a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addGroup.jsx ++++ b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addGroup.jsx +@@ -111,7 +111,9 @@ class AddGroup extends React.Component { + myLdifArray, + (result) => { + this.setState({ +- commandOutput: result.errorCode === 0 ? _("Group successfully created!") : _("Failed to create group, error: ") + result.errorCode, ++ commandOutput: result.errorCode === 0 ? ++ _("Group successfully created!") : ++ _("Failed to create group: ") + result.output, + resultVariant: result.errorCode === 0 ? 'success' : 'danger', + adding: false, + }, () => { +@@ -133,12 +135,6 @@ class AddGroup extends React.Component { + } + }; + +- this.handleBack = ({ id }) => { +- if (id === 5) { +- this.updateValuesTableRows(true); +- } +- }; +- + this.handleSearchClick = () => { + this.setState({ + isSearchRunning: true, +@@ -540,7 +536,7 @@ class AddGroup extends React.Component { + ); + + const ldifListItems = ldifArray.map((line, index) => +- ++ + {line} + + ); +@@ -636,7 +632,7 @@ class AddGroup extends React.Component { + component: groupReviewStep, + nextButtonText: _("Finish"), + canJumpTo: stepIdReached >= 6, +- hideBackButton: true, ++ hideBackButton: this.state.resultVariant === "success" ? true : false, + enableNext: !this.state.adding + } + ]; +@@ -652,7 +648,6 @@ class AddGroup extends React.Component { + isOpen={this.props.isWizardOpen} + onClose={this.props.handleToggleWizard} + onNext={this.handleNext} +- onBack={this.handleBack} + title={_("Add A Group")} + description={title} + steps={addGroupSteps} +diff --git a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addLdapEntry.jsx b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addLdapEntry.jsx +index ffb8b8f7a..4bad70599 100644 +--- a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addLdapEntry.jsx ++++ b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addLdapEntry.jsx +@@ -783,7 +783,7 @@ class AddLdapEntry extends React.Component { + }} + /> + {row.cells.map((cell, cellIndex) => ( +- +@@ -854,7 +854,7 @@ class AddLdapEntry extends React.Component { + }} + /> + {row.cells.map((cell, cellIndex) => ( +- +@@ -902,7 +902,7 @@ class AddLdapEntry extends React.Component { + ); + + const ldifListItems = cleanLdifArray.map((line, index) => +- ++ + {line} + + ); +@@ -1003,7 +1003,7 @@ class AddLdapEntry extends React.Component { + component: entryReviewStep, + nextButtonText: _("Finish"), + canJumpTo: stepIdReached >= 6, +- hideBackButton: true, ++ hideBackButton: this.state.resultVariant === "success" ? true : false, + enableNext: !this.state.adding, + } + ]; +diff --git a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addRole.jsx b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addRole.jsx +index abfc3938b..0c21f8573 100644 +--- a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addRole.jsx ++++ b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addRole.jsx +@@ -844,16 +844,16 @@ class AddRole extends React.Component { + position="left" + onSelect={this.handleAttrDropDownSelect} + toggle={ +- 0 ? "ds-badge-bgcolor" : undefined, + isRead: selectedAttributes.length === 0 + }} + onToggle={(_event, isOpen) => this.handleAttrDropDownToggle(isOpen)} + > +- {selectedAttributes.length > 0 ? +- `${selectedAttributes.length} ${_("selected")}` : ++ {selectedAttributes.length > 0 ? ++ `${selectedAttributes.length} ${_("selected")}` : + `0 ${_("selected")}`} + + } +@@ -898,7 +898,7 @@ class AddRole extends React.Component { + }} + /> + {row.cells.map((cell, cellIndex) => ( +- +@@ -952,7 +952,7 @@ class AddRole extends React.Component { + ); + + const ldifListItems = ldifArray.map((line, index) => +- ++ + {line} + + ); +@@ -1059,7 +1059,7 @@ class AddRole extends React.Component { + component: roleReviewStep, + nextButtonText: _("Finish"), + canJumpTo: stepIdReached >= 7, +- hideBackButton: true, ++ hideBackButton: this.state.resultVariant === "success" ? true : false, + enableNext: !this.state.adding + } + ]; +diff --git a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addUser.jsx b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addUser.jsx +index 7988076e7..47c083cb2 100644 +--- a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addUser.jsx ++++ b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/addUser.jsx +@@ -201,7 +201,9 @@ class AddUser extends React.Component { + myLdifArray, + (result) => { + this.setState({ +- commandOutput: result.errorCode === 0 ? _("Successfully added user!") : _("Failed to add user, error: ") + result.errorCode, ++ commandOutput: result.errorCode === 0 ? ++ _("Successfully added user!") : ++ _("Failed to add user: ") + result.output, + resultVariant: result.errorCode === 0 ? 'success' : 'danger', + adding: false, + }, () => { +@@ -648,7 +650,7 @@ class AddUser extends React.Component { + position="left" + onSelect={this.handleAttrDropDownSelect} + toggle={ +- 0 ? "ds-badge-bgcolor" : undefined, +@@ -710,7 +712,7 @@ class AddUser extends React.Component { + }} + /> + {row.cells.map((cell, cellIndex) => ( +- +@@ -765,7 +767,7 @@ class AddUser extends React.Component { + ); + + const ldifListItems = cleanLdifArray.map((line, index) => +- ++ + {line} + + ); +@@ -861,7 +863,7 @@ class AddUser extends React.Component { + component: userReviewStep, + nextButtonText: _("Finish"), + canJumpTo: stepIdReached >= 6, +- hideBackButton: true, ++ hideBackButton: this.state.resultVariant === "success" ? true : false, + enableNext: !this.state.adding + } + ]; +diff --git a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/editGroup.jsx b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/editGroup.jsx +index 191a6c144..056a3e149 100644 +--- a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/editGroup.jsx ++++ b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/editGroup.jsx +@@ -335,7 +335,7 @@ class EditGroup extends React.Component { + } else { + this.props.addNotification( + "error", +- _("Failed to update group, error code: ") + result.errorCode ++ _("Failed to update group: ") + result.output + ); + } + this.setState({ +@@ -356,7 +356,7 @@ class EditGroup extends React.Component { + } else { + this.props.addNotification( + "error", +- _("Failed to update group, error code: ") + result.errorCode ++ _("Failed to update group: ") + result.output + ); + } + this.setState({ +diff --git a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/editLdapEntry.jsx b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/editLdapEntry.jsx +index 231ef55e1..109861e5b 100644 +--- a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/editLdapEntry.jsx ++++ b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/editLdapEntry.jsx +@@ -143,7 +143,9 @@ class EditLdapEntry extends React.Component { + result.output = _("Successfully modified entry"); + } + this.setState({ +- commandOutput: result.errorCode === 0 ? _("Successfully modified entry!") : _("Failed to modify entry, error: ") + result.errorCode, ++ commandOutput: result.errorCode === 0 ? ++ _("Successfully modified entry!") : ++ _("Failed to modify entry: ") + result.output, + resultVariant: result.errorCode === 0 ? 'success' : 'danger', + modifying: false, + }, () => { this.state.localProps.onReload() }); // refreshes tableView +@@ -1195,8 +1197,8 @@ class EditLdapEntry extends React.Component { + onSelect={this.handleAttrDropDownSelect} + position="left" + toggle={ +- + {numSelected !== 0 ? <>{numSelected} {_("selected")} : <>0 {_("selected")} } +@@ -1280,7 +1282,7 @@ class EditLdapEntry extends React.Component { + }} + /> + {row.cells.map((cell, cellIndex) => ( +- +@@ -1329,8 +1331,8 @@ class EditLdapEntry extends React.Component { + /> + + +- +@@ -1357,7 +1359,7 @@ class EditLdapEntry extends React.Component { + }} + /> + {row.cells.map((cell, cellIndex) => ( +-
+@@ -1394,7 +1396,7 @@ class EditLdapEntry extends React.Component { + ); + + const ldifListItems = cleanLdifArray.map((line, index) => +- ++ + {(typeof line === 'string' || line instanceof String) + ? line.length < 1000 + ? line +@@ -1514,10 +1516,10 @@ class EditLdapEntry extends React.Component { + {row.cells.map((cell, cellIndex) => ( + + +- {cell.title ? ++ {cell.title ? + // For cells with React element content + cell.title.props.children +- : ++ : + // For simple string cells + cell + } +@@ -1545,7 +1547,7 @@ class EditLdapEntry extends React.Component { + component: entryReviewStep, + nextButtonText: _("Finish"), + canJumpTo: stepIdReached > 6, +- hideBackButton: true, ++ hideBackButton: this.state.resultVariant === "success" ? true : false, + enableNext: !this.state.modifying + } + ]; +diff --git a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/genericUpdate.jsx b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/genericUpdate.jsx +index a719722ef..6a2907326 100644 +--- a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/genericUpdate.jsx ++++ b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/genericUpdate.jsx +@@ -108,7 +108,9 @@ class GenericUpdate extends React.Component { + myLdifArray, + (result) => { + this.setState({ +- commandOutput: result.errorCode === 0 ? _("Successfully added entry!") : _("Failed to add entry, error: ") + result.errorCode, ++ commandOutput: result.errorCode === 0 ? ++ _("Successfully added entry!") : ++ _("Failed to add entry: ") + result.output, + resultVariant: result.errorCode === 0 ? 'success' : 'danger', + adding: false, + }, () => { +@@ -528,7 +530,7 @@ class GenericUpdate extends React.Component { + isCompact + /> + {/* Updated Table structure for Patternfly 5 */} +- +@@ -554,7 +556,7 @@ class GenericUpdate extends React.Component { + }} + /> + {row.cells.map((cell, cellIndex) => ( +- + {row.map((cell, cellIndex) => ( +-
+@@ -602,7 +604,7 @@ class GenericUpdate extends React.Component { + ); + + const ldifListItems = ldifArray.map((line, index) => +- ++ + {line} + + ); +@@ -697,7 +699,7 @@ class GenericUpdate extends React.Component { + component: reviewStep, + nextButtonText: _("Finish"), + canJumpTo: stepIdReached >= 5 && stepIdReached < 5, +- hideBackButton: true, ++ hideBackButton: this.state.resultVariant === "success" ? true : false, + enableNext: !this.state.adding + } + ]; +diff --git a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/renameEntry.jsx b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/renameEntry.jsx +index a3c4c618a..e67de6852 100644 +--- a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/renameEntry.jsx ++++ b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/renameEntry.jsx +@@ -80,7 +80,9 @@ class RenameEntry extends React.Component { + result.output = _("Successfully renamed entry"); + } + this.setState({ +- commandOutput: result.errorCode === 0 ? _("Successfully renamed entry!") : _("Failed to rename entry, error: ") + result.errorCode, ++ commandOutput: result.errorCode === 0 ? ++ _("Successfully renamed entry!") : ++ _("Failed to rename entry: ") + result.output, + resultVariant: result.errorCode === 0 ? 'success' : 'danger', + renaming: false + }); +@@ -368,7 +370,7 @@ class RenameEntry extends React.Component { + ); + + const ldifListItems = ldifArray.map((line, index) => +- ++ + {line} + + ); +@@ -462,7 +464,7 @@ class RenameEntry extends React.Component { + component: reviewStep, + nextButtonText: _("Finish"), + canJumpTo: stepIdReached > 5, +- hideBackButton: true, ++ hideBackButton: this.state.resultVariant === "success" ? true : false, + enableNext: !this.state.renaming + } + ]; +diff --git a/src/cockpit/389-console/src/lib/plugins/managedEntries.jsx b/src/cockpit/389-console/src/lib/plugins/managedEntries.jsx +index a62c2de1c..7954f9920 100644 +--- a/src/cockpit/389-console/src/lib/plugins/managedEntries.jsx ++++ b/src/cockpit/389-console/src/lib/plugins/managedEntries.jsx +@@ -802,7 +802,7 @@ class ManagedEntries extends React.Component { + .done(content => { + this.props.addNotification( + "success", +- cockpit.format(_("Config entry $0 was successfully $1ed"), templateDN, action) ++ cockpit.format(_("Config entry $0 was successfully $1"), templateDN, action + "ed") + ); + this.loadConfigs(); + this.handleCloseTempModal(); +@@ -1058,7 +1058,7 @@ class ManagedEntries extends React.Component { + aria-describedby="originScope" + name="originScope" + onChange={(e, str) => this.handleFieldChange(str, e)} +- validated={isOriginScopeValidated ++ validated={isOriginScopeValidated + ? ValidatedOptions.error + : ValidatedOptions.default + } +@@ -1101,7 +1101,7 @@ class ManagedEntries extends React.Component { + aria-describedby="managedBase" + name="managedBase" + onChange={(e, str) => this.handleFieldChange(str, e)} +- validated={isManagedBaseValidated ++ validated={isManagedBaseValidated + ? ValidatedOptions.error + : ValidatedOptions.default + } +@@ -1170,7 +1170,7 @@ class ManagedEntries extends React.Component { + name="templateDN" + onChange={(e, str) => this.handleFieldChange(str, e)} + isDisabled={!newTemplateEntry} +- validated={isTemplateDNValidated ++ validated={isTemplateDNValidated + ? ValidatedOptions.error + : ValidatedOptions.default + } +@@ -1530,7 +1530,7 @@ class ManagedEntries extends React.Component { + aria-describedby="configArea" + name="configArea" + onChange={(e, str) => this.handleFieldChange(str, e)} +- validated={isConfigAreaValidated ++ validated={isConfigAreaValidated + ? ValidatedOptions.error + : ValidatedOptions.default} + /> +diff --git a/src/cockpit/389-console/src/lib/plugins/memberOf.jsx b/src/cockpit/389-console/src/lib/plugins/memberOf.jsx +index afddf103c..715c1b872 100644 +--- a/src/cockpit/389-console/src/lib/plugins/memberOf.jsx ++++ b/src/cockpit/389-console/src/lib/plugins/memberOf.jsx +@@ -851,7 +851,7 @@ class MemberOf extends React.Component { + const value = action === "set" ? "edit" : "add"; + this.props.addNotification( + "success", +- cockpit.format(_("Config entry $0 was successfully $1ed"), configDN, value) ++ cockpit.format(_("Config entry $0 was successfully $1"), configDN, value + "ed") + ); + this.props.pluginListHandler(); + this.handleCloseModal(); +@@ -903,6 +903,7 @@ class MemberOf extends React.Component { + ); + this.props.pluginListHandler(); + this.handleCloseModal(); ++ this.closeConfirmDelete(); + this.setState({ + modalSpinning: false, + }); +@@ -915,6 +916,7 @@ class MemberOf extends React.Component { + ); + this.props.pluginListHandler(); + this.handleCloseModal(); ++ this.closeConfirmDelete(); + this.setState({ + modalSpinning: false, + }); +diff --git a/src/cockpit/389-console/src/lib/plugins/pluginBasicConfig.jsx b/src/cockpit/389-console/src/lib/plugins/pluginBasicConfig.jsx +index 77efdf337..8b2a81f4f 100644 +--- a/src/cockpit/389-console/src/lib/plugins/pluginBasicConfig.jsx ++++ b/src/cockpit/389-console/src/lib/plugins/pluginBasicConfig.jsx +@@ -114,8 +114,9 @@ class PluginBasicConfig extends React.Component { + } + addNotification( + `${!dynamicPluginEnabled ? 'warning' : 'success'}`, +- cockpit.format(_("$0 plugin was successfully $1d."), pluginName, new_status) + +- `${!dynamicPluginEnabled ? _("Please, restart the instance.") : ''}` ++ cockpit.format(_("$0 plugin was successfully $1."), ++ pluginName, new_status + "d") + ++ `${!dynamicPluginEnabled ? " " + _("Please, restart the instance.") : ''}` + ); + toggleLoadingHandler(); + }) +@@ -126,7 +127,8 @@ class PluginBasicConfig extends React.Component { + ); + addNotification( + "warning", +- cockpit.format(_("$0 plugin was successfully $1d. Please, restart the instance."), pluginName, new_status) ++ cockpit.format(_("$0 plugin was successfully $1. Please, restart the instance."), ++ pluginName, new_status + "d") + ); + toggleLoadingHandler(); + }); +diff --git a/src/cockpit/389-console/src/lib/plugins/referentialIntegrity.jsx b/src/cockpit/389-console/src/lib/plugins/referentialIntegrity.jsx +index 23748c341..4269d9c35 100644 +--- a/src/cockpit/389-console/src/lib/plugins/referentialIntegrity.jsx ++++ b/src/cockpit/389-console/src/lib/plugins/referentialIntegrity.jsx +@@ -622,7 +622,7 @@ class ReferentialIntegrity extends React.Component { + console.info("referintOperation", "Result", content); + this.props.addNotification( + "success", +- cockpit.format(_("Config entry $0 was successfully $1ed"), configDN, action) ++ cockpit.format(_("Config entry $0 was successfully $1"), configDN, action + "ed") + ); + this.props.pluginListHandler(); + this.handleCloseModal(); +diff --git a/src/cockpit/389-console/src/lib/replication/replConfig.jsx b/src/cockpit/389-console/src/lib/replication/replConfig.jsx +index 9412c5985..0acec213c 100644 +--- a/src/cockpit/389-console/src/lib/replication/replConfig.jsx ++++ b/src/cockpit/389-console/src/lib/replication/replConfig.jsx +@@ -150,7 +150,8 @@ export class ReplConfig extends React.Component { + this.props.reload(); + this.props.addNotification( + "success", +- cockpit.format(_("Successfully $0d replica to a $1"), action, this.state.newRole) ++ cockpit.format(_("Successfully $0 replica to a $1"), ++ action + "d", this.state.newRole) + ); + this.setState({ + roleChangeSpinning: false, +-- +2.48.1 + diff --git a/0016-Issue-6625-UI-fix-next-round-of-bugs.patch b/0016-Issue-6625-UI-fix-next-round-of-bugs.patch new file mode 100644 index 0000000..276ef20 --- /dev/null +++ b/0016-Issue-6625-UI-fix-next-round-of-bugs.patch @@ -0,0 +1,2900 @@ +From c5a2f2cdc66754e2199039a45f626b696325113f Mon Sep 17 00:00:00 2001 +From: Mark Reynolds +Date: Thu, 20 Feb 2025 16:00:10 -0500 +Subject: [PATCH] Issue 6625 - UI - fix next round of bugs + +Description: + +This fixes the following issues: + +- Subtrees field must not be mandatory If you configure the Attribute Uniqueness + plug-in over object classes +- MemberOf configuration window you can select empty values for Subtree Scope + and Exclude Subtree fields +- Database suffix field accepts dash symbol which ends in error +- Enable logs checkboxes do not display properly after changes +- Instance fails to load when DB backup directory doesn't exist +- Improvement for Create New Instance form +- Database Name is not validated +- Database Suffix is not validated properly +- Failing to update NDN cache size +- Import cache size is not easy to set +- Import cache autosize off/on fails +- Statistic about worker threads is incorrect +- Database index table searching does not work +- Schema attribute table searching does not work +- TimePicker component needs updating for PF5 +- Fix Treeview appearance for browser Dark Mode +- Add attribute syntax oid name to table + +Fixes: https://github.com/389ds/389-ds-base/issues/6625 +Fixes: https://github.com/389ds/389-ds-base/issues/5969 + +Reviewed by: spichugi(Thanks!) +--- + ldap/servers/plugins/uiduniq/uid.c | 41 ++- + src/cockpit/389-console/src/css/ds.css | 2 - + src/cockpit/389-console/src/database.jsx | 29 +- + src/cockpit/389-console/src/ds.jsx | 21 +- + src/cockpit/389-console/src/dsModals.jsx | 96 +++++-- + .../src/lib/database/databaseConfig.jsx | 209 ++++++++++++-- + .../src/lib/database/databaseModal.jsx | 1 + + .../src/lib/database/databaseTables.jsx | 63 ++-- + .../ldap_editor/wizards/operations/aciNew.jsx | 4 +- + .../src/lib/monitor/serverMonitor.jsx | 6 +- + .../src/lib/plugins/attributeUniqueness.jsx | 268 ++++++++++++++---- + .../389-console/src/lib/plugins/memberOf.jsx | 28 +- + .../src/lib/plugins/rootDNAccessControl.jsx | 4 +- + .../src/lib/replication/replAgmts.jsx | 3 +- + .../src/lib/replication/replModals.jsx | 16 +- + .../src/lib/replication/replTables.jsx | 33 +-- + .../src/lib/replication/winsyncAgmts.jsx | 2 +- + .../src/lib/schema/schemaTables.jsx | 46 +-- + .../389-console/src/lib/server/accessLog.jsx | 22 +- + .../389-console/src/lib/server/auditLog.jsx | 27 +- + .../src/lib/server/auditfailLog.jsx | 24 +- + .../389-console/src/lib/server/errorLog.jsx | 28 +- + .../src/lib/server/securityLog.jsx | 24 +- + src/cockpit/389-console/src/lib/tools.jsx | 45 ++- + src/cockpit/389-console/src/monitor.jsx | 21 +- + src/cockpit/389-console/src/replication.jsx | 19 +- + src/cockpit/389-console/src/server.jsx | 10 +- + .../lib389/cli_conf/plugins/attruniq.py | 7 +- + src/lib389/lib389/cli_conf/schema.py | 4 +- + 29 files changed, 800 insertions(+), 303 deletions(-) + +diff --git a/ldap/servers/plugins/uiduniq/uid.c b/ldap/servers/plugins/uiduniq/uid.c +index 5b763b551..053af4f9d 100644 +--- a/ldap/servers/plugins/uiduniq/uid.c ++++ b/ldap/servers/plugins/uiduniq/uid.c +@@ -195,17 +195,17 @@ uniqueness_entry_to_config(Slapi_PBlock *pb, Slapi_Entry *config_entry) + slapi_pblock_get(pb, SLAPI_PLUGIN_ARGC, &argc); + if (argc == 0) { + /* This is new config style +- * uniqueness-attribute-name: uid +- * uniqueness-subtrees: dc=people,dc=example,dc=com +- * uniqueness-subtrees: dc=sales, dc=example,dc=com +- * uniqueness-across-all-subtrees: on +- * +- * or +- * +- * uniqueness-attribute-name: uid +- * uniqueness-top-entry-oc: organizationalUnit +- * uniqueness-subtree-entries-oc: person +- */ ++ * uniqueness-attribute-name: uid ++ * uniqueness-subtrees: dc=people,dc=example,dc=com ++ * uniqueness-subtrees: dc=sales, dc=example,dc=com ++ * uniqueness-across-all-subtrees: on ++ * ++ * or ++ * ++ * uniqueness-attribute-name: uid ++ * uniqueness-top-entry-oc: organizationalUnit ++ * uniqueness-subtree-entries-oc: person ++ */ + + /* Attribute name of the attribute we are going to check value uniqueness */ + values = slapi_entry_attr_get_charray(config_entry, ATTR_UNIQUENESS_ATTRIBUTE_NAME); +@@ -293,16 +293,15 @@ uniqueness_entry_to_config(Slapi_PBlock *pb, Slapi_Entry *config_entry) + } + if (UNTAGGED_PARAMETER == result) { + /* This is +- * nsslapd-pluginarg0: uid +- * nsslapd-pluginarg1: dc=people,dc=example,dc=com +- * nsslapd-pluginarg2: dc=sales, dc=example,dc=com +- * +- * config attribute are in argc/argv +- * +- * attrName is set +- * markerObjectClass/requiredObjectClass are NOT set +- */ +- ++ * nsslapd-pluginarg0: uid ++ * nsslapd-pluginarg1: dc=people,dc=example,dc=com ++ * nsslapd-pluginarg2: dc=sales, dc=example,dc=com ++ * ++ * config attribute are in argc/argv ++ * ++ * attrName is set ++ * markerObjectClass/requiredObjectClass are NOT set ++ */ + if (slapi_pblock_get(pb, SLAPI_PLUGIN_ARGC, &argc) || slapi_pblock_get(pb, SLAPI_PLUGIN_ARGV, &argv)) { + slapi_log_err(SLAPI_LOG_PLUGIN, plugin_name, "uniqueness_entry_to_config - " + "Only attribute name is valid\n"); +diff --git a/src/cockpit/389-console/src/css/ds.css b/src/cockpit/389-console/src/css/ds.css +index 9cd669569..03be19911 100644 +--- a/src/cockpit/389-console/src/css/ds.css ++++ b/src/cockpit/389-console/src/css/ds.css +@@ -62,7 +62,6 @@ td { + + .ds-tree { + border: 1px solid #909090; +- background-color: #f8f8f8; + width: 300px; + min-width: 300px; + min-height: 350px; +@@ -75,7 +74,6 @@ td { + + .pf-theme-dark .ds-tree { + border: 1px solid #909090; +- background-color: rgb(54 55 58); + width: 300px; + min-width: 300px; + min-height: 350px; +diff --git a/src/cockpit/389-console/src/database.jsx b/src/cockpit/389-console/src/database.jsx +index c33c1e2d2..509f7105c 100644 +--- a/src/cockpit/389-console/src/database.jsx ++++ b/src/cockpit/389-console/src/database.jsx +@@ -1,6 +1,6 @@ + import cockpit from "cockpit"; + import React from "react"; +-import { log_cmd, valid_dn } from "./lib/tools.jsx"; ++import { log_cmd, valid_dn, valid_db_name } from "./lib/tools.jsx"; + import { + ChainingConfig, + ChainingDatabaseConfig +@@ -12,6 +12,7 @@ import { GlobalPwPolicy } from "./lib/database/globalPwp.jsx"; + import { LocalPwPolicy } from "./lib/database/localPwp.jsx"; + import { + Button, ++ Card, + Form, + FormGroup, + FormSelect, +@@ -749,7 +750,11 @@ export class Database extends React.Component { + } else if (e.target.id === "createSuffix" && !valid_dn(str)) { + valueErr = true; + createNotOK = true; ++ } else if (e.target.id === "createBeName" && !valid_db_name(str)) { ++ valueErr = true; ++ createNotOK = true; + } ++ + // Check existing values + if (e.target.id !== "createSuffix") { + if (!valid_dn(this.state.createSuffix)) { +@@ -758,7 +763,7 @@ export class Database extends React.Component { + } + } + if (e.target.id !== "createBeName") { +- if (this.state.createBeName === "") { ++ if (this.state.createBeName === "" || !valid_db_name(this.state.createBeName)) { + errObj.createBeName = true; + createNotOK = true; + } +@@ -1386,18 +1391,16 @@ export class Database extends React.Component { + } + body = ( +
+-
+-
+-
+- +-
++ ++
++ +
+-
++ +
+ {db_element} +
+diff --git a/src/cockpit/389-console/src/ds.jsx b/src/cockpit/389-console/src/ds.jsx +index 144ce8d4d..b87084b8d 100644 +--- a/src/cockpit/389-console/src/ds.jsx ++++ b/src/cockpit/389-console/src/ds.jsx +@@ -270,7 +270,7 @@ export class DSInstance extends React.Component { + wasActiveList: [this.state.activeTabKey] + }, + () => { +- this.loadBackups(); ++ this.loadBackups(true); + } + ); + if (action === "restart") { +@@ -305,7 +305,7 @@ export class DSInstance extends React.Component { + wasActiveList: [] + }, + () => { +- this.loadBackups(); ++ this.loadBackups(true); + } + ); + } +@@ -329,7 +329,7 @@ export class DSInstance extends React.Component { + wasActiveList: [] + }, + () => { +- this.loadBackups(); ++ this.loadBackups(true); + } + ); + } +@@ -371,7 +371,7 @@ export class DSInstance extends React.Component { + wasActiveList: [] + }, + () => { +- this.loadBackups(); ++ this.loadBackups(true); + } + ); + } +@@ -448,7 +448,7 @@ export class DSInstance extends React.Component { + ); + } + +- loadBackups() { ++ loadBackups(initializing) { + let cmd = ["dsctl", "-j", this.state.serverId, "backups"]; + log_cmd("loadBackups", "Load Backups", cmd); + cockpit.spawn(cmd, { superuser: true, err: "message" }) +@@ -479,10 +479,13 @@ export class DSInstance extends React.Component { + .fail(err => { + this.updateProgress(25); + const errMsg = JSON.parse(err); +- this.addNotification( +- "error", +- cockpit.format(_("Load Backups operation failed - $0"), errMsg.desc) +- ); ++ if (!initializing) { ++ // Don't log an error when first initializing the UI ++ this.addNotification( ++ "error", ++ cockpit.format(_("Load Backups operation failed - $0"), errMsg.desc) ++ ); ++ } + this.setState({ + backupRows: [], + }); +diff --git a/src/cockpit/389-console/src/dsModals.jsx b/src/cockpit/389-console/src/dsModals.jsx +index 8b39324ef..e3ee18fc0 100644 +--- a/src/cockpit/389-console/src/dsModals.jsx ++++ b/src/cockpit/389-console/src/dsModals.jsx +@@ -12,6 +12,8 @@ import { + FormHelperText, + FormSelect, + FormSelectOption, ++ HelperText, ++ HelperTextItem, + Grid, + GridItem, + Modal, +@@ -419,12 +421,18 @@ export class CreateInstanceModal extends React.Component { + }} + validated={errObj.createServerId ? ValidatedOptions.error : ValidatedOptions.default} + /> +- +- {this.state.createServerIdMsg} +- ++ {errObj.createServerId && ++ ++ ++ ++ {this.state.createServerIdMsg} ++ ++ ++ ++ } + + +- ++ + + {_("Port")} + +@@ -443,11 +451,15 @@ export class CreateInstanceModal extends React.Component { + widthChars={8} + /> + +- {_("Port 0 will disable non-TLS connections")} ++ ++ ++ {_("Port 0 will disable non-TLS connections")} ++ ++ + + + +- ++ + + {_("Secure Port")} + +@@ -467,7 +479,7 @@ export class CreateInstanceModal extends React.Component { + /> + + +- ++ + + {_("Create Self-Signed TLS Certificate")} + +@@ -497,12 +509,18 @@ export class CreateInstanceModal extends React.Component { + }} + validated={errObj.createDM ? ValidatedOptions.error : ValidatedOptions.default} + /> +- +- {_("Enter a valid DN")} +- ++ {errObj.createDM && ++ ++ ++ ++ {_("Enter a valid DN")} ++ ++ ++ ++ } + + +- ++ + + {_("Directory Manager Password")} + +@@ -518,12 +536,18 @@ export class CreateInstanceModal extends React.Component { + }} + validated={errObj.createDMPassword ? ValidatedOptions.error : ValidatedOptions.default} + /> +- +- {_("Password must be set and it must match the confirmation password.")} +- ++ {errObj.createDMPassword && ++ ++ ++ ++ Password must be set with at least 8 characters, and it must match the confirmation password ++ ++ ++ ++ } + + +- ++ + + {_("Confirm Password")} + +@@ -539,12 +563,18 @@ export class CreateInstanceModal extends React.Component { + }} + validated={errObj.createDMPasswordConfirm ? ValidatedOptions.error : ValidatedOptions.default} + /> +- +- {_("Confirmation password must be set and it must match the first password.")} +- ++ {errObj.createDMPasswordConfirm && ++ ++ ++ ++ Confirmation password must be set with at least 8 characters, and it must match the first password ++ ++ ++ ++ } + + +- ++ + +- +- {_("Value must be a valid DN")} +- ++ {errObj.createDBSuffix && ++ ++ ++ ++ {_("Value must be a valid DN")} ++ ++ ++ ++ } + + +- ++ + + {_("Database Name")} + +@@ -596,12 +632,18 @@ export class CreateInstanceModal extends React.Component { + }} + validated={errObj.createDBName ? ValidatedOptions.error : ValidatedOptions.default} + /> +- +- {_("Name is required")} +- ++ {errObj.createDBName && ++ ++ ++ ++ {_("Name is required")} ++ ++ ++ ++ } + + +- ++ + + {_("Database Initialization")} + +diff --git a/src/cockpit/389-console/src/lib/database/databaseConfig.jsx b/src/cockpit/389-console/src/lib/database/databaseConfig.jsx +index b944c08d9..112625be9 100644 +--- a/src/cockpit/389-console/src/lib/database/databaseConfig.jsx ++++ b/src/cockpit/389-console/src/lib/database/databaseConfig.jsx +@@ -17,8 +17,10 @@ import { + TextVariants, + TimePicker, + Tooltip, ++ ValidatedOptions, + } from "@patternfly/react-core"; + import PropTypes from "prop-types"; ++import { SyncAltIcon } from '@patternfly/react-icons'; + import { OutlinedQuestionCircleIcon } from '@patternfly/react-icons/dist/js/icons/outlined-question-circle-icon'; + + const _ = cockpit.gettext; +@@ -29,6 +31,7 @@ export class GlobalDatabaseConfig extends React.Component { + this.state = { + saving: false, + saveBtnDisabled: true, ++ error: {}, + activeTabKey: this.props.data.activeTab, + db_cache_auto: this.props.data.db_cache_auto, + import_cache_auto: this.props.data.import_cache_auto, +@@ -86,22 +89,29 @@ export class GlobalDatabaseConfig extends React.Component { + this.maxValue = 2147483647; + this.onMinusConfig = (id) => { + this.setState({ +- [id]: Number(this.state[id]) - 1 ++ [id]: Number(this.state[id]) - 1, + }, () => { this.validateSaveBtn() }); + }; + this.onConfigChange = (event, id, min, max) => { ++ let error = this.state.error; + let maxValue = this.maxValue; + if (max !== 0) { + maxValue = max; + } ++ let badValue = false; + const newValue = isNaN(event.target.value) ? 0 : Number(event.target.value); ++ if (newValue > maxValue || newValue < min) { ++ badValue = true; ++ } ++ error[id] = badValue; + this.setState({ +- [id]: newValue > maxValue ? maxValue : newValue < min ? min : newValue ++ [id]: newValue, ++ error, + }, () => { this.validateSaveBtn() }); + }; + this.onPlusConfig = (id) => { + this.setState({ +- [id]: Number(this.state[id]) + 1 ++ [id]: Number(this.state[id]) + 1, + }, () => { this.validateSaveBtn() }); + }; + +@@ -143,6 +153,15 @@ export class GlobalDatabaseConfig extends React.Component { + break; + } + } ++ ++ // Check if have any errors on our attributes ++ for (const config_attr of check_attrs) { ++ if (config_attr in this.state.error && this.state.error[config_attr]) { ++ saveBtnDisabled = true; ++ break; ++ } ++ } ++ + this.setState({ + saveBtnDisabled, + }); +@@ -153,14 +172,21 @@ export class GlobalDatabaseConfig extends React.Component { + const value = e.target.type === 'checkbox' ? e.target.checked : e.target.value; + const attr = e.target.id; + ++ if (attr === "import_cache_auto" && value) { ++ // We need to set it to -1 if it's already set to 0 ++ if (this.state.importcacheauto === "0") { ++ this.setState({ importcacheauto: "-1" }); ++ } ++ } ++ + this.setState({ + [attr]: value, + }, () => { this.validateSaveBtn() }); + } + +- handleTimeChange(_event, value) { ++ handleTimeChange = (_event, time, hour, min, seconds, isValid) => { + this.setState({ +- compacttime: value, ++ compacttime: time, + }, () => { this.validateSaveBtn() }); + } + +@@ -400,6 +426,10 @@ export class GlobalDatabaseConfig extends React.Component { + plusBtnAriaLabel="plus" + widthChars={10} + unit="%" ++ validated={'dblocksMonitoringThreshold' in this.state.error && ++ this.state.error['dblocksMonitoringThreshold'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -423,6 +453,10 @@ export class GlobalDatabaseConfig extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'dblocksMonitoringPause' in this.state.error && ++ this.state.error['dblocksMonitoringPause'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -454,6 +488,10 @@ export class GlobalDatabaseConfig extends React.Component { + plusBtnAriaLabel="plus" + widthChars={4} + unit="%" ++ validated={'autosize' in this.state.error && ++ this.state.error['autosize'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -478,6 +516,10 @@ export class GlobalDatabaseConfig extends React.Component { + plusBtnAriaLabel="plus" + widthChars={4} + unit="%" ++ validated={'autosizesplit' in this.state.error && ++ this.state.error['autosizesplit'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -496,17 +538,21 @@ export class GlobalDatabaseConfig extends React.Component { + + + { this.onMinusConfig("dbcachesize") }} +- onChange={(e) => { this.onConfigChange(e, "dbcachesize", 512000, 0) }} +- onPlus={() => { this.onPlusConfig("dbcachesize") }} +- inputName="input" +- inputAriaLabel="number input" +- minusBtnAriaLabel="minus" +- plusBtnAriaLabel="plus" +- widthChars={10} ++ value={this.state.dbcachesize} ++ min={512000} ++ max={this.maxValue} ++ onMinus={() => { this.onMinusConfig("dbcachesize") }} ++ onChange={(e) => { this.onConfigChange(e, "dbcachesize", 512000, 0) }} ++ onPlus={() => { this.onPlusConfig("dbcachesize") }} ++ inputName="input" ++ inputAriaLabel="number input" ++ minusBtnAriaLabel="minus" ++ plusBtnAriaLabel="plus" ++ widthChars={10} ++ validated={'dbcachesize' in this.state.error && ++ this.state.error['dbcachesize'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -539,6 +585,10 @@ export class GlobalDatabaseConfig extends React.Component { + plusBtnAriaLabel="plus" + widthChars={4} + unit={this.state.importcacheauto > 0 ? "%" : ""} ++ validated={'importcacheauto' in this.state.error && ++ this.state.error['importcacheauto'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -568,6 +618,10 @@ export class GlobalDatabaseConfig extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'importcachesize' in this.state.error && ++ this.state.error['importcachesize'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -604,9 +658,17 @@ export class GlobalDatabaseConfig extends React.Component { + + + {_("Global Database Configuration")} ++ + + +- +
+ + {_("Limits")}}> +@@ -631,6 +693,10 @@ export class GlobalDatabaseConfig extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'looklimit' in this.state.error && ++ this.state.error['looklimit'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -654,6 +720,10 @@ export class GlobalDatabaseConfig extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'idscanlimit' in this.state.error && ++ this.state.error['idscanlimit'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -677,6 +747,10 @@ export class GlobalDatabaseConfig extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'pagelooklimit' in this.state.error && ++ this.state.error['pagelooklimit'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -700,6 +774,10 @@ export class GlobalDatabaseConfig extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'pagescanlimit' in this.state.error && ++ this.state.error['pagescanlimit'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -723,6 +801,10 @@ export class GlobalDatabaseConfig extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'rangelooklimit' in this.state.error && ++ this.state.error['rangelooklimit'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -790,6 +872,10 @@ export class GlobalDatabaseConfig extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'ndncachemaxsize' in this.state.error && ++ this.state.error['ndncachemaxsize'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -818,6 +904,10 @@ export class GlobalDatabaseConfig extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'dblocks' in this.state.error && ++ this.state.error['dblocks'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -928,6 +1018,10 @@ export class GlobalDatabaseConfig extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'compactinterval' in this.state.error && ++ this.state.error['compactinterval'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -951,6 +1045,10 @@ export class GlobalDatabaseConfig extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'chxpoint' in this.state.error && ++ this.state.error['chxpoint'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -999,6 +1097,7 @@ export class GlobalDatabaseConfigMDB extends React.Component { + saving: false, + saveBtnDisabled: true, + availDbSizeBytes: 0, ++ error: {}, + activeTabKey: this.props.data.activeTab, + db_cache_auto: this.props.data.db_cache_auto, + import_cache_auto: this.props.data.import_cache_auto, +@@ -1034,11 +1133,11 @@ export class GlobalDatabaseConfigMDB extends React.Component { + this.onMinusConfig = (id) => { + if (id === "mdbmaxsize") { + this.setState({ +- [id]: Number(this.state[id]) - (1024 * 1024) ++ [id]: Number(this.state[id]) - (1024 * 1024), + }, () => { this.validateSaveBtn() }); + } else { + this.setState({ +- [id]: Number(this.state[id]) - 1 ++ [id]: Number(this.state[id]) - 1, + }, () => { this.validateSaveBtn() }); + } + }; +@@ -1086,8 +1185,17 @@ export class GlobalDatabaseConfigMDB extends React.Component { + [id]: (newValueBytes > max ? max : newValueBytes < min ? min : newValueBytes) + }, () => { this.validateSaveBtn() }); + } else { ++ let error = this.state.error; ++ let badValue = false; ++ const newValue = isNaN(event.target.value) ? 0 : Number(event.target.value); ++ if (newValue > maxValue || newValue < min) { ++ badValue = true; ++ ++ } ++ error[id] = badValue; + this.setState({ +- [id]: newValue > maxValue ? maxValue : newValue < min ? min : newValue ++ [id]: newValue, ++ error, + }, () => { this.validateSaveBtn() }); + } + }; +@@ -1095,11 +1203,11 @@ export class GlobalDatabaseConfigMDB extends React.Component { + this.onPlusConfig = (id) => { + if (id === "mdbmaxsize") { + this.setState({ +- [id]: Number(this.state[id]) + (1024 * 1024) ++ [id]: Number(this.state[id]) + (1024 * 1024), + }, () => { this.validateSaveBtn() }); + } else { + this.setState({ +- [id]: Number(this.state[id]) + 1 ++ [id]: Number(this.state[id]) + 1, + }, () => { this.validateSaveBtn() }); + } + }; +@@ -1150,7 +1258,15 @@ export class GlobalDatabaseConfigMDB extends React.Component { + break; + } + } +- // jc console.log(saveBtnDisabled); ++ ++ // Check if have any errors on our attributes ++ for (const config_attr of check_attrs) { ++ if (config_attr in this.state.error && this.state.error[config_attr]) { ++ saveBtnDisabled = true; ++ break; ++ } ++ } ++ + this.setState({ + saveBtnDisabled + }); +@@ -1338,6 +1454,15 @@ export class GlobalDatabaseConfigMDB extends React.Component { + + + {_("Global Database Configuration")} ++ + + + +@@ -1366,6 +1491,10 @@ export class GlobalDatabaseConfigMDB extends React.Component { + plusBtnAriaLabel="plus" + unit="MB" + widthChars={10} ++ validated={'mdbmaxsize' in this.state.error && ++ this.state.error['mdbmaxsize'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -1393,6 +1522,10 @@ export class GlobalDatabaseConfigMDB extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'looklimit' in this.state.error && ++ this.state.error['looklimit'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -1416,6 +1549,10 @@ export class GlobalDatabaseConfigMDB extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'idscanlimit' in this.state.error && ++ this.state.error['idscanlimit'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -1439,6 +1576,10 @@ export class GlobalDatabaseConfigMDB extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'pagelooklimit' in this.state.error && ++ this.state.error['pagelooklimit'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -1462,6 +1603,10 @@ export class GlobalDatabaseConfigMDB extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'pagescanlimit' in this.state.error && ++ this.state.error['pagescanlimit'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -1485,6 +1630,10 @@ export class GlobalDatabaseConfigMDB extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'rangelooklimit' in this.state.error && ++ this.state.error['rangelooklimit'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -1498,7 +1647,7 @@ export class GlobalDatabaseConfigMDB extends React.Component { + className="ds-margin-top-xlg" + > + +- {_("Normalized DN Cache Max Size")} ++ {_("Normalized DN Cache Max Size") } + + + + + +@@ -1560,6 +1713,10 @@ export class GlobalDatabaseConfigMDB extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'mdbmaxreaders' in this.state.error && ++ this.state.error['mdbmaxreaders'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +@@ -1584,6 +1741,10 @@ export class GlobalDatabaseConfigMDB extends React.Component { + minusBtnAriaLabel="minus" + plusBtnAriaLabel="plus" + widthChars={10} ++ validated={'mdbmaxdbs' in this.state.error && ++ this.state.error['mdbmaxdbs'] ++ ? ValidatedOptions.error ++ : ValidatedOptions.default} + /> + + +diff --git a/src/cockpit/389-console/src/lib/database/databaseModal.jsx b/src/cockpit/389-console/src/lib/database/databaseModal.jsx +index a64235996..8d668494e 100644 +--- a/src/cockpit/389-console/src/lib/database/databaseModal.jsx ++++ b/src/cockpit/389-console/src/lib/database/databaseModal.jsx +@@ -17,6 +17,7 @@ import { + import { LDIFTable } from "./databaseTables.jsx"; + import PropTypes from "prop-types"; + ++ + const _ = cockpit.gettext; + + class CreateLinkModal extends React.Component { +diff --git a/src/cockpit/389-console/src/lib/database/databaseTables.jsx b/src/cockpit/389-console/src/lib/database/databaseTables.jsx +index 1c4b43716..3d0ce5e98 100644 +--- a/src/cockpit/389-console/src/lib/database/databaseTables.jsx ++++ b/src/cockpit/389-console/src/lib/database/databaseTables.jsx +@@ -88,12 +88,12 @@ class ReferralTable extends React.Component { + + handleSort(_event, index, direction) { + const sortedRefs = [...this.props.rows]; +- ++ + sortedRefs.sort(); + if (direction !== 'asc') { + sortedRefs.reverse(); + } +- ++ + const rows = sortedRefs.map(refRow => [ + refRow, + this.getDeleteButton(refRow) +@@ -130,6 +130,7 @@ class ReferralTable extends React.Component { + onSort: this.handleSort, + columnIndex: idx + } : undefined} ++ textCenter={idx === 1} + > + {column.title} + +@@ -140,7 +141,7 @@ class ReferralTable extends React.Component { + {displayRows.map((row, rowIndex) => ( +
+@@ -203,10 +204,10 @@ class IndexTable extends React.Component { + } + + handleSort(_event, index, direction) { +- const sortedRows = [...this.state.rows].sort((a, b) => ++ const sortedRows = [...this.state.rows].sort((a, b) => + (a[index] < b[index] ? -1 : a[index] > b[index] ? 1 : 0) + ); +- ++ + this.setState({ + sortBy: { + index, +@@ -219,14 +220,15 @@ class IndexTable extends React.Component { + handleSearchChange(event, value) { + let rows = []; + const val = value.toLowerCase(); +- ++ + if (val === "") { + rows = [...this.props.rows]; + } else { + for (const row of this.props.rows) { ++ const mr_row = row[2].length > 0 ? row[2] : ""; + if (row[0].toLowerCase().includes(val) || + row[1].toLowerCase().includes(val) || +- row[2].toLowerCase().includes(val)) { ++ mr_row.toLowerCase().includes(val)) { + rows.push([row[0], row[1], row[2]]); + } + } +@@ -281,14 +283,14 @@ class IndexTable extends React.Component { + onChange={this.handleSearchChange} + onClear={(evt) => this.handleSearchChange(evt, '')} + /> +- + + + {columns.map((column, idx) => ( +- +@@ -415,7 +417,7 @@ class EncryptedAttrTable extends React.Component { + if (direction !== 'asc') { + sortedAttrs.reverse(); + } +- ++ + const rows = sortedAttrs.map(attrRow => [ + attrRow, + this.getDeleteButton(attrRow) +@@ -452,6 +454,7 @@ class EncryptedAttrTable extends React.Component { + onSort: this.handleSort, + columnIndex: idx + } : undefined} ++ textCenter={idx === 1} + > + {column.title} + +@@ -462,7 +465,7 @@ class EncryptedAttrTable extends React.Component { + {displayRows.map((row, rowIndex) => ( + + {row.map((cell, cellIndex) => ( +- +@@ -689,7 +692,7 @@ class LDIFManageTable extends React.Component { + + handleSort(_event, index, direction) { + const sortedLDIF = [...this.state.rows]; +- ++ + sortedLDIF.sort((a, b) => { + const aValue = Array.isArray(a) ? a[index] : a.cells[index]; + const bValue = Array.isArray(b) ? b[index] : b.cells[index]; +@@ -726,7 +729,7 @@ class LDIFManageTable extends React.Component { + render() { + const { columns, rows, perPage, page, sortBy } = this.state; + const hasRows = this.props.rows.length > 0; +- ++ + // Calculate pagination + const startIdx = (perPage * page) - perPage; + const tableRows = [...rows].splice(startIdx, perPage); +@@ -769,7 +772,7 @@ class LDIFManageTable extends React.Component { + )} + {hasRows && ( + +@@ -842,7 +845,7 @@ class BackupTable extends React.Component { + + handleSort(_event, index, direction) { + const sortedBaks = [...this.state.rows]; +- ++ + sortedBaks.sort((a, b) => { + const aValue = Array.isArray(a) ? a[index] : a[0]; + const bValue = Array.isArray(b) ? b[index] : b[0]; +@@ -879,7 +882,7 @@ class BackupTable extends React.Component { + render() { + const { columns, rows, perPage, page, sortBy } = this.state; + const hasRows = this.props.rows.length > 0; +- ++ + // Calculate pagination + const startIdx = (perPage * page) - perPage; + const tableRows = [...rows].splice(startIdx, perPage); +@@ -922,7 +925,7 @@ class BackupTable extends React.Component { + )} + {hasRows && ( + +@@ -995,7 +998,7 @@ class PwpTable extends React.Component { + + handleSort(_event, index, direction) { + const sortedPwp = [...this.state.rows]; +- ++ + sortedPwp.sort((a, b) => { + const aValue = Array.isArray(a) ? a[index] : a.cells[index]; + const bValue = Array.isArray(b) ? b[index] : b.cells[index]; +@@ -1032,7 +1035,7 @@ class PwpTable extends React.Component { + render() { + const { columns, rows, perPage, page, sortBy } = this.state; + const hasRows = this.props.rows.length > 0; +- ++ + // Calculate pagination + const startIdx = (perPage * page) - perPage; + const tableRows = [...rows].splice(startIdx, perPage); +@@ -1075,7 +1078,7 @@ class PwpTable extends React.Component { + )} + {hasRows && ( + +@@ -1313,7 +1316,7 @@ class VLVTable extends React.Component { + + return ( +
+-
( + +- {Array.isArray(cell) && cell.length === 0 ? ++ {Array.isArray(cell) && cell.length === 0 ? + '' : // Handle empty arrays + String(cell) // Convert any value to string + } +@@ -323,7 +325,7 @@ class IndexTable extends React.Component { + )} + {has_rows && this.props.editable && ( + +- +
+@@ -552,10 +555,10 @@ class LDIFTable extends React.Component { + } + + handleSort(_event, index, direction) { +- const sortedRows = [...this.state.rows].sort((a, b) => ++ const sortedRows = [...this.state.rows].sort((a, b) => + (a[index] < b[index] ? -1 : a[index] > b[index] ? 1 : 0) + ); +- ++ + this.setState({ + sortBy: { + index, +@@ -615,7 +618,7 @@ class LDIFTable extends React.Component { + {/* Only render the action column if we have rows */} + {hasRows && ( + +- + +- + +- + +- +
+@@ -1321,7 +1324,7 @@ class VLVTable extends React.Component { + + {!noRows && + {!noRows && ( +- +@@ -1362,7 +1365,7 @@ class VLVTable extends React.Component { + {row.isOpen && row.originalData && ( + +
} + {columns.map((column, columnIndex) => ( +- +
+- +
+- +diff --git a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/aciNew.jsx b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/aciNew.jsx +index 9a427ab8f..1ea66e809 100644 +--- a/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/aciNew.jsx ++++ b/src/cockpit/389-console/src/lib/ldap_editor/wizards/operations/aciNew.jsx +@@ -1264,7 +1264,7 @@ class AddNewAci extends React.Component { + className="ds-left-margin" + time={this.state.timeOfDayStart} + is24Hour +- onChange={(val) => this.handleTimeChange(val, "timeOfDayStart")} ++ onChange={(_event, time, hour, min, seconds, isValid) => this.handleTimeChange(time, "timeOfDayStart")} + /> + + +@@ -1292,7 +1292,7 @@ class AddNewAci extends React.Component { + className="ds-left-margin" + time={this.state.timeOfDayEnd} + is24Hour +- onChange={(val) => this.handleTimeChange(val, "timeOfDayEnd")} ++ onChange={(_event, time, hour, min, seconds, isValid) => this.handleTimeChange(time, "timeOfDayEnd")} + /> + + +diff --git a/src/cockpit/389-console/src/lib/monitor/serverMonitor.jsx b/src/cockpit/389-console/src/lib/monitor/serverMonitor.jsx +index 599595acd..0fe5f047d 100644 +--- a/src/cockpit/389-console/src/lib/monitor/serverMonitor.jsx ++++ b/src/cockpit/389-console/src/lib/monitor/serverMonitor.jsx +@@ -324,7 +324,7 @@ export class ServerMonitor extends React.Component { + + + {_("Server Statistics")} +-