From 75eb3815225f4ebd86ad114cb3a3fb9849e4c8ce Mon Sep 17 00:00:00 2001 From: Simon Schweizer Date: Tue, 15 Oct 2024 14:07:43 +0200 Subject: [PATCH 1/6] documentation for DSF v1.6.0 --- docs/src/.vuepress/theme.ts | 99 ++- docs/src/stable | 2 +- docs/src/v1.6.0/contribute/code.md | 97 +++ docs/src/v1.6.0/contribute/documentation.md | 15 + docs/src/v1.6.0/contribute/readme.md | 35 + docs/src/v1.6.0/develop/README.md | 7 + docs/src/v1.6.0/develop/create.md | 14 + docs/src/v1.6.0/develop/upgrade-from-0.md | 10 + docs/src/v1.6.0/dsf-for-dev.md | 4 + docs/src/v1.6.0/index.md | 31 + docs/src/v1.6.0/maintain/README.md | 20 + docs/src/v1.6.0/maintain/allowList-mgm.md | 34 + .../maintain/bpe-reverse-proxy/README.md | 6 + .../bpe-reverse-proxy/configuration.md | 87 +++ docs/src/v1.6.0/maintain/bpe/README.md | 8 + .../src/v1.6.0/maintain/bpe/access-control.md | 104 +++ docs/src/v1.6.0/maintain/bpe/configuration.md | 689 ++++++++++++++++++ docs/src/v1.6.0/maintain/bpe/oidc.md | 56 ++ .../maintain/fhir-reverse-proxy/README.md | 6 + .../fhir-reverse-proxy/configuration.md | 87 +++ docs/src/v1.6.0/maintain/fhir/README.md | 8 + .../v1.6.0/maintain/fhir/access-control.md | 129 ++++ .../src/v1.6.0/maintain/fhir/configuration.md | 422 +++++++++++ docs/src/v1.6.0/maintain/fhir/oidc.md | 63 ++ docs/src/v1.6.0/maintain/install-plugins.md | 56 ++ docs/src/v1.6.0/maintain/install.md | 232 ++++++ docs/src/v1.6.0/maintain/upgrade-from-0.md | 32 + docs/src/v1.6.0/maintain/upgrade-from-1.md | 67 ++ docs/src/v1.6.0/process-plugins-advanced.md | 4 + 29 files changed, 2419 insertions(+), 5 deletions(-) create mode 100644 docs/src/v1.6.0/contribute/code.md create mode 100644 docs/src/v1.6.0/contribute/documentation.md create mode 100644 docs/src/v1.6.0/contribute/readme.md create mode 100644 docs/src/v1.6.0/develop/README.md create mode 100644 docs/src/v1.6.0/develop/create.md create mode 100644 docs/src/v1.6.0/develop/upgrade-from-0.md create mode 100644 docs/src/v1.6.0/dsf-for-dev.md create mode 100644 docs/src/v1.6.0/index.md create mode 100644 docs/src/v1.6.0/maintain/README.md create mode 100644 docs/src/v1.6.0/maintain/allowList-mgm.md create mode 100644 docs/src/v1.6.0/maintain/bpe-reverse-proxy/README.md create mode 100644 docs/src/v1.6.0/maintain/bpe-reverse-proxy/configuration.md create mode 100644 docs/src/v1.6.0/maintain/bpe/README.md create mode 100644 docs/src/v1.6.0/maintain/bpe/access-control.md create mode 100644 docs/src/v1.6.0/maintain/bpe/configuration.md create mode 100644 docs/src/v1.6.0/maintain/bpe/oidc.md create mode 100644 docs/src/v1.6.0/maintain/fhir-reverse-proxy/README.md create mode 100644 docs/src/v1.6.0/maintain/fhir-reverse-proxy/configuration.md create mode 100644 docs/src/v1.6.0/maintain/fhir/README.md create mode 100644 docs/src/v1.6.0/maintain/fhir/access-control.md create mode 100644 docs/src/v1.6.0/maintain/fhir/configuration.md create mode 100644 docs/src/v1.6.0/maintain/fhir/oidc.md create mode 100644 docs/src/v1.6.0/maintain/install-plugins.md create mode 100644 docs/src/v1.6.0/maintain/install.md create mode 100644 docs/src/v1.6.0/maintain/upgrade-from-0.md create mode 100644 docs/src/v1.6.0/maintain/upgrade-from-1.md create mode 100644 docs/src/v1.6.0/process-plugins-advanced.md diff --git a/docs/src/.vuepress/theme.ts b/docs/src/.vuepress/theme.ts index 9e58efbf0..3b72e9ba2 100644 --- a/docs/src/.vuepress/theme.ts +++ b/docs/src/.vuepress/theme.ts @@ -43,7 +43,7 @@ export default hopeTheme({ prefix: "/stable/", children: [ { - text: "Guideline v1.5.2 (stable)", + text: "Guideline v1.6.0 (stable)", icon: "info", children: ["index", "maintain/install", "maintain/upgrade-from-0", "maintain/allowList-mgm", "maintain/install-plugins", "develop/create", "contribute/"], } @@ -66,7 +66,7 @@ export default hopeTheme({ text: "Versions", icon: "note", // children:["/v1/"], - children: [{ text: "v1.5.2 (stable)", link: "/stable/" }, { text: "v1.5.1", link: "/v1.5.1/" }, { text: "v1.5.0", link: "/v1.5.0/" }, { text: "v1.4.0", link: "/v1.4.0/" }, { text: "v1.3.2", link: "/v1.3.2/" }, { text: "v1.3.1", link: "/v1.3.1/" }, { text: "v1.3.0", link: "/v1.3.0/" }, { text: "v1.2.0", link: "/v1.2.0/" }, { text: "v1.1.0", link: "/v1.1.0/" }, { text: "v1.0.0", link: "/v1.0.0/" }, { text: "v0.9.3 (oldstable)", link: "/oldstable/"}], + children: [{ text: "v1.6.0 (stable)", link: "/stable/" }, { text: "v1.5.2", link: "/v1.5.2/" }, { text: "v1.5.1", link: "/v1.5.1/" }, { text: "v1.5.0", link: "/v1.5.0/" }, { text: "v1.4.0", link: "/v1.4.0/" }, { text: "v1.3.2", link: "/v1.3.2/" }, { text: "v1.3.1", link: "/v1.3.1/" }, { text: "v1.3.0", link: "/v1.3.0/" }, { text: "v1.2.0", link: "/v1.2.0/" }, { text: "v1.1.0", link: "/v1.1.0/" }, { text: "v1.0.0", link: "/v1.0.0/" }, { text: "v0.9.3 (archived)", link: "/oldstable/"}], }, { text: "", @@ -216,7 +216,7 @@ export default hopeTheme({ ] }, ], - "/v1.5.2/": [ + "/v1.6.0/": [ { text: "Home", icon: "home", @@ -299,13 +299,104 @@ export default hopeTheme({ children: ["create", "upgrade-from-0" ], }, ], + "/v1.5.2/": [ + { + text: "Home", + icon: "home", + link: "/", + }, + { + text: "Current version", + icon: "update", + link: "/stable/", + }, + { + text: "Maintain a DSF instance", + icon: "tool", + prefix: "maintain/", + link: "maintain/", + children: ["install", "upgrade-from-1", "upgrade-from-0", "allowList-mgm", { + text: "FHIR Reverse Proxy", + icon: "module", + prefix: "fhir-reverse-proxy/", + link: "fhir-reverse-proxy/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }] + }, { + text: "FHIR Server", + icon: "module", + prefix: "fhir/", + link: "fhir/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }, { + icon: "config", + text: "Access Control", + link: "access-control" + }, { + icon: "config", + text: "OpenID Connect", + link: "oidc" + }] + }, { + text: "BPE Reverse Proxy", + icon: "module", + prefix: "bpe-reverse-proxy/", + link: "bpe-reverse-proxy/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }] + }, { + text: "BPE Server", + icon: "module", + prefix: "bpe/", + link: "bpe/", + children: [{ + icon: "config", + text: "Configuration", + link: "configuration" + }, { + icon: "config", + text: "Access Control", + link: "access-control" + }, { + icon: "config", + text: "OpenID Connect", + link: "oidc" + }] + }, + { + text: "Install Plugins", + icon: "plugin", + link: "install-plugins" + }], + }, + { + text: "Develop process plugins", + icon: "plugin", + prefix: "develop/", + link: "develop/", + children: ["create", "upgrade-from-0" ], + }, + ], "/v1.5.1/": [ { text: "Home", icon: "home", link: "/", }, - "", + { + text: "Current version", + icon: "update", + link: "/stable/", + }, { text: "Maintain a DSF instance", icon: "tool", diff --git a/docs/src/stable b/docs/src/stable index 74a63a224..05f629f1b 120000 --- a/docs/src/stable +++ b/docs/src/stable @@ -1 +1 @@ -v1.5.2 \ No newline at end of file +v1.6.0 \ No newline at end of file diff --git a/docs/src/v1.6.0/contribute/code.md b/docs/src/v1.6.0/contribute/code.md new file mode 100644 index 000000000..b4f16ba6e --- /dev/null +++ b/docs/src/v1.6.0/contribute/code.md @@ -0,0 +1,97 @@ +--- +title: Contribute code +icon: info +--- + +Your code can make a difference for the Data Sharing Framework (DSF). We invite all users to share their code, tests, scripts and improvement ideas. Contributions of any size enhance the DSF and support the data sharing framework community. + +### Benefits of Contributing: +- Foster community growth and diversification. +- Sharpen your coding skills. +- Gain recognition in the DSF community. +- Directly impact the future of data sharing in medicine. + +Start now by visiting our contribution pages. Every line of code helps us build a stronger and more versatile DSF. + +## General + +### Code style + +You can import our code style for your specific IDE: + +* [Eclipse](https://github.com/datasharingframework/dsf/blob/main/src/main/resources/eclipse-formatter-config.xml). Open your preferences, click on `Java`, `Code style`, `Formatter`, `Import` and select the downloaded file. +* [IntelliJ](https://github.com/datasharingframework/dsf/blob/main/src/main/resources/intellij-formatter-config.xml). Open your settings, click on `Editor`, `Code style`, `Java`, the settings icon, `import scheme`, `IntelliJ` and select the downloaded file. + +Pull requests will only be approved if the code is formatted according to the code style configurations above. To format the code with maven before pushing to GitHub, use `mvn compile -Pformat-and-sort`. + +### Branching strategy + +[Git Flow](https://www.atlassian.com/de/git/tutorials/comparing-workflows/gitflow-workflow) is used as this project's branching strategy. Therefore, you will find the following structure: + +* main +* develop +* issue +* hotfix +* release + +Notice that only the first two elements listed are actual branches. The other elements are containers to hold all branches belonging to that category. + + +#### Branch naming + +The following ruleset is applied to name branches: + +* `issue/_` +* `hotfix/` +* `release/` + +## Setting up the project + +This chapter lists all important requirements to get the project buildable and running properly. + +### Java + +This project uses Java JDK 17, so make sure you have it installed on your system. + +### Docker + +[Docker](https://www.docker.com/) is used in this project to test database functionality and to run more complex test-setups. + +### Maven + +The project relies on [Maven](https://maven.apache.org/) as its management tool. +*Important:* When building the project you might encounter the following error: +*Could not determine gpg version* [GPG](https://gnupg.org/) is used to sign artifacts for public release. Since this does not concern contributors, you may skip this step in the maven build process with `-Dgpg.skip`. + + +## Workflow + +1. Create an issue or comment on an issue that you want to contribute some feature +2. Fork the repository, create a branch and mention it in the issue +3. If you desire feedback, create a pull request or comment on it in the issue. Feel free to @ any member with write permissions if you feel like your request has not been registered yet. They will review your changes and/or change requests +4. If your changes are production-ready, create a [pull request](https://github.com/datasharingframework/dsf/pulls). + +### Pull request process + +We follow Martin Fowler's method for managing pull requests. This approach categorizes pull requests based on the level of trust and experience of the contributor, as well as the impact of the changes. Here's how we apply it: + +1. **Ship**: For our most trusted contributors with a proven track record. These members can merge their pull requests without prior review, typically for minor or highly confident changes. + +2. **Show**: This level is for trusted contributors who need some oversight, as well as for experienced developers who want to demonstrate how certain changes should be made in the future. They create pull requests and show their work to the team. + +3. **Ask**: New or less experienced contributors, as well as those submitting more complex changes, fall into this category. They are required to ask for feedback and approval before their changes can be merged, ensuring thorough review and quality control. + + +This method helps us maintain a balance between code quality and efficient development, recognizing the varying levels of expertise among our contributors. + +For more information on Fowler's approach, visit [Martin Fowler's article on Pull Requests](https://martinfowler.com/articles/ship-show-ask.html). + + +## Data Security in DSF Development + +The DSF (Data Sharing Framework) and its process plugins are frequently used to transmit sensitive personal data. To prevent the release of personal data during development, please adhere to the following guidelines: + +- **No development with real personal data:** Always use anonymized or synthetic data for development purposes. +- **No personal data in repositories:** Ensure no personal data is present in local and remote repositories intended for publication, not even temporarily. +- **Review all log files:** Before using log files in issues, examples, etc., thoroughly review them to ensure no personal and sensitive data is included. + diff --git a/docs/src/v1.6.0/contribute/documentation.md b/docs/src/v1.6.0/contribute/documentation.md new file mode 100644 index 000000000..afbaf5511 --- /dev/null +++ b/docs/src/v1.6.0/contribute/documentation.md @@ -0,0 +1,15 @@ +--- +title: Contribute documentation +icon: info +--- + +**Join us in enhancing our documentation!** + +We believe in the power of community collaboration to make our documentation clearer, more comprehensive, and more user-friendly. There are several ways you can contribute, and we welcome greatly your input! + + +1. **Contact us with feedback**: If you find any of our documentation unclear or if you think there's a topic not covered yet, please don't hesitate to reach out to us. Your perspective as a reader is invaluable in helping us to identify areas for improvement. +2. **Create an issue**: You noticed something that needs fixing or you have a suggestion? Head over to our GitHub repository at [Data Sharing Framework Documentation](https://github.com/datasharingframework/datasharingframework.github.io/issues) and please create an issue. This way, our team and other contributors can track and address documentation changes systematically. +3. **Contribute directly with a pull request**: If you're feeling proactive and want to make direct changes, you're more than welcome to submit a pull request. Visit our GitHub repository at [Data Sharing Framework Documentation](https://github.com/datasharingframework/datasharingframework.github.io) and feel free to propose your changes. Whether it's a typo fix, a new section, or enhanced explanations, every contribution counts. + +We're excited to see your suggestions and are grateful for every contribution that helps us improve. Let's build better documentation together! \ No newline at end of file diff --git a/docs/src/v1.6.0/contribute/readme.md b/docs/src/v1.6.0/contribute/readme.md new file mode 100644 index 000000000..bbacced29 --- /dev/null +++ b/docs/src/v1.6.0/contribute/readme.md @@ -0,0 +1,35 @@ +--- +title: Contribute +icon: info +--- + +We are thrilled that you consider contributing to our projects. Your contributions, big or small, are greatly valued and play a significant role in the success and improvement of our work. Whether you're a seasoned developer or just starting out, there's a place for you here to make a meaningful impact. + +### **Ways you can contribute:** + + +1. **Helping other users**: + * **MII Zulip**: If you are part of the German Medical Informatics Initiative, [join the MII Zulip community](https://mii.zulipchat.com/#narrow/stream/392426-Data-Sharing-Framework-.28DSF.29) to assist others, share your knowledge, and learn from fellow contributors. + * **GitHub Discussions**: Engage with our community in [GitHub Discussions](https://github.com/datasharingframework/dsf/discussions) by answering questions, providing feedback, and sharing your insights. +2. **Testing releases**: + * **Stay ahead**: Help us testing the latest releases. Your feedback on functionality, bugs, and user experience is invaluable. + * **Report findings**: Share your testing results to help us refine and enhance our releases. +3. **Reviewing changes**: + * **Peer review**: Contribute by reviewing pull requests. Your insights can help ensure the quality and integrity of code changes. + * **Constructive feedback**: Offer constructive feedback and suggestions to help improve and refine proposed changes. +4. **Documentation changes**: + * **Improve documentation**: Help us improving and updating our documentation. Clear and accurate documentation is crucial for user understanding and success. Please checkout our [Getting started guide for documentation contributions](./documentation) to DSF. + * **Suggest improvements**: If you notice gaps or areas for enhancement in our documentation, we welcome [your suggestions and contributions](https://github.com/datasharingframework/datasharingframework.github.io). +5. **Contributing bug reports**: + * **Report bugs**: If you find a bug, please report it via [an issue on GitHub](https://github.com/datasharingframework/dsf/issues). Detailed bug reports are incredibly helpful. + * **Reproduction steps**: Include steps to reproduce the bug and any relevant logs according to our bug report issue template. +6. **Contributing feature requests**: + * **Suggest features**: You have an idea for a new feature? We'd love to hear it! Open an issue to describe your proposed feature and its potential benefits according to our feature request template. + * **Collaborate on implementation**: If you're able to, contribute to the development of your proposed feature or bug fix. Collaboration can lead to more innovative and effective solutions. Please checkout our [Getting started guide for code contributions](./code) to DSF. +7. **Contributing process plugins**: + * **Develop process plugins for the DSF**: If you have ideas for a process plugin, we encourage you to develop and contribute them. Our [Getting started guide for process plugin development](https://dsf.dev/stable/develop/) will be a useful reference. + * **Share your work**: Your plugins could be a valuable addition to the ecosystem and benefit other users. + +Before you start contributing, we recommend reading our getting started guidelines for detailed information on our processes and standards. This ensures a smooth and productive experience for everyone involved. + +**Your contributions in any form, are what drives the continuous growth and improvement of this project. Thank you for being a part of our community and for your willingness to contribute!** \ No newline at end of file diff --git a/docs/src/v1.6.0/develop/README.md b/docs/src/v1.6.0/develop/README.md new file mode 100644 index 000000000..7c7613cb5 --- /dev/null +++ b/docs/src/v1.6.0/develop/README.md @@ -0,0 +1,7 @@ +--- +title: Develop Process Plugins +icon: plugin +--- +## Overview +- [Create a new process plugin](create) +- [Upgrade processes from 0.9.x](upgrade-from-0) \ No newline at end of file diff --git a/docs/src/v1.6.0/develop/create.md b/docs/src/v1.6.0/develop/create.md new file mode 100644 index 000000000..13f5b32bc --- /dev/null +++ b/docs/src/v1.6.0/develop/create.md @@ -0,0 +1,14 @@ +--- +title: Create a new process plugin +icon: code +--- + +Visit the [how the DSF can help you](../../for-you/) page to get started. + + +::: tip Work in progress +We are currently in the process of updating the written documentation on how to create a DSF process plugin. In the meantime we recommend to study the oldstable version of the [process plugin tutorial](/oldstable/tutorial/). Additionally, we recommend to take a look at the upgraded DSF processes here: +- The [hello world plugin](https://github.com/datasharingframework/dsf-process-hello-world) +- The [ping pong plugin](https://github.com/datasharingframework/dsf-process-ping-pong) +- The [update allowlist plugin](https://github.com/datasharingframework/dsf-process-allow-list) +::: \ No newline at end of file diff --git a/docs/src/v1.6.0/develop/upgrade-from-0.md b/docs/src/v1.6.0/develop/upgrade-from-0.md new file mode 100644 index 000000000..d27d7a228 --- /dev/null +++ b/docs/src/v1.6.0/develop/upgrade-from-0.md @@ -0,0 +1,10 @@ +--- +title: Upgrade processes from 0.9.x +icon: update +--- +::: tip Work in progress +We are currently in the process of updating the written documentation on how to upgrade a DSF process plugin to DSF 1.0.0. In the meantime we recommend to take a look at the provided sample plugin and the upgraded DSF plugins: +- The [hello world plugin](https://github.com/datasharingframework/dsf-process-hello-world) +- The [ping pong plugin](https://github.com/datasharingframework/dsf-process-ping-pong) +- The [update allowlist plugin](https://github.com/datasharingframework/dsf-process-allow-list) +::: \ No newline at end of file diff --git a/docs/src/v1.6.0/dsf-for-dev.md b/docs/src/v1.6.0/dsf-for-dev.md new file mode 100644 index 000000000..45e408ca1 --- /dev/null +++ b/docs/src/v1.6.0/dsf-for-dev.md @@ -0,0 +1,4 @@ +--- +title: DSF for Developers +icon: info +--- \ No newline at end of file diff --git a/docs/src/v1.6.0/index.md b/docs/src/v1.6.0/index.md new file mode 100644 index 000000000..1e5c05a31 --- /dev/null +++ b/docs/src/v1.6.0/index.md @@ -0,0 +1,31 @@ +--- +title: DSF 1.6.0 +icon: guide +--- + +Data Sharing Framework 1.x is the new major release of the Data Sharing Framework. Click [here](/intro/) to find more information about the DSF in general. +::: tip Important note +This is a major DSF release not compatible with 0.9.x and older version developed at https://github.com/highmed/highmed-dsf. +::: + +# System Administrators + +- [Upgrade from DSF 0.9.x.](maintain/upgrade-from-0) +- [Upgrade from DSF 1.5.2](maintain/upgrade-from-1) +- [Install DSF 1.6.0](maintain/install) + + +# Developers +- [Create a new process plugin](develop/create) +- [Upgrade from DSF 0.9.x.](develop/upgrade-from-0) + +## New features +- Improved versioning to support up- and downwards-compatibility +- Enhanced web ui to start processes in the web browser +- Allow local user authentication and authorization with OpenID Connect +- New process plugin API +- Removed mostly unused features to simplify instance configuration +- Unified proxy setup +- Many more features, see [1.x release-notes](https://github.com/datasharingframework/dsf/releases) + + diff --git a/docs/src/v1.6.0/maintain/README.md b/docs/src/v1.6.0/maintain/README.md new file mode 100644 index 000000000..5ad9f1c58 --- /dev/null +++ b/docs/src/v1.6.0/maintain/README.md @@ -0,0 +1,20 @@ +--- +title: Maintain a DSF instance +icon: tool +--- +## Overview +- [Install DSF 1.5.2](install) +- [Upgrade from DSF 0.9.x](upgrade-from-0) +- [Allow List Management](allowList-mgm) +- FHIR Reverse Proxy + - [Configuration Parameters](fhir-reverse-proxy/configuration) +- FHIR Server + - [Configuration Parameters](fhir/configuration) + - [Access Control](fhir/access-control) + - [OpenID Connect](fhir/oidc) +- BPE Reverse Proxy + - [Configuration Parameters](bpe-reverse-proxy/configuration) +- BPE Server + - [Configuration Parameters](bpe/configuration) + - [Access Control](bpe/access-control) + - [OpenID Connect](bpe/oidc) diff --git a/docs/src/v1.6.0/maintain/allowList-mgm.md b/docs/src/v1.6.0/maintain/allowList-mgm.md new file mode 100644 index 000000000..d04ae8c54 --- /dev/null +++ b/docs/src/v1.6.0/maintain/allowList-mgm.md @@ -0,0 +1,34 @@ +--- +title: Allow List Management +icon: share +--- +You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). + +## Overview +To simplify the DSF Allow List Management we have built a portal for administration. The portal is managed by the GECKO Institute at Heilbronn University. You as an DSF administrator can create or update your Allow List information. The information you provide on this portal will be transferred to us and will be used to built Allow List bundles that get distributed to the communication partners of the distributed processes. + +The DSF Allow List management tool uses client certificates for authentication. You can either use a personal client certificate or the client certificate from your DSF BPE, which needs to be added to your web-browsers certificate store. + + +## Prerequisites +1. Deployed DSF instance (test or production infrastructure) + 1.1 If none exists yet, read [the installation guide](install) +2. Certificate + 2.1 If none exists yet, read [the certificate requirements](install#client-server-certificates) +3. Organization identifier, shortest FQDN of your organizations website, e.g. `my-hospital.de` +4. FHIR endpoint URL, e.g. `https://dsf.my-hospital.de/fhir` +5. Contact details from a responsible person of your organization +6. Access to the E-Mail address from your organization for verification + + +## Start here +When you have fulfilled all the prerequisites, you can start managing your Allow Lists via the environment specific Allow List Management Tool: + +- [**Test** infrastructure](https://allowlist-test.gecko.hs-heilbronn.de) +- [**Production** infrastructure](https://allowlist.gecko.hs-heilbronn.de) + +We use different highlight colors for the DSF Allow List Management Tool: Green for the **Test** environment and blue for the **Production** infrastructure. To access the site, you have to authenticate yourself with a client certificate. Your web-browser will show a dialog to choose a valid certificate. + +::: tip Ideas for improvement? +Have you found an error or is something unclear to you? Then please feel free to contact us on the MII-Zulip Channel or write us at gth-gecko@hs-heilbronn.de. Thank you very much! +::: \ No newline at end of file diff --git a/docs/src/v1.6.0/maintain/bpe-reverse-proxy/README.md b/docs/src/v1.6.0/maintain/bpe-reverse-proxy/README.md new file mode 100644 index 000000000..4e6a614a0 --- /dev/null +++ b/docs/src/v1.6.0/maintain/bpe-reverse-proxy/README.md @@ -0,0 +1,6 @@ +--- +title: BPE Reverse Proxy +icon: module +--- +## Overview +- [Configuration Parameters](configuration) diff --git a/docs/src/v1.6.0/maintain/bpe-reverse-proxy/configuration.md b/docs/src/v1.6.0/maintain/bpe-reverse-proxy/configuration.md new file mode 100644 index 000000000..8649694ee --- /dev/null +++ b/docs/src/v1.6.0/maintain/bpe-reverse-proxy/configuration.md @@ -0,0 +1,87 @@ +--- +title: Configuration Parameters +icon: config +--- + +### APP_SERVER_IP +- **Required:** Yes +- **Description:** Hostname or IP-Address of the DSF BPE server application container, the reverse proxy target +- **Example:** `app`, `172.28.1.3` + + +### HTTPS_SERVER_NAME_PORT +- **Required:** Yes +- **Description:** External FQDN of your DSF BPE server with port, typically `443` +- **Example:** `my-external.fqdn:443` + + +### PROXY_PASS_CONNECTION_TIMEOUT_HTTP +- **Required:** No +- **Description:** Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established +- **Default:** `30` seconds + + +### PROXY_PASS_CONNECTION_TIMEOUT_WS +- **Required:** No +- **Description:** Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established +- **Default:** `30` seconds + + +### PROXY_PASS_TIMEOUT_HTTP +- **Required:** No +- **Description:** Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply +- **Default:** `60` seconds + + +### PROXY_PASS_TIMEOUT_WS +- **Required:** No +- **Description:** Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply +- **Default:** `60` seconds + + +### SERVER_CONTEXT_PATH +- **Required:** No +- **Description:** Reverse proxy context path that delegates to the app server, `/` character at start, no `/` character at end, use `''` (empty string) to configure root as context path. +- **Default:** `/bpe` + + +### SSL_CA_CERTIFICATE_FILE +- **Required:** Yes +- **Description:** Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter `SSLCACertificateFile` +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/ssl_ca_certificate_file.pem` + + +### SSL_CA_DN_REQUEST_FILE +- **Required:** No +- **Description:** File containing all signing certificates excepted, will be used to specify the `Acceptable client certificate CA names` send to the client, during TLS handshake, sets the apache httpd parameter `SSLCADNRequestFile`; if omitted all entries from `SSL_CA_CERTIFICATE_FILE` are used +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/ssl_ca_dn_request_file.pem` + + +### SSL_CERTIFICATE_CHAIN_FILE +- **Required:** No +- **Description:** Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter `SSLCertificateChainFile`; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via `SSL_CERTIFICATE_FILE` contains the certificate chain +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/ssl_certificate_chain_file.pem` + + +### SSL_CERTIFICATE_FILE +- **Required:** Yes +- **Description:** Server certificate file, PEM encoded, sets the apache httpd parameter `SSLCertificateFile` +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/ssl_certificate_file.pem` + + +### SSL_CERTIFICATE_KEY_FILE +- **Required:** Yes +- **Description:** Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter `SSLCertificateKeyFile` +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/ssl_certificate_key_file.pem` + + +### SSL_VERIFY_CLIENT +- **Required:** No +- **Description:** Modifies the apache mod_ssl config parameter `SSLVerifyClient` +- **Recommendation:** Set to `optional` when using OIDC authentication +- **Default:** `require` diff --git a/docs/src/v1.6.0/maintain/bpe/README.md b/docs/src/v1.6.0/maintain/bpe/README.md new file mode 100644 index 000000000..669fe4a4a --- /dev/null +++ b/docs/src/v1.6.0/maintain/bpe/README.md @@ -0,0 +1,8 @@ +--- +title: BPE Server +icon: module +--- +## Overview +- [Configuration Parameters](configuration) +- [Access Control](access-control) +- [OpenID Connect](oidc) diff --git a/docs/src/v1.6.0/maintain/bpe/access-control.md b/docs/src/v1.6.0/maintain/bpe/access-control.md new file mode 100644 index 000000000..e51587c62 --- /dev/null +++ b/docs/src/v1.6.0/maintain/bpe/access-control.md @@ -0,0 +1,104 @@ +--- +title: Access Control +icon: config +--- + +## Overview + +The DSF BPE server provides a user interface for administrators. Without any additional configuration the user interface is not accessible with the organizations X.509 client certificate or any other certificate or OpenID Connect authenticated user. + +::: tip OpenID Connect +To enable OpenID Connect authentication of local user, see the DSF BPE server OpenID Connect [configuration page](oidc). +::: + +Access to the user interface can be enabled for client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter [DEV_DSF_BPE_SERVER_ROLECONFIG](configuration#dev-dsf-bpe-server-roleconfig). The value for this environment variable is specified as YAML using the block scalar `|`. + +The listing below shows a minimal configuration to enable access for a specific client-certificate: + +```yaml + DEV_DSF_BPE_SERVER_ROLECONFIG: | + - example_read_only_role: + thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128} + dsf-role: + - ADMIN +``` +The list of user roles above contains a single rule-entry `example_read_only_role`, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles. Any string can be used as the name for the rule-enty. + +::: tip Certificate Thumbprints +SHA-512 certificate thumbprints in HEX form `[a-f0-9]{128}` can be calculated using: +```sh +certtool --fingerprint --hash=sha512 --infile=certificate.pem +``` +::: + +Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string `""` or a single block scalar `|` character as the value for the configuration parameter [DEV_DSF_BPE_SERVER_ROLECONFIG](configuration#dev-dsf-bpe-server-roleconfig) if no roles should be configured. + +## Matching Users + +To apply roles, users can be matched via the `thumbprint`, `email`, `token-role` or `token-group` properties. A single value or a list of values can be specified. + +#### thumbprint + +The property `thumbprint` can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints. + +#### email + +Using the property `email` users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the `email` [claim](https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims) from the access token will be matched against the property values. + +#### token-role and token-group + +With the properties `token-role` and `token-group` role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens. + + +## DSF and Practitioner Roles + +Two types of roles can be applied to matched users. + +#### dsf-role + +DSF roles specified via the `dsf-role` property define general access to the user interface. Allowed values are: + +`ADMIN`. + +#### practitioner-role + +The BPE server currently does not support any practionier-roles. + + +## Examples + +The first example defines a group of DSF administrators. Two client certificates match against this role: + +```yaml + DEV_DSF_BPE_SERVER_ROLECONFIG: | + - certificate-admins: + thumbprint: + - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d + - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c + dsf-role: + - ADMIN +``` + + +The second example defines a group of DSF administrators by specifying an `admin` role that gets matched against OAuth 2.0 access tokens: + +```yaml + DEV_DSF_BPE_SERVER_ROLECONFIG: | + - token-role-admins: + token-role: admin + dsf-role: + - ADMIN +``` + + +The third example allows administrator access and users e-mail addresses to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched: + +```yaml + DEV_DSF_BPE_SERVER_ROLECONFIG: | + - email-admins: + email: + - first.user@test.org + - second.user@test.org + dsf-role: + - ADMIN +``` diff --git a/docs/src/v1.6.0/maintain/bpe/configuration.md b/docs/src/v1.6.0/maintain/bpe/configuration.md new file mode 100644 index 000000000..e6cdb3b6c --- /dev/null +++ b/docs/src/v1.6.0/maintain/bpe/configuration.md @@ -0,0 +1,689 @@ +--- +title: Configuration Parameters +icon: config +--- + +### DEV_DSF_SERVER_API_HOST +- **Property:** dev.dsf.server.api.host +- **Required:** Yes +- **Description:** API connector host, default in docker image: `0.0.0.0` +- **Default:** `127.0.0.1` + + +### DEV_DSF_SERVER_API_PORT +- **Property:** dev.dsf.server.api.port +- **Required:** Yes +- **Description:** API connector port, default in docker image: `8080` + + +### DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER +- **Property:** dev.dsf.server.auth.client.certificate.header +- **Required:** Yes +- **Description:** Name of HTTP header with client certificate from reverse proxy +- **Default:** `X-ClientCert` + + +### DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW +- **Property:** dev.dsf.server.auth.oidc.authorization.code.flow +- **Required:** No +- **Description:** Set to `true` to enable OIDC authorization code flow +- **Recommendation:** Requires *DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL*, *DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID* and *DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET* to be specified +- **Default:** `false` + + +### DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT +- **Property:** dev.dsf.server.auth.oidc.back.channel.logout +- **Required:** No +- **Description:** Set to `true` to enable OIDC back-channel logout +- **Recommendation:** Requires *DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW* to be set to `true` (enabled), *DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID* and *DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH* to be specified +- **Default:** `false` + + +### DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH +- **Property:** dev.dsf.server.auth.oidc.back.channel.logout.path +- **Required:** No +- **Description:** Path called by the OIDC provide to request back-channel logout +- **Default:** `/back-channel-logout` + + +### DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN +- **Property:** dev.dsf.server.auth.oidc.bearer.token +- **Required:** No +- **Description:** Set to `true` to enable OIDC bearer token authentication +- **Recommendation:** Requires *DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL* to be specified +- **Default:** `false` + + +### DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID +- **Property:** dev.dsf.server.auth.oidc.client.id +- **Required:** No +- **Description:** OIDC provider client_id, must be specified if *DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW* is enabled + + +### DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET +- **Property:** dev.dsf.server.auth.oidc.client.secret +- **Required:** No +- **Description:** OIDC provider client_secret, must be specified if *DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW* is enabled + + +### DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE +- **Property:** dev.dsf.server.auth.oidc.provider.client.certificate +- **Required:** No +- **Description:** PEM encoded file with client certificate for https connections to the OIDC provider +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/oidc_provider_client_certificate.pem` + + +### DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY +- **Property:** dev.dsf.server.auth.oidc.provider.client.certificate.private.key +- **Required:** No +- **Description:** Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use *DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or *DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* if private key is encrypted +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/oidc_provider_client_certificate_private_key.pem` + + +### DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE +- **Property:** dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password +- **Required:** No +- **Description:** Password to decrypt the client certificate for the OIDC provider encrypted private key +- **Recommendation:** Use docker secret file to configure using *DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* +- **Example:** `/run/secrets/oidc_provider_client_certificate_private_key.pem.password` + + +### DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT +- **Property:** dev.dsf.server.auth.oidc.provider.client.connectTimeout +- **Required:** No +- **Description:** OIDC provider client connect timeout in milliseconds +- **Default:** `5000` + + +### DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT +- **Property:** dev.dsf.server.auth.oidc.provider.client.idleTimeout +- **Required:** No +- **Description:** OIDC provider client idle timeout in milliseconds +- **Default:** `30000` + + +### DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS +- **Property:** dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas +- **Required:** No +- **Description:** PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/oidc_provider_trust_certificates.pem` + + +### DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL +- **Property:** dev.dsf.server.auth.oidc.provider.realm.base.url +- **Required:** No +- **Description:** OIDC provider realm base url +- **Example:** `https://keycloak.test.com:8443/realms/example-realm-name` + + +### DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS +- **Property:** dev.dsf.server.auth.trust.client.certificate.cas +- **Required:** Yes +- **Description:** PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/app_client_trust_certificates.pem` + + +### DEV_DSF_SERVER_CERTIFICATE +- **Property:** dev.dsf.server.certificate +- **Required:** No +- **Description:** Server certificate file for testing +- **Recommendation:** Only specify For testing when terminating TLS in jetty server + + +### DEV_DSF_SERVER_CERTIFICATE_CHAIN +- **Property:** dev.dsf.server.certificate.chain +- **Required:** No +- **Description:** Server certificate chain file for testing +- **Recommendation:** Only specify For testing when terminating TLS in jetty server + + +### DEV_DSF_SERVER_CERTIFICATE_KEY +- **Property:** dev.dsf.server.certificate.key +- **Required:** No +- **Description:** Server certificate private key file for testing +- **Recommendation:** Only specify For testing when terminating TLS in jetty server + + +### DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE +- **Property:** dev.dsf.server.certificate.key.password +- **Required:** No +- **Description:** Server certificate private key file password for testing +- **Recommendation:** Only specify For testing when terminating TLS in jetty server + + +### DEV_DSF_SERVER_CONTEXT_PATH +- **Property:** dev.dsf.server.context.path +- **Required:** Yes +- **Description:** Web application context path, default in `bpe` docker image: `/bpe`, default in `fhir` docker image: `/fhir` +- **Recommendation:** Only modify for testing + + +### DEV_DSF_SERVER_STATUS_HOST +- **Property:** dev.dsf.server.status.host +- **Required:** Yes +- **Description:** Status connector host +- **Default:** `127.0.0.1` + + +### DEV_DSF_SERVER_STATUS_PORT +- **Property:** dev.dsf.server.status.port +- **Required:** Yes +- **Description:** Status connector port, default in docker image: `10000` + + +### DEV_DSF_BPE_DB_LIQUIBASE_FORCEUNLOCK +- **Property:** dev.dsf.bpe.db.liquibase.forceUnlock +- **Required:** No +- **Description:** To force liquibase to unlock the migration lock set to `true` +- **Recommendation:** Only use this option temporarily to unlock a stuck DB migration step +- **Default:** `false` + + +### DEV_DSF_BPE_DB_LIQUIBASE_LOCKWAITTIME +- **Property:** dev.dsf.bpe.db.liquibase.lockWaitTime +- **Required:** No +- **Description:** Liquibase change lock wait time in minutes, default 2 minutes +- **Default:** `2` + + +### DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD or DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE +- **Property:** dev.dsf.bpe.db.liquibase.password +- **Required:** Yes +- **Description:** The password to access the database from the DSF BPE server to execute database migrations +- **Recommendation:** Use docker secret file to configure by using *DEV_DSF_BPE_DB_LIQUIBASE_PASSWORD_FILE* +- **Example:** `/run/secrets/db_liquibase.password` + + +### DEV_DSF_BPE_DB_LIQUIBASE_USERNAME +- **Property:** dev.dsf.bpe.db.liquibase.username +- **Required:** No +- **Description:** The user name to access the database from the DSF BPE server to execute database migrations +- **Default:** `liquibase_user` + + +### DEV_DSF_BPE_DB_URL +- **Property:** dev.dsf.bpe.db.url +- **Required:** Yes +- **Description:** Address of the database used for the DSF BPE server +- **Recommendation:** Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose +- **Example:** `jdbc:postgresql://db/bpe` + + +### DEV_DSF_BPE_DB_USER_CAMUNDA_GROUP +- **Property:** dev.dsf.bpe.db.user.camunda.group +- **Required:** No +- **Description:** The name of the user group to access the database from the DSF BPE server for camunda processes +- **Default:** `camunda_users` + + +### DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD or DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE +- **Property:** dev.dsf.bpe.db.user.camunda.password +- **Required:** Yes +- **Description:** Password to access the database from the DSF BPE server for camunda processes +- **Recommendation:** Use docker secret file to configure using *DEV_DSF_BPE_DB_USER_CAMUNDA_PASSWORD_FILE* +- **Example:** `/run/secrets/db_user_camunda.password` + + +### DEV_DSF_BPE_DB_USER_CAMUNDA_USERNAME +- **Property:** dev.dsf.bpe.db.user.camunda.username +- **Required:** No +- **Description:** Username to access the database from the DSF BPE server for camunda processes +- **Recommendation:** Use a different user then in *DEV_DSF_BPE_DB_USER_USERNAME* +- **Default:** `camunda_server_user` + + +### DEV_DSF_BPE_DB_USER_GROUP +- **Property:** dev.dsf.bpe.db.user.group +- **Required:** No +- **Description:** The name of the user group to access the database from the DSF BPE server +- **Default:** `bpe_users` + + +### DEV_DSF_BPE_DB_USER_PASSWORD or DEV_DSF_BPE_DB_USER_PASSWORD_FILE +- **Property:** dev.dsf.bpe.db.user.password +- **Required:** Yes +- **Description:** Password to access the database from the DSF BPE server +- **Recommendation:** Use docker secret file to configure using *DEV_DSF_BPE_DB_USER_PASSWORD_FILE* +- **Example:** `/run/secrets/db_user.password` + + +### DEV_DSF_BPE_DB_USER_USERNAME +- **Property:** dev.dsf.bpe.db.user.username +- **Required:** No +- **Description:** Username to access the database from the DSF BPE server +- **Default:** `bpe_server_user` + + +### DEV_DSF_BPE_DEBUG_LOG_MESSAGE_CURRENTUSER +- **Property:** dev.dsf.bpe.debug.log.message.currentUser +- **Required:** No +- **Description:** To enable logging of the currently requesting user set to `true`. +- **Recommendation:** This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log! +- **Default:** `false` + + +### DEV_DSF_BPE_DEBUG_LOG_MESSAGE_DBSTATEMENT +- **Property:** dev.dsf.bpe.debug.log.message.dbStatement +- **Required:** No +- **Description:** To enable logging of DB queries set to `true`. +- **Recommendation:** This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log! +- **Default:** `false` + + +### DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYEND +- **Property:** dev.dsf.bpe.debug.log.message.onActivityEnd +- **Required:** No +- **Description:** To enable debug log messages for every bpmn activity end, set to `true`. +- **Recommendation:** This debug function should only be activated during process plugin development. +- **Default:** `false` + + +### DEV_DSF_BPE_DEBUG_LOG_MESSAGE_ONACTIVITYSTART +- **Property:** dev.dsf.bpe.debug.log.message.onActivityStart +- **Required:** No +- **Description:** To enable debug log messages for every bpmn activity start, set to `true`. +- **Recommendation:** This debug function should only be activated during process plugin development. +- **Default:** `false` + + +### DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLES +- **Property:** dev.dsf.bpe.debug.log.message.variables +- **Required:** No +- **Description:** To enable logging of bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to `true`. +- **Recommendation:** This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log! +- **Default:** `false` + + +### DEV_DSF_BPE_DEBUG_LOG_MESSAGE_VARIABLESLOCAL +- **Property:** dev.dsf.bpe.debug.log.message.variablesLocal +- **Required:** No +- **Description:** To enable logging of local bpmn variables for every bpmn activity start or end, when logging of these events is enabled, set to `true`. +- **Recommendation:** This debug function should only be activated during process plugin development. WARNNING: Confidential information may be leaked via the debug log! +- **Default:** `false` + + +### DEV_DSF_BPE_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST +- **Property:** dev.dsf.bpe.debug.log.message.webserviceRequest +- **Required:** No +- **Description:** To enable logging of webservices requests set to `true`. +- **Recommendation:** This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log! +- **Default:** `false` + + +### DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE +- **Property:** dev.dsf.bpe.fhir.client.certificate +- **Required:** Yes +- **Description:** PEM encoded file with local client certificate for https connections to local and remote DSF FHIR servers +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/app_client_certificate.pem` + + +### DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY +- **Property:** dev.dsf.bpe.fhir.client.certificate.private.key +- **Required:** Yes +- **Description:** Private key corresponding to the local client certificate as PEM encoded file. Use DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or *DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* if private key is encrypted +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/app_client_certificate_private_key.pem` + + +### DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE +- **Property:** dev.dsf.bpe.fhir.client.certificate.private.key.password +- **Required:** No +- **Description:** Password to decrypt the local client certificate encrypted private key +- **Recommendation:** Use docker secret file to configure using *DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* +- **Example:** `/run/secrets/app_client_certificate_private_key.pem.password` + + +### DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_CONNECT +- **Property:** dev.dsf.bpe.fhir.client.local.timeout.connect +- **Required:** No +- **Description:** Timeout in milliseconds until a connection is established with the local DSF FHIR server +- **Recommendation:** Change default value only if timeout exceptions occur +- **Default:** `2000` + + +### DEV_DSF_BPE_FHIR_CLIENT_LOCAL_TIMEOUT_READ +- **Property:** dev.dsf.bpe.fhir.client.local.timeout.read +- **Required:** No +- **Description:** Timeout in milliseconds until reading a resource from the local DSF FHIR server is aborted +- **Recommendation:** Change default value only if timeout exceptions occur +- **Default:** `60000` + + +### DEV_DSF_BPE_FHIR_CLIENT_LOCAL_VERBOSE +- **Property:** dev.dsf.bpe.fhir.client.local.verbose +- **Required:** No +- **Description:** To enable verbose logging of requests to and replies from the local DSF FHIR server, set to `true` +- **Default:** `false` + + +### DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_CONNECT +- **Property:** dev.dsf.bpe.fhir.client.remote.timeout.connect +- **Required:** No +- **Description:** Timeout in milliseconds until a connection is established with a remote DSF FHIR server +- **Recommendation:** Change default value only if timeout exceptions occur +- **Default:** `5000` + + +### DEV_DSF_BPE_FHIR_CLIENT_REMOTE_TIMEOUT_READ +- **Property:** dev.dsf.bpe.fhir.client.remote.timeout.read +- **Required:** No +- **Description:** Timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted +- **Recommendation:** Change default value only if timeout exceptions occur +- **Default:** `60000` + + +### DEV_DSF_BPE_FHIR_CLIENT_REMOTE_VERBOSE +- **Property:** dev.dsf.bpe.fhir.client.remote.verbose +- **Required:** No +- **Description:** To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to `true` +- **Default:** `false` + + +### DEV_DSF_BPE_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS +- **Property:** dev.dsf.bpe.fhir.client.trust.server.certificate.cas +- **Required:** Yes +- **Description:** PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to local and remote DSF FHIR servers +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/app_client_trust_certificates.pem` + + +### DEV_DSF_BPE_FHIR_QUESTIONNAIRE_RESPONSE_SUBSCRIPTION_SEARCH_PARAMETER +- **Property:** dev.dsf.bpe.fhir.questionnaire.response.subscription.search.parameter +- **Required:** No +- **Description:** Subscription to receive notifications about questionnaire response resources from the DSF FHIR server +- **Default:** `?criteria=QuestionnaireResponse%3Fstatus%3Dcompleted&status=active&type=websocket&payload=application/fhir%2Bjson` + + +### DEV_DSF_BPE_FHIR_SERVER_BASE_URL +- **Property:** dev.dsf.bpe.fhir.server.base.url +- **Required:** Yes +- **Description:** Base address of the local DSF FHIR server to read/store fhir resources +- **Example:** `https://foo.bar/fhir` + + +### DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_MAX +- **Property:** dev.dsf.bpe.fhir.task.subscription.retry.max +- **Required:** No +- **Description:** Number of retries until a websocket connection can be established with the DSF FHIR server, `-1` means infinite number of retries +- **Default:** `-1` + + +### DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_RETRY_SLEEP +- **Property:** dev.dsf.bpe.fhir.task.subscription.retry.sleep +- **Required:** No +- **Description:** Milliseconds between two retries to establish a websocket connection with the DSF FHIR server +- **Default:** `5000` + + +### DEV_DSF_BPE_FHIR_TASK_SUBSCRIPTION_SEARCH_PARAMETER +- **Property:** dev.dsf.bpe.fhir.task.subscription.search.parameter +- **Required:** No +- **Description:** Subscription to receive notifications about task resources from the DSF FHIR server +- **Default:** `?criteria=Task%3Fstatus%3Drequested&status=active&type=websocket&payload=application/fhir%2Bjson` + + +### DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE +- **Property:** dev.dsf.bpe.mail.client.certificate +- **Required:** No +- **Description:** PEM encoded file with client certificate used to authenticate against the SMTP server. Requires SMTP over TLS to be enabled via *DEV_DSF_BPE_MAIL_USESMTPS* +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/smtp_server_client_certificate.pem` + + +### DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY +- **Property:** dev.dsf.bpe.mail.client.certificate.private.key +- **Required:** No +- **Description:** Private key corresponging to the SMTP server client certificate as PEM encoded file. Use DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or *DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* if private key is encrypted. Requires SMTP over TLS to be enabled via *DEV_DSF_BPE_MAIL_USESMTPS* +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/smtp_server_client_certificate_private_key.pem` + + +### DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE +- **Property:** dev.dsf.bpe.mail.client.certificate.private.key.password +- **Required:** No +- **Description:** Password to decrypt the local client certificate encrypted private key +- **Recommendation:** Use docker secret file to configure using *DEV_DSF_BPE_MAIL_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* +- **Example:** `/run/secrets/smtp_server_client_certificate_private_key.pem.password` + + +### DEV_DSF_BPE_MAIL_FROMADDRESS +- **Property:** dev.dsf.bpe.mail.fromAddress +- **Required:** No +- **Description:** Mail service sender address +- **Example:** `sender@localhost` + + +### DEV_DSF_BPE_MAIL_HOST +- **Property:** dev.dsf.bpe.mail.host +- **Required:** No +- **Description:** SMTP server hostname +- **Example:** `smtp.server.de` + + +### DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTBUFFERSIZE +- **Property:** dev.dsf.bpe.mail.mailOnErrorLogEventBufferSize +- **Required:** No +- **Description:** Number of previous INFO, WARN log messages to include in ERROR log event mails (>=0). Requires send mail on ERROR log event option to be enabled to have an effect. +- **Default:** `4` + + +### DEV_DSF_BPE_MAIL_MAILONERRORLOGEVENTDEBUGLOGLOCATION +- **Property:** dev.dsf.bpe.mail.mailOnErrorLogEventDebugLogLocation +- **Required:** No +- **Description:** Location of the BPE debug log as displayed in the footer of ERROR log event mails, does not modify the actual location of the debug log file. Requires send mail on ERROR log event option to be enabled to have an effect. +- **Default:** `/opt/bpe/log/bpe.log` + + +### DEV_DSF_BPE_MAIL_PASSWORD or DEV_DSF_BPE_MAIL_PASSWORD_FILE +- **Property:** dev.dsf.bpe.mail.password +- **Required:** No +- **Description:** SMTP server authentication password +- **Recommendation:** Configure if the SMTP server reqiures username/password authentication; use docker secret file to configure using *DEV_DSF_BPE_MAIL_PASSWORD_FILE*; enable SMTP over TLS via *DEV_DSF_BPE_MAIL_USESMTPS* + + +### DEV_DSF_BPE_MAIL_PORT +- **Property:** dev.dsf.bpe.mail.port +- **Required:** No +- **Description:** SMTP server port +- **Example:** `465` +- **Default:** `0` + + +### DEV_DSF_BPE_MAIL_REPLYTOADDRESSES +- **Property:** dev.dsf.bpe.mail.replyToAddresses +- **Required:** No +- **Description:** Mail service reply to addresses; comma or space separated list, YAML block scalars supported +- **Example:** `reply.to@localhost` + + +### DEV_DSF_BPE_MAIL_SENDMAILONERRORLOGEVENT +- **Property:** dev.dsf.bpe.mail.sendMailOnErrorLogEvent +- **Required:** No +- **Description:** To enable mails being send for every ERROR logged, set to `true`. Requires SMTP server to be configured. +- **Default:** `false` + + +### DEV_DSF_BPE_MAIL_SENDTESTMAILONSTARTUP +- **Property:** dev.dsf.bpe.mail.sendTestMailOnStartup +- **Required:** No +- **Description:** To enable a test mail being send on startup of the BPE, set to `true`. Requires SMTP server to be configured. +- **Default:** `false` + + +### DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE +- **Property:** dev.dsf.bpe.mail.smime.p12Keystore +- **Required:** No +- **Description:** PKCS12 encoded file with S/MIME certificate, private key and certificate chain to enable send mails to be S/MIME signed +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/smime_certificate.p12` + + +### DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD or DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE +- **Property:** dev.dsf.bpe.mail.smime.p12Keystore.password +- **Required:** No +- **Description:** Password to decrypt the PKCS12 encoded S/MIMIE certificate file +- **Recommendation:** Use docker secret file to configure using *DEV_DSF_BPE_MAIL_SMIME_P12KEYSTORE_PASSWORD_FILE* +- **Example:** `/run/secrets/smime_certificate.p12.password` + + +### DEV_DSF_BPE_MAIL_TOADDRESSES +- **Property:** dev.dsf.bpe.mail.toAddresses +- **Required:** No +- **Description:** Mail service recipient addresses, configure at least one; comma or space separated list, YAML block scalars supported +- **Example:** `recipient@localhost` + + +### DEV_DSF_BPE_MAIL_TOADDRESSESCC +- **Property:** dev.dsf.bpe.mail.toAddressesCc +- **Required:** No +- **Description:** Mail service CC recipient addresses; comma or space separated list, YAML block scalars supported +- **Example:** `cc.recipient@localhost` + + +### DEV_DSF_BPE_MAIL_TRUST_SERVER_CERTIFICATE_CAS +- **Property:** dev.dsf.bpe.mail.trust.server.certificate.cas +- **Required:** No +- **Description:** PEM encoded file with one or more trusted root certificates to validate the server certificate of the SMTP server. Requires SMTP over TLS to be enabled via *DEV_DSF_BPE_MAIL_USESMTPS* +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/smtp_server_trust_certificates.pem` + + +### DEV_DSF_BPE_MAIL_USERNAME +- **Property:** dev.dsf.bpe.mail.username +- **Required:** No +- **Description:** SMTP server authentication username +- **Recommendation:** Configure if the SMTP server reqiures username/password authentication; enable SMTP over TLS via *DEV_DSF_BPE_MAIL_USESMTPS* + + +### DEV_DSF_BPE_MAIL_USESMTPS +- **Property:** dev.dsf.bpe.mail.useSmtps +- **Required:** No +- **Description:** To enable SMTP over TLS (smtps), set to `true` +- **Default:** `false` + + +### DEV_DSF_BPE_PROCESS_ENGINE_COREPOOLSIZE +- **Property:** dev.dsf.bpe.process.engine.corePoolSize +- **Required:** No +- **Description:** Process engine job executor core pool size +- **Default:** `4` + + +### DEV_DSF_BPE_PROCESS_ENGINE_MAXPOOLSIZE +- **Property:** dev.dsf.bpe.process.engine.maxPoolSize +- **Required:** No +- **Description:** Process engine job executor max pool size, additional threads until max pool size are created if the queue is full +- **Default:** `10` + + +### DEV_DSF_BPE_PROCESS_ENGINE_QUEUESIZE +- **Property:** dev.dsf.bpe.process.engine.queueSize +- **Required:** No +- **Description:** Process engine job executor queue size, jobs are added to the queue if all core pool threads are busy +- **Default:** `40` + + +### DEV_DSF_BPE_PROCESS_EXCLUDED +- **Property:** dev.dsf.bpe.process.excluded +- **Required:** No +- **Description:** List of process names that should be excluded from deployment during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported +- **Recommendation:** Only deploy processes that can be started depending on your organization's roles in the Allow-List +- **Example:** `dsfdev_updateAllowList|1.0, another_process|x.y` + + +### DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_MAX +- **Property:** dev.dsf.bpe.process.fhir.server.retry.max +- **Required:** No +- **Description:** Number of retries until a connection can be established with the local DSF FHIR server during process deployment, `-1` means infinite number of retries +- **Default:** `-1` + + +### DEV_DSF_BPE_PROCESS_FHIR_SERVER_RETRY_SLEEP +- **Property:** dev.dsf.bpe.process.fhir.server.retry.sleep +- **Required:** No +- **Description:** Milliseconds between two retries to establish a connection with the local DSF FHIR server during process deployment +- **Default:** `5000` + + +### DEV_DSF_BPE_PROCESS_PLUGIN_DIRECTROY +- **Property:** dev.dsf.bpe.process.plugin.directroy +- **Required:** No +- **Description:** Directory containing the DSF BPE process plugins for deployment on startup of the DSF BPE server +- **Recommendation:** Change only if you don't use the provided directory structure from the installation guide or made changes to tit +- **Default:** `process` + + +### DEV_DSF_BPE_PROCESS_RETIRED +- **Property:** dev.dsf.bpe.process.retired +- **Required:** No +- **Description:** List of already deployed process names that should be retired during startup of the DSF BPE server; comma or space separated list, YAML block scalars supported +- **Recommendation:** Retire processes that where deployed previously but are not anymore available +- **Example:** `old_process|x.y` + + +### DEV_DSF_BPE_PROCESS_THREADS +- **Property:** dev.dsf.bpe.process.threads +- **Required:** No +- **Description:** Number of parallel Task / QuestionnaireResponse threads to start new or continue existing processes, a value `<= 0` means number of cpu cores +- **Default:** `-1` + + +### DEV_DSF_BPE_SERVER_BASE_URL +- **Property:** dev.dsf.bpe.server.base.url +- **Required:** No +- **Description:** Base address of the BPE server, configure when exposing the web-ui +- **Example:** `https://foo.bar/bpe` +- **Default:** `https` + + +### DEV_DSF_BPE_SERVER_ROLECONFIG +- **Property:** dev.dsf.bpe.server.roleConfig +- **Required:** No +- **Description:** Role config YAML as defined in [FHIR Server: Access Control](access-control). + + +### DEV_DSF_BPE_SERVER_STATIC_RESOURCE_CACHE +- **Property:** dev.dsf.bpe.server.static.resource.cache +- **Required:** No +- **Description:** To disable static resource caching, set to `false` +- **Recommendation:** Only set to `false` for development +- **Default:** `true` + + +### DEV_DSF_BPE_SERVER_UI_THEME +- **Property:** dev.dsf.bpe.server.ui.theme +- **Required:** No +- **Description:** UI theme parameter, adds a color indicator to the ui to distinguish `dev`, `test` and `prod` environments im configured; supported values: `dev`, `test` and `prod` + + +### DEV_DSF_PROXY_NOPROXY +- **Property:** dev.dsf.proxy.noProxy +- **Required:** No +- **Description:** Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported +- **Example:** `foo.bar, test.com:8080` + + +### DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE +- **Property:** dev.dsf.proxy.password +- **Required:** No +- **Description:** Forward Proxy password +- **Recommendation:** Configure password if proxy requires authentication, use docker secret file to configure using *DEV_DSF_PROXY_PASSWORD_FILE* + + +### DEV_DSF_PROXY_URL +- **Property:** dev.dsf.proxy.url +- **Required:** No +- **Description:** Forward (http/https) proxy url, use *DEV_DSF_BPE_PROXY_NOPROXY* to list domains that do not require a forward proxy +- **Example:** `http://proxy.foo:8080` + + +### DEV_DSF_PROXY_USERNAME +- **Property:** dev.dsf.proxy.username +- **Required:** No +- **Description:** Forward proxy username +- **Recommendation:** Configure username if proxy requires authentication \ No newline at end of file diff --git a/docs/src/v1.6.0/maintain/bpe/oidc.md b/docs/src/v1.6.0/maintain/bpe/oidc.md new file mode 100644 index 000000000..5ba035d2c --- /dev/null +++ b/docs/src/v1.6.0/maintain/bpe/oidc.md @@ -0,0 +1,56 @@ +--- +title: OpenID Connect +icon: config +--- + +## Overview +Access to the DSF BPE server user interface can be configured via [access control roles](access-control). By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled. + +The DSF BPE server supports [Authorization Code Flow](https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth) for the user interface. [Back-Channel Logout](https://openid.net/specs/openid-connect-backchannel-1_0.html) is also supported. + + +::: tip BPE Reverse Proxy +The DSF BPE reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter [SSL_VERIFY_CLIENT](configuration/reverseproxy.html#ssl-verify-client) needs to be set to `optional`. +::: + + +## Authorization Code Flow + +To enable authentication via OpenID Connect authorization code flow, set the configuration parameter [DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW](configuration#dev-dsf-server-auth-oidc-authorization-code-flow) to `true` and specify the following parameters: + +- [DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL](configuration#dev-dsf-server-auth-oidc-provider-realm-base-url) +- [DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID](configuration#dev-dsf-server-auth-oidc-client-id) +- [DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET](configuration#dev-dsf-server-auth-oidc-client-secret) + +Optionally, back channel logout can be enabled by setting [DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT](configuration#dev-dsf-server-auth-oidc-back-channel-logout) to `true`. The DSF BPE server accepts logout tokens at [DEV_DSF_BPE_SERVER_BASE_URL](configuration#dev-dsf-bpe-server-base-url) + `/back-channel-logout`. The path can be modified via [DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH](configuration#dev-dsf-server-auth-oidc-back-channel-logout-path). + +## Additional ODIC Configuration Parameter + +A number of additional `DEV_DSF_SERVER_AUTH_OIDC ...` configuration parameter are specify on the DSF BPE server [configuration parameter page](configuration). + +For example the configuration parameter [DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS](configuration#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas) can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection. + + +## Example +```yaml +services: + app: + image: ghcr.io/datasharingframework/bpe:1.5.2 + # ... + secrets: + - keycloak_root_ca.pem + # ... + environment: + # ... + DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW: 'true' + DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT: 'true' + DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN: 'true' + DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL: https://keycloak.test.org/realms/dsf + DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/keycloak_root_ca.pem + DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID: dsf-bpe + DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET: n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3 + # ... +secrets: + keycloak_root_ca.pem: + file: ./secrets/keycloak_root_ca.pem +``` \ No newline at end of file diff --git a/docs/src/v1.6.0/maintain/fhir-reverse-proxy/README.md b/docs/src/v1.6.0/maintain/fhir-reverse-proxy/README.md new file mode 100644 index 000000000..d88afe12a --- /dev/null +++ b/docs/src/v1.6.0/maintain/fhir-reverse-proxy/README.md @@ -0,0 +1,6 @@ +--- +title: FHIR Reverse Proxy +icon: module +--- +## Overview +- [Configuration Parameters](configuration) diff --git a/docs/src/v1.6.0/maintain/fhir-reverse-proxy/configuration.md b/docs/src/v1.6.0/maintain/fhir-reverse-proxy/configuration.md new file mode 100644 index 000000000..7a666bc16 --- /dev/null +++ b/docs/src/v1.6.0/maintain/fhir-reverse-proxy/configuration.md @@ -0,0 +1,87 @@ +--- +title: Configuration Parameters +icon: config +--- + +### APP_SERVER_IP +- **Required:** Yes +- **Description:** Hostname or IP-Address of the DSF FHIR server application container, the reverse proxy target +- **Example:** `app`, `172.28.1.3` + + +### HTTPS_SERVER_NAME_PORT +- **Required:** Yes +- **Description:** External FQDN of your DSF FHIR server with port, typically `443` +- **Example:** `my-external.fqdn:443` + + +### PROXY_PASS_CONNECTION_TIMEOUT_HTTP +- **Required:** No +- **Description:** Connection timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a connection to be established +- **Default:** `30` seconds + + +### PROXY_PASS_CONNECTION_TIMEOUT_WS +- **Required:** No +- **Description:** Connection timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a connection to be established +- **Default:** `30` seconds + + +### PROXY_PASS_TIMEOUT_HTTP +- **Required:** No +- **Description:** Timeout (seconds) for reverse proxy to app server http connection, time the proxy waits for a reply +- **Default:** `60` seconds + + +### PROXY_PASS_TIMEOUT_WS +- **Required:** No +- **Description:** Timeout (seconds) for reverse proxy to app server ws connection, time the proxy waits for a reply +- **Default:** `60` seconds + + +### SERVER_CONTEXT_PATH +- **Required:** No +- **Description:** Reverse proxy context path that delegates to the app server, `/` character at start, no `/` character at end, use `''` (empty string) to configure root as context path. +- **Default:** `/fhir` + + +### SSL_CA_CERTIFICATE_FILE +- **Required:** Yes +- **Description:** Certificate chain file including all signing, intermediate and ca certificate used to validate client certificates, PEM encoded, sets the apache httpd parameter `SSLCACertificateFile` +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/ssl_ca_certificate_file.pem` + + +### SSL_CA_DN_REQUEST_FILE +- **Required:** No +- **Description:** File containing all signing certificates excepted, will be used to specify the `Acceptable client certificate CA names` send to the client, during TLS handshake, sets the apache httpd parameter `SSLCADNRequestFile`; if omitted all entries from `SSL_CA_CERTIFICATE_FILE` are used +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/ssl_ca_dn_request_file.pem` + + +### SSL_CERTIFICATE_CHAIN_FILE +- **Required:** No +- **Description:** Certificate chain file, PEM encoded, must contain all certificates between the server certificate and the root ca certificate, sets the apache httpd parameter `SSLCertificateChainFile`; can be omitted if either no chain is needed (aka self signed server certificate) or the file specified via `SSL_CERTIFICATE_FILE` contains the certificate chain +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/ssl_certificate_chain_file.pem` + + +### SSL_CERTIFICATE_FILE +- **Required:** Yes +- **Description:** Server certificate file, PEM encoded, sets the apache httpd parameter `SSLCertificateFile` +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/ssl_certificate_file.pem` + + +### SSL_CERTIFICATE_KEY_FILE +- **Required:** Yes +- **Description:** Server certificate private key file, PEM encoded, unencrypted, sets the apache httpd parameter `SSLCertificateKeyFile` +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/ssl_certificate_key_file.pem` + + +### SSL_VERIFY_CLIENT +- **Required:** No +- **Description:** Modifies the apache mod_ssl config parameter `SSLVerifyClient` +- **Recommendation:** Set to `optional` when using OIDC authentication +- **Default:** `require` diff --git a/docs/src/v1.6.0/maintain/fhir/README.md b/docs/src/v1.6.0/maintain/fhir/README.md new file mode 100644 index 000000000..cedc99c38 --- /dev/null +++ b/docs/src/v1.6.0/maintain/fhir/README.md @@ -0,0 +1,8 @@ +--- +title: FHIR Server +icon: module +--- +## Overview +- [Configuration Parameters](configuration) +- [Access Control](access-control) +- [OpenID Connect](oidc) diff --git a/docs/src/v1.6.0/maintain/fhir/access-control.md b/docs/src/v1.6.0/maintain/fhir/access-control.md new file mode 100644 index 000000000..60e7162b7 --- /dev/null +++ b/docs/src/v1.6.0/maintain/fhir/access-control.md @@ -0,0 +1,129 @@ +--- +title: Access Control +icon: config +--- + +## Overview + +The DSF FHIR server implements a subset of the FHIR R4 [REST API](http://hl7.org/fhir/R4/http.html). When accessing the API with a web browser a limited graphical user interface is shown. Without any additional configuration the API and user interface is only accessible with the X.509 client certificate configured for the organization via the configuration parameter: [DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT](configuration#dev-dsf-fhir-server-organization-thumbprint) + +::: tip OpenID Connect +To enable OpenID Connect authentication of local user, see the DSF FHIR server OpenID Connect [configuration page](oidc). +::: + +Access to the API and user interface can be enabled for additional client certificates and local users authenticating via OAuth 2.0 OpenID Connect. Access can be configured for so called roles, with all roles specified using the configuration parameter [DEV_DSF_FHIR_SERVER_ROLECONFIG](configuration#dev-dsf-fhir-server-roleconfig). The value for this environment variable is specified as YAML using the block scalar `|`. + +The listing below shows a minimal configuration to enable read access for a specific client-certificate: + +```yaml + DEV_DSF_FHIR_SERVER_ROLECONFIG: | + - example_read_only_role: + thumbprint: 00474993fa261b0225f93c5a66aa6fcc... [a-f0-9]{128} + dsf-role: + - READ + - SEARCH + - HISTORY +``` +The list of user roles above contains a single rule-entry `example_read_only_role`, matching the user via a client certificate SHA-512 thumprint and assigning three DSF roles. Any string can be used as the name for the rule-enty. + +::: tip Certificate Thumbprints +SHA-512 certificate thumbprints in HEX form `[a-f0-9]{128}` can be calculated using: +```sh +certtool --fingerprint --hash=sha512 --infile=certificate.pem +``` +::: + +Multiple user roles can be specified and all matching roles will be applied to an authenticated users. Use an empty string `""` or a single block scalar `|` character as the value for the configuration parameter [DEV_DSF_FHIR_SERVER_ROLECONFIG](configuration#dev-dsf-fhir-server-roleconfig) if no roles should be configured. + +## Matching Users + +To apply roles, users can be matched via the `thumbprint`, `email`, `token-role` or `token-group` properties. A single value or a list of values can be specified. + +#### thumbprint + +The property `thumbprint` can used to specify one or multiple SHA-512 certificate thumbprints. Roles from this rule are applied to the authenticating user if the certificate matches one of the specified thumbprints. + +#### email + +Using the property `email` users can be matched against e-mail addresses specified in X.509 client certificates and in OpenID Connect access tokens. Values will be matched against e-mail addresses specified in the subject DN (via PKCS#9 extension 1.2.840.113549.1.9.1) and RFC-822 Name entries of the Subject Alternative Name field. If the user authenticates via OpenID Connect, the `email` [claim](https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims) from the access token will be matched against the property values. + +#### token-role and token-group + +With the properties `token-role` and `token-group` role and group names can be specified to match against role and group claims within OAuth 2.0 access tokens. + + +## DSF and Practitioner Roles + +Two types of roles can be applied to matched users. + +#### dsf-role + +DSF roles specified via the `dsf-role` property define general access to the REST API and user interface. Allowed values are: + +`CREATE`, `READ`, `UPDATE`, `DELETE`, `SEARCH`, `HISTORY`, `PERMANENT_DELETE` and `WEBSOCKET`. + +#### practitioner-role + +In order to allow users to start processes, the property `practitioner-role` can be used to assign codes from FHIR [CodeSystem](http://hl7.org/fhir/R4/codesystem.html) resources. Codes are specified in the form `system-url|code`. +If the uses has a code specified here that match with a `requester` extension within the process plugin's [ActivityDefinition](http://hl7.org/fhir/R4/activitydefinition.html) resource, the user can start the process if he also has the `dsf-role` `CREATE`. + +Process plugins can defined and use there own code-systems. However, the DSF specifies a standard set of practitioner roles within the CodeSystem `http://dsf.dev/fhir/CodeSystem/practitioner-role`: + +`UAC_USER`, `COS_USER`, `CRR_USER`, `DIC_USER`, `DMS_USER`, `DTS_USER`, `HRP_USER`, `TTP_USER`, `AMS_USER` and `DSF_ADMIN`. + + +## Examples + +The first example defines a group of DSF administrators. Two client certificates match against this role: + +```yaml + DEV_DSF_FHIR_SERVER_ROLECONFIG: | + - certificate-admins: + thumbprint: + - afb68b1d9d47e691b8b3d50fd9848467cada8b1c76f5f4b45f00c9f8432d505361a3ee27805f4aa06799d9ac8dace94b3f1942fce44d84866961259b13be825d + - 2441bfddcad97eeb83c8c31fe181b90652787b8b59bf4e569219da7db4429e389479cb7c4a2f311e34217357d594ecad7d58ccfeef2a9e93c6fcf8d98897d88c + dsf-role: + - CREATE + - READ + - UPDATE + - DELETE + - SEARCH + - HISTORY + practitioner-role: + - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN + +``` + + +The second example defines a group of DSF administrators by specifying an `admin` role that gets matched against OAuth 2.0 access tokens: + +```yaml + DEV_DSF_FHIR_SERVER_ROLECONFIG: | + - token-role-admins: + token-role: admin + dsf-role: + - CREATE + - READ + - UPDATE + - DELETE + - SEARCH + - HISTORY + practitioner-role: + - http://dsf.dev/fhir/CodeSystem/practitioner-role|DSF_ADMIN + +``` + + +The third example allows read-only access. Two e-mail addresses are used to match this role. E-mail addresses from X.509 client certificates and OAuth 2.0 access tokens are matched: + +```yaml + DEV_DSF_FHIR_SERVER_ROLECONFIG: | + - read-only: + email: + - first.user@test.org + - second.user@test.org + dsf-role: + - READ + - SEARCH + - HISTORY +``` diff --git a/docs/src/v1.6.0/maintain/fhir/configuration.md b/docs/src/v1.6.0/maintain/fhir/configuration.md new file mode 100644 index 000000000..8e0dd88f5 --- /dev/null +++ b/docs/src/v1.6.0/maintain/fhir/configuration.md @@ -0,0 +1,422 @@ +--- +title: Configuration Parameters +icon: config +--- + +### DEV_DSF_FHIR_CLIENT_CERTIFICATE +- **Property:** dev.dsf.fhir.client.certificate +- **Required:** Yes +- **Description:** PEM encoded file with local client certificate for https connections to remote DSF FHIR servers +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/app_client_certificate.pem` + + +### DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY +- **Property:** dev.dsf.fhir.client.certificate.private.key +- **Required:** Yes +- **Description:** Private key corresponding to the local client certificate as PEM encoded file. Use *DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or *DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* if private key is encrypted +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/app_client_certificate_private_key.pem` + + +### DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE +- **Property:** dev.dsf.fhir.client.certificate.private.key.password +- **Required:** No +- **Description:** Password to decrypt the local client certificate encrypted private key +- **Recommendation:** Use docker secret file to configure using *DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* +- **Example:** `/run/secrets/app_client_certificate_private_key.pem.password` + + +### DEV_DSF_FHIR_CLIENT_TIMEOUT_CONNECT +- **Property:** dev.dsf.fhir.client.timeout.connect +- **Required:** No +- **Description:** Timeout in milliseconds until a connection is established between this DSF FHIR server and a remote DSF FHIR server +- **Recommendation:** Change default value only if timeout exceptions occur +- **Default:** `2000` + + +### DEV_DSF_FHIR_CLIENT_TIMEOUT_READ +- **Property:** dev.dsf.fhir.client.timeout.read +- **Required:** No +- **Description:** Timeout in milliseconds until a reading a resource from a remote DSF FHIR server is aborted +- **Recommendation:** Change default value only if timeout exceptions occur +- **Default:** `10000` + + +### DEV_DSF_FHIR_CLIENT_TRUST_SERVER_CERTIFICATE_CAS +- **Property:** dev.dsf.fhir.client.trust.server.certificate.cas +- **Required:** Yes +- **Description:** PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to remote DSF FHIR servers +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/app_client _trust_certificates.pem` + + +### DEV_DSF_FHIR_CLIENT_VERBOSE +- **Property:** dev.dsf.fhir.client.verbose +- **Required:** No +- **Description:** To enable verbose logging of requests to and replies from remote DSF FHIR servers, set to `true` +- **Default:** `false` + + +### DEV_DSF_FHIR_DB_LIQUIBASE_FORCEUNLOCK +- **Property:** dev.dsf.fhir.db.liquibase.forceUnlock +- **Required:** No +- **Description:** To force liquibase to unlock the migration lock set to `true` +- **Recommendation:** Only use this option temporarily to unlock a stuck DB migration step +- **Default:** `false` + + +### DEV_DSF_FHIR_DB_LIQUIBASE_LOCKWAITTIME +- **Property:** dev.dsf.fhir.db.liquibase.lockWaitTime +- **Required:** No +- **Description:** Liquibase change lock wait time in minutes, default 2 minutes +- **Default:** `2` + + +### DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD or DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE +- **Property:** dev.dsf.fhir.db.liquibase.password +- **Required:** Yes +- **Description:** The password to access the database from the DSF FHIR server to execute database migrations +- **Recommendation:** Use docker secret file to configure by using *DEV_DSF_FHIR_DB_LIQUIBASE_PASSWORD_FILE* +- **Example:** `/run/secrets/db_liquibase.password` + + +### DEV_DSF_FHIR_DB_LIQUIBASE_USERNAME +- **Property:** dev.dsf.fhir.db.liquibase.username +- **Required:** No +- **Description:** The user name to access the database from the DSF FHIR server to execute database migrations +- **Default:** `liquibase_user` + + +### DEV_DSF_FHIR_DB_URL +- **Property:** dev.dsf.fhir.db.url +- **Required:** Yes +- **Description:** Address of the database used for the DSF FHIR server +- **Recommendation:** Change only if you don't use the provided docker-compose from the installation guide or made changes to the database settings/networking in the docker-compose +- **Example:** `jdbc:postgresql://db/fhir` + + +### DEV_DSF_FHIR_DB_USER_GROUP +- **Property:** dev.dsf.fhir.db.user.group +- **Required:** No +- **Description:** The name of the user group to access the database from the DSF FHIR server +- **Default:** `fhir_users` + + +### DEV_DSF_FHIR_DB_USER_PASSWORD or DEV_DSF_FHIR_DB_USER_PASSWORD_FILE +- **Property:** dev.dsf.fhir.db.user.password +- **Required:** Yes +- **Description:** Password to access the database from the DSF FHIR server +- **Recommendation:** Use docker secret file to configure using *DEV_DSF_FHIR_DB_USER_PASSWORD_FILE* +- **Example:** `/run/secrets/db_user.password` + + +### DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_GROUP +- **Property:** dev.dsf.fhir.db.user.permanent.delete.group +- **Required:** No +- **Description:** The name of the user group to access the database from the DSF FHIR server for permanent deletes +- **Default:** `fhir_permanent_delete_users` + + +### DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD or DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE +- **Property:** dev.dsf.fhir.db.user.permanent.delete.password +- **Required:** Yes +- **Description:** Password to access the database from the DSF FHIR server for permanent deletes +- **Recommendation:** Use docker secret file to configure using *DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_PASSWORD_FILE* +- **Example:** `/run/secrets/db_user_permanent_delete.password` + + +### DEV_DSF_FHIR_DB_USER_PERMANENT_DELETE_USERNAME +- **Property:** dev.dsf.fhir.db.user.permanent.delete.username +- **Required:** No +- **Description:** Username to access the database from the DSF FHIR server for permanent deletes +- **Recommendation:** Use a different user then *DEV_DSF_FHIR_DB_USER_USERNAME* +- **Default:** `fhir_server_permanent_delete_user` + + +### DEV_DSF_FHIR_DB_USER_USERNAME +- **Property:** dev.dsf.fhir.db.user.username +- **Required:** No +- **Description:** Username to access the database from the DSF FHIR server +- **Default:** `fhir_server_user` + + +### DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_CURRENTUSER +- **Property:** dev.dsf.fhir.debug.log.message.currentUser +- **Required:** No +- **Description:** To enable logging of the currently requesting user set to `true`. +- **Recommendation:** This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log! +- **Default:** `false` + + +### DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_DBSTATEMENT +- **Property:** dev.dsf.fhir.debug.log.message.dbStatement +- **Required:** No +- **Description:** To enable logging of DB queries set to `true`. +- **Recommendation:** This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log! +- **Default:** `false` + + +### DEV_DSF_FHIR_DEBUG_LOG_MESSAGE_WEBSERVICEREQUEST +- **Property:** dev.dsf.fhir.debug.log.message.webserviceRequest +- **Required:** No +- **Description:** To enable logging of webservices requests set to `true`. +- **Recommendation:** This debug function should only be activated during development. WARNNING: Confidential information may be leaked via the debug log! +- **Default:** `false` + + +### DEV_DSF_FHIR_SERVER_BASE_URL +- **Property:** dev.dsf.fhir.server.base.url +- **Required:** Yes +- **Description:** Base address of this DSF FHIR server to read/store fhir resources +- **Example:** `https://foo.bar/fhir` + + +### DEV_DSF_FHIR_SERVER_INIT_BUNDLE +- **Property:** dev.dsf.fhir.server.init.bundle +- **Required:** No +- **Description:** Fhir bundle containing the initial Allow-List, loaded on startup of the DSF FHIR server +- **Recommendation:** Change only if you don't use the provided files from the installation guide, have local changes in the Allow-List or received an Allow-List from another source +- **Default:** `conf/bundle.xml` + + +### DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE +- **Property:** dev.dsf.fhir.server.organization.identifier.value +- **Required:** Yes +- **Description:** Local identifier value used in the Allow-List +- **Recommendation:** By convention: The shortest possible FQDN that resolve the homepage of the organization +- **Example:** `hospital.com` + + +### DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT +- **Property:** dev.dsf.fhir.server.organization.thumbprint +- **Required:** Yes +- **Description:** The SHA-512 thumbprint of the local organization client certificate +- **Recommendation:** The thumbprint can be calculated via `certtool --fingerprint --hash=sha512 --infile=client_certificate.pem` + + +### DEV_DSF_FHIR_SERVER_PAGE_COUNT +- **Property:** dev.dsf.fhir.server.page.count +- **Required:** No +- **Description:** Page size returned by the DSF FHIR server when reading/searching fhir resources +- **Default:** `20` + + +### DEV_DSF_FHIR_SERVER_ROLECONFIG +- **Property:** dev.dsf.fhir.server.roleConfig +- **Required:** No +- **Description:** Role config YAML as defined in [FHIR Server: Access Control](access-control). + + +### DEV_DSF_FHIR_SERVER_STATIC_RESOURCE_CACHE +- **Property:** dev.dsf.fhir.server.static.resource.cache +- **Required:** No +- **Description:** To disable static resource caching, set to `false` +- **Recommendation:** Only set to `false` for development +- **Default:** `true` + + +### DEV_DSF_FHIR_SERVER_UI_THEME +- **Property:** dev.dsf.fhir.server.ui.theme +- **Required:** No +- **Description:** UI theme parameter, adds a color indicator to the ui to distinguish `dev`, `test` and `prod` environments im configured; supported values: `dev`, `test` and `prod` + + +### DEV_DSF_PROXY_NOPROXY +- **Property:** dev.dsf.proxy.noProxy +- **Required:** No +- **Description:** Forward proxy no-proxy list, entries will match exactly or agianst (one level) sub-domains, if no port is specified - all ports are matched; comma or space separated list, YAML block scalars supported +- **Example:** `foo.bar, test.com:8080` + + +### DEV_DSF_PROXY_PASSWORD or DEV_DSF_PROXY_PASSWORD_FILE +- **Property:** dev.dsf.proxy.password +- **Required:** No +- **Description:** Forward Proxy password +- **Recommendation:** Configure password if proxy requires authentication, use docker secret file to configure using *DEV_DSF_PROXY_PASSWORD_FILE* + + +### DEV_DSF_PROXY_URL +- **Property:** dev.dsf.proxy.url +- **Required:** No +- **Description:** Forward (http/https) proxy url, use *DEV_DSF_BPE_PROXY_NOPROXY* to list domains that do not require a forward proxy +- **Example:** `http://proxy.foo:8080` + + +### DEV_DSF_PROXY_USERNAME +- **Property:** dev.dsf.proxy.username +- **Required:** No +- **Description:** Forward proxy username +- **Recommendation:** Configure username if proxy requires authentication + + +### DEV_DSF_SERVER_API_HOST +- **Property:** dev.dsf.server.api.host +- **Required:** Yes +- **Description:** API connector host, default in docker image: `0.0.0.0` +- **Default:** `127.0.0.1` + + +### DEV_DSF_SERVER_API_PORT +- **Property:** dev.dsf.server.api.port +- **Required:** Yes +- **Description:** API connector port, default in docker image: `8080` + + +### DEV_DSF_SERVER_AUTH_CLIENT_CERTIFICATE_HEADER +- **Property:** dev.dsf.server.auth.client.certificate.header +- **Required:** Yes +- **Description:** Name of HTTP header with client certificate from reverse proxy +- **Default:** `X-ClientCert` + + +### DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW +- **Property:** dev.dsf.server.auth.oidc.authorization.code.flow +- **Required:** No +- **Description:** Set to `true` to enable OIDC authorization code flow +- **Recommendation:** Requires *DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL*, *DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID* and *DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET* to be specified +- **Default:** `false` + + +### DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT +- **Property:** dev.dsf.server.auth.oidc.back.channel.logout +- **Required:** No +- **Description:** Set to `true` to enable OIDC back-channel logout +- **Recommendation:** Requires *DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW* to be set to `true` (enabled), *DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID* and *DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH* to be specified +- **Default:** `false` + + +### DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH +- **Property:** dev.dsf.server.auth.oidc.back.channel.logout.path +- **Required:** No +- **Description:** Path called by the OIDC provide to request back-channel logout +- **Default:** `/back-channel-logout` + + +### DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN +- **Property:** dev.dsf.server.auth.oidc.bearer.token +- **Required:** No +- **Description:** Set to `true` to enable OIDC bearer token authentication +- **Recommendation:** Requires *DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL* to be specified +- **Default:** `false` + + +### DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID +- **Property:** dev.dsf.server.auth.oidc.client.id +- **Required:** No +- **Description:** OIDC provider client_id, must be specified if *DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW* is enabled + + +### DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET +- **Property:** dev.dsf.server.auth.oidc.client.secret +- **Required:** No +- **Description:** OIDC provider client_secret, must be specified if *DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW* is enabled + + +### DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE +- **Property:** dev.dsf.server.auth.oidc.provider.client.certificate +- **Required:** No +- **Description:** PEM encoded file with client certificate for https connections to the OIDC provider +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/oidc_provider_client_certificate.pem` + + +### DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY +- **Property:** dev.dsf.server.auth.oidc.provider.client.certificate.private.key +- **Required:** No +- **Description:** Private key corresponding to the client certificate for the OIDC provider as PEM encoded file. Use *DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD* or *DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* if private key is encrypted +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/oidc_provider_client_certificate_private_key.pem` + + +### DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD or DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE +- **Property:** dev.dsf.server.auth.oidc.provider.client.certificate.private.key.password +- **Required:** No +- **Description:** Password to decrypt the client certificate for the OIDC provider encrypted private key +- **Recommendation:** Use docker secret file to configure using *DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE* +- **Example:** `/run/secrets/oidc_provider_client_certificate_private_key.pem.password` + + +### DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_CONNECTTIMEOUT +- **Property:** dev.dsf.server.auth.oidc.provider.client.connectTimeout +- **Required:** No +- **Description:** OIDC provider client connect timeout in milliseconds +- **Default:** `5000` + + +### DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_IDLETIMEOUT +- **Property:** dev.dsf.server.auth.oidc.provider.client.idleTimeout +- **Required:** No +- **Description:** OIDC provider client idle timeout in milliseconds +- **Default:** `30000` + + +### DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS +- **Property:** dev.dsf.server.auth.oidc.provider.client.trust.server.certificate.cas +- **Required:** No +- **Description:** PEM encoded file with one or more trusted root certificates to validate server certificates for https connections to the OIDC provider +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/oidc_provider_trust_certificates.pem` + + +### DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL +- **Property:** dev.dsf.server.auth.oidc.provider.realm.base.url +- **Required:** No +- **Description:** OIDC provider realm base url +- **Example:** `https://keycloak.test.com:8443/realms/example-realm-name` + + +### DEV_DSF_SERVER_AUTH_TRUST_CLIENT_CERTIFICATE_CAS +- **Property:** dev.dsf.server.auth.trust.client.certificate.cas +- **Required:** Yes +- **Description:** PEM encoded file with one or more trusted root certificates to validate client certificates for https connections from local and remote clients +- **Recommendation:** Use docker secret file to configure +- **Example:** `/run/secrets/app_client_trust_certificates.pem` + + +### DEV_DSF_SERVER_CERTIFICATE +- **Property:** dev.dsf.server.certificate +- **Required:** No +- **Description:** Server certificate file for testing +- **Recommendation:** Only specify For testing when terminating TLS in jetty server + + +### DEV_DSF_SERVER_CERTIFICATE_CHAIN +- **Property:** dev.dsf.server.certificate.chain +- **Required:** No +- **Description:** Server certificate chain file for testing +- **Recommendation:** Only specify For testing when terminating TLS in jetty server + + +### DEV_DSF_SERVER_CERTIFICATE_KEY +- **Property:** dev.dsf.server.certificate.key +- **Required:** No +- **Description:** Server certificate private key file for testing +- **Recommendation:** Only specify For testing when terminating TLS in jetty server + + +### DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD or DEV_DSF_SERVER_CERTIFICATE_KEY_PASSWORD_FILE +- **Property:** dev.dsf.server.certificate.key.password +- **Required:** No +- **Description:** Server certificate private key file password for testing +- **Recommendation:** Only specify For testing when terminating TLS in jetty server + + +### DEV_DSF_SERVER_CONTEXT_PATH +- **Property:** dev.dsf.server.context.path +- **Required:** Yes +- **Description:** Web application context path, default in `bpe` docker image: `/bpe`, default in `fhir` docker image: `/fhir` +- **Recommendation:** Only modify for testing + + +### DEV_DSF_SERVER_STATUS_HOST +- **Property:** dev.dsf.server.status.host +- **Required:** Yes +- **Description:** Status connector host +- **Default:** `127.0.0.1` + + +### DEV_DSF_SERVER_STATUS_PORT +- **Property:** dev.dsf.server.status.port +- **Required:** Yes +- **Description:** Status connector port, default in docker image: `10000` \ No newline at end of file diff --git a/docs/src/v1.6.0/maintain/fhir/oidc.md b/docs/src/v1.6.0/maintain/fhir/oidc.md new file mode 100644 index 000000000..c78e74c8a --- /dev/null +++ b/docs/src/v1.6.0/maintain/fhir/oidc.md @@ -0,0 +1,63 @@ +--- +title: OpenID Connect +icon: config +--- + +## Overview +Access to the DSF FHIR server REST API and user interface can be configured via [access control roles](access-control). By default users are only authenticated using X.509 client certificates, but authentication for local users via OAuth 2.0 OpenID Connect can also be enabled. + +The DSF FHIR server supports [Authorization Code Flow](https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth) for the user interface as well as [Bearer Token Authentication](https://datatracker.ietf.org/doc/html/rfc6750) for the REST API. [Back-Channel Logout](https://openid.net/specs/openid-connect-backchannel-1_0.html) is also supported. + + +::: tip FHIR Reverse Proxy +The DSF FHIR reverse proxy requires client certificates by default. To use OpenID Connect authentication the configuration parameter [SSL_VERIFY_CLIENT](configuration/reverseproxy.html#ssl-verify-client) needs to be set to `optional`. +::: + + +## Authorization Code Flow + +To enable authentication via OpenID Connect authorization code flow, set the configuration parameter [DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW](configuration#dev-dsf-server-auth-oidc-authorization-code-flow) to `true` and specify the following parameters: + +- [DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL](configuration#dev-dsf-server-auth-oidc-provider-realm-base-url) +- [DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID](configuration#dev-dsf-server-auth-oidc-client-id) +- [DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET](configuration#dev-dsf-server-auth-oidc-client-secret) + +Optionally, back channel logout can be enabled by setting [DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT](configuration#dev-dsf-server-auth-oidc-back-channel-logout) to `true`. The DSF FHIR server accepts logout tokens at [DEV_DSF_FHIR_SERVER_BASE_URL](configuration#dev-dsf-fhir-server-base-url) + `/back-channel-logout`. The path can be modified via [DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT_PATH](configuration#dev-dsf-server-auth-oidc-back-channel-logout-path). + + +## Bearer Token Authentication + +To enable bearer token authentication, set the configuration parameter [DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN](configuration#dev-dsf-server-auth-oidc-bearer-token) to `true` and specify the following parameter: +- [DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL](configuration#dev-dsf-server-auth-oidc-provider-realm-base-url) + + +## Additional ODIC Configuration Parameter + +A number of additional `DEV_DSF_SERVER_AUTH_OIDC ...` configuration parameter are specify on the DSF FHIR server [configuration parameter page](configuration). + +For example the configuration parameter [DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS](configuration#dev-dsf-server-auth-oidc-provider-client-trust-server-certificate-cas) can be used to specify a PEM encoded file with trusted root certificates to be used when accessing the OpenID Connect provider. If not specify the JVM default trusted root certificates are used for this connection. + + +## Example +```yaml +services: + app: + image: ghcr.io/datasharingframework/fhir:1.5.2 + # ... + secrets: + - keycloak_root_ca.pem + # ... + environment: + # ... + DEV_DSF_SERVER_AUTH_OIDC_AUTHORIZATION_CODE_FLOW: 'true' + DEV_DSF_SERVER_AUTH_OIDC_BACK_CHANNEL_LOGOUT: 'true' + DEV_DSF_SERVER_AUTH_OIDC_BEARER_TOKEN: 'true' + DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_REALM_BASE_URL: https://keycloak.test.org/realms/dsf + DEV_DSF_SERVER_AUTH_OIDC_PROVIDER_CLIENT_TRUST_SERVER_CERTIFICATE_CAS: /run/secrets/keycloak_root_ca.pem + DEV_DSF_SERVER_AUTH_OIDC_CLIENT_ID: dsf-fhir + DEV_DSF_SERVER_AUTH_OIDC_CLIENT_SECRET: n9bCMtjugv3Y_.szktXyQ2RH5se+J%o3 + # ... +secrets: + keycloak_root_ca.pem: + file: ./secrets/keycloak_root_ca.pem +``` \ No newline at end of file diff --git a/docs/src/v1.6.0/maintain/install-plugins.md b/docs/src/v1.6.0/maintain/install-plugins.md new file mode 100644 index 000000000..fe9ae121c --- /dev/null +++ b/docs/src/v1.6.0/maintain/install-plugins.md @@ -0,0 +1,56 @@ +--- +title: Install Plugins +icon: plugin +--- + +::: tip Marketplace for process plugins +To install and learn more about each Process Plugin, you can visit the Marketplace [here](https://hub.dsf.dev/). +::: + + +## **Overview** +- You can find an overview of compatable process plugins below (last updated 14/08/2024). + + +| Process Plugin | released for test | released for production | +| ------------------------- | ----------------------------- | ----------------------------- | +| [Ping-Pong](https://github.com/datasharingframework/dsf-process-ping-pong/releases) | [v1.0.1.0](https://github.com/datasharingframework/dsf-process-ping-pong/releases/tag/v1.0.1.0) | [v1.0.1.0](https://github.com/datasharingframework/dsf-process-ping-pong/releases/tag/v1.0.1.0) | +| [Allow-List](https://github.com/datasharingframework/dsf-process-allow-list/releases) | [v1.0.0.1](https://github.com/datasharingframework/dsf-process-allow-list/releases/tag/v1.0.0.1) | [v1.0.0.1](https://github.com/datasharingframework/dsf-process-allow-list/releases/tag/v1.0.0.1) | +| [MII Process Feasibility](https://github.com/medizininformatik-initiative/mii-process-feasibility/releases) | [v1.0.0.6](https://github.com/medizininformatik-initiative/mii-process-feasibility/releases/tag/v1.0.0.6) | [v1.0.0.6](https://github.com/medizininformatik-initiative/mii-process-feasibility/releases/tag/v1.0.0.6) | +| [MII Process Report](https://github.com/medizininformatik-initiative/mii-process-report/releases) | [v1.1.1.1](https://github.com/medizininformatik-initiative/mii-process-report/releases/tag/v1.1.1.1) | [v1.1.1.1](https://github.com/medizininformatik-initiative/mii-process-report/releases/tag/v1.1.1.1) | +| [MII Process Data Transfer](https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases) | [v1.0.2.1](https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases/tag/v1.0.2.1) | [v1.0.2.1](https://github.com/medizininformatik-initiative/mii-process-data-transfer/releases/tag/v1.0.2.1) | +| [MII Process Data Sharing](https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases) | [v1.0.1.1](https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases/tag/v1.0.1.1) | [v1.0.1.1](https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases/tag/v1.0.1.1) | +| [NUM-RDP](https://github.com/num-codex/codex-processes-ap1/releases) | [v1.1.0.0](https://github.com/num-codex/codex-processes-ap1/releases/tag/v1.1.0.0) | [v1.1.0.0](https://github.com/num-codex/codex-processes-ap1/releases/tag/v1.1.0.0) | + + +- Explore and install Process Plugins in the Marketplace. Details on each plugin are available [here](https://hub.dsf.dev/). +- Deploying the process plugin to the DSF involves copy the process jar-file and configuring environment variable for the business process engine (BPE). + + +### Prerequisites +- A DSF installation of version 1.3.x or higher. An installation guide can be found [here](https://dsf.dev/stable/maintain/install.html). + +### Deployment +- Add the process jar-file to the DSF BPE folder `/opt/bpe/process`: +``` +wget (your jar-file download link) +``` + +For example: +``` + wget https://github.com/medizininformatik-initiative/mii-process-data-sharing/releases/download/v1.0.0.1/mii-process-data-sharing-1.0.0.1.jar +``` + +- Make sure the process is readable by the bpe user or group, for example by executing: +``` +sudo chmod 440 (your jar-file name.jar) +sudo chown root:bpe (your jar-file name.jar) +``` +For example: +``` +sudo chmod 440 mii-process-data-sharing-1.0.0.1.jar +sudo chown root:bpe mii-process-data-sharing-1.0.0.1.jar +``` + +- Modify the process exclude config in `/opt/bpe/docker-compose.yml` +- **Reminder:** Update/verify required configurations in `docker-compose.yml` diff --git a/docs/src/v1.6.0/maintain/install.md b/docs/src/v1.6.0/maintain/install.md new file mode 100644 index 000000000..9138e4b03 --- /dev/null +++ b/docs/src/v1.6.0/maintain/install.md @@ -0,0 +1,232 @@ +--- +title: Install DSF 1.6.0 +icon: install +--- + +In the following installation manual we will show you how you can install your own DSF instance to be part of an already existing DSF network. + +::: tip Unified installation manual + +The installation instructions of DSF 0.9.x for different application use cases (e.g. NUM CODEX or HiGHmed) are now combined under one common manual. The specific steps for process installation and configuration are documented at the process plugin documentation pages. +::: + +## Prerequisites +### Virtual Machines +* DSF FHIR VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD +* DSF BPE VM: min. 4 GB RAM, 4 vCPU, 20 GB HDD +### Docker / Docker-Compose +Both VMs need latest docker (>= 24.0.0) and docker compose. For the latest install guide see https://docs.docker.com/engine/install. + +``` +sudo apt-get update +sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg +echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null +sudo apt-get update +sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin +sudo systemctl enable docker.service +sudo systemctl enable containerd.service +``` + +The current version of docker compose is installed with the current docker version. + +### Client/Server Certificates +Two Certificates from the GÉANT TCS (via DFN e.V.), D-Trust (via TMF e.V.) or DFN-PKI Global G2 (legacy, no new certificates are issued) are needed: +* Certificate _A_: Server Certificate - `TLS Web Server Authentication` (DFN PKI Profile: 'Web Server', Common-Name: Your external DSF FHIR Servers FQDN) +* Certificate _B_: Client Certificate - `TLS Web Client Authentication` (DFN PKI Profile: '802.1X Client', Common-Name: Your DSF BPE Servers FQDN) + +If you use GÉANT TCS certificates, then they are configured by default with the necessary *X509v3 Extended Key Usage*s: `TLS Web Server Authentication, TLS Web Client Authentication`. + + +### Network setup / Network access + +* The DSF FHIR server needs to be accessible via the internet and able to access the internet without TLS interception. +* The BPE FHIR server should only be accessible by the internal network and able to access your DSF FHIR server via its external FQDN and the internet without TLS interception. + +Here is a quick overview of the expected network setup. + +| Source | Target | Port | Protocol | +| ----------------------------- | ----------------------------- | ---- | ---------------------- | +| DSF BPE (local) | DSF FHIR (local) | 443 | https, wss | +| DSF BPE (local) | DSF FHIR (other DSF communication partners) | 443 | https | +| DSF FHIR (local) | DSF FHIR (other DSF communication partners) | 443 | https (HTTP HEAD only) | +| DSF BPE (other DSF communication partners) | DSF FHIR (local) | 443 | https | +| DSF FHIR (other DSF communication partners) | DSF FHIR (local) | 443 | https (HTTP HEAD only) | + + Connections to services that are used by process plugins (e.g. a fTTP, a terminology server, simplifier.net or a local FHIR server) are not listed. Please refer to the respective process plugin documentation pages for more information. + + + +## Setup +### Prepare Certificates +1. Server Certificate (certificate _A_) + _This certificate will be used as the DSF FHIR servers server certificate (ssl_certificate_file.pem, ssl_certificate_key_file.pem)_ + * Store PEM encoded certificate as `ssl_certificate_file.pem` + * Store unencrypted, PEM encoded private-key as `ssl_certificate_key_file.pem` + +1. Client Certificate (Certificate _B_) + _This certificate will be used as the DSF BPE servers client certificate (client_certificate.pem, client_certificate_private_key.pem) as well as the DSF FHIR servers client certificate (client_certificate.pem, client_certificate_private_key.pem)_ + * Store PEM encoded certificate as `client_certificate.pem` + * Store encrypted or not encrypted, PEM encoded private-key as `client_certificate_private_key.pem` + +### DSF FHIR Server +1. Add Group/User + Add group and user used by the DSF FHIR java application. Ubuntu compatible commands below: + ``` + sudo groupadd --gid 2101 fhir + sudo useradd --system --no-create-home --uid 2101 --gid 2101 fhir + ``` + +1. Download and Extract Config Files + Download and unpack the prepared DSF FHIR server config files and folder structure: + ``` + cd /opt + wget https://dsf.dev/download/dsf_fhir_1_6_0.tar.gz + sudo tar --same-owner -zxvf dsf_fhir_1_6_0.tar.gz + ``` + _The `tar` command will unpack the config files at `/opt/fhir` assuming you changed into the `/opt` directory._ + +1. Verify that the `fhir` system user or group can write into the following folder + * `/opt/fhir/log` + +1. Add certificates and keys + * Add the server certificate (certificate _A_) and the corresponding private-key to **/opt/fhir/secrets/** + * ssl_certificate_file.pem (chmod: 440, chown: fhir:docker) + * ssl_certificate_key_file.pem (chmod: 440, chown: fhir:docker) + * Add the client certificate (Certificate _B_) and the corresponding private-key to **/opt/fhir/secrets/** + * client_certificate.pem (chmod: 440, chown: fhir:docker) + * client_certificate_private_key.pem (chmod: 440, chown: fhir:docker) + * If the private key is encrypted, add a password file with the password as the only content to **/opt/fhir/secrets/client_certificate_private_key.pem.password** + * If the private key is not encrypted, remove the corresponding docker secret lines from the `docker-compose.yml` file + ``` + L39: - app_client_certificate_private_key.pem.password + ... + L54: DEV_DSF_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password + ... + L141: app_client_certificate_private_key.pem.password: + L142: file: ./secrets/client_certificate_private_key.pem.password + ``` + + ::: tip How to chmod / chown + For the example *ssl_certificate_file.pem (chmod: 440, chown: fhir:docker)* you must: + + 1. Set the file content as requested + 2. Change the file permissions to 440 (allow read access to the owner of the file and the group the file belongs to, deny write access to everybody and deny read for other users): + `chmod 440 /opt/fhir/secrets/ssl_certificate_file.pem` + 3. Change the owner of the file to the user `fhir` and the group the file belongs to to `docker`: + `chown fhir:docker /opt/fhir/secrets/ssl_certificate_file.pem` + + ::: + +1. Uncomment one of the certificate chain entries in the docker-compose file base on the certificate authority that signed your DSF FHIR server certificate (certificate A). For example use the following two lines if the server certificate is signed by `DFN-Verein Global Issuing CA` + ``` + L114: ssl_certificate_chain_file.pem: + L115: file: ./secrets/ssl_certificate_chain_file_DFN-Verein.pem + ``` + +1. Modify database passwords + * **/opt/fhir/secrets/db_liquibase.password** + * Generate a random password (min. 32 characters recommended) and replace the content of the file. + * **/opt/fhir/secrets/db_user.password** + * Generate a random password (min. 16 characters recommended) and replace the content of the file. + * **/opt/fhir/secrets/db_user_permanent_delete.password** + * Generate a random password (min. 16 characters recommended) and replace the content of the file. + +1. Modify the docker-compose.yml file and set environment variables to the appropriate values + * **services -> proxy -> environment:** + * **HTTPS_SERVER_NAME_PORT**: _TODO_DSF_FHIR_SERVER_EXTERNAL_FQDN:443_ + Set your FHIR servers external FQDN, e.g. `foo.bar.de` -> `foo.bar.de:443` + * For additional environment variables, see [DSF configuration parameters - FHIR Reverse Proxy](fhir-reverse-proxy/configuration) + * **services -> app -> environment:** + * **DEV_DSF_FHIR_SERVER_ORGANIZATION_IDENTIFIER_VALUE**: `todo.organization.com` + Set your Organizations DSF identifier, aka the shortest FQDN that resolves to the main homepage of the organization, e.g. `hs-heilbronn.de` + * **DEV_DSF_FHIR_SERVER_BASE_URL**: `https://dsf.todo.organization.com/fhir` + Set your FHIR servers external FQDN, e.g. `foo.bar.de` -> `https://foo.bar.de/fhir` + * **DEV_DSF_FHIR_SERVER_ORGANIZATION_THUMBPRINT**: `f4344032fe77bffb912ff5abfd44da89fe64d355affb8d0f14c9ecb8bdbf92c7fe5f995b1ec0c453e4228b395e331052e4639044df4933d57721de508a84d26f` + Set the SHA-512 Hash (lowercase hex) of your client certificate (Certificate _B_) + Use `certtool --fingerprint --hash=sha512 --infile=client_certificate.pem` to generate the hash. + * **DEV_DSF_FHIR_SERVER_ROLECONFIG**: `|` + (Optional) You can add other client certificates (e.g. personal certificates from admins) to your DSF instance. For additional information, see the FHIR server [Access Control](fhir/access-control) page. + + * For additional environment variables, see FHIR server [Configuration Parameters](fhir/configuration) page. + +1. Start the DSF FHIR Server + Start using: `docker compose up -d && docker compose logs -f` (Ctrl-C will close log, but not stop container) + +### DSF BPE Server +1. Add Group/User + Add group and user used by the DSF BPE java application. Ubuntu compatible commands below: + ``` + sudo groupadd --gid 2202 bpe + sudo useradd --system --no-create-home --uid 2202 --gid 2202 bpe + ``` +1. Download and Extract Config Files + Download and extract prepared DSF BPE server config files and folder structure: + ``` + cd /opt + wget https://dsf.dev/download/dsf_bpe_1_6_0.tar.gz + sudo tar --same-owner -zxvf dsf_bpe_1_6_0.tar.gz + ``` + _The `tar` command will unpack the config files at `/opt/bpe` assuming you changed into the `/opt` directory._ + +1. Verify that the `bpe` system user or group can write into the following folders + * `/opt/bpe/log` + +1. Add certificates and keys + * Add the client certificate (Certificate _B_) and the corresponding private-key to **/opt/bpe/secrets/** + * client_certificate.pem (chmod: 440 chown: bpe:docker) + * client_certificate_private_key.pem (chmod: 440 chown: bpe:docker) + * If the private key is encrypted, add a password file with the password as the only content to **/opt/bpe/secrets/client_certificate_private_key.pem.password** + * If the private key is not encrypted, remove the corresponding docker secret lines from the `docker-compose.yml` file + ``` + L13: - app_client_certificate_private_key.pem.password + ... + L35: DEV_DSF_BPE_FHIR_CLIENT_CERTIFICATE_PRIVATE_KEY_PASSWORD_FILE: /run/secrets/app_client_certificate_private_key.pem.password + ... + L89: app_client_certificate_private_key.pem.password: + L90: file: ./secrets/client_certificate_private_key.pem.password + ``` +1. Modify database passwords + * **/opt/bpe/secrets/db_liquibase.password** + * Generate a random password (min. 32 characters recommended) and replace the content of the file. + * **/opt/bpe/secrets/db_user.password** + * Generate a random password (min. 16 characters recommended) and replace the content of the file. + * **/opt/bpe/secrets/db_user_camunda.password** + * Generate a random password (min. 16 characters recommended) and replace the content of the file. + +1. Modify the docker-compose.yml file and set environment variables to the appropriate values + * **services -> app -> environment:** + * **DEV_DSF_BPE_FHIR_SERVER_BASE_URL**: `https://dsf.todo.organization.com/fhir` + Set your FHIR servers external FQDN, e.g. `foo.bar.de` -> `https://foo.bar.de/fhir` + + * For additional environment variables, see the BPE server [Configuration Parameters](bpe/configuration) page. + +1. Start the DSF BPE Server (without process plugins) + Start using: `docker compose up -d && docker compose logs -f` (Ctrl-C will close log, but not stop container) + +1. Verify DSF BPE Startup + * Check that the BPE was able to download new Task resources from the DSF FHIR server during startup. + * Check that the BPE was able to download a Subscription resource from the DSF FHIR server during startup. + * Check that the BPE was able to connect to the websocket endpoint of the DSF FHIR server during startup. + + If you need to debug the TLS connection to your DSF FHIR server use for example: + `docker run -it --rm alpine/openssl s_client your-fhir-server.fqdn:443` + The command above should print the server certificate of your DSF FHIR server (certificate _A_) and end with a message like `[...]tlsv13 alert certificate required[...]` + + +### Logs +By default, we will log both to the console (collected by docker) and to files in the log directory, so you can use `docker compose logs -f` in `/opt/bpe` and `/opt/fhir` to view informational, warning and error logs. If you encounter any error and the reported information is not detailled enough, you can also check the logs in the `/opt/fhir/log` and `/opt/bpe/log` directories with debugging logs. There, you will also find older log files. If you have any questions and can't resolve them by yourself please always include the latest logs from `/opt/fhir/log` and `/opt/bpe/log` in your support request. + +On a successful BPE start, you should see the following entries in your BPE log: + +``` +INFO Grizzly(1) - INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket open, session SOME_RANDOM_UUID1 +INFO Grizzly(1) - INFO Grizzly(1) - ClientEndpoint.onOpen(37) | Websocket open, session SOME_RANDOM_UUID2 +``` + +### On-Boarding +Please visit the on boarding website of your network for more information. + +::: tip Ideas for improvement? +Have you found an error or is something unclear to you? Then please feel free to write to us at gth-gecko@hs-heilbronn.de. Thank you very much! +::: diff --git a/docs/src/v1.6.0/maintain/upgrade-from-0.md b/docs/src/v1.6.0/maintain/upgrade-from-0.md new file mode 100644 index 000000000..58dea1a00 --- /dev/null +++ b/docs/src/v1.6.0/maintain/upgrade-from-0.md @@ -0,0 +1,32 @@ +--- +title: Upgrade from DSF 0.9.x +icon: update +--- + +A direct upgrade from DSF 0.9.x to DSF 1.x is not supported. + +:::danger Do not use your 0.9.x configuration as starting point +There are too many changes between DSF 0.9.x and DSF 1.x to use the old configuration as starting point and just adapt some configuration parameter names. + +**Please** use the new installation manual to perform a new installation and use the old setup only for reference. +::: + + +Instead, please perform the following steps: + + +1. Shut down your DSF instances (DSF FHIR Server and DSF BPE). +2. Backup your DSF instances (e.g. by moving the folders `/opt/bpe` and `/opt/fhir` to `/opt/bpe_0.9` and `/opt/fhir_0.9`) +3. Install the new DSF according to the [instructions](install). +4. You can copy **your** certificates (server- and client certificates) to your new installation. Please do **not** copy the CA certificate files from your old installation, as the new version will contain additional CAs (e.g. D-Trust). +5. Configure your processes according to the **new** process plugin [documentation](./install-plugins). You can use your **test** environment configuration and your old production setup configuration for reference. Please ensure to use the **new** configuration parameter names, as many of them will have new prefixes (like `DEV_DSF` instead of `ORG_HIGHMED`). +6. If you perform the installation before the change of the according environment, you can start the old instances again (out of the `/opt/fhir_0.9` and `/opt/bpe_0.9` directories). +7. If you want to replace the old setup with the new one, shutdown the old instances (FHIR + BPE) and start the new ones. + +::: tip New process plugins +Please do not copy your old process plugins into the new DSF. There will be a new release for each process plugin at the time you will be prompted to update your DSF instance. +::: + +::: tip Use your old virtual machine +We recommand the usage of your old DSF 0.9.x virtual machine for your new DSF 1.x setup. This will ensure that you already have the required firewall settings in place. +::: \ No newline at end of file diff --git a/docs/src/v1.6.0/maintain/upgrade-from-1.md b/docs/src/v1.6.0/maintain/upgrade-from-1.md new file mode 100644 index 000000000..c85e867ba --- /dev/null +++ b/docs/src/v1.6.0/maintain/upgrade-from-1.md @@ -0,0 +1,67 @@ +--- +title: Upgrade from DSF 1.5.2 +icon: update +--- + +Upgrading the DSF from 1.5.2 to 1.6.0 involves modifying the docker-compose.yml files and recreating the containers. + + + +## Modify DSF FHIR Server Setup +1. Preparation / Backup + * We recommend to create a backup of the `/opt/fhir` directory before proceeding with the upgrade. + For example using: `sudo cp -rp /opt/fhir /opt/fhir_backup_pre_1.6.0_upgrade` + +2. Modify the DSF FHIR docker-compose.yml file, replace the version number with 1.6.0. +```diff +version: '3.8' +services: + proxy: +- image: ghcr.io/datasharingframework/fhir_proxy:1.5.2 ++ image: ghcr.io/datasharingframework/fhir_proxy:1.6.0 + restart: on-failure +... + app: +- image: ghcr.io/datasharingframework/fhir:1.5.2 ++ image: ghcr.io/datasharingframework/fhir:1.6.0 + restart: on-failure +... +``` + +3. Upgrade the DSF FHIR containers + From `/opt/fhir` execute + ``` + docker compose up -d && docker compose logs -f + ``` + +## Modify DSF BPE Server Setup +1. Preparation / Backup + * We recommend to create a backup of the `/opt/bpe` directory before proceeding with the upgrade. + For example using: `sudo cp -rp /opt/bpe /opt/bpe_backup_pre_1.6.0_upgrade` + +2. Modify the DSF BPE docker-compose.yml file, replace the version number with 1.6.0. +```diff +version: '3.8' +services: + app: +- image: ghcr.io/datasharingframework/bpe:1.5.2 ++ image: ghcr.io/datasharingframework/bpe:1.6.0 + restart: on-failure +... +``` + +3. Upgrade the DSF BPE containers + From `/opt/bpe` execute + ``` + docker compose up -d && docker compose logs -f + ``` + +4. Verify your upgrade: + * Verify the DSF FHIR server is running in version 1.6.0. The log should contain a message: + `INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-fhir-server-jetty, version: 1.6.0, [...]` + * Verify the DSF FHIR server started without errors + * Verify the DSF FHIR server is accessible via https, for example by browsing to https://your-dsf-endpoint.de/fhir/ (authentication with your client-certificate) + * Verify the DSF BPE server is running in version 1.6.0. The log should contain a message: + `INFO main - BuildInfoReaderImpl.logBuildInfo(137) | Artifact: dsf-bpe-server-jetty, version: 1.6.0, [...]` + * Verify the DSF BPE server started without errors + * Verify your install with a ping/pong test diff --git a/docs/src/v1.6.0/process-plugins-advanced.md b/docs/src/v1.6.0/process-plugins-advanced.md new file mode 100644 index 000000000..ccd9c3d99 --- /dev/null +++ b/docs/src/v1.6.0/process-plugins-advanced.md @@ -0,0 +1,4 @@ +--- +title: Process Plugins Advanced +icon: info +--- \ No newline at end of file From c5b3431317ec1c1738884fa2dd76db028f373846 Mon Sep 17 00:00:00 2001 From: Hauke Hund Date: Tue, 15 Oct 2024 16:04:13 +0200 Subject: [PATCH 2/6] 1.6.0 tar.gz files --- .../public/download/dsf_bpe_1_6_0.tar.gz | Bin 0 -> 18269 bytes .../public/download/dsf_fhir_1_6_0.tar.gz | Bin 0 -> 28039 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/src/.vuepress/public/download/dsf_bpe_1_6_0.tar.gz create mode 100644 docs/src/.vuepress/public/download/dsf_fhir_1_6_0.tar.gz diff --git a/docs/src/.vuepress/public/download/dsf_bpe_1_6_0.tar.gz b/docs/src/.vuepress/public/download/dsf_bpe_1_6_0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..15e94ff27546d7fa8bd987ce1733271f01f08909 GIT binary patch literal 18269 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 Ys>^8G@%(=(ca)<`jM$OnVes($1^S&ZPXGV_ literal 0 HcmV?d00001 diff --git a/docs/src/.vuepress/public/download/dsf_fhir_1_6_0.tar.gz b/docs/src/.vuepress/public/download/dsf_fhir_1_6_0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..d77a98abfc39299cce277903e42fa08a7810a3ca GIT binary patch literal 28039 zcmV)CK*GNtiwFP!000001MFJqbE`^rf1mj)s5hyaq%^kJw7KejXm%t45}TH(iHcoF zNFYE$kmP?)BiVkouPyt&n){N>1lt94H|O-(e&-x;u#U3!FF*Id;L+<~moq%xo-fxp z)x$`tM`Aej3x;DIjQ9oZ{N#OIj$>Zf8H)arB}s8>-DmUvM~|Sfzn8dMKf802U7F%-;EBl5N|KC#|l};P>5o?DAmd zH|i}O&}4rX*in4U{L6TnWJP|ZjiPrbPW0|E_=7+6G5GsDPEq6o{JY%ezMJ_kAIkH1 z<@#9>1(9nP{wj!K|33A1A1>JX)#r=cwH@t0SZ05LpS|+-tIR(fq2#ZZ`1@0oCHtMf zFP?-jmJcX*%#ze^(|#65`^Rz7Feds+=QNAcRtk{0)kM{d2h>nmb;auZiWepAX`Y)K zoTh;Bil4H|v${|eOeRlDq{#znr|IK_u8&s?rx_A2F~Hzfyfo$>&~|p*w;z?<{zSKL zDU7(qSE#&WfVY$w5lG5cXuWHv3pMa1;cnXUkq)b@G;V5gx^aWdN9Nx9MH3e<95#T~ zFZ{iC8SwlRUgj$pd(R6R6TusJ`mwP4Lco0&J)X0Qqr)+BY>4=&o#&96_j2|KvEajr zRqAIudke{f_0|@A)&& zI3@9M=fBWmQKis8PPBib0X3Z*GZzltx8o#y9)(5;eQ1_;k`@=6Jzqrb^Ip|7kpvq)mWOE5)E_+KtR`Ls>Z$-3AcRdEkzS< z{xf3lx!(J9I86phBRR{BIpfn^e#v!Tae7qjRm+ch|4z%V*nHLR-(&NF^2b!)kC9Kv zttOgeJwo-DNPiGpKfvauF@9f!e&+<*_yOH`j{5)$*CK@AcZeU_(9)L>Lmr>{(E6Ry`UCdG+DDr}L62FCCIP&Uauo7I8-8e0fPJ!;OE_L6Ul&E1H}dAe{kvPZ zrG{o7x(Mz%I03JZI|u51UtD+Oqs+xNcg%0LLG2uklhV&nx7oeO&C!3={Lnu?p#T0? z`!2xl27mhxoaq18zx>-X!^X5llEmoUT>!I|pIv#}-K}9F`v!Aa!~E_p+BY!t?WTW! z!7heq$~1I91y)J{MN$+-5`o|AIYHnIa3Tmgwi9?1<=Oo~;CCsH>~w56*Y~ghr`&<> zI(^4;f&t<70>2Xs1|0|YUCgCAq)!n<-ysJbpCn;>O88Wl9AJ=EKn+OJ>-2gA?)e?8 zZ}%yW=msAsJxgLAbrUFWc+9RISR|+&L&c)D3k&bOxo-?$O6V!F(b9MBoGdA!UqHu2 zHCT(l!cIa1cylEhxo87x`Cp*#_$X}Uj!i1L(zXk<@eR*E-PEF{jyXnEcu9Cb{}cI2 z_0kMDHtZU2R5PB_kn)^YwainTKH#03^~&0}<6`ZueRumr5yB^2_t#$;nZ46RZan_= zFX*pnxQg=3x4jCzGtuWPbU}Lb&O@63`1Nm(6rk_H@Ur6v6vy%>s?p9*j*xKYX$0a^ z7Qr2&o!^o3pX9r1inZ^v|H+1lKXTf?!BzWt;SUr76IC|^=nKC)D?bxx(&)n*y}ez- z(hnCse&84{{ospbCh}t4N3F({MswHb^$U&3t#0FM#9s9$$e+;T9%5)?5A?+<^wN1i zYZX~_0dfy*qPW3K08cRF@+jQH(F!`nTVQ`l2r}^R!~4sld;eUZP_fVwdp}2`;QI7S zwk5>hN6JoxvUit~r0G;3Rztm_WWygv2@D%R%AfSL56zO#74q9dt4D^bOKa3HT#-$S zgs&Qg7lr)d%)*_uV22lZ!y=i~3__*>U7u zFX0*p?C{jY0Nl;b-b*9%5AEd%KHhJRZlK49-PFf#2X0b(?`^^*i@pP+?-Tk6_TTnZ zA3puI`}(wRx=HCqyLEllal2XiSXs>r*&F)*xM6yq*17flm+W@`m)ZXx^mt|e&(iAeyZ8P6kuC0DE?(`}z{9TT6&D#=KMC3lIKYkWQ zg`Fd|RrAFvqbb`^#%~t483oQ5u*`!+HY&u4W5*iwr^gPJK<=7@<^)MWU%WKFj3Tlm zv1QFL;BX8Q2xaAO&41%R6zy_Ok`GtbDV1}PmX z77Y?vil>E1#O zb`_Zo&oT?nvH>ue<*->ZR?FA1jf^9zVRmMl_vQPFc*rgJz9JrSOTJs;g&`No022^K zKM1 z3`pmAx(R(lIhxz{U^_S}SeU4w&7Y25;!dzmjFI}e6KUosfHG?9&0+>__3G zYxpvMI<2?(A+`!u8--I|t7BjV{B9!d=qS<-5z802yfaO;V$Om!Q$@g%&JrmlydMTi zObEuCvev(0`^3~_3owuDKj_`;&#l434`P^JM8Hpp}XjR*RT z19@D@(d}}|%K%OW{gMqAtfgTSFcsU-94rVqL8h_GS~i@{Xj*S0GaV2>+=U4<%r?rr zT6iOBEFT$t^G-wpl>t)@$Wt|1O!L4~*A=4V%c5lxek&R!)PkSYeWJH-9kQ*qrLu0? z=S{LM4yuv{x;ohEY1#_cv5mEWAkCr)V36bKyp~#vdRNn3yIw|q7vm&KTP*#tGorHn z(2~hTtOO?|p%>9EN+a*w*(6br^Cxj>m59V8qN219?eh$DoNVqFYsZ_HydTA4uw@ci zQ^?u`y@KaOKcX}Wb2T!>cbIgtEWzm_AwE9@vXn;JDRp`il?rEErT1IDWJOLM2jzUd z@%RnU=}_Jo`z)19yO_uJMw__=JynpwJ`t_H8-=A=Oon+p++d5m8?%ADkq(4DVGnA1 zPai#5IoTM!JsvjoxmBycI~q!+#S?_qeU3LXmsY&9N{HM8VO z=yKEP2;v+!wzSHdE7%h>4QmiTqsWd&!Kr~I#1Z(~tpLO_g@#ZQ${SFs z2Jrb3gJ%w+r&+43j4Q_4hGW&+G332%{m8D6_qO%^uArWDsbr^%;V4;3>yxX%z@QO& z3Rnn$6PUYTq$CWyrh%eXdOqlCtpUEPCS5gZ&rEJMRE$ip2d5TM(#b&uET>^4VuC0z z%ruGFS#1skbJ2A}>(KVi`6eH2$Xe&t(@B^GT09#M36kYFOxapPmXLyQZc+qN=;CM& z(TC;-PLNldb979nbZ@C7#!R26y13B5{xQqF0%s_6OOp3Sm~&@Jl8ZMP7fI-b3GGO(K0^^xs1g8!HSi1 zx;u&OR4;b2Z4A{B8;DwqV)R~}w$^*|aJ0l0Eli4NTlQ1?YzUysMfSdVx6Niu+9uVC++sQ2La7B8BlTn*btVqq{%$91`Cn*z)+lCz)+>> z1;o96iWs6D~QWJrb0d*z7UI}nbEYL7jW95ZFKuh9SmPARG1dxc` zFp!pAN6^+To1DgkmbyD@gLuNA^7YPkJimI|c-M(NX22R7yzxNYvJ`V@NafYZ%u0UD zu+5lUnH6+pg}&TGa1y3nnce0_jX%3@Gp7-Fq%&uBVru+^Xlem1UGCz|0@@RS+aMf5 zS$jf!a(3s`C8y=IOVbGpGs$d?c_QeJs{!ee?s3WB*tIz59GCOyX+aKiWK2v8PaNVd zsReGcO@6Ss!~)*0=aBHc9tM|K&^sG0uht zy0ze@bT%HRGS_lUdAK9Qt|E`EQug-|V!J`@DtX8+oGBYHtqkz^TJE&=7||{W(A!TY zBherFwi0dj%OIW#tgb|23mfYcKS(hoA=@U|V;10WKG{T`4|T0dX7l6F%HqyuyzdvS zOb@bpD{MDJX)HVVdC?Z;X58z^ZH5{lHDex>sX;A0SCfUQ zw{_#2;+N>q&vL(NkH1|nP$nv>rW?#tKR2;YQ$%1PE_lI&i`x z2_#{@;QZJ9u?tF5nN?Z4YMa>I(Wh2KMP^E{49vC0oNJ9a$_vh9e%MbS3(*26+|d;U zs)(xVL&i0Fn&~6%SvCW1WM~D3(gXqA8TRfruPQ;%_+2*o+b;84!K$&8nT?eoh8%vHd!x}rK=HT zmcCg}O1fPcpfx301ka9GrmG5H zD}@aE;9`|~Y@3sLTAP4(A`rjZRJn|@w>=A;neu>YyM!1dxpJo|=$*5h1q%AdIV<^78z0_ zsS_;ra~Sosfgor&%cYuSVKwAjPVMaCS*a>`^@ff&t;qOY_i+UFEf3`j0F|Hcb6zjG z$vTqQVcTd7#AAC?iaP%+s26(dBjfW(qC7b-etRzwOvS( z&Nnwdwd?s^HW-8fq?uc@tISY+v-Wn)P1totv7-a`l6XN?UGr%pf}29ugUuWj8XB8! zryafK@LX3RuIPZxLFb@+HxVPK!qJ*esKa5~of|G6 z;zCO?QQkO_4&>Sx%^v@#DBuQhh2y0WVmz$6g6R#{af7=Z8P`&2A<#`s$J4C{^xIqS zUT@h@dQ$=z$91f@e9jq(CCJ+hAA@yBD2-%r@#+f4^td|l(~WMyk@0cYsyPns!rD*8 z20CJ?54b|L^Jv1*b}LyKPu&>B`ADwf?c|5!ZMJQVhcW#mG(tokwoHU1{T4Y~)`!i= zA@vplE(UhIY4harli+H)L60VV24BuQ2``HKHj>bL*0In;fjGIp>VCGl8k+B3w(QYe z*E$8*?x;B0&c>Ww+_%lm$ul_HIpKB12n=~VZoLwXnZ2`<`Mx9XX~Ry8poAM7tq~m# zC}21=)!~KT)QEtKgY|)swy}EPX`SoL?J%% zKv4`#kf9B)thNU|9K3t8D|f~AFZ4`Un*P0>30*89Z|1yuCa!q%2m4|Tu{7A%wUT>` zEEVLAO4HdhDb#~DPvhwct${z{l`Lot{1LBYL2KX(xaKri{$a0VaY}$c;*~7J1pbIu zvJ4aW9bU=1VFKS8XIzjPH3yMTuWgRvQmaihjTBQQCrK@6IX$=>s}mrCF@YHR-P-uU z3~KFgbx=6*rzlv*jpE7P5erXZ$=pcGT60HrUBM8Z^V4)cT6xo?zzJ8ty?@la$Qg7U&F61OfMyLS})9B@9i2}dFt~^PorD~#{*uz>lp37T;J6fwkc_&JPI+dLT)3U~# zcQq#zoU}7w+=~vO1L%r>+j=Sy+WA&eD#uXU`>>Pv)XOev8R{4Rs*H{hz&7FrS^8^{ z%fI@ptjgRaCIrvZ?sEagYTI89@}aNxvuk+m6Zqz+LXXJK6to~xgM5XDow=DNVqU&g!KfJC*GTFbMj z?Qz+~mbr4-5*L_V_a@y+^>pkGhAU>Kkqkh)MFq8*z(Ba1cox1J2}B$Ho;x{_zj2U4U3O|6yiZf^ zB2!PNR&z)-KZk(im^K4wFSMqip{vG+4L6K%#^pU!4c;GH>56fKSiO~v*4nCd%lUZ4 zw=_lJ0L^>=lAhPIPm$O&My5TLF2UDq>de!5sbE+vSCG~m+NJIMB}dKA;qhR4Zw6&c znCC^$KWzc0^9Ma!kUW*@^Nl1alPOQt3B`~s4Uh$;J!;f9tYK1u%sT0^@tPIeQ!MDc znr|K(tozwg=Q;7R@mho^d|yl*m~H*B#j9Hi^OXsg91`<$gjiQ_^1SgHr*C?xu`Cc2 z)JbMGJWY2zsaYH~k#trlZ(E1I)%wyn@Y=egm-f>ZFrzK4HCivdc_uQ+^Ze(%i9^i zdfIMkh^jxpBfqQK1Gv7oHoXy}Ny5orJ#_n5uiSr5`BD7;khlJWZF~>^F#>sy|0seG z=uiCrE6VrqKUt16@8Apm>!f;9Q@t8?N8|3RAZ6rRZMv0TPUSxJ(gApP=vvvPtjj&C zJzz^@`?Ko1QEJTS6QTAD@!HdBtZ4$idiD6ed_fu;$XAv2i_#zXQs}K|7^@@*2)q&zlv)6 zHpBEetfPT1Nbki>VXfzD*sb#n;q$^u!V4k;A3^e4M0UOM&bP-_?ohFh#T6*_XSP3N zV4gY2m8Ll>x`rUe6|S7+-9`!s|yWsZD`#D!j$WH##cfMQN8&mYiNj9U=* zHsj-BSkEWB$~`o;uf_+=U^#oA3bSBf;4JJcZvMHwy|ujgrZHqF^v%#HQqwOopZ36^ ze~Yj?UVhtpqy1{@OXI-YI_2~FlP^5`drNCEv(Ow~TkGdH;0J;ZKb>076=URU#lUOL z<~KJHj@`EDWcU(DynQ2>vty6=eT_SK9av{$nec_yYei1o^A=pZ=GY@14-gbNo+Hm(SEMpDO;1 zs9&ZyN8=i*nD)1*U;S^VeidZ-nfhhD=@z2MpE<8`s=;h38{|0q2dnv6QQ}wJNR|Vh z$dMazxqwc052EBLs9 zwv?kK$VA&NleJguGOetYfM-N8)GIau{gBHojK8DfaGry7{m@>DZ7o>uh{6tTt(-Ia=5*y5^N<^C+(mD?u^qdv944gdtK(mTkOH#F%t}VP#~@ZF8q!%% zm|PGgagXV4(pEf(YZZF1Jm}>_78hxL*}2NRUU=RIFDNSQxf5wY@yQybO^?lQNhrk? zw7V7}+@u>%>vi&d&^)_;sLW_Q@Fr-cvOIeYnjaJ>8Y$!vDLhlWK2x8bV&3|NDy7|k zu(oG^?%9zdbx-EJ-X=YEaZ_gSlx6nxIWnIo8&|Ae8;P+P1K!rQRJKQ}Tg=zgVk&w4TUWngLhG#f<^>4ORLDIX&${uI{W-|dc07ZtT}f+&pmGT`D$Etr)JN5_4N>7MLm3;V3k}@4`TVk zV$;wei!gcqjC|1F=E+tqe3|hHovljGztNYqV93O29rRO()xfxKkWv9NhVBLzX1&lhl!7fv2h-T{A_?15 zFW{F%W`^VXdUUBZW$#q54O;IIpa*>eI1{?d3XZAgl{`hI&DM*~i6pVCG(U`lEYtbd zzGuawgpT{dJFPc51MBy^fWWCd7Fz&}jk}rq=IxS4;|W_|l#?f9Q$Q=K&Ne0iNW|M-NVi!w?ZMAxM4fG>3f zKDq-TKDguCdI7Ihe7g<+AmjLv8{d8UuPCce@qd4sE$^54np59Aso4DYliKay=COSw zCbP6+e5KX$sB_7cuRk%I^7q3|{N+`G<*X;ef>VEk&ccNP!=u4-&Px+JdPZ!jSLeKc=)-A0* zHT0r}G*@VSS4rr(qA$Am80tHbp||%3FLb8gq&xHr@P8h#~zJnS1+`-uX%Fy4x~jn*3KUWk1XBDDUw9!?pg8xAC3*9~fRCU+RCa)<4gG{*q$C z4E)bMqFD$<8rVOX%|B~|n4JIwZvJ^&VKW>Dt5pyG8D{Xa{2P`p=l?sW?N4gsyYn9- zzV!cB>($Ts|5ud9{O1Hj|K}nXKTm&ane>OBlm356`Dp%sI|TcEZG0d9*I&&4HL}Kj z&i}und^P_M*z)eN`Q0;EgPo(%w1PQxXRaN>_x3?PAK@*iNunn*aHg*?2mB3fM;^}@8*C34}$a; z95Aa=s2}Bk0SgK2k8r?%g#`ASIbfV*YQ_@>?2(Q3(aG}TU^#spEYpvJ<&-7QUX~*P zn;*J#>+f`#?6(@wZscp$wSt4$V-O%@HhM!uTm3aucW}7N6?(3nU zWZN&zvE%YXZ32gUuO9CcsP!tM^u;~(K&kE4N8@CZkg1jK6b(1rtT0E&!HZPy_L6;r zB=siTVxm^hz}_jvFjE<0QU_9zP+a5>!#2ZJml;O_!f-TU3G3j}S7}2|$*nedf;rw- zJ9|L!isk^5w$oqwcgdYfj>(52?Z*{0h1j+s~>9*w}Jw{6qgg9_V4 z&BOwy@gwa_q6LB(1JTuY=2ZpG8eQEEjNan(BzQQ9_@w1R^GX8c1XUD};?;P=FKr)d)c zpiVm6Gx}y*Yj`Alhdi9lRDg_S*j=yZ{XjB)o2(*XwZZdYfUOf>96Wd0q^S({u0ZHaXkj*bS}_M=ow*0WAVU&7!>6_&PtmzVPu(EwPJm*t z*q$zwVdL2G(75-ThHkFAIM@-}vN_gRNUeu+eC!m(JP2F1ii$3B{NbGVD={xNKsB~B zk4*60aIOZ`rAA|oJk)(wYk6iIenmLsl+_)%T!0hunz(WBclzcp7v6fkG zvM)k-IBzT#-ISBVt_Eh}cj1wrO~OQVpz2rYUK~IuQtUQ}AqbS)vw1$t)o@vD$S=_g+$xS<_bhIY0RjEr}+2FwNlz z&a;7tZdRjQVrx3yTP-Cw9UQ`rr8tCDx$^{h1}YG>(MMdM zNMYk$E|MVLYwWO>gp#WP_Oy3(yVcy7HbJaUsbgvpSwh<@+N0*%%QkjcV|~qYbJN)t zb8&0CGP^L>m3-WHC=k}H<8W5BCJH+jrBk{(o|=@sC|I!SkJJ z$svgj(HisG=?VnrSdY4$&6nyqFh%JARbWL5`raQ(D7LPnvR&~Y7^;SLX;k`bAA->0 zE0l#)cI4VKAfEg5hVCIpimH1|q@Yhixl`^9IXX972;N*mqb_%b0Ci=!RR|YQt6cE@ zZO8;)`~M$m(Ep(}e%=3Hp~(8n{l66f|KxxECFLvWz~|Gw>DGSYPDvXl?QJA_ov&dr=fiOQDOqnmxiRB{S zz*9TN2lhFia?z8eV4XK}L^I&>opdZ9u#YcZTi4Oy?$ul;vegt}_7Vau9NJgy*e_+G zfDg1|V-+hSeTyHn?#>5sq&15aY9RI~CPtLIIlJ)nv2U$4Y26tYwC?c~e)9pus9%k$B8AChu(pUO%t=TM4x8?iMhWo?(s5ZPnWz zL5j%gR`W!l&#OcWGzTgVV5tf8mIM>1$#PLxfqu@ys*WQf;G&MtDtmudHrGBZuY$iZ z#=$iY*e0>*4bh$z_l&LZ@oMkztgY4-x3v&R?8X+!3%Uc=dc;W#h@Qw!fGjwuQ^hzj zL4@Uo;3sASc8L>>nl;7DiAVE<=jvPB%nPY@#t&k=2Ri0>ur?<`rI=}i<7>fd+XHvz zjJDmS!iaCcq%qk^dC`tdQ;}O@O458v$OZ)cAw22XT%g?8T+iz4n zE)@gcs`*DMPGk5D0eODnlqhJjC@3-`^Y4kt@hfXLM3pI`SN&Y^+^By8_VZe|hqsJ{ zkk^;A@8`dJBYp4cA3k_Czhwy7gM9lmjA{uLmfT|C9mV;PeEgZ>?4f!u=byX#=q(y| zAu44djXe0az<##$y`yA%j6%Hpwf6aDu2>e;=K$lI0>wb;X55)2%45H>H)K5o#R{MJ z6uIcrRQWixfr?`=W%Jw`m1_Wl1GKZIfaKe@l`ngKUe@~@l|(;R$^j26rbnDrT3A~{ zwp4cxuY2#N-~39Tw1R6a)s|LMnT#uFmz70AQzis(R@eIHTdFQQ9e1=Lwj5-Sm}qiP z#8SL_ID0HvjqHUkSD|EXSV`oQ)%u3A0nD#024I-NpQG^e0b_Z3Ei%+}pbIN2B*WSy z&D9O>$&NCM`)x>|t*d<|QcurVZe&P?o$3mVFTv`%VCS}PlFv}iL85U7YE|^3A z-<+_rE65Y@(mm1ox_fVWx9lm-!x5i*_F1nOcq>@^v0m{|S-k6P5D%4jh`O@sDy~9y z?*&)fAGW|M#C7X7th(r6`YzVDtOFi)INNLV-QI8lyx`VVl_DJP9j8gK7_Y9YMF&r~p;+@brG&}E- z3#S8`Y-@JBr>_JtTANFl2R_v8(Q~A9lFUF%$=XmboXvikNGB1T*Jg3g_Ow61||<(NVA(5-VSKzyR_*qg1*x zzk)ecIpJ9(nsTiQyu>oQ@?2_CP7|uRq!!7~D>(3yxiY`9@{yFpP~;c;E%4|4mf;*a z73@3ObzaS%-OOGb-lz>A^uvw7a0!Q_2f1VfqcDn9wbQZevrc@#cc&Mj59w}~pR zR?2N3Rtk8?_A!ZESfSjBJ3dVHS!W{ky!ROLL9Pj~B%Ay|uF0#M$|JwzY5b2I6yP-p z1!k87l;Jt&WcY5*$@6|2@Z#S4<~EjAN92>f;T>i0H)A4S5=5P zkE?wizl2P+hW(q)<6%b#o9KRY#uK8{j(;i0vL#MPDe7j!^$jj{T_*u+K}Ypk!h;s3 zw{{cc2{lDgB}rR(C|Y%7$JZ&o{fIB?$m4&Iv?*Ny%EXYV|=97VS*Jm)ET z&Hyi9h!Y-!7nFXt4sBh<(2EpB?+aW(Fr*pdZdjE8yg{opJjoOy z2k%744Acmh6`B=;mk14KN-Sxq`>|R6VdhNRBGr_il3O9NP!l;80<^-ATBvE6M7B66 z5K3TIvd5HzQCe-+xRjwohwZ?%7phoVyCKAj5am%yUf?kqXvaTnqG=nc*DDgI*BDb||)g!*j& zj(uL7;+0hiCQu?#D~-4ylzGuiQE>q79#>a1>sr==JNHVHo&SE;5arlmAh30IQZNL0 zSh1!vf)9+lBF7VBDHVFd$2MCqfSjMLMkLSbWswlLfws?yQM+u=bxJHm%HaH2=2|gC zyizs6n~dSUTpz=}%ZMn{f&tK1El{=+H#7No_l%3j$l2pWcZmyeR&>v9;Bt%2kRv@* zX=nUUJ+N2&6GDVCG!=&cW=ki-s|aNR$DGw*E>chC3-&RL;|4wvJaVigAYo(@2g@ZB zHPNyb-1YDI0si2J$4`FvcjSlaJAUX+e)u@?Xo@0?&WHJbjvshd>4dDX!+(w=fNvo2 zcR1pa$!#mr$Vuxhz-h^mz0I_4r%9EIzs(WAKm0#kMO*j=dAwP@G|}NK@wfzuJRb_K z%^JfpFM(t)>wTyvHvyxIt8g)lBy+Y4FR|O(OiZDSsDq)ZO#*8$KeYSB5lp6J z<(w<{7#IrrK5rEXzTf?TKRYYAkG$d9()R9*jgi_loQtSm)pciAU5~U^HEjOQC#!LZ z&RPe|ez%)d?6uxKtMT|=Qr8>jcw|FUtrpUe`b10&uBXDOwC(MyY_w2H#NR@sy3m}H z0!xcVsqvEP_yrN9=v%nox%}~JO4|}`+Li5F$Pm|ypJp;1{bl&e_Z(qpCr5m-wf)D( zkfN=Msx3ZP;`6y%Hcnj|y*?lU|F7ubEJYtSsmm`hnYyK{2p@pW?nK} zS=3(^SqS)VqcZi?aGCF-GFef#rj`42eu=`Wm@Y4zWh(ic*l?w8*|5*LFRSpIQw;*5 zf1t1T;}8;^?Y_-Y+;7)-;)i97euu&OC5HnrK2W3j9OJIOxAg>Iue8$-l_R%5LI&+gBID`-iPe%My~>oo)!0! zQEmN<>q7xnt+)+5`wZww#GXxsiNPhg;?g=2`}7!=3?c-DFMW_U%iMiKc&fLZjaxV( zCAI#f0sYWShG#4|TG$L=&d-M$uM493U%= zt>l6_JC)EOr4;S^h4E$-=iY^W_iDkdEwBqqm_Bbqv=Fm&f=zks;!4^!gE8>Z;CRtM z^gzSP3!Wfq%`KRo@4_P<=uRSoPlCw^;^Dns#N$fD;Z#vlwdOB3#&2a0VEf5Q^Qz8C znI;2ji3yzX;w6NU)|R|#A1UZI>&&D{!p(S~>oGB89#c&|OO=np58&E_!?RT=MmF;` zb$tdDE~pairUFh|lnzOA<-2h@pk}_No_csF~VbAh%Xyh6m zKkuNNJdnnnW(~iuaE=>j6<{&jw6`{Fx^UBVs>oklk+d>yvT)FMn z5H$I#xN|EvqpcTHE}B_q-TFhJ6aTW%eVyLCST;O0EtG-ptWn>kn&^Vg7he-ltWD>r zRkOY&pfE3;`*oTDe2G9QKgSu#@d1R!E5z(m6R3BH((}nEmUsN)NLAoRGF87ts(v^^ ze=l{wk7TO;RirBLBblnd-2G1?Re>MLRQ-LV>i6;o{AOJU(_P(mGU|+S)ZYafj~4@o?Q@?M~NCf|eHo`>7O5jGyb^QJ!-g1yOx zcE@no>CX~w(bi*FG5?wGfE2852QDTpHmG))Mk8tz_oBt1o1MVH!9K0gS}aBu%*e3GZj^)> z-8g|88#c=2^Wu8InvLU|cS5w*qsOf?hPd|nw+O|ra1D-QIq8G-%B5nW@^)9Q5bfjC z9tSsexD2W(bigwJCyd3Tl$b*LqQ1ICsOm_z_^L-F6LxrT)Qm8y*kq)2AB|Ly&*KNR z(rjdK)_w(qa6L9zHT@?Rhsz<^PogS4KAMsyenRoHGF~K}Kx+P0twxcXXb8ICVP9%C zxhFRt1_Do352%$jx4)KRS3d+RAjx>gqU>NQx*i4DVHFN{WQG)G`#;by#F-3|1`Y+G`#;by#F-3|1`Y+s}1jegXDz2LvkMuVtxPROpcY_ zT5L7jBS^VH&DpZw^WhJi@o#k|C;YQ#a*@s!-_GRhZ`as<_>DDLnLiuYAKCxpay?OPk5Ze;Y{)}3kCYwgbFbE>rZb-!KE_1z#anjR$VA<2>k?WkfI zhB~`{{>A#fV#}E)zkq>G>>8tr6vAgHL$kRB=U(z=jb2rPk?#{d_i`-NNb34%viRV?6XSLTMN0}Q$Zw~KI5hvbzw)<2GK7$C$jixsMSmK6 zDs9_)xuAPE0X29Pst}RywT}dQu(_`(Q1}TV)Wv4;-WXtg=m4oo&)86 zJmG0xF?jZa)ON&|?Qfftr5i!aA`n`9P>$F1sz93db8$_^_Lp95HK!HxmdG@`M zkmMFycaWH?_Sdvww))r?875!ShQALR{)VZjfV`ouV&Swr_RJJV8S zmM`+hpDv#->rch`6MHuE4G|T~3eL{-%lQ=W^$d>v&EkZb!N1KFb(dLm4i?$#$N3zy zetP+Txt0SMJG_4(m$O2jNOXMLI`tKWc<-vO-X|93tnggzgS~cwSy*8R{W{tGoZunJ zhm3t4I(|9OL%x%`k9N@eeZxwyz;`APv}hcR00)`(}I-_Di8;~Q@QA9qiG z=3nq|!@;qlgu2d}1Q0 zXz%N;DpFvP_|=y5E7y%`3YN5c?>2`unGU!;Jff1-1!`{hy>!8;Bne}A-ABj(Qv!82 zRFXqX4ug$CW%zwISI~S@UKq3pY9B_qlOdv>Lq^j9|na%Dg0s>e9Qu1DfowNE@2U&+?nF%s0mgqcBkaEjBB z(BmP?k2l=g6R*DJXKyr}X8{C+M=~RbbVNso=Bk_foD(^JtrdR$peuFDZwa z4P6_~inaA9q~~YQ83U4KnNQIr7pQ95!o;)RtJ$n}vUe5beG24s!9y`}QtKhY0^T68 z?sN#2SX)>C%0&pVHYz-2ue2l8jdvNVuNv*{TP(JZoK!i9`hCRgE6Rh)#0tCdL<&8`** zxZ}|(y;AL$`@DH-bnxXX->v=XH`UF($UhH1PL%(eZWa{PVIaLHTghAB)(CpHmqyNe z=`{Jb(p9-Ss{e^2%EX)>N4RXy^#JKSI~WSz^Wx#}KM6(b#2ToK7Xv_88IuVC~t z{4-XDU|i>)u`(QCQvWF{!$(Q**~$>yRLd_}8NT7h0G>6(S8fcsG^{n<%9}JcC!DWA zCRT1{M6YO;UCP#Zho($R!3J1lX^%CyV9H662&dd^1SIiP%&EyP4FWbdR^e6I%6PF< zPQ>uIaxh^v$%@PQSzIAkP~@1{mr^JxlvyyRABgsBOU==%<*_7>c1*!9_I)}W`09zkR@6p9h{+-#Sr2`|NBhx@ zVOO-^JwW=DkEp;w;!O^mNqTM5j6v5Vx)QJFax>uI8{=s2@ez0rklx{={f&>t$66(A z9^3$F06yNqS(P+I`XdGFwSWbFR>68LV1b`iuwDyT;Aa)A*8&#!Sq1B*fVGY^5@hF` znI5P6cDW=LR1j5R8g%=K!qA)DJlED|%yw&{7O8r#kwQB`}~BIqG0<7gyrC zK_$J85#!<|PA9`s(U*mkc}s6qf@;=s zthSjo(`GfV!^TL41LdB&k7;Q~JrG`t;SX(0iym8HEDuW%z=a8zkC4yOa zxG0YIl8a$d-M7miYO{}@x#{K;y0C&xt$Rtp#m(C+7x}uMR@cA<|N^O*II@2govX`h&R;4o&$(8QyfVODK)WG=$_7rY#DBap zeyO0}wHXJFU5Z_>SOv7j=gHWyqw;ZItXeDPn@22a?M3Tp1jP&`z=yj)$wZpZl{WHy zE&Ao17Ry!Z0mYkryD?wF&8Z-sL#|Dwvpp#hqS(n4j^5cM)7Y3Ft_;+7 z7+QA)__~GSiN?+YeiJRiKi~}`p*h*O*0khKb^dM`3s`gs!VSn+8n|>(9?;@zF)yS^ z^z4Wawk+R|&@OGcNNfyQeOvG~WmNE&88r&JIkw5A-H92Dhz>IF5&zZPU@81Urd=t91&OS{d03>upaMP5(K^eQb6uQ0yzB+MH5 zyK!Ic$jhlHD)Pr+Ex8%Nt_)d02@)65dMN4P4>V#gSZ9OxH^}v6!aC47r)AD9Z*=cr zvWOPFGcSlR`Eyi{1tLN~j|&T?4CR9u8=-7EIuX7 z0Y|z#S~dg1nh)k+Oag2=Acsd6R(6*&<=^smt@l( zF8V_eeOwxgZmoJB{k8a^<9mO0w7-nG<&&wIXDuoJe)(PBgsF9II&0mI>QH|og>>0FtZa@3+Psp0MEpvHrubTRQQRyfi~BF zh05GQ!e1?OX+PyS55uf*o(cs#2W76MJa1c``$!Lfgo;7J<4N3EF#gH3_M|962Qthu zMX={n-=RyG{LhxI14Mr=x1K2eVj3J+Grl7l1&Y0cty* zN33foVK`ZaH{WO)vao#tC^IP=ra#0pB*RV*#GEKuG^)259r4}~Co+!u%@PY;vjG14 zLhHBA*~y6zT~uC~W=+O8oTF_5{Tb}gxG#Na&tRrESkfDoEukA0PAYXopzt0G!R`D^ zDSl#czr#Q;|IJ-WAgM!UJAwEOy7m(?wD5LeL~bq0TfmXMzwz!7!$0C-Xu6Uk)e*J9 zbzrASwDe@iv6?-PDi$Dt5U~T@RMV+BeaO4I8*NrFrj^qwMVORC zIYJV%BkqFv4c3)HOb#ou=6W{51A{db7v9=`Kz}ehI7DtO{xxe%i}=!mx6;L8QBB*6 z*{eIm-^1i{!~gx>?>*}izVqD|A=V55d_jmK<{184EMt{_2x!c|9Js9p4KK##urdr3?VgFG0KND2yB%*gc|7g2y0{fTc1M7{g#I57OG;<{y;Adb`FX{1`}w}54EK&wv-bziv%Ih%^6ZlPUUk)Al>V%!Yv#8E zvpOu|?hihqa&BD+$($ab-?j{xP$;ch?FCcxxGtuZqv0`ZeQAZfd(4ida3Y0Pnijnq zXQR;srNSVTq8?b+pS0UIYuovHIki4jr!?{SEWXtjtUUs4(DcuTm&pyf%!u)YqIkWZ zcR-Ibv&dT-8zez_C9#2N4k3ax3P8f?UBM7;;iZDsyw5Ce0j(SQt^pbj>jYv|H6IpN zdHmJb8>8s5Ft&%Wdr24fQLKp!Ej>Olwps@}04x1k55^ONeqHcMBf0RmJokl5e}p#& z?U_aP&!ajhNCjI^#0}S=J7sUY1{V{p2C99mU5_=;YlZz^=PWop?76f|hTIYNs0{+7 z1`M#Zk!cipvy|aO!%KS3G4aeVa&He>qHPksw4vskc~hSqH9p|>SomUHJkGlzqZumK ze3hr#u`M{7ERm4EwPEh2xrv+|qn*cXNpH6#UGif&1eBQ*o@w z!X}n*;WwjB&TZb}5dJusOch#IiT?ku< z0dHGg`zK`@C7u(9-b-9Rg`t6;xwvo0_3pdnFaaf1T9qi*kChZWJ3f>BQy&@-?QaRu zQ->bst~I3fIw=5vO4yeY1&!oYx{Lcz2JTm#K4*d-#+H6#K!ZcT*mBX;Y`#ZVnKYTC z15OUVPU0507E}9y%jdg*r-GQ6KE!lS%#wMyd4m(3nXaZ2Yr-R~G@Bjq?IDHqQdUwQbM+WK$JnpF33Cv%Rx z(9_-HpqDssx-;Z&u#f;JkD;>95HRy#k-qru)wMkt7dJ+x#!m90%(y{nJ+TOGAi991 z-`$ZNY;?u?L#92+D`m#T)2f>XswRTBA11W7d$%WRj;-8TwO&`W^7W!2pHL|DD)PMv zT0$w`8BZsiw3B0;k*_X`te9IA!s>F`u%03Tls;1^ws5QJQzC!Z+n3cHV8qY13q;h+ zj)yMm$x1$=ia{(GVgq-xtU*Z*S99i;&BREomob~(rV8>y7(r(NIEUz?#1g#9_bT8+ zp??NhI1jAs$_iCy(E5X^)3rI=M()ODD{Dy-h`}c&hs%$LH@=1@k28yGnINMdAzDF; z4mj(w9PtwI|uJ))kjfn%N%>C7P^wdBJO3N9w>`9ZjTSFY*e@1SNr0pt3D z;Wi`adD-0yS;f?+z-mej(dbIee5n*mFeIa#xZT0phfhOZ2dBVKRDs1#^Yt2IcuRAjT({&{X&NSN#5TS+x@;`jUa;5Xa&#DviwM z2^r7ArnJxz`N0@m&Q{?FS~O0^WB7MhY(j!w+em_*5UtUvuOCyb5iSEYs5Llt%{K3QN#FqyydhzM>i*L2NO#MLyd>E(g4OVVx{|cZ#<)LeSVJS*RE=@{{`B&?5otPvr zGk+z*m2(>4OcUQZx#kFFyW@)i5VjiuA~RsloJ>Y^W5 zd}AiGH+E`*R4~&@7`0&;(`%gC^QjKV^?lO6KLwmVzVABHKgW;t8XLbjAp|~8 z#M*Kr^IJqE8OWW&?Vp_Q&f-{n2Vdw0kJjU~TqnRuDUt6d7pcYl<+9;V{MPu5K>Ai9tXfb~e=Suf6_nlKr z`sw#wX>pjmdzbm#bWZLV5mfZ{xX?eA^l-UvFt4$+QurJMgHOxtA?8uzU*G$J{Cs>odOMSAPu@oF zmlAhb{^|I9{8Z|5f7sw}Y4g!~J9BU~Cbgvho{9fN^`#&ZfsNfhtATl^nKkFeqA)-; zXl?1pEkk842Fk|wTF9b;r&sHIHz5e7cL~;9Tqaa&G6(WSq#QdI)(|{TTQ39EHzQsa zMj{zF3ar-0(mZS)ajj7rf(~5x#>JYiAm=p#P^23~0kwTYzbZ413C@TMLj8p|efvEo z8_}pY(O6{^lf&{j{xr#Hhpgs6kZu#sT`)E^zE7iT9BCQl6r<+Y0TadmwR5HvBb}*f zB?Z?MTMwF+?<(kWUXVj2x&3=g-1Y_H55E1eCGfGAV zr@#OxRU)B%2r1k%0!5?eM0W6WYKZ#KJ!c3FPH7w{enRb6eE}J?b@$Ig6+vVBM9NvRT#~WEJp?Y zKt&k8v?%5TFV+lnUiGtZL2|izCdWZC73%vIvg7!0Nq|r5bRde*umEh^2#vY;c!+YF zB!v)-j{EPzQl?#?gtSQq_J^O;eI{uP>V{A_|Ll0n8nSg9!yL!AKFx-ouO-_z&}QY@ zOs(_#r>hm02=m{O8KUQs%WLZgcsM;(E~c;tOd-=g2AE^v2oWK^lqOt*7VGOSo;T+~ zluWol@@hR5k8u#J_JIRuUL(6j(a*@T@Q2fkvJYpSI1b757XrJsU2 z8WtKZihPzlx`viYaHD3PVL$)+#?7nVWH?z%9A>HphC&qoHD{V{(%}R1jOAi))f_PB z#(0^wTe@niGc}5SYz?C?k3JdlZob9)52G)g2*;BCReIajDg(KGR=znrqxt;>aqW3- zZVD?;8swh-6+)Awo_@X0fb2&4g}s(dedGf}u}&0Rqbrz5Sw%DGHJGVf3+^9PPOb$q z)T&0)4yzWf55bb7im^)!LoSn*!*cY3qhYsn1NpYP&DTVVjKhScIe6z-Fm2l&pizIVAt zFeDY6U%|RRBzkuA1(+;)8r0hoCPtm}bOl5+<^<8GxP}O31iR}7<)h;T^?w%U-iUVx z1@Cr~h180PJ1X|s=z{Xe#CWG?Ypqz*R@4t=X}*%iq1s>yxK+&y4~|jArg|$bs7-h~ z^!iMpUuTjQkiK1SjiEmP-W>dI2EC=8HBt@VyzoDdo&t@N`E%21V_!OXpq`+<_=i#! z=v;ayi0L(LLRY1dJkO0~_+_ZIzfBN9zR`p{F$02g0inj(obHch_w58K(1Ycc{ z#q24>7?;DFMeNhrT<7g{-QcSu3FMzyUfRIWvaQWYqxM7sgK5qbpa|=DngSd=f@|>G z4dj?1M-q_^tA&E6k63pvHe`e0OFLVd1g~Cx$i06BnF>^$cCeove6iLQwA%y~S1JzG z{!>b9`f{J{uj&VP^(W;~z$UrY91%)BYDo`UMd9PG%NMI!ug$5ZdyuF6VHYo=p<4t7 z6ie;NUlq}uk zo0Q`D$9x&|CzI`}+d<~^fu{ERyb-!R2@rnq@P9iI+8eUB&$MThikF5+`r|y3B5|qh zT-ZEklR`U+5#VVDbzDEc=Q%))Dg5Vve%q=&wqK}zJ4Wc?alBRR?}UU&JBnu@Z~8By z5>ku8DhlGdaS@LJbN>dPLDx>-Y%>^2a}$~Y2Fr8+i)al{!&_-R7pxX871@+Tk)0z! zx3!h}W|{<_Q2l4rOv5Q~y?Mn_uA~O)ILli**|Wvt@7>*(^kn|=Uq+~y4Pk#*#uT3@ zN0|E9+|{BSr}1miy7`aogm2BuElmXY?szNv9CovuQlCgt#zz}T%{2essGjLMByks^ z28_SVqhj)uJt}x_22a=;)>xy+Y+Uke^4{PYF;J0PWgsGF8br{?yBvn1m)~P4LgYf_ zWj}VaZu(l6KLYskdqq*U0ns-~u$qj)X~M+R@x@Q-eL+!-^zNG2`siq7mlWCIZV#S^ ztzq|%Ed+Uw>(9Ed+v{+iaU)7n)tj8hg4+Spl$Ra)Pt)q#?@>yGskwe7?75LCcU~ah z-DIF(d~VqNt9xz=`uRvYK$~?&pIF0Vf_esT*+(eXb?rAGK|A|T!etkWR&S(PPxW+e z6qdKwkHCi&Sd4cS_X~<=Sff)VFua)WA~tNT`xDO4`r<>TsU*Kj!f(1!uZn-Y63_xH zSBE~O z_4!Fe_at?vcFA@kclVoE;;aK+r!AcId1{iaWc$1U{KS;~g)I0KeY` zcR7i`CC8XFZqP|qO#iu59*1BfU`J>egMmkR*qySYGdq}1iPQZmicU{D0aA=L9#d>o zLptZVq!n9|n|qG=eq=ngLUGR=>l*GeUjCN;g}O3;jh4pUT!NiN2A!mBN2fNUfBP!^ zNGe0#R3dsA;NQ)bJVqX0z?^xa0bG^s*0;}Iw-FIY0_7? z{q@t*7q{a=+_iI|kZ4O4hUxs;^t3Txk7d%Ka)3I+RD!WqZiYlv_rjlJtnvW4v%Myz znYR7E5rDRF=x>Ge>$D-}X&-ibxUtff&X(V{oh;y{W^jpWBA{aws2T^bK55Wk@>uwwr*RWUi6>4;w-6#T$-EQgA86EZdfgF zZ!i>PcovG(Y9)_o+B8uiT6$luJk^hy#%D2`hp<7s2?⫬N>e!qQ_|EcZn+UFA~8 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 Date: Tue, 15 Oct 2024 16:11:37 +0200 Subject: [PATCH 3/6] added allowlist management publication --- docs/src/intro/publications.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/src/intro/publications.md b/docs/src/intro/publications.md index 0397a8f85..78958b594 100644 --- a/docs/src/intro/publications.md +++ b/docs/src/intro/publications.md @@ -22,6 +22,8 @@ icon: blog - H. Hund, R. Wettstein, M. Kurscheidt, S.T. Schweizer, C. Zilske, C. Fegeler, **Interoperability Is a Process- The Data Sharing Framework**, Stud Health Technol Inform, 310 (2024) 28-32, [doi:10.3233/SHTI230921](https://ebooks.iospress.nl/doi/10.3233/SHTI230921) +- S.T. Schweizer, H. Hund, M. Kurscheidt, C. Zilske, J.P. Böhringer, C. Fegeler, **Handling Complexity in Decentralized Research Networks: The Data Sharing Framework Allowlist Management Application**, Stud Health Technol Inform, 317 (2024) 85-93, [doi:10.3233/SHTI240841](https://ebooks.iospress.nl/doi/10.3233/SHTI240841) + ### Recorded Talks #### GMDS Conference 2022 - [Hands On! - Introduction to the Data Sharing Framework from a User Perspective ](https://www.youtube.com/playlist?list=PLsHs7HOt6jDMe3PNevpo-uGsDTWVSMsYZ) From bf7007f5b39d5c0528e2d0adf34fe03b2d4b773a Mon Sep 17 00:00:00 2001 From: Hauke Hund Date: Tue, 15 Oct 2024 17:01:00 +0200 Subject: [PATCH 4/6] dependency version upgrades and associated fixes --- .github/workflows/main.yml | 2 +- .github/workflows/pull_request.yml | 2 +- docs/.github/workflows/deploy-docs.yml | 2 +- docs/package-lock.json | 4360 +++++++++++++++++------- docs/package.json | 18 +- docs/src/.vuepress/styles/config.scss | 1 + docs/src/.vuepress/styles/palette.scss | 9 - docs/src/.vuepress/theme.ts | 20 +- 8 files changed, 3164 insertions(+), 1250 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6c8944157..d6fbcf46a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -21,7 +21,7 @@ jobs: uses: actions/setup-node@v3 with: # choose node.js version to use - node-version: 18 + node-version: 20 - name: Install dependencies run: cd docs && npm ci diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 78f5fbdc7..43ed34894 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -18,7 +18,7 @@ jobs: uses: actions/setup-node@v3 with: # choose node.js version to use - node-version: 18 + node-version: 20 - name: Install dependencies run: cd docs && npm ci diff --git a/docs/.github/workflows/deploy-docs.yml b/docs/.github/workflows/deploy-docs.yml index 4bbb2f3c2..413ef424d 100644 --- a/docs/.github/workflows/deploy-docs.yml +++ b/docs/.github/workflows/deploy-docs.yml @@ -23,7 +23,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 cache: npm - name: Install Deps diff --git a/docs/package-lock.json b/docs/package-lock.json index 846fb23bc..1384a590e 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -9,22 +9,47 @@ "version": "0.0.0", "license": "MIT", "devDependencies": { - "@vuepress/bundler-vite": "2.0.0-rc.9", - "sass-loader": "14.1.1", - "vue": "3.4.21", - "vuepress": "2.0.0-rc.9", - "vuepress-plugin-search-pro": "2.0.0-rc.32", - "vuepress-theme-hope": "2.0.0-rc.32" + "@vuepress/bundler-vite": "2.0.0-rc.17", + "@vuepress/plugin-markdown-image": "2.0.0-rc.52", + "@vuepress/plugin-markdown-math": "2.0.0-rc.52", + "@vuepress/plugin-markdown-tab": "2.0.0-rc.52", + "katex": "^0.16.11", + "sass-loader": "16.0.2", + "vue": "3.5.12", + "vuepress": "2.0.0-rc.17", + "vuepress-plugin-search-pro": "2.0.0-rc.57", + "vuepress-theme-hope": "2.0.0-rc.58" }, "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "^4.13.2" + "@rollup/rollup-linux-x64-gnu": "^4.22.4" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "dev": true, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", "dev": true, + "dependencies": { + "@babel/types": "^7.25.8" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -32,292 +57,505 @@ "node": ">=6.0.0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "node_modules/@babel/types": { + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ - "x64" + "ppc64" ], "dev": true, "optional": true, "os": [ - "win32" + "aix" ], "engines": { "node": ">=12" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz", - "integrity": "sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==", - "dev": true - }, - "node_modules/@lit/reactive-element": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", - "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.2.0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@mdit-vue/plugin-component": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-2.0.0.tgz", - "integrity": "sha512-cTRxlocav/+mfgDcp0P2z/gWuWBez+iNuN4D+b74LpX4AR6UAx2ZvWtCrUZ8VXrO4eCt1/G0YC/Af7mpIb3aoQ==", + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@types/markdown-it": "^13.0.7", - "markdown-it": "^14.0.0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@mdit-vue/plugin-frontmatter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-frontmatter/-/plugin-frontmatter-2.0.0.tgz", - "integrity": "sha512-/LrT6E60QI4XV4mqx3J87hqYXlR7ZyMvndmftR2RGz7cRAwa/xL+kyFLlgrMxkBIKitOShKa3LS/9Ov9b0fU+g==", + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@mdit-vue/types": "2.0.0", - "@types/markdown-it": "^13.0.7", - "gray-matter": "^4.0.3", - "markdown-it": "^14.0.0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@mdit-vue/plugin-headers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-headers/-/plugin-headers-2.0.0.tgz", - "integrity": "sha512-ITMMPCnLEYHHgj3XEUL2l75jsNn8guxNqr26YrMSi1f5zcgq4XVy1LIvfwvJ1puqM6Cc5v4BHk3oAyorAi7l1A==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@mdit-vue/shared": "2.0.0", - "@mdit-vue/types": "2.0.0", - "@types/markdown-it": "^13.0.7", - "markdown-it": "^14.0.0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@mdit-vue/plugin-sfc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-sfc/-/plugin-sfc-2.0.0.tgz", - "integrity": "sha512-OXrMXOyk0iwdIou2jRoIHIbjskwghkO14C9/OjgVHXSSX+iM/WQ4l4yi1aWmNlbQNjtP8IXcVAyJB9K0DFYmLg==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@mdit-vue/types": "2.0.0", - "@types/markdown-it": "^13.0.7", - "markdown-it": "^14.0.0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@mdit-vue/plugin-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-title/-/plugin-title-2.0.0.tgz", - "integrity": "sha512-eqBoETPVkMXNLvwFshz/A2+Cz81VB5HEkXDm0tt6RBW/rTvnoWmGJ1Z+mvcjR5ck5W4nYdIyT68oHxX2JI2M4g==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@mdit-vue/shared": "2.0.0", - "@mdit-vue/types": "2.0.0", - "@types/markdown-it": "^13.0.7", - "markdown-it": "^14.0.0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@mdit-vue/plugin-toc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-toc/-/plugin-toc-2.0.0.tgz", - "integrity": "sha512-PKQ8sZna3D5chTnt2lxL+ddpyXd++6Nyc0l8VXCeDgStlySQwiP9jaLeeC88oqY4BtRu4cAmILmxDrvuX0Rrdg==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@mdit-vue/shared": "2.0.0", - "@mdit-vue/types": "2.0.0", - "@types/markdown-it": "^13.0.7", - "markdown-it": "^14.0.0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@mdit-vue/shared": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@mdit-vue/shared/-/shared-2.0.0.tgz", - "integrity": "sha512-PdxpQpbyTazeo2JT87qms6RPZIzyJd+gwuB+1jSwLDI7+0u5g79y2XgTAbZromSVgY2f3UU5HWdwaLbV9w4uOw==", + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@mdit-vue/types": "2.0.0", - "@types/markdown-it": "^13.0.7", - "markdown-it": "^14.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@mdit-vue/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@mdit-vue/types/-/types-2.0.0.tgz", - "integrity": "sha512-1BeEB+DbtmDMUAfvbNUj5Hso8cSl2sBVK2iTyOMAqhfDVLdh+/9+D0JmQHaCeUk/vuJoMhOwbweZvh55wHxm4w==", - "dev": true - }, - "node_modules/@mdit/plugin-alert": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-alert/-/plugin-alert-0.8.0.tgz", - "integrity": "sha512-mxA/lhOyDDR6/qSAegGG/XZRjUbr1wjwdULudbpkA/CCQi6piW9D0Z8crDQGYz4KPQM9Bgx4Ac81QFSzHOV66Q==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@types/markdown-it": "^13.0.7" - }, - "peerDependencies": { - "markdown-it": "^14.0.0" - }, - "peerDependenciesMeta": { - "markdown-it": { - "optional": true - } + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@mdit/plugin-align": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-align/-/plugin-align-0.8.0.tgz", - "integrity": "sha512-OJPYzSdmT0UZj/QTvnKYE4GelAL0OD8bNIPxpidXbFd3IqYv/8+xMjT6XeR+R3oZEvtbYSc2e1MmO5fo3DopJA==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@mdit/plugin-container": "0.8.0", - "@types/markdown-it": "^13.0.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "markdown-it": "^14.0.0" - }, - "peerDependenciesMeta": { - "markdown-it": { - "optional": true - } + "node": ">=12" } }, - "node_modules/@mdit/plugin-attrs": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-attrs/-/plugin-attrs-0.8.0.tgz", - "integrity": "sha512-ewmx5i+b3M4CRJNDpDNBA0YTHa1snn+adDsDDpDtPPSzCH1NhtWXdzwI0TrcCQUnueeSEEWX/wY4ESo+NRkBNQ==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "@types/markdown-it": "^13.0.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "markdown-it": "^14.0.0" - }, - "peerDependenciesMeta": { - "markdown-it": { - "optional": true - } + "node": ">=12" } }, - "node_modules/@mdit/plugin-container": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-container/-/plugin-container-0.8.0.tgz", - "integrity": "sha512-uWK3t0CWssintcmT5PTJVhAwbstcD+SrtijQKs6BhLRtGGgHJ9mOf0ybGjlJhn4077yFFTHmaCIT3K+n5ZVjPg==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "@types/markdown-it": "^13.0.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "markdown-it": "^14.0.0" - }, - "peerDependenciesMeta": { - "markdown-it": { - "optional": true - } + "node": ">=12" } }, - "node_modules/@mdit/plugin-demo": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-demo/-/plugin-demo-0.8.0.tgz", - "integrity": "sha512-yFRXnp3Lj0g4H9ImzHKQwwgtSykrL/BDNEQzql9fdA9FbSygfu0CIxfm+A8lsVos8cAvdsgxy3gILySxpfR89g==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "@types/markdown-it": "^13.0.7" - }, - "peerDependencies": { - "markdown-it": "^14.0.0" - }, - "peerDependenciesMeta": { - "markdown-it": { - "optional": true - } + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@mdit/plugin-figure": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-figure/-/plugin-figure-0.8.0.tgz", - "integrity": "sha512-/o4RoKjnkdWc+K7m6mR7BAu2J79yYE38s8HUc8iKk9v+e9j1E+6LeXcpx1LoPnHzUhT4EO2QmUsv+kAaPFfZYw==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "@types/markdown-it": "^13.0.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "markdown-it": "^14.0.0" - }, - "peerDependenciesMeta": { - "markdown-it": { - "optional": true - } + "node": ">=12" } }, - "node_modules/@mdit/plugin-footnote": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-footnote/-/plugin-footnote-0.8.0.tgz", - "integrity": "sha512-AaX1rfkJwq9vLX+H/a+XQ3ZxahOXrnMLr5dVZfNdazjqdDEJ7Cc/A7UFtLfOM19F2w3EgvcHR1gbINxIVDn/eg==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "@types/markdown-it": "^13.0.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "markdown-it": "^14.0.0" + "node": ">=12" } }, - "node_modules/@mdit/plugin-img-lazyload": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-img-lazyload/-/plugin-img-lazyload-0.8.0.tgz", - "integrity": "sha512-Rrlf2FzOxxyszbv3DpkIwEgmYKmtwHdxIO+Whkn0a9QckxnEKkaGl5KARCnM7LqX2fhEyFLgnfkr3onVOJG54g==", + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@types/markdown-it": "^13.0.7" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "markdown-it": "^14.0.0" - }, - "peerDependenciesMeta": { - "markdown-it": { - "optional": true - } + "node": ">=12" } }, - "node_modules/@mdit/plugin-img-mark": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-img-mark/-/plugin-img-mark-0.8.0.tgz", - "integrity": "sha512-4P6z2QOfLHLMSXUP4mB/2Rnd6KeHmJBkUXJWJhybcXoIG5S5FDTFHJxOycSP4eGzfdOYAWSlkx6XwXEUGGZz5w==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@types/markdown-it": "^13.0.7" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">= 18" + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.1.tgz", + "integrity": "sha512-wx4aBmgeGvFmOKucFKY+8VFJSYZxs9poN3SDNQFF6lT6NrQUnHiPB2PWz2sc4ieEcAaYYzN+1uWahEeTq2aRIQ==", + "dev": true + }, + "node_modules/@lit/reactive-element": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", + "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", + "dev": true, + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0" + } + }, + "node_modules/@mdit-vue/plugin-component": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-component/-/plugin-component-2.1.3.tgz", + "integrity": "sha512-9AG17beCgpEw/4ldo/M6Y/1Rh4E1bqMmr/rCkWKmCAxy9tJz3lzY7HQJanyHMJufwsb3WL5Lp7Om/aPcQTZ9SA==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14.1.1", + "markdown-it": "^14.1.0" + } + }, + "node_modules/@mdit-vue/plugin-frontmatter": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-frontmatter/-/plugin-frontmatter-2.1.3.tgz", + "integrity": "sha512-KxsSCUVBEmn6sJcchSTiI5v9bWaoRxe68RBYRDGcSEY1GTnfQ5gQPMIsM48P4q1luLEIWurVGGrRu7u93//LDQ==", + "dev": true, + "dependencies": { + "@mdit-vue/types": "2.1.0", + "@types/markdown-it": "^14.1.1", + "gray-matter": "^4.0.3", + "markdown-it": "^14.1.0" + } + }, + "node_modules/@mdit-vue/plugin-headers": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-headers/-/plugin-headers-2.1.3.tgz", + "integrity": "sha512-AcL7a7LHQR3ISINhfjGJNE/bHyM0dcl6MYm1Sr//zF7ZgokPGwD/HhD7TzwmrKA9YNYCcO9P3QmF/RN9XyA6CA==", + "dev": true, + "dependencies": { + "@mdit-vue/shared": "2.1.3", + "@mdit-vue/types": "2.1.0", + "@types/markdown-it": "^14.1.1", + "markdown-it": "^14.1.0" + } + }, + "node_modules/@mdit-vue/plugin-sfc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-sfc/-/plugin-sfc-2.1.3.tgz", + "integrity": "sha512-Ezl0dNvQNS639Yl4siXm+cnWtQvlqHrg+u+lnau/OHpj9Xh3LVap/BSQVugKIV37eR13jXXYf3VaAOP1fXPN+w==", + "dev": true, + "dependencies": { + "@mdit-vue/types": "2.1.0", + "@types/markdown-it": "^14.1.1", + "markdown-it": "^14.1.0" + } + }, + "node_modules/@mdit-vue/plugin-title": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-title/-/plugin-title-2.1.3.tgz", + "integrity": "sha512-XWVOQoZqczoN97xCDrnQicmXKoqwOjIymIm9HQnRXhHnYKOgJPW1CxSGhkcOGzvDU1v0mD/adojVyyj/s6ggWw==", + "dev": true, + "dependencies": { + "@mdit-vue/shared": "2.1.3", + "@mdit-vue/types": "2.1.0", + "@types/markdown-it": "^14.1.1", + "markdown-it": "^14.1.0" + } + }, + "node_modules/@mdit-vue/plugin-toc": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/plugin-toc/-/plugin-toc-2.1.3.tgz", + "integrity": "sha512-41Q+iXpLHZt0zJdApVwoVt7WF6za/xUjtjEPf90Z3KLzQO01TXsv48Xp9BsrFHPcPcm8tiZ0+O1/ICJO80V/MQ==", + "dev": true, + "dependencies": { + "@mdit-vue/shared": "2.1.3", + "@mdit-vue/types": "2.1.0", + "@types/markdown-it": "^14.1.1", + "markdown-it": "^14.1.0" + } + }, + "node_modules/@mdit-vue/shared": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@mdit-vue/shared/-/shared-2.1.3.tgz", + "integrity": "sha512-27YI8b0VVZsAlNwaWoaOCWbr4eL8B04HxiYk/y2ktblO/nMcOEOLt4p0RjuobvdyUyjHvGOS09RKhq7qHm1CHQ==", + "dev": true, + "dependencies": { + "@mdit-vue/types": "2.1.0", + "@types/markdown-it": "^14.1.1", + "markdown-it": "^14.1.0" + } + }, + "node_modules/@mdit-vue/types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@mdit-vue/types/-/types-2.1.0.tgz", + "integrity": "sha512-TMBB/BQWVvwtpBdWD75rkZx4ZphQ6MN0O4QB2Bc0oI5PC2uE57QerhNxdRZ7cvBHE2iY2C+BUNUziCfJbjIRRA==", + "dev": true + }, + "node_modules/@mdit/plugin-alert": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-alert/-/plugin-alert-0.13.1.tgz", + "integrity": "sha512-3LMYQQ3QP6TUx6zmtmuoHJScST5SVoPZlNuuF4S6PUZvJIwtlITF+eFNjDrA7UQx0PUdCgVHmwu5kYliq+BNtg==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14.1.2" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -325,19 +563,20 @@ } } }, - "node_modules/@mdit/plugin-img-size": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-img-size/-/plugin-img-size-0.8.0.tgz", - "integrity": "sha512-r+LbAizP/hw5SisY44VbHEnR7XUKpcHM2k2fwu5wb1+V1crxeigG4sa8rzrJEddU+k6uCl27yL5FTGbHjAl82Q==", + "node_modules/@mdit/plugin-align": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-align/-/plugin-align-0.13.1.tgz", + "integrity": "sha512-g8je53oEpYNHEudhtB5ViSiAaiMcca+hvoGbInhLl979tWuvEosOs0oWH2X3GM4f6goTGx8gLwzA10Z5C4FxIQ==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@mdit/plugin-container": "0.13.1", + "@types/markdown-it": "^14.1.2" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -345,17 +584,19 @@ } } }, - "node_modules/@mdit/plugin-include": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-include/-/plugin-include-0.8.0.tgz", - "integrity": "sha512-e8Z8q5VkJ6UX04tTgELraupB/MdHio7hkdYT71wBJ6UQuhSmFv/xMOxFfTcGKH5yzsbEM45BtAFHzSXIi3dMCw==", + "node_modules/@mdit/plugin-attrs": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-attrs/-/plugin-attrs-0.13.1.tgz", + "integrity": "sha512-3saBw5W2y3T0QNbui+uk7nfD36FOoBWNQImk+pbMGpKRqunjouiYP4ZtnttT/AiieGbZBVaOqhM4e01Uyua8VA==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7", - "upath": "^2.0.1" + "@types/markdown-it": "^14.1.2" + }, + "engines": { + "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -363,45 +604,36 @@ } } }, - "node_modules/@mdit/plugin-katex": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-katex/-/plugin-katex-0.8.0.tgz", - "integrity": "sha512-u7CX3Xv5nuc2bu2sHrk1nil83/9ETKTBMmy0icbW8zlqBC0ykLo1xTCEBXmdhXtnJtPi9f/wUZVs6iMZrJzbNg==", + "node_modules/@mdit/plugin-container": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-container/-/plugin-container-0.13.1.tgz", + "integrity": "sha512-mFfm7YViyLHo8uORVa9oLi9+acZZoSVdPf3WPqzC/yLZAJbF27rfJgWZ9Kylt+tyaAYng8L4DiSeVcSNUIHF1A==", "dev": true, "dependencies": { - "@mdit/plugin-tex": "0.8.0", - "@types/katex": "^0.16.7", - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.2" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "katex": "^0.16.9", - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { - "katex": { - "optional": true - }, "markdown-it": { "optional": true } } }, - "node_modules/@mdit/plugin-mark": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-mark/-/plugin-mark-0.8.0.tgz", - "integrity": "sha512-1hImu8FskIZ9dumWD2VIyB5USyVGwGY2IuaPxYO25tFvMZkhu4rYBjkSK8x+vXExwp94OLzFUlGgVl94S+nw9w==", + "node_modules/@mdit/plugin-demo": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-demo/-/plugin-demo-0.13.1.tgz", + "integrity": "sha512-ne36FB7jstUblatow7ed1Z3Nm0zootM7A6b+77xEw7aJnXHkM5tJLbBfS6l8WN1Ze7fWVZbP7xQkI3wRvjqrqg==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" - }, - "engines": { - "node": ">= 18" + "@types/markdown-it": "^14.1.2" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -409,45 +641,54 @@ } } }, - "node_modules/@mdit/plugin-mathjax": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-mathjax/-/plugin-mathjax-0.8.0.tgz", - "integrity": "sha512-y016KQHa3PoXDUIcQseISMAz5q2mZJ/qocEs2EABT4PjquXPEh/4rw7Ql7KX9gf/SQIUyzj8hYs4bHyRZc6x4w==", + "node_modules/@mdit/plugin-figure": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-figure/-/plugin-figure-0.13.1.tgz", + "integrity": "sha512-bxeUVMPAuXHYRqPzU+1ux7R3LkpyHTdavCa05rQUhzDI07N+BZDE7oOABXnnFbx6ESamzu3/FBtq9VKjoifLmw==", "dev": true, "dependencies": { - "@mdit/plugin-tex": "0.8.0", - "@types/markdown-it": "^13.0.7", - "upath": "^2.0.1" + "@types/markdown-it": "^14.1.2" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0", - "mathjax-full": "^3.2.2" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { "optional": true - }, - "mathjax-full": { - "optional": true } } }, - "node_modules/@mdit/plugin-stylize": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-stylize/-/plugin-stylize-0.8.0.tgz", - "integrity": "sha512-oNFI3Z7UTxP8CKxS3CIuawLmsyrc0n9jIw9mPzUcPNp+LtYmLktfZc3FIRlqpUUq34YwHTH3yihayBRdSkVV6A==", + "node_modules/@mdit/plugin-footnote": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-footnote/-/plugin-footnote-0.13.1.tgz", + "integrity": "sha512-46TzNvY9QXO5y6MbXlewCe+gfw3lgF2IFQCs0enaWVSgKNaGxOuecDR68SlbLPc7unJQCcs5Bb/XB4xsx0depQ==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14.1.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + } + }, + "node_modules/@mdit/plugin-img-lazyload": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-img-lazyload/-/plugin-img-lazyload-0.13.1.tgz", + "integrity": "sha512-DPzR+yabbgqHWHb8oetOj56TtZzOcn5YZjSTssoh7lY5hp/Yy7jWvlLDrSw/LiXkYEhyocUee78enhTodBEpHQ==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.2" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -455,19 +696,19 @@ } } }, - "node_modules/@mdit/plugin-sub": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-sub/-/plugin-sub-0.8.0.tgz", - "integrity": "sha512-oqCcmJVJykESgNJ4fFmDKKxRRQddwkXWIT4PjF83XSeXHxTOz8gMfke/V1mE7BAfKKCLP4io8HbrYfvIiOTZ4A==", + "node_modules/@mdit/plugin-img-mark": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-img-mark/-/plugin-img-mark-0.13.1.tgz", + "integrity": "sha512-HOALB1nILV5vkopSKPrclkwwc5WGbpuAWxuOLTz/teOifE8E4JsbiFivcM6URMP1lZXzRBXoniQCCOUhWRis8A==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.2" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -475,19 +716,19 @@ } } }, - "node_modules/@mdit/plugin-sup": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-sup/-/plugin-sup-0.8.0.tgz", - "integrity": "sha512-5/uE2lONNjCgGDXC8jZ265tzefjUNQNakmK4PSCI4D5jD80xFrxc6MKh70VLCOL8Xk6COK/K9f0SAU2lwa97Tg==", + "node_modules/@mdit/plugin-img-size": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-img-size/-/plugin-img-size-0.13.1.tgz", + "integrity": "sha512-cgihl72BNzij7GXjrqcKhl2eOqAlqWHiImOgblJPghDFNFKnnynty/Bf9nwbj8hTnhVWznFeuwawzXBfKYNbkg==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.2" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -495,16 +736,17 @@ } } }, - "node_modules/@mdit/plugin-tab": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-tab/-/plugin-tab-0.8.0.tgz", - "integrity": "sha512-SNa1S14Buuy564egiUTkU9HTTNFrEURJZLqA1+jr/2xYCdICPym0FWcB0cLtBl3lrQZkFtbxhzC6ws5JBt/ERQ==", + "node_modules/@mdit/plugin-include": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-include/-/plugin-include-0.13.1.tgz", + "integrity": "sha512-rWGJ3/L2Ocv+8KDNoXPb6H1f+aLqx0FzJKcNqJl+0HOAEScuyKS1GC4OxeWefVMQ87QoG/mYqoCbpDsJeiDbLQ==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.2", + "upath": "^2.0.1" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -512,39 +754,45 @@ } } }, - "node_modules/@mdit/plugin-tasklist": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-tasklist/-/plugin-tasklist-0.8.0.tgz", - "integrity": "sha512-vfOTZdXIL/jk/ConUqCODI5WuqgB9qiBGc+wIa7UMhe73KcpwFeGFJVQZm9AvjhXDDYqznJxSMVRP/TN7TxVVw==", + "node_modules/@mdit/plugin-katex-slim": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-katex-slim/-/plugin-katex-slim-0.13.1.tgz", + "integrity": "sha512-OO4n51aLo0Igv0aICXOaTO5+ZW/jW8Lnl8u1kxs2zkFVNUqpqNHAo8l4QxtscQk5L4XhXGgaTj2ZgAv7rtH96Q==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@mdit/plugin-tex": "0.13.1", + "@types/katex": "^0.16.7", + "@types/markdown-it": "^14.1.2" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "katex": "^0.16.9", + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { + "katex": { + "optional": true + }, "markdown-it": { "optional": true } } }, - "node_modules/@mdit/plugin-tex": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-tex/-/plugin-tex-0.8.0.tgz", - "integrity": "sha512-uh4kOhwBVEESz6dMmHk4Hn/AVfVtUhMA1UKpwMc1EL9qelodJ0YzSYfNXp6d/PS+E1l53yp8nMZK90DUO+3vpA==", + "node_modules/@mdit/plugin-mark": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-mark/-/plugin-mark-0.13.1.tgz", + "integrity": "sha512-UV+7cSY8iQXlfnrIJ/gEpgwiL2SSVzVLtaWMOV0J4tRSsdtN8ZXnJn/gC547SxBaOLIkt+0ObSskXaCH/UzuIA==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@types/markdown-it": "^14.1.2" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0" }, "peerDependenciesMeta": { "markdown-it": { @@ -552,85 +800,801 @@ } } }, - "node_modules/@mdit/plugin-uml": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@mdit/plugin-uml/-/plugin-uml-0.8.0.tgz", - "integrity": "sha512-6TOVxLhmdzV7bzjlJCRP5uCFq62Xwk2ZAeYUK3RLx9lgM3s2Mww5ENhdysnQMd7VQlUHsPmp4XIMBZZjPddg3g==", + "node_modules/@mdit/plugin-mathjax-slim": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-mathjax-slim/-/plugin-mathjax-slim-0.13.1.tgz", + "integrity": "sha512-ZFtKG2BtLAk1BarJZei9HP4aK0vNU7YvDb+R+nApK7MRmLQ53xHe7upu3qlfNBoOZWHXsdRmcz0G4xL3oxzlqA==", "dev": true, "dependencies": { - "@types/markdown-it": "^13.0.7" + "@mdit/plugin-tex": "0.13.1", + "@types/markdown-it": "^14.1.2", + "upath": "^2.0.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "markdown-it": "^14.0.0" + "markdown-it": "^14.1.0", + "mathjax-full": "^3.2.2" }, "peerDependenciesMeta": { "markdown-it": { "optional": true + }, + "mathjax-full": { + "optional": true } } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@mdit/plugin-plantuml": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-plantuml/-/plugin-plantuml-0.13.1.tgz", + "integrity": "sha512-qupMO/lG1mDYaGHSutB9AO1TsxHjmp4yFnvp3VBNNRdVh9lqWhXFv/htrnr0IGEWAmlik6zlkCvz/YrKRONV5A==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@mdit/plugin-uml": "0.13.1", + "@types/markdown-it": "^14.1.2" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@mdit/plugin-spoiler": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-spoiler/-/plugin-spoiler-0.13.1.tgz", + "integrity": "sha512-6aOD+kjGavkn+Ta0Iq8AUfBG3UsKsL5e0pxi0Eng13lIEp8DrDw36W+E6fLOFtX8Te3ays6eTkTc1I5WzHO0Gw==", "dev": true, + "dependencies": { + "@types/markdown-it": "^14.1.2" + }, "engines": { - "node": ">= 8" + "node": ">= 18" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@mdit/plugin-stylize": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-stylize/-/plugin-stylize-0.13.1.tgz", + "integrity": "sha512-1v+3H1nMMvXsbu6iyV1pQ7WccrRNkuHovkIAp04Vj0FtbjnKrBHlmzFZace5OaD2RcZ0fn6qRpyR+/AIMjUvtQ==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@types/markdown-it": "^14.1.2" }, "engines": { - "node": ">= 8" + "node": ">= 18" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz", - "integrity": "sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz", - "integrity": "sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==", - "cpu": [ - "x64" - ], + "node_modules/@mdit/plugin-sub": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-sub/-/plugin-sub-0.13.1.tgz", + "integrity": "sha512-2rIvEl6pXUoXIm3JMO5ZOQ+vWIeFXmLkqxcmTZB2yOIfhYdLwIcSyquRwtI2AX8zCuvaTdiQ/aypvIE4tDoURw==", "dev": true, - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "@types/markdown-it": "^14.1.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } + } + }, + "node_modules/@mdit/plugin-sup": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-sup/-/plugin-sup-0.13.1.tgz", + "integrity": "sha512-vkNif2Rbj7/gtk4/HJt5hnb+Dcbnek/V4HtLdtqUUnq9bIbzFBpYw5jZ1ZKKZeetDtRvOUPH5oy5d7iXAHorUg==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14.1.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } + } + }, + "node_modules/@mdit/plugin-tab": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@mdit/plugin-tab/-/plugin-tab-0.13.2.tgz", + "integrity": "sha512-evpIXvo6vXRWhgNE6vu4ok1I2dVOzrBYmBUGc1gW8nT9MvkW9litu7RbJ6CafscqaiiYRIM5Oib1ahS0lwte6g==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14.1.2" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } + } + }, + "node_modules/@mdit/plugin-tasklist": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-tasklist/-/plugin-tasklist-0.13.1.tgz", + "integrity": "sha512-flEWnDJFEB7QZIHRwtkVjAEZe9ONiRQLRg7oazRDBM/3Z0rf28blxOx7qj2QZ/FVzQnRRZTgjFQkpiz61IckKQ==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14.1.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } + } + }, + "node_modules/@mdit/plugin-tex": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-tex/-/plugin-tex-0.13.1.tgz", + "integrity": "sha512-lkRf6XrfVfS11FzT3hiooWdOUPJfAd/cnAv4NN/4WU7qOEz0e0HBVQO8PQb5CPwrE94Ld4+E6rQwJfVH1grkwQ==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14.1.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } + } + }, + "node_modules/@mdit/plugin-uml": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mdit/plugin-uml/-/plugin-uml-0.13.1.tgz", + "integrity": "sha512-JdCOg25OyG+QJFAba6AWwdpkaOjuht5VmOqYt4/h/AzLsIHh/2j+TnCZBn0XQm3D8yJ9Y4w4oouS4wpPduRW0A==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14.1.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "markdown-it": "^14.1.0" + }, + "peerDependenciesMeta": { + "markdown-it": { + "optional": true + } + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.4.1", + "@parcel/watcher-darwin-arm64": "2.4.1", + "@parcel/watcher-darwin-x64": "2.4.1", + "@parcel/watcher-freebsd-x64": "2.4.1", + "@parcel/watcher-linux-arm-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-musl": "2.4.1", + "@parcel/watcher-linux-x64-glibc": "2.4.1", + "@parcel/watcher-linux-x64-musl": "2.4.1", + "@parcel/watcher-win32-arm64": "2.4.1", + "@parcel/watcher-win32-ia32": "2.4.1", + "@parcel/watcher-win32-x64": "2.4.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", + "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true + }, + "node_modules/@shikijs/core": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.22.0.tgz", + "integrity": "sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==", + "dev": true, + "dependencies": { + "@shikijs/engine-javascript": "1.22.0", + "@shikijs/engine-oniguruma": "1.22.0", + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.3" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.0.tgz", + "integrity": "sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==", + "dev": true, + "dependencies": { + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0", + "oniguruma-to-js": "0.4.3" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.0.tgz", + "integrity": "sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==", + "dev": true, + "dependencies": { + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.22.0.tgz", + "integrity": "sha512-k7iMOYuGQA62KwAuJOQBgH2IQb5vP8uiB3lMvAMGUgAMMurePOx3Z7oNqJdcpxqZP6I9cc7nc4DNqSKduCxmdg==", + "dev": true, + "dependencies": { + "shiki": "1.22.0" + } + }, + "node_modules/@shikijs/types": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.22.0.tgz", + "integrity": "sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==", + "dev": true, + "dependencies": { + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz", + "integrity": "sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==", + "dev": true }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", @@ -645,9 +1609,9 @@ } }, "node_modules/@stackblitz/sdk": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@stackblitz/sdk/-/sdk-1.9.0.tgz", - "integrity": "sha512-3m6C7f8pnR5KXys/Hqx2x6ylnpqOak6HtnZI6T5keEO0yT+E4Spkw37VEbdwuC+2oxmjdgq6YZEgiKX7hM1GmQ==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@stackblitz/sdk/-/sdk-1.11.0.tgz", + "integrity": "sha512-DFQGANNkEZRzFk1/rDP6TcFdM82ycHE+zfl9C/M/jXlH68jiqHWHFMQURLELoD8koxvu/eW5uhg94NSAZlYrUQ==", "dev": true }, "node_modules/@types/debug": { @@ -660,9 +1624,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, "node_modules/@types/fs-extra": { @@ -681,6 +1645,15 @@ "integrity": "sha512-UP28RddqY8xcU0SCEp9YKutQICXpaAq9N8U2klqF5hegGha7KzTOL8EdhIIV3bOSGBzjEpN9bU/d+nNZBdJYVw==", "dev": true }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/jsonfile": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", @@ -697,34 +1670,43 @@ "dev": true }, "node_modules/@types/linkify-it": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", - "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "dev": true }, "node_modules/@types/markdown-it": { - "version": "13.0.7", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.7.tgz", - "integrity": "sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==", + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", "dev": true, "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" + "@types/linkify-it": "^5", + "@types/mdurl": "^2" } }, "node_modules/@types/markdown-it-emoji": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/markdown-it-emoji/-/markdown-it-emoji-2.0.4.tgz", - "integrity": "sha512-H6ulk/ZmbDxOayPwI/leJzrmoW1YKX1Z+MVSCHXuYhvqckV4I/c+hPTf6UiqJyn2avWugfj30XroheEb6/Ekqg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/markdown-it-emoji/-/markdown-it-emoji-3.0.1.tgz", + "integrity": "sha512-cz1j8R35XivBqq9mwnsrP2fsz2yicLhB8+PDtuVkKOExwEdsVBNI+ROL3sbhtR5occRZ66vT0QnwFZCqdjf3pA==", + "dev": true, + "dependencies": { + "@types/markdown-it": "^14" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dev": true, "dependencies": { - "@types/markdown-it": "*" + "@types/unist": "*" } }, "node_modules/@types/mdurl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", - "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "dev": true }, "node_modules/@types/ms": { @@ -734,12 +1716,12 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", - "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/sax": { @@ -757,16 +1739,28 @@ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "dev": true }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true + }, "node_modules/@types/web-bluetooth": { "version": "0.0.20", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", "dev": true }, + "node_modules/@ungap/structured-clone": { + "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/@vitejs/plugin-vue": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", - "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz", + "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==", "dev": true, "engines": { "node": "^18.0.0 || >=20.0.0" @@ -777,284 +1771,342 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", - "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz", + "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==", "dev": true, "dependencies": { - "@babel/parser": "^7.23.9", - "@vue/shared": "3.4.21", + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.12", "entities": "^4.5.0", "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", - "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz", + "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==", "dev": true, "dependencies": { - "@vue/compiler-core": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/compiler-core": "3.5.12", + "@vue/shared": "3.5.12" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", - "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz", + "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==", "dev": true, "dependencies": { - "@babel/parser": "^7.23.9", - "@vue/compiler-core": "3.4.21", - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21", + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.12", + "@vue/compiler-dom": "3.5.12", + "@vue/compiler-ssr": "3.5.12", + "@vue/shared": "3.5.12", "estree-walker": "^2.0.2", - "magic-string": "^0.30.7", - "postcss": "^8.4.35", - "source-map-js": "^1.0.2" + "magic-string": "^0.30.11", + "postcss": "^8.4.47", + "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", - "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz", + "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/compiler-dom": "3.5.12", + "@vue/shared": "3.5.12" } }, "node_modules/@vue/devtools-api": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", - "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==", - "dev": true + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.4.6.tgz", + "integrity": "sha512-XipBV5k0/IfTr0sNBDTg7OBUCp51cYMMXyPxLXJZ4K/wmUeMqt8cVdr2ZZGOFq+si/jTyCYnNxeKoyev5DOUUA==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.4.6" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.4.6.tgz", + "integrity": "sha512-NbYBwPWgEic1AOd9bWExz9weBzFdjiIfov0yRn4DrRfR+EQJCI9dn4I0XS7IxYGdkmUJi8mFW42LLk18WsGqew==", + "dev": true, + "dependencies": { + "@vue/devtools-shared": "^7.4.6", + "birpc": "^0.2.17", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.1" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.4.6.tgz", + "integrity": "sha512-rPeSBzElnHYMB05Cc056BQiJpgocQjY8XVulgni+O9a9Gr9tNXgPteSzFFD+fT/iWMxNuUgGKs9CuW5DZewfIg==", + "dev": true, + "dependencies": { + "rfdc": "^1.4.1" + } }, "node_modules/@vue/reactivity": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", - "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.12.tgz", + "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==", "dev": true, "dependencies": { - "@vue/shared": "3.4.21" + "@vue/shared": "3.5.12" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", - "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.12.tgz", + "integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==", "dev": true, "dependencies": { - "@vue/reactivity": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/reactivity": "3.5.12", + "@vue/shared": "3.5.12" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", - "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz", + "integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==", "dev": true, "dependencies": { - "@vue/runtime-core": "3.4.21", - "@vue/shared": "3.4.21", + "@vue/reactivity": "3.5.12", + "@vue/runtime-core": "3.5.12", + "@vue/shared": "3.5.12", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", - "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.12.tgz", + "integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==", "dev": true, "dependencies": { - "@vue/compiler-ssr": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/compiler-ssr": "3.5.12", + "@vue/shared": "3.5.12" }, "peerDependencies": { - "vue": "3.4.21" + "vue": "3.5.12" } }, "node_modules/@vue/shared": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", - "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz", + "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg==", "dev": true }, "node_modules/@vuepress/bundler-vite": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@vuepress/bundler-vite/-/bundler-vite-2.0.0-rc.9.tgz", - "integrity": "sha512-GcM2eSqW2mPY5xXX4i5kuZujvwUeiTpsLX5kgau9LzPox+FdA3SMUkppCY3hsou2o2RxXPTfjocE7OlYQrUqvA==", + "version": "2.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@vuepress/bundler-vite/-/bundler-vite-2.0.0-rc.17.tgz", + "integrity": "sha512-K2osFYuAX1y1m50IxSA7ykM0wdxvQBD3LsYsqAltMk/yM26cF8BjTOfpAbfBw4/gTbQHv2pzJbfUgOm9o/LbvQ==", + "dev": true, + "dependencies": { + "@vitejs/plugin-vue": "^5.1.4", + "@vuepress/bundlerutils": "2.0.0-rc.17", + "@vuepress/client": "2.0.0-rc.17", + "@vuepress/core": "2.0.0-rc.17", + "@vuepress/shared": "2.0.0-rc.17", + "@vuepress/utils": "2.0.0-rc.17", + "autoprefixer": "^10.4.20", + "connect-history-api-fallback": "^2.0.0", + "postcss": "^8.4.47", + "postcss-load-config": "^6.0.1", + "rollup": "^4.22.5", + "vite": "~5.4.8", + "vue": "^3.5.10", + "vue-router": "^4.4.5" + } + }, + "node_modules/@vuepress/bundlerutils": { + "version": "2.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@vuepress/bundlerutils/-/bundlerutils-2.0.0-rc.17.tgz", + "integrity": "sha512-+Hxv3N8XRr6TTzBcXtaXlzq8r3YY/+HLeQHZ9mCGAhBXRCv5BeBgjpMP4BiQT1jd1FxfxRguyyFwioC6g5dOdA==", "dev": true, "dependencies": { - "@vitejs/plugin-vue": "^5.0.4", - "@vuepress/client": "2.0.0-rc.9", - "@vuepress/core": "2.0.0-rc.9", - "@vuepress/shared": "2.0.0-rc.9", - "@vuepress/utils": "2.0.0-rc.9", - "autoprefixer": "^10.4.19", - "connect-history-api-fallback": "^2.0.0", - "postcss": "^8.4.38", - "postcss-load-config": "^5.0.3", - "rollup": "^4.13.0", - "vite": "~5.2.2", - "vue": "^3.4.21", - "vue-router": "^4.3.0" + "@vuepress/client": "2.0.0-rc.17", + "@vuepress/core": "2.0.0-rc.17", + "@vuepress/shared": "2.0.0-rc.17", + "@vuepress/utils": "2.0.0-rc.17", + "vue": "^3.5.10", + "vue-router": "^4.4.5" } }, "node_modules/@vuepress/cli": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@vuepress/cli/-/cli-2.0.0-rc.9.tgz", - "integrity": "sha512-uv7Xmv3QmPpzCaUAq0oKEwp2tY64AO+7mxamgr7tr+t6FEnCYqr+X0nLlH17UtMkmGWIsbHLIlMjteprxGxIMg==", + "version": "2.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@vuepress/cli/-/cli-2.0.0-rc.17.tgz", + "integrity": "sha512-naib+o5MRmkimjzHykuTLojltebv4+VpstK2KyOp7oR8XBBLAbpgVOgTLnTnDSooR9e313wQzYUzrgI+TKOwdQ==", "dev": true, "dependencies": { - "@vuepress/core": "2.0.0-rc.9", - "@vuepress/shared": "2.0.0-rc.9", - "@vuepress/utils": "2.0.0-rc.9", + "@vuepress/core": "2.0.0-rc.17", + "@vuepress/shared": "2.0.0-rc.17", + "@vuepress/utils": "2.0.0-rc.17", "cac": "^6.7.14", "chokidar": "^3.6.0", - "envinfo": "^7.11.1", - "esbuild": "~0.20.2" + "envinfo": "^7.14.0", + "esbuild": "~0.21.5" }, "bin": { "vuepress-cli": "bin/vuepress.js" } }, "node_modules/@vuepress/client": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-rc.9.tgz", - "integrity": "sha512-V5jA6L1nHQ8tXBshRHBJKei7HPFonGxFzmVK5yjj2Ho/Xtp/SD9rBS6dyYd5CSkKRGQDgy19Z+BUUPXtdI1qzg==", + "version": "2.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@vuepress/client/-/client-2.0.0-rc.17.tgz", + "integrity": "sha512-dnCU+spOgVw1V7vU/Gkj6e7bkfsGbezUuPAQMiWkBdrNTZ2BJctOHhhi+F8OBRR02hZ9JldlToA5vBoVsPKRpw==", "dev": true, "dependencies": { - "@vue/devtools-api": "^6.6.1", - "@vuepress/shared": "2.0.0-rc.9", - "vue": "^3.4.21", - "vue-router": "^4.3.0" + "@vue/devtools-api": "^7.4.6", + "@vuepress/shared": "2.0.0-rc.17", + "vue": "^3.5.10", + "vue-router": "^4.4.5" } }, "node_modules/@vuepress/core": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-2.0.0-rc.9.tgz", - "integrity": "sha512-uvMkIqYJ7vjfYEC91rMmT8YJt8xXnob5YYY3TzlwWUSEv4yoV3nlVu0l6Zfhenx/7FwKaxRJ/ePlUGIgUHBcBw==", + "version": "2.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-2.0.0-rc.17.tgz", + "integrity": "sha512-Ux5zAqnSAAnaE4qFgIGkGRMWObyZaAeRk6Pj30tVRCC7zkYIRWXii7sUK6aehPyugQz02TKMvW5FlrJeA40ogw==", "dev": true, "dependencies": { - "@vuepress/client": "2.0.0-rc.9", - "@vuepress/markdown": "2.0.0-rc.9", - "@vuepress/shared": "2.0.0-rc.9", - "@vuepress/utils": "2.0.0-rc.9", - "vue": "^3.4.21" + "@vuepress/client": "2.0.0-rc.17", + "@vuepress/markdown": "2.0.0-rc.17", + "@vuepress/shared": "2.0.0-rc.17", + "@vuepress/utils": "2.0.0-rc.17", + "vue": "^3.5.10" } }, "node_modules/@vuepress/helper": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/helper/-/helper-2.0.0-rc.21.tgz", - "integrity": "sha512-yKIG8hwsrA63uWo9hx9u7KBc0HvotKe2/0wVZtUdvdsibG3UYNI9enYQNa8MdqbxF92mmlFkPZdosGjUTA+BYw==", + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/helper/-/helper-2.0.0-rc.52.tgz", + "integrity": "sha512-zePTo0eJkyK7NirwidII1+r8PkuJbsXO0CrcXw/K7Yv8ab8RkQKaUmqLSM21xHZddKuzWEncugGtRIt5yITumw==", "dev": true, "dependencies": { - "@vue/shared": "^3.4.21", - "cheerio": "1.0.0-rc.12", + "@vue/shared": "^3.5.10", + "@vueuse/core": "^11.1.0", + "cheerio": "1.0.0", "fflate": "^0.8.2", "gray-matter": "^4.0.3", - "vue": "^3.4.21" + "vue": "^3.5.10" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" + } + }, + "node_modules/@vuepress/highlighter-helper": { + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/highlighter-helper/-/highlighter-helper-2.0.0-rc.52.tgz", + "integrity": "sha512-imyoo7gQxJ2/uhyPL1uQ1FexD2BpsJ7gYp4BXHY3iaaDuJ6KVnF+FSIbxaLW4XW3qivJ7IjWWfv5Q3gi0/xQxQ==", + "dev": true, + "peerDependencies": { + "@vueuse/core": "^11.1.0", + "vuepress": "2.0.0-rc.17" + }, + "peerDependenciesMeta": { + "@vueuse/core": { + "optional": true + } } }, "node_modules/@vuepress/markdown": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-2.0.0-rc.9.tgz", - "integrity": "sha512-e7as2ar3RQp0bUyMiwBPi7L/G2fzscb3s0BywNcAwubFR22o0/dBEYRYdrN0clPQ2FXpPxF6AFj4aD7O1heCbw==", - "dev": true, - "dependencies": { - "@mdit-vue/plugin-component": "^2.0.0", - "@mdit-vue/plugin-frontmatter": "^2.0.0", - "@mdit-vue/plugin-headers": "^2.0.0", - "@mdit-vue/plugin-sfc": "^2.0.0", - "@mdit-vue/plugin-title": "^2.0.0", - "@mdit-vue/plugin-toc": "^2.0.0", - "@mdit-vue/shared": "^2.0.0", - "@mdit-vue/types": "^2.0.0", - "@types/markdown-it": "^13.0.7", - "@types/markdown-it-emoji": "^2.0.4", - "@vuepress/shared": "2.0.0-rc.9", - "@vuepress/utils": "2.0.0-rc.9", + "version": "2.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-2.0.0-rc.17.tgz", + "integrity": "sha512-eIwRostE3t3zsJzPjmOufVyyBpsaWQkZluk6o0i1e9WLW3EoinKrDZdzej0Jw8IQlq6nvOPD2JMFWyXwu8fv7w==", + "dev": true, + "dependencies": { + "@mdit-vue/plugin-component": "^2.1.3", + "@mdit-vue/plugin-frontmatter": "^2.1.3", + "@mdit-vue/plugin-headers": "^2.1.3", + "@mdit-vue/plugin-sfc": "^2.1.3", + "@mdit-vue/plugin-title": "^2.1.3", + "@mdit-vue/plugin-toc": "^2.1.3", + "@mdit-vue/shared": "^2.1.3", + "@mdit-vue/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@types/markdown-it-emoji": "^3.0.1", + "@vuepress/shared": "2.0.0-rc.17", + "@vuepress/utils": "2.0.0-rc.17", "markdown-it": "^14.1.0", - "markdown-it-anchor": "^8.6.7", + "markdown-it-anchor": "^9.2.0", "markdown-it-emoji": "^3.0.0", "mdurl": "^2.0.0" } }, "node_modules/@vuepress/plugin-active-header-links": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-rc.21.tgz", - "integrity": "sha512-6i9TfGDV1zfszQ5aw6bV+/UvPdBWt3VxN2WB4Dg5o1g8Qn4z5CI6AW6VfLKRyaKUD+Rzj6W+Ikgx4xnF5RZAdA==", + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-rc.52.tgz", + "integrity": "sha512-2QJbVTurvHuIAkO6YqXHoHkY6t4H6o0nktxbUjCiezkOGtiN2DHn4wpD2AFKjYstezIWDGbPianbBuGAZKr+aQ==", "dev": true, "dependencies": { - "@vueuse/core": "^10.9.0", - "vue": "^3.4.21" + "@vueuse/core": "^11.1.0", + "vue": "^3.5.10" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, "node_modules/@vuepress/plugin-back-to-top": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-rc.21.tgz", - "integrity": "sha512-qEWu0BFvadJZRH1r1UQW4mHvBYwHGSJtwNv14C/Qmxuvv2UQnpl8T2qbvPAntUWMdy94wVhr2YWCfyLh7TSEOA==", + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-rc.52.tgz", + "integrity": "sha512-Ea1r8bNma61vxAAxwuA62md4cZlP8Dmfl0kqlA9u++90l95Dc3z/lw+Rju/ENlBqxvv17lTN4NWMMbwcnXK21w==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.21", - "@vueuse/core": "^10.9.0", - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.52", + "@vueuse/core": "^11.1.0", + "vue": "^3.5.10" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, "node_modules/@vuepress/plugin-blog": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-blog/-/plugin-blog-2.0.0-rc.21.tgz", - "integrity": "sha512-LCju1cC7vFA4WMaYbcnkhnEuiGno0JcavcDRFS6Np4hlVKhvh5Zoi47R3FBuF88X2OdbvBog63k4m5Jp60f+aQ==", + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-blog/-/plugin-blog-2.0.0-rc.52.tgz", + "integrity": "sha512-W9FrpR/ynV1lztdCrtEmnfZizNbnhLdzl/BdLxbDoVrKcjAWktqmfx8VJI+zrWyHmPzwIxrY0FdttQDUXPj+VA==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.21", + "@vuepress/helper": "2.0.0-rc.52", "chokidar": "^3.6.0", - "vue": "^3.4.21" + "vue": "^3.5.10" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, "node_modules/@vuepress/plugin-catalog": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-catalog/-/plugin-catalog-2.0.0-rc.21.tgz", - "integrity": "sha512-qWb0K/clF9o0bW8eeiu/30f5MWNt4MZI3jt6pLL67sAOyiMXqlHSMCKI/WYZhzgnPOQi9cnIAWoF4ePsApIzAA==", + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-catalog/-/plugin-catalog-2.0.0-rc.52.tgz", + "integrity": "sha512-NMT0Iyi8F4eRiHd8KoP2Wje9vzY6shzwxuqYpXULNKsc9e3gPpCP63N6AqjSEaEO/NyqN8EzJftYIiK7KorYbw==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.21", - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.52", + "vue": "^3.5.10" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, "node_modules/@vuepress/plugin-comment": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-comment/-/plugin-comment-2.0.0-rc.21.tgz", - "integrity": "sha512-17Qpwz/W/B3cVLiCTq0UO18dy1ejf563mURas7XgqIcIibGE3G1k5kTftDbwbpehQ0e/4okdIwnkSxPpeGPOFw==", + "version": "2.0.0-rc.53", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-comment/-/plugin-comment-2.0.0-rc.53.tgz", + "integrity": "sha512-1nzUCKqTHf/zrwBKs9hSwUMo/f7tI2SKhTAwAWFY0sHo1uYTtSV7gllDXrhpeoprlO4S3R3oQc/0ZkSIFpe08Q==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.21", + "@vuepress/helper": "2.0.0-rc.52", "giscus": "^1.5.0", - "vue": "^3.4.21" + "vue": "^3.5.10" }, "peerDependencies": { - "@waline/client": "^3.1.0", - "artalk": "^2.7.3", - "sass-loader": "^14.0.0", - "twikoo": "^1.5.0", - "vuepress": "2.0.0-rc.9" + "@waline/client": "^3.3.1", + "artalk": "^2.9.0", + "twikoo": "^1.6.39", + "vuepress": "2.0.0-rc.17" }, "peerDependenciesMeta": { "@waline/client": { @@ -1063,227 +2115,412 @@ "artalk": { "optional": true }, - "sass-loader": { - "optional": true - }, "twikoo": { "optional": true } } }, "node_modules/@vuepress/plugin-copy-code": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-copy-code/-/plugin-copy-code-2.0.0-rc.21.tgz", - "integrity": "sha512-280jsPmI/YeKBnXt/MCw/nrv9pUou+zhHK5mOU3ecVYfY7Pu2Xi1zdZ2kK0Ri02Txm5AwLb5YWeSac349JuUUA==", + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-copy-code/-/plugin-copy-code-2.0.0-rc.52.tgz", + "integrity": "sha512-YQeWH3EZrZsiQGUC/9tkhKXk5LuWZKIRDnYgit03+i/1hoivgVO8sRRAKCf9gQpX2EEbyyyiCqBTSByOFNAHag==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.21", - "@vueuse/core": "^10.9.0", - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.52", + "@vueuse/core": "^11.1.0", + "vue": "^3.5.10" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, "node_modules/@vuepress/plugin-copyright": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-copyright/-/plugin-copyright-2.0.0-rc.21.tgz", - "integrity": "sha512-KFDnWkyz3tdts7uuCyVawYr2SdkNjDFJ93CtPYPDounnEJDC9OxQk0d7QSMYHotTZUzmfOiQNmJL/FngEVaDQQ==", + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-copyright/-/plugin-copyright-2.0.0-rc.52.tgz", + "integrity": "sha512-eDGSqisi9Fnu3ODd4JwVepxd+ACrRbcO1ugAFukVeTQqySodnh5c70aDJN32QuYN7RmxIt1FvPJoS9/hWiOSrw==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.21", - "@vueuse/core": "^10.9.0", - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.52", + "@vueuse/core": "^11.1.0", + "vue": "^3.5.10" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, - "node_modules/@vuepress/plugin-external-link-icon": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-external-link-icon/-/plugin-external-link-icon-2.0.0-rc.21.tgz", - "integrity": "sha512-Wt7hjWpoUccJHj5KHK24Uks+6oWug6y5cw9QzWlNgiCyg+hvII7I+FdORRvibPUG2ndymi6ZOFyJZcR072kbKA==", + "node_modules/@vuepress/plugin-git": { + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-git/-/plugin-git-2.0.0-rc.52.tgz", + "integrity": "sha512-IHCHAKvia0NCv64Y1NQcmAeJKZvT3lFddhl3yrd79KiIZ4HLoBjni7jII0dsx77FtTJLeXHYkkNhnY1l/j1Diw==", "dev": true, "dependencies": { - "vue": "^3.4.21" + "execa": "^9.4.0" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, - "node_modules/@vuepress/plugin-git": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-git/-/plugin-git-2.0.0-rc.21.tgz", - "integrity": "sha512-Xgrqv86bjrBPFrJr69b1KQlDUhAGhWfBRIGM3GQOI98mOi2VKCX9P4xyWK/lIpn8eVB3s0lY1KewhkXgy7UITg==", + "node_modules/@vuepress/plugin-links-check": { + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-links-check/-/plugin-links-check-2.0.0-rc.52.tgz", + "integrity": "sha512-peu3Fzv/TNb+rpiNByKfbira79sR8vGVpF8u9mZXgM/xsQH5IvO0g7Zgwub8fkoIxsNjEN2SnA0k3bCbOWGUgw==", "dev": true, "dependencies": { - "execa": "^8.0.1" + "@vuepress/helper": "2.0.0-rc.52" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, - "node_modules/@vuepress/plugin-links-check": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-links-check/-/plugin-links-check-2.0.0-rc.21.tgz", - "integrity": "sha512-3dIXKJILTDP7RoPVmhtq/RfytZqX1sCA9Bf++DlgQV6jp2ctcTf4F9I5J/2wQce8yuLogO8fHnWhEgO2rgQXLw==", + "node_modules/@vuepress/plugin-markdown-hint": { + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-hint/-/plugin-markdown-hint-2.0.0-rc.52.tgz", + "integrity": "sha512-8c3RVFvjh9ntgmqpU3ZWiolCMIBcKZXmd4utTU9EGBaNeIBGtdGyY2dYhbMkR89/OUBP1NfEtuSTNa2PkVW9Cg==", + "dev": true, + "dependencies": { + "@mdit/plugin-alert": "^0.13.1", + "@mdit/plugin-container": "^0.13.1", + "@types/markdown-it": "^14.1.2", + "@vuepress/helper": "2.0.0-rc.52", + "@vueuse/core": "^11.1.0" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.17" + } + }, + "node_modules/@vuepress/plugin-markdown-image": { + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-image/-/plugin-markdown-image-2.0.0-rc.52.tgz", + "integrity": "sha512-Qu21KKNOvQPOaW++WtJ43XHT8tj1HlV7eDOGZJzc2Gv+0aeRHxCZ6Ljycbs6cSsekP6Rg9GOlMOv2902pCu4Pg==", + "dev": true, + "dependencies": { + "@mdit/plugin-figure": "^0.13.1", + "@mdit/plugin-img-lazyload": "^0.13.1", + "@mdit/plugin-img-mark": "^0.13.1", + "@mdit/plugin-img-size": "^0.13.1", + "@types/markdown-it": "^14.1.2", + "@vuepress/helper": "2.0.0-rc.52" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.17" + } + }, + "node_modules/@vuepress/plugin-markdown-math": { + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-math/-/plugin-markdown-math-2.0.0-rc.52.tgz", + "integrity": "sha512-Dnez/mkxLe/EgpGcORUwi0oNwwxOpdY8hzfjTGgOEONxQOhO9MwTzgp75aNbVKGG5Df/xqEpKjU8plncNIg7eA==", + "dev": true, + "dependencies": { + "@mdit/plugin-katex-slim": "^0.13.1", + "@mdit/plugin-mathjax-slim": "^0.13.1", + "@types/markdown-it": "^14.1.2", + "@vuepress/helper": "2.0.0-rc.52", + "vue": "^3.5.10" + }, + "peerDependencies": { + "katex": "^0.16.10", + "mathjax-full": "^3.2.2", + "vuepress": "2.0.0-rc.17" + }, + "peerDependenciesMeta": { + "katex": { + "optional": true + }, + "mathjax-full": { + "optional": true + } + } + }, + "node_modules/@vuepress/plugin-markdown-tab": { + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-markdown-tab/-/plugin-markdown-tab-2.0.0-rc.52.tgz", + "integrity": "sha512-ZIeRllMZR/pRKLLID2xW++cjE7JGJLutjUVvqLRF9BPb2t425zurZUE3ahI8z338UZr8UhUosZeb/5HDHJ7MTQ==", + "dev": true, + "dependencies": { + "@mdit/plugin-tab": "^0.13.2", + "@types/markdown-it": "^14.1.2", + "@vuepress/helper": "2.0.0-rc.52", + "@vueuse/core": "^11.1.0", + "vue": "^3.5.10" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.17" + } + }, + "node_modules/@vuepress/plugin-notice": { + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-notice/-/plugin-notice-2.0.0-rc.52.tgz", + "integrity": "sha512-kBu5uTJWwgK9n3g62vayAlMx8m7PKPdCOUOSza3x6VTI0pkANHIgwVH0jyRosfnJjrfbcZRF86lpGjMnmW6+sw==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.21" + "@vuepress/helper": "2.0.0-rc.52", + "@vueuse/core": "^11.1.0", + "vue": "^3.5.10" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, "node_modules/@vuepress/plugin-nprogress": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-rc.21.tgz", - "integrity": "sha512-qpGA76195SyfpuQC1Pb9LwgCYIp/zg+BBDnexukJMdLjP1KnaU7HLhS5NnRNIWv8E+IC61zLvlh/wRox17QE+w==", + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-rc.52.tgz", + "integrity": "sha512-TxDd4y+RWytToja0fOF4GL0k500g8zB0LpCxsc33gHvVUsJ7qVXcq8XPyYH6FgZPX4BuiPexVxE6FG7XUat/fg==", "dev": true, "dependencies": { - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.52", + "vue": "^3.5.10" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, "node_modules/@vuepress/plugin-photo-swipe": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-photo-swipe/-/plugin-photo-swipe-2.0.0-rc.21.tgz", - "integrity": "sha512-2zCljlDTlSXUUeYy3Z74zkkAc6uEzV0Tos2HL89RZEhiH5tMyvNJaG4+dTVy7uODcQoe+Fcv1hovdbC6LKCFoQ==", + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-photo-swipe/-/plugin-photo-swipe-2.0.0-rc.52.tgz", + "integrity": "sha512-ybrAzJZfZwd6oK7uMHckR/rsZ8T9v3TZrWYRVZQ08rSlW71YKLA0Lsi+UaD+ECMJh2onSALhipb9WGGVTDMd0A==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.21", - "@vueuse/core": "^10.9.0", - "photoswipe": "^5.4.3", - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.52", + "@vueuse/core": "^11.1.0", + "photoswipe": "^5.4.4", + "vue": "^3.5.10" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, - "node_modules/@vuepress/plugin-prismjs": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-prismjs/-/plugin-prismjs-2.0.0-rc.21.tgz", - "integrity": "sha512-dMTCu/TZ1QCmTHXL4THVeh9gWzuqkJV8qhck5U77OP1qmgyf+r529A+MTOgp3ddcph1Yzb/FRb2orlefHk+yNQ==", + "node_modules/@vuepress/plugin-reading-time": { + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-reading-time/-/plugin-reading-time-2.0.0-rc.52.tgz", + "integrity": "sha512-LRpxo55wPOomeDZF+TQV4QxgEM5hb18aVsFRlyDy55tHvjwtv7zJJOtcROkDXTgMqWqe1ipqoDyo4IAoRglxXQ==", "dev": true, "dependencies": { - "prismjs": "^1.29.0" + "@vuepress/helper": "2.0.0-rc.52", + "vue": "^3.5.10" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, - "node_modules/@vuepress/plugin-reading-time": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-reading-time/-/plugin-reading-time-2.0.0-rc.21.tgz", - "integrity": "sha512-8ByRTp6z4z0d9W1evfeVyOx55V9OYqxJJeC7KBiJuiA2GP8QkY9b8ajbQ8SWeCjzDLl4H0KudSU1KqH2kqw/zQ==", + "node_modules/@vuepress/plugin-redirect": { + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-redirect/-/plugin-redirect-2.0.0-rc.52.tgz", + "integrity": "sha512-57j8ycJ5CBS7MfuhpWCxkhphTO67MoEcm3ZfZJpvUCXiX/D9l9uPuK+JD2/Ky+60p7Md0YfBnYsenfk/0zFlYQ==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.21", - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.52", + "@vueuse/core": "^11.1.0", + "cac": "^6.7.14", + "vue": "^3.5.10" + }, + "bin": { + "vp-redirect": "lib/cli/index.js" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, "node_modules/@vuepress/plugin-rtl": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-rtl/-/plugin-rtl-2.0.0-rc.21.tgz", - "integrity": "sha512-r+4aP898KsFbF6m1J0e+776ZlSE9yaHr9zsMlib1GEUDcqP/OykMYaNKwRsOMB1eFXNmymgHlXFvswBGEHxS7w==", + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-rtl/-/plugin-rtl-2.0.0-rc.52.tgz", + "integrity": "sha512-Uz7IVWazFE4IfkEZpArImUmOQhJVDU1/CcfUOOb4UY0ZStrLOtJrbgOYoBLgNYZrfcCsQtxSKD/syFuyM5RLcg==", + "dev": true, + "dependencies": { + "@vuepress/helper": "2.0.0-rc.52", + "vue": "^3.5.10" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.17" + } + }, + "node_modules/@vuepress/plugin-sass-palette": { + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-sass-palette/-/plugin-sass-palette-2.0.0-rc.52.tgz", + "integrity": "sha512-z4SS9UlrMu99e2CICmUknItkK85QSaRXpNOR9vlIno+UEjeAthw5s4YYgkCdQul7yEn6EosyXqxNJ5vH6OtLgQ==", "dev": true, "dependencies": { - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.52", + "chokidar": "^4.0.1" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "sass": "^1.79.2", + "sass-embedded": "^1.79.2", + "sass-loader": "^16.0.1", + "vuepress": "2.0.0-rc.17" + }, + "peerDependenciesMeta": { + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "sass-loader": { + "optional": true + } + } + }, + "node_modules/@vuepress/plugin-sass-palette/node_modules/chokidar": { + "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" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@vuepress/plugin-sass-palette/node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/@vuepress/plugin-seo": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-seo/-/plugin-seo-2.0.0-rc.21.tgz", - "integrity": "sha512-q8pXhXn5OL0QG6KN9rjyXngj2km5eRDK0VL8ShLrTD9fAwvjhujhjHpI/DRHg6ScWlMDKY7ncEOmslDCBuKLtg==", + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-seo/-/plugin-seo-2.0.0-rc.52.tgz", + "integrity": "sha512-q3BhGXnhrDBms4QZbMryKnCLR+TIY79J8Xt01SfkhD8UanYWvMg3+pXg7+Wn9HNLNAUsuuXfLZ4tLQwlF0OxJQ==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.21" + "@vuepress/helper": "2.0.0-rc.52" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" + } + }, + "node_modules/@vuepress/plugin-shiki": { + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-shiki/-/plugin-shiki-2.0.0-rc.52.tgz", + "integrity": "sha512-UBbDCCHVr1jp4xWS1at+iCZnBih/Gt+b4Md/VISFfKUZ+ZbZsZQqtF2jmeJ0kj2rCwJSRWTaqAQJg/DlM2eDyQ==", + "dev": true, + "dependencies": { + "@shikijs/transformers": "^1.21.0", + "@vuepress/helper": "2.0.0-rc.52", + "@vuepress/highlighter-helper": "2.0.0-rc.52", + "nanoid": "^5.0.7", + "shiki": "^1.21.0" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.17" + } + }, + "node_modules/@vuepress/plugin-shiki/node_modules/nanoid": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz", + "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" } }, "node_modules/@vuepress/plugin-sitemap": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-sitemap/-/plugin-sitemap-2.0.0-rc.21.tgz", - "integrity": "sha512-YbotKptHfifjwmXhj4kX6iA8tCGp7gTZAHm9YiPDr/8dYzBkkQ4oC84JCifkZYt3fWkVqq/Qa0vpJfnKPGOidg==", + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-sitemap/-/plugin-sitemap-2.0.0-rc.52.tgz", + "integrity": "sha512-16SBEXox2IwztBBjJRCQbecz/K3aEBKkQRsxI4cUhSGU3BaMk1DiGyTSYhge+e4DaQQvcjfrDOTWNJTPg46L7A==", "dev": true, "dependencies": { - "@vuepress/helper": "~2.0.0-rc.21", - "sitemap": "^7.1.1" + "@vuepress/helper": "2.0.0-rc.52", + "sitemap": "^8.0.0" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, "node_modules/@vuepress/plugin-theme-data": { - "version": "2.0.0-rc.21", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-rc.21.tgz", - "integrity": "sha512-vLXvTKx4gWXY6oVaJ9Z2ECnojnKQuXBIe1ZGIAwJdxCYfr6aaqggrVvmphB8BwTURh0XAuis/l6YTcMrs0bX8Q==", + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-rc.52.tgz", + "integrity": "sha512-eCqCNgYUcLA6zISgWLUXMMLLP+5BJj3gx/v9Eczd7vtyYHaNwEZ+MRC1GMJHcCUK25o5KzMUXnzR1JKFCGobAQ==", + "dev": true, + "dependencies": { + "@vue/devtools-api": "^7.4.6", + "vue": "^3.5.10" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.17" + } + }, + "node_modules/@vuepress/plugin-watermark": { + "version": "2.0.0-rc.52", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-watermark/-/plugin-watermark-2.0.0-rc.52.tgz", + "integrity": "sha512-iiCrcJOYqHgBA9CRYeAEMzcG0PT5FmB9iSoNnrWWzKEBBlXfEvdx9dZSe+KBytJ1TBAPQ99Ddy4lMxs6EQ5NzQ==", "dev": true, "dependencies": { - "@vue/devtools-api": "^6.6.1", - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.52", + "vue": "^3.5.10", + "watermark-js-plus": "^1.5.7" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, "node_modules/@vuepress/shared": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@vuepress/shared/-/shared-2.0.0-rc.9.tgz", - "integrity": "sha512-XfI6CWNv4/Vp9Iew6GJil9RUSy1rM7zGdjwikr0j3Rkh55q3f00w1wud47wE9kxRqsZ0PIvsMget5CxEn5rA/w==", + "version": "2.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@vuepress/shared/-/shared-2.0.0-rc.17.tgz", + "integrity": "sha512-meBWLJCCHqj+edHY+U2q64Q8AIqqlHzau6T0j95Q58WkWOQdgn8MUCx1/TXXh2mKVyTt4g6Kgci/3fK2Hi97HQ==", "dev": true, "dependencies": { - "@mdit-vue/types": "^2.0.0" + "@mdit-vue/types": "^2.1.0" } }, "node_modules/@vuepress/utils": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/@vuepress/utils/-/utils-2.0.0-rc.9.tgz", - "integrity": "sha512-qk6Pel4JVKYKxp3bWxyvnwchvx3QaCWc7SqUw7L6qUo/um+0U2U45L0anWoAfckw12RXYhoIEbJ9UZpueiKOPg==", + "version": "2.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@vuepress/utils/-/utils-2.0.0-rc.17.tgz", + "integrity": "sha512-5QFG8arU01QxJm+pzaNpNxfvSy3ttSjouwcefyr/6dO/cKbnjgmmaDOoy3UKnHYQtEDycybNOg4ebn2AHslEKw==", "dev": true, "dependencies": { "@types/debug": "^4.1.12", "@types/fs-extra": "^11.0.4", "@types/hash-sum": "^1.0.2", - "@vuepress/shared": "2.0.0-rc.9", - "debug": "^4.3.4", + "@vuepress/shared": "2.0.0-rc.17", + "debug": "^4.3.7", "fs-extra": "^11.2.0", - "globby": "^14.0.1", + "globby": "^14.0.2", "hash-sum": "^2.0.0", - "ora": "^8.0.1", - "picocolors": "^1.0.0", + "ora": "^8.1.0", + "picocolors": "^1.1.0", "upath": "^2.0.1" } }, "node_modules/@vueuse/core": { - "version": "10.9.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz", - "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-11.1.0.tgz", + "integrity": "sha512-P6dk79QYA6sKQnghrUz/1tHi0n9mrb/iO1WTMk/ElLmTyNqgDeSZ3wcDf6fRBGzRJbeG1dxzEOvLENMjr+E3fg==", "dev": true, "dependencies": { "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.9.0", - "@vueuse/shared": "10.9.0", - "vue-demi": ">=0.14.7" + "@vueuse/metadata": "11.1.0", + "@vueuse/shared": "11.1.0", + "vue-demi": ">=0.14.10" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/core/node_modules/vue-demi": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", - "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", "dev": true, "hasInstallScript": true, "bin": { @@ -1307,30 +2544,30 @@ } }, "node_modules/@vueuse/metadata": { - "version": "10.9.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz", - "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-11.1.0.tgz", + "integrity": "sha512-l9Q502TBTaPYGanl1G+hPgd3QX5s4CGnpXriVBR5fEZ/goI6fvDaVmIl3Td8oKFurOxTmbXvBPSsgrd6eu6HYg==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared": { - "version": "10.9.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz", - "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-11.1.0.tgz", + "integrity": "sha512-YUtIpY122q7osj+zsNMFAfMTubGz0sn5QzE5gPzAIiCmtt2ha3uQUY1+JPyL4gRCTsLPX82Y9brNbo/aqlA91w==", "dev": true, "dependencies": { - "vue-demi": ">=0.14.7" + "vue-demi": ">=0.14.10" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@vueuse/shared/node_modules/vue-demi": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", - "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", "dev": true, "hasInstallScript": true, "bin": { @@ -1354,9 +2591,9 @@ } }, "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "engines": { "node": ">=12" @@ -1409,9 +2646,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -1428,11 +2665,11 @@ } ], "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -1472,6 +2709,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/birpc": { + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", + "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -1479,21 +2725,21 @@ "dev": true }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "dev": true, "funding": [ { @@ -1510,10 +2756,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -1541,9 +2787,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001600", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", - "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", + "version": "1.0.30001668", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz", + "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==", "dev": true, "funding": [ { @@ -1560,6 +2806,16 @@ } ] }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", @@ -1572,22 +2828,46 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", "dev": true, "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=18.17" }, "funding": { "url": "https://github.com/cheeriojs/cheerio?sponsor=1" @@ -1635,15 +2915,15 @@ } }, "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "dependencies": { - "restore-cursor": "^4.0.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1731,6 +3011,26 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", @@ -1740,11 +3040,29 @@ "node": ">=0.8" } }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/create-codepen": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/create-codepen/-/create-codepen-1.0.1.tgz", - "integrity": "sha512-XzSWwGCFNeOnNGp3KdCDGaKq4Cp1SvjzpPGQqO0tj1HT3BhksLdl/xQ2ZEY4+0MQ3m1I/K1Fvpm4GGMthtamyA==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/create-codepen/-/create-codepen-2.0.0.tgz", + "integrity": "sha512-ehJ0Zw5RSV2G4+/azUb7vEZWRSA/K9cW7HDock1Y9ViDexkgSJUZJRcObdw/YAWeXKjreEQV9l/igNSsJ1yw5A==", + "dev": true, + "engines": { + "node": ">=18" + } }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -1795,18 +3113,18 @@ "dev": true }, "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", "dev": true }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "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.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1826,6 +3144,42 @@ "node": ">=0.10.0" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dijkstrajs": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", @@ -1888,22 +3242,29 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.719", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.719.tgz", - "integrity": "sha512-FbWy2Q2YgdFzkFUW/W5jBjE9dj+804+98E4Pup78JBPnbdb3pv6IneY2JCPKdeKLh3AOKHQeYf+KwLr7mxGh6Q==", + "version": "1.5.38", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.38.tgz", + "integrity": "sha512-VbeVexmZ1IFh+5EfrYz1I0HTzHVIlJa112UEWhciPyeOcKJGeTv6N8WnG4wsQB81DGCaVEGhpSb6o6a8WYFXXg==", "dev": true }, "node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true }, - "node_modules/encode-utf8": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", - "dev": true + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } }, "node_modules/entities": { "version": "4.5.0", @@ -1918,9 +3279,9 @@ } }, "node_modules/envinfo": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", - "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -1930,9 +3291,9 @@ } }, "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -1942,35 +3303,35 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" @@ -1996,65 +3357,41 @@ "dev": true }, "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.4.0.tgz", + "integrity": "sha512-yKHlle2YGxZE842MERVIplWwNH5VYmqqcPFgtnlU//K8gxuFFXu0pwd/CrfXTumFpeEiufsP7+opT/bPJa1yVw==", "dev": true, "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.0.0", "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" }, "engines": { - "node": ">=16.17" + "node": "^18.19.0 || >=20.5.0" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } - }, - "node_modules/execa/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + }, + "node_modules/execa/node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", "dev": true, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/extend-shallow": { @@ -2100,10 +3437,25 @@ "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", "dev": true }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -2152,6 +3504,20 @@ "node": ">=14.14" } }, + "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/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2162,9 +3528,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", "dev": true, "engines": { "node": ">=18" @@ -2174,12 +3540,16 @@ } }, "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2207,9 +3577,9 @@ } }, "node_modules/globby": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", - "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", @@ -2253,10 +3623,62 @@ "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", "dev": true }, + "node_modules/hast-util-to-html": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", + "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -2268,23 +3690,35 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", + "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, "engines": { - "node": ">=16.17.0" + "node": ">=0.10.0" } }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" @@ -2294,7 +3728,9 @@ "version": "4.3.5", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -2368,22 +3804,34 @@ "node": ">=0.12.0" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-unicode-supported": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.0.0.tgz", - "integrity": "sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, "engines": { "node": ">=18" @@ -2392,6 +3840,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2423,6 +3883,23 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/katex": { + "version": "0.16.11", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.11.tgz", + "integrity": "sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==", + "dev": true, + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -2433,9 +3910,9 @@ } }, "node_modules/lilconfig": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", - "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, "engines": { "node": ">=14" @@ -2454,31 +3931,31 @@ } }, "node_modules/lit": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.2.tgz", - "integrity": "sha512-VZx5iAyMtX7CV4K8iTLdCkMaYZ7ipjJZ0JcSdJ0zIdGxxyurjIn7yuuSxNBD7QmjvcNJwr0JS4cAdAtsy7gZ6w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.2.1.tgz", + "integrity": "sha512-1BBa1E/z0O9ye5fZprPtdqnc0BFzxIxTTOO/tQFmyC/hj1O3jL4TfmLBw0WEwjAokdLwpclkvGgDJwTIh0/22w==", "dev": true, "dependencies": { "@lit/reactive-element": "^2.0.4", - "lit-element": "^4.0.4", - "lit-html": "^3.1.2" + "lit-element": "^4.1.0", + "lit-html": "^3.2.0" } }, "node_modules/lit-element": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.4.tgz", - "integrity": "sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.1.1.tgz", + "integrity": "sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==", "dev": true, "dependencies": { "@lit-labs/ssr-dom-shim": "^1.2.0", "@lit/reactive-element": "^2.0.4", - "lit-html": "^3.1.2" + "lit-html": "^3.2.0" } }, "node_modules/lit-html": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.2.tgz", - "integrity": "sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.2.1.tgz", + "integrity": "sha512-qI/3lziaPMSKsrwlxH/xMgikhQ0EGOX2ICU73Bi/YHFvz2j/yMCIrw4+puF2IpQ4+upd3EWbvnHM9+PnJn48YA==", "dev": true, "dependencies": { "@types/trusted-types": "^2.0.2" @@ -2524,28 +4001,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", "dev": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/markdown-it": { @@ -2566,9 +4028,9 @@ } }, "node_modules/markdown-it-anchor": { - "version": "8.6.7", - "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", - "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-9.2.0.tgz", + "integrity": "sha512-sa2ErMQ6kKOA4l31gLGYliFQrMKkqSO0ZJgGhDHKijPf0pNFM9vghjAh3gn26pS4JDRs7Iwa9S36gxm3vgZTzg==", "dev": true, "peerDependencies": { "@types/markdown-it": "*", @@ -2587,18 +4049,33 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dev": true, + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "dev": true }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2608,32 +4085,130 @@ "node": ">= 8" } }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "node_modules/nanoid": { @@ -2660,10 +4235,18 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "node_modules/normalize-path": { @@ -2685,15 +4268,16 @@ } }, "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, "dependencies": { - "path-key": "^4.0.0" + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2711,6 +4295,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm-run-path/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -2724,34 +4320,46 @@ } }, "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/oniguruma-to-js": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz", + "integrity": "sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==", + "dev": true, + "dependencies": { + "regex": "^4.3.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/ora": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.0.1.tgz", - "integrity": "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.1.0.tgz", + "integrity": "sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==", "dev": true, "dependencies": { "chalk": "^5.3.0", - "cli-cursor": "^4.0.0", + "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.1", - "string-width": "^7.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", "strip-ansi": "^7.1.0" }, "engines": { @@ -2797,25 +4405,49 @@ "node": ">=6" } }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", + "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==", "dev": true, "dependencies": { - "entities": "^4.4.0" + "entities": "^4.5.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dev": true, + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", "dev": true, "dependencies": { - "domhandler": "^5.0.2", "parse5": "^7.0.0" }, "funding": { @@ -2852,19 +4484,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, "node_modules/photoswipe": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/photoswipe/-/photoswipe-5.4.3.tgz", - "integrity": "sha512-9UC6oJBK4oXFZ5HcdlcvGkfEHsVrmE4csUdCQhEjHYb3PvPLO3PG7UhnPuOgjxwmhq5s17Un5NUdum01LgBDng==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/photoswipe/-/photoswipe-5.4.4.tgz", + "integrity": "sha512-WNFHoKrkZNnvFFhbHL93WDkW3ifwVOXSW3w1UuZZelSmgXpIGiZSNlZJq37rR8YejqME2rHs9EhH9ZvlvFH2NA==", "dev": true, "engines": { "node": ">= 0.12.0" } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true }, "node_modules/picomatch": { @@ -2889,9 +4527,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "dev": true, "funding": [ { @@ -2909,17 +4547,17 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-load-config": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.0.3.tgz", - "integrity": "sha512-90pBBI5apUVruIEdCxZic93Wm+i9fTrp7TXbgdUCH+/L+2WnfpITSpq5dFU/IPvbv7aNiMlQISpUkAm3fEcvgQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", "dev": true, "funding": [ { @@ -2932,15 +4570,16 @@ } ], "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" + "lilconfig": "^3.1.1" }, "engines": { "node": ">= 18" }, "peerDependencies": { "jiti": ">=1.21.0", - "postcss": ">=8.0.9" + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "jiti": { @@ -2948,6 +4587,12 @@ }, "postcss": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, @@ -2957,13 +4602,29 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "node_modules/pretty-ms": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.1.0.tgz", + "integrity": "sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==", "dev": true, + "dependencies": { + "parse-ms": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/punycode.js": { @@ -2976,13 +4637,12 @@ } }, "node_modules/qrcode": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.3.tgz", - "integrity": "sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", "dev": true, "dependencies": { "dijkstrajs": "^1.0.1", - "encode-utf8": "^1.0.3", "pngjs": "^5.0.0", "yargs": "^15.3.1" }, @@ -3025,6 +4685,12 @@ "node": ">=8.10.0" } }, + "node_modules/regex": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.3.tgz", + "integrity": "sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==", + "dev": true + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3041,16 +4707,16 @@ "dev": true }, "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3066,13 +4732,19 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, "node_modules/rollup": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", - "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", "dev": true, "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -3082,21 +4754,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.13.2", - "@rollup/rollup-android-arm64": "4.13.2", - "@rollup/rollup-darwin-arm64": "4.13.2", - "@rollup/rollup-darwin-x64": "4.13.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.13.2", - "@rollup/rollup-linux-arm64-gnu": "4.13.2", - "@rollup/rollup-linux-arm64-musl": "4.13.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.13.2", - "@rollup/rollup-linux-riscv64-gnu": "4.13.2", - "@rollup/rollup-linux-s390x-gnu": "4.13.2", - "@rollup/rollup-linux-x64-gnu": "4.13.2", - "@rollup/rollup-linux-x64-musl": "4.13.2", - "@rollup/rollup-win32-arm64-msvc": "4.13.2", - "@rollup/rollup-win32-ia32-msvc": "4.13.2", - "@rollup/rollup-win32-x64-msvc": "4.13.2", + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", "fsevents": "~2.3.2" } }, @@ -3123,13 +4796,22 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "node_modules/sass": { - "version": "1.72.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", - "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==", + "version": "1.79.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.5.tgz", + "integrity": "sha512-W1h5kp6bdhqFh2tk3DsI771MoEJjvrSY/2ihJRJS4pjIyfJCw0nTsxqhnrUzaLMOJjFchj8rOvraI/YUVjtx5g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", + "@parcel/watcher": "^2.4.1", + "chokidar": "^4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" }, @@ -3141,9 +4823,9 @@ } }, "node_modules/sass-loader": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.1.1.tgz", - "integrity": "sha512-QX8AasDg75monlybel38BZ49JP5Z+uSKfKwF2rO7S74BywaRmGQMUBw9dtkS+ekyM/QnP+NOrRYq8ABMZ9G8jw==", + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.2.tgz", + "integrity": "sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==", "dev": true, "dependencies": { "neo-async": "^2.6.2" @@ -3180,10 +4862,42 @@ } } }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "dev": true }, "node_modules/section-matter": { @@ -3199,21 +4913,6 @@ "node": ">=4" } }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -3241,16 +4940,36 @@ "node": ">=8" } }, + "node_modules/shiki": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.22.0.tgz", + "integrity": "sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==", + "dev": true, + "dependencies": { + "@shikijs/core": "1.22.0", + "@shikijs/engine-javascript": "1.22.0", + "@shikijs/engine-oniguruma": "1.22.0", + "@shikijs/types": "1.22.0", + "@shikijs/vscode-textmate": "^9.3.0", + "@types/hast": "^3.0.4" + } + }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/sitemap": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", - "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.0.tgz", + "integrity": "sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==", "dev": true, "dependencies": { "@types/node": "^17.0.5", @@ -3262,8 +4981,8 @@ "sitemap": "dist/cli.js" }, "engines": { - "node": ">=12.0.0", - "npm": ">=5.6.0" + "node": ">=14.0.0", + "npm": ">=6.0.0" } }, "node_modules/sitemap/node_modules/@types/node": { @@ -3294,9 +5013,28 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -3321,9 +5059,9 @@ } }, "node_modules/string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { "emoji-regex": "^10.3.0", @@ -3337,6 +5075,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -3362,17 +5114,38 @@ } }, "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "dev": true, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/superjson": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz", + "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==", + "dev": true, + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3385,16 +5158,35 @@ "node": ">=8.0" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true }, + "node_modules/undici": { + "version": "6.20.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.20.1.tgz", + "integrity": "sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==", + "dev": true, + "engines": { + "node": ">=18.17" + } + }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, "node_modules/unicorn-magic": { @@ -3409,6 +5201,74 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -3429,9 +5289,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -3448,8 +5308,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -3458,15 +5318,43 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vite": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.6.tgz", - "integrity": "sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==", + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", + "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", "dev": true, "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.36", - "rollup": "^4.13.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" @@ -3485,6 +5373,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -3502,6 +5391,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -3514,16 +5406,16 @@ } }, "node_modules/vue": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", - "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.12.tgz", + "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==", "dev": true, "dependencies": { - "@vue/compiler-dom": "3.4.21", - "@vue/compiler-sfc": "3.4.21", - "@vue/runtime-dom": "3.4.21", - "@vue/server-renderer": "3.4.21", - "@vue/shared": "3.4.21" + "@vue/compiler-dom": "3.5.12", + "@vue/compiler-sfc": "3.5.12", + "@vue/runtime-dom": "3.5.12", + "@vue/server-renderer": "3.5.12", + "@vue/shared": "3.5.12" }, "peerDependencies": { "typescript": "*" @@ -3535,12 +5427,12 @@ } }, "node_modules/vue-router": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.0.tgz", - "integrity": "sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.4.5.tgz", + "integrity": "sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==", "dev": true, "dependencies": { - "@vue/devtools-api": "^6.5.1" + "@vue/devtools-api": "^6.6.4" }, "funding": { "url": "https://github.com/sponsors/posva" @@ -3549,19 +5441,25 @@ "vue": "^3.2.0" } }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "dev": true + }, "node_modules/vuepress": { - "version": "2.0.0-rc.9", - "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-2.0.0-rc.9.tgz", - "integrity": "sha512-jT1ln2lawdph+vVI6n2JfEUhQIcyc1RQWDdQu9DffhJGywJunFcumnUJudpqd1SNIES2Fz1hVCD6gdrE/rVKOQ==", + "version": "2.0.0-rc.17", + "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-2.0.0-rc.17.tgz", + "integrity": "sha512-KUWHbB4c9bEeFa8Zx9OAz0e1n8Ae9bEvu0T+Yuhm73cnLONxvhLveBdaLjCwrQZC78auP1L5xL8R1voq0ahXYQ==", "dev": true, "dependencies": { - "@vuepress/cli": "2.0.0-rc.9", - "@vuepress/client": "2.0.0-rc.9", - "@vuepress/core": "2.0.0-rc.9", - "@vuepress/markdown": "2.0.0-rc.9", - "@vuepress/shared": "2.0.0-rc.9", - "@vuepress/utils": "2.0.0-rc.9", - "vue": "^3.4.21" + "@vuepress/cli": "2.0.0-rc.17", + "@vuepress/client": "2.0.0-rc.17", + "@vuepress/core": "2.0.0-rc.17", + "@vuepress/markdown": "2.0.0-rc.17", + "@vuepress/shared": "2.0.0-rc.17", + "@vuepress/utils": "2.0.0-rc.17", + "vue": "^3.5.10" }, "bin": { "vuepress": "bin/vuepress.js", @@ -3569,12 +5467,12 @@ "vuepress-webpack": "bin/vuepress-webpack.js" }, "engines": { - "node": ">=18.16.0" + "node": "^18.19.0 || >=20.4.0" }, "peerDependencies": { - "@vuepress/bundler-vite": "2.0.0-rc.9", - "@vuepress/bundler-webpack": "2.0.0-rc.9", - "vue": "^3.4.0" + "@vuepress/bundler-vite": "2.0.0-rc.17", + "@vuepress/bundler-webpack": "2.0.0-rc.17", + "vue": "^3.5.0" }, "peerDependenciesMeta": { "@vuepress/bundler-vite": { @@ -3586,23 +5484,23 @@ } }, "node_modules/vuepress-plugin-components": { - "version": "2.0.0-rc.32", - "resolved": "https://registry.npmjs.org/vuepress-plugin-components/-/vuepress-plugin-components-2.0.0-rc.32.tgz", - "integrity": "sha512-ndu3lXnmS3AzYwqXn+mTJNItXux0MiPj2BzE8uH5HL473uAtzE8nS3q0gvcAt8CNbOSElJt+I5Hz4AO8/hbtAA==", + "version": "2.0.0-rc.57", + "resolved": "https://registry.npmjs.org/vuepress-plugin-components/-/vuepress-plugin-components-2.0.0-rc.57.tgz", + "integrity": "sha512-/YEQS46Y87Sqn55PAhBaJI31J221qq+twpl62u7yLgVZmtE1P6ibnRCSqzsu/D8OscMjDSUlN4yFuuVZvdtCqA==", "dev": true, "dependencies": { - "@stackblitz/sdk": "^1.9.0", - "@vuepress/helper": "2.0.0-rc.21", - "@vueuse/core": "^10.9.0", + "@stackblitz/sdk": "^1.11.0", + "@vuepress/helper": "2.0.0-rc.52", + "@vuepress/plugin-sass-palette": "2.0.0-rc.52", + "@vueuse/core": "^11.1.0", "balloon-css": "^1.2.0", - "create-codepen": "1.0.1", - "qrcode": "^1.5.3", - "vue": "^3.4.21", - "vuepress-plugin-sass-palette": "2.0.0-rc.32", - "vuepress-shared": "2.0.0-rc.32" + "create-codepen": "^2.0.0", + "qrcode": "^1.5.4", + "vue": "^3.5.10", + "vuepress-shared": "2.0.0-rc.57" }, "engines": { - "node": ">=18.16.0", + "node": ">=18.19.0", "npm": ">=8", "pnpm": ">=7", "yarn": ">=2" @@ -3612,10 +5510,11 @@ "dashjs": "4.7.4", "hls.js": "^1.4.12", "mpegts.js": "^1.7.3", - "plyr": "^3.7.8", - "sass-loader": "^14.0.0", - "vidstack": "^1.9.0", - "vuepress": "2.0.0-rc.9" + "sass": "^1.79.3", + "sass-embedded": "^1.79.3", + "sass-loader": "^16.0.2", + "vidstack": "^1.12.9", + "vuepress": "2.0.0-rc.17" }, "peerDependenciesMeta": { "artplayer": { @@ -3630,7 +5529,10 @@ "mpegts.js": { "optional": true }, - "plyr": { + "sass": { + "optional": true + }, + "sass-embedded": { "optional": true }, "sass-loader": { @@ -3642,69 +5544,58 @@ } }, "node_modules/vuepress-plugin-md-enhance": { - "version": "2.0.0-rc.32", - "resolved": "https://registry.npmjs.org/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-rc.32.tgz", - "integrity": "sha512-zZK8aEfbq26J5w8o9xGWXCHHrL3PYk25tloTPcx96nZWYPeD+5fMFAtVpHte0rXBWUf0MBtDQxddSeATteBE7Q==", - "dev": true, - "dependencies": { - "@mdit/plugin-alert": "^0.8.0", - "@mdit/plugin-align": "^0.8.0", - "@mdit/plugin-attrs": "^0.8.0", - "@mdit/plugin-container": "^0.8.0", - "@mdit/plugin-demo": "^0.8.0", - "@mdit/plugin-figure": "^0.8.0", - "@mdit/plugin-footnote": "^0.8.0", - "@mdit/plugin-img-lazyload": "^0.8.0", - "@mdit/plugin-img-mark": "^0.8.0", - "@mdit/plugin-img-size": "^0.8.0", - "@mdit/plugin-include": "^0.8.0", - "@mdit/plugin-katex": "^0.8.0", - "@mdit/plugin-mark": "^0.8.0", - "@mdit/plugin-mathjax": "^0.8.0", - "@mdit/plugin-stylize": "^0.8.0", - "@mdit/plugin-sub": "^0.8.0", - "@mdit/plugin-sup": "^0.8.0", - "@mdit/plugin-tab": "^0.8.0", - "@mdit/plugin-tasklist": "^0.8.0", - "@mdit/plugin-tex": "^0.8.0", - "@mdit/plugin-uml": "^0.8.0", - "@types/markdown-it": "^13.0.7", - "@vuepress/helper": "2.0.0-rc.21", - "@vueuse/core": "^10.9.0", + "version": "2.0.0-rc.57", + "resolved": "https://registry.npmjs.org/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-rc.57.tgz", + "integrity": "sha512-+HU1NRoUkAlPUqLizmLfvmXHCa5Z1gc0+mApONaS1Q01K64DBZ9GSUMjpch/QCa2gL76yI9C8w679ukhlDY3Gw==", + "dev": true, + "dependencies": { + "@mdit/plugin-alert": "^0.13.1", + "@mdit/plugin-align": "^0.13.1", + "@mdit/plugin-attrs": "^0.13.1", + "@mdit/plugin-container": "^0.13.1", + "@mdit/plugin-demo": "^0.13.1", + "@mdit/plugin-footnote": "^0.13.1", + "@mdit/plugin-include": "^0.13.1", + "@mdit/plugin-mark": "^0.13.1", + "@mdit/plugin-plantuml": "^0.13.1", + "@mdit/plugin-spoiler": "^0.13.1", + "@mdit/plugin-stylize": "^0.13.1", + "@mdit/plugin-sub": "^0.13.1", + "@mdit/plugin-sup": "^0.13.1", + "@mdit/plugin-tasklist": "^0.13.1", + "@mdit/plugin-uml": "^0.13.1", + "@types/markdown-it": "^14.1.2", + "@vuepress/helper": "2.0.0-rc.52", + "@vuepress/plugin-sass-palette": "2.0.0-rc.52", + "@vueuse/core": "^11.1.0", "balloon-css": "^1.2.0", "js-yaml": "^4.1.0", - "vue": "^3.4.21", - "vuepress-plugin-sass-palette": "2.0.0-rc.32", - "vuepress-shared": "2.0.0-rc.32" + "vue": "^3.5.10", + "vuepress-shared": "2.0.0-rc.57" }, "engines": { - "node": ">=18.16.0", + "node": ">=18.19.0", "npm": ">=8", "pnpm": ">=7", "yarn": ">=2" }, "peerDependencies": { - "@types/reveal.js": "^5.0.0", "@vue/repl": "^4.1.1", "chart.js": "^4.0.0", "echarts": "^5.0.0", - "flowchart.ts": "^2.0.0 || ^3.0.0", - "katex": "^0.16.0", + "flowchart.ts": "^3.0.0", "kotlin-playground": "^1.23.0", - "markmap-lib": "^0.15.5 || ^0.16.0", - "markmap-toolbar": "^0.15.5 || ^0.16.0", - "markmap-view": "^0.15.5 || ^0.16.0", - "mathjax-full": "^3.2.2", - "mermaid": "^10.8.0", - "reveal.js": "^5.0.0", + "markmap-lib": "^0.17.0", + "markmap-toolbar": "^0.17.0", + "markmap-view": "^0.17.0", + "mermaid": "^11.2.0", "sandpack-vue3": "^3.0.0", - "sass-loader": "^14.0.0", - "vuepress": "2.0.0-rc.9" + "sass": "^1.79.3", + "sass-embedded": "^1.79.3", + "sass-loader": "^16.0.2", + "vuepress": "2.0.0-rc.17" }, "peerDependenciesMeta": { - "@types/reveal.js": { - "optional": true - }, "@vue/repl": { "optional": true }, @@ -3717,9 +5608,6 @@ "flowchart.ts": { "optional": true }, - "katex": { - "optional": true - }, "kotlin-playground": { "optional": true }, @@ -3732,16 +5620,16 @@ "markmap-view": { "optional": true }, - "mathjax-full": { + "mermaid": { "optional": true }, - "mermaid": { + "sandpack-vue3": { "optional": true }, - "reveal.js": { + "sass": { "optional": true }, - "sandpack-vue3": { + "sass-embedded": { "optional": true }, "sass-loader": { @@ -3767,143 +5655,126 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/vuepress-plugin-sass-palette": { - "version": "2.0.0-rc.32", - "resolved": "https://registry.npmjs.org/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-rc.32.tgz", - "integrity": "sha512-3tHHQU1E5cCo/udiZ4t0PL6OrWMxuP67+/tj3U5R9Zls6zM1aNE+Dw8I6/Of+HRTzctsQFxGPH0lZa05gS49UQ==", - "dev": true, - "dependencies": { - "@vuepress/helper": "2.0.0-rc.21", - "chokidar": "^3.6.0", - "sass": "^1.72.0", - "vuepress-shared": "2.0.0-rc.32" - }, - "engines": { - "node": ">=18.16.0", - "npm": ">=8", - "pnpm": ">=7", - "yarn": ">=2" - }, - "peerDependencies": { - "sass-loader": "^14.0.0", - "vuepress": "2.0.0-rc.9" - }, - "peerDependenciesMeta": { - "sass-loader": { - "optional": true - } - } - }, "node_modules/vuepress-plugin-search-pro": { - "version": "2.0.0-rc.32", - "resolved": "https://registry.npmjs.org/vuepress-plugin-search-pro/-/vuepress-plugin-search-pro-2.0.0-rc.32.tgz", - "integrity": "sha512-Roac2Xxr3V9es9TuKuQon2W7q+jCc2fowSKHuvmO5kbZ2XYH+djH7zZZHqGRoBWLUNtpQj8MOrOBubQqVa4bwg==", + "version": "2.0.0-rc.57", + "resolved": "https://registry.npmjs.org/vuepress-plugin-search-pro/-/vuepress-plugin-search-pro-2.0.0-rc.57.tgz", + "integrity": "sha512-d+gl1G5GYGHhAlF6BofAWFaLNn0h9euULGJEJ2/2GtWsBgkppEI0pPrGDlJ1t7KAo/67eOX0/VNf4CrRSp1GFA==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.21", - "@vueuse/core": "^10.9.0", - "cheerio": "1.0.0-rc.12", + "@vuepress/helper": "2.0.0-rc.52", + "@vuepress/plugin-sass-palette": "2.0.0-rc.52", + "@vueuse/core": "^11.1.0", + "cheerio": "1.0.0", "chokidar": "^3.6.0", "slimsearch": "^2.1.1", - "vue": "^3.4.21", - "vuepress-plugin-sass-palette": "2.0.0-rc.32", - "vuepress-shared": "2.0.0-rc.32" + "vue": "^3.5.10", + "vuepress-shared": "2.0.0-rc.57" }, "engines": { - "node": ">=18.16.0", + "node": ">=18.19.0", "npm": ">=8", "pnpm": ">=7", "yarn": ">=2" }, "peerDependencies": { - "sass-loader": "^14.0.0", - "vuepress": "2.0.0-rc.9" + "sass": "^1.79.3", + "sass-embedded": "^1.79.3", + "sass-loader": "^16.0.2", + "vuepress": "2.0.0-rc.17" }, "peerDependenciesMeta": { + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, "sass-loader": { "optional": true } } }, "node_modules/vuepress-shared": { - "version": "2.0.0-rc.32", - "resolved": "https://registry.npmjs.org/vuepress-shared/-/vuepress-shared-2.0.0-rc.32.tgz", - "integrity": "sha512-wGPPUoP6rxy7QnulD0sNz3r7iEHwp+TJroNmI+AT6FuCo1WCD4ZWfnRnm3dVcAkobc3nuOvSmDTvM9pIDCaxsA==", + "version": "2.0.0-rc.57", + "resolved": "https://registry.npmjs.org/vuepress-shared/-/vuepress-shared-2.0.0-rc.57.tgz", + "integrity": "sha512-W6zSdTl7Vvjnvu/eTIZYm0+jyFEMEOJQTbF/nOgmeQcOaX8cDiftWi64s0dopZ2FSeWETiZ/efyIGcuB6O17JQ==", "dev": true, "dependencies": { - "@vuepress/helper": "2.0.0-rc.21", - "@vueuse/core": "^10.9.0", - "cheerio": "1.0.0-rc.12", - "dayjs": "^1.11.10", - "execa": "^8.0.1", - "fflate": "^0.8.2", - "gray-matter": "^4.0.3", - "semver": "^7.6.0", - "vue": "^3.4.21" + "@vuepress/helper": "2.0.0-rc.52", + "@vueuse/core": "^11.1.0", + "dayjs": "^1.11.13", + "vue": "^3.5.10" }, "engines": { - "node": ">=18.16.0", + "node": ">=18.19.0", "npm": ">=8", "pnpm": ">=7", "yarn": ">=2" }, "peerDependencies": { - "vuepress": "2.0.0-rc.9" + "vuepress": "2.0.0-rc.17" } }, "node_modules/vuepress-theme-hope": { - "version": "2.0.0-rc.32", - "resolved": "https://registry.npmjs.org/vuepress-theme-hope/-/vuepress-theme-hope-2.0.0-rc.32.tgz", - "integrity": "sha512-5S5qg5xa0TErqVjpubhBN5oy0QmROd+ja5EQKfORUCKdXKQvx0soojQZnCPkXsUEXonwiZ12oCLN2+UGO03eng==", - "dev": true, - "dependencies": { - "@vuepress/helper": "2.0.0-rc.21", - "@vuepress/plugin-active-header-links": "2.0.0-rc.21", - "@vuepress/plugin-back-to-top": "2.0.0-rc.21", - "@vuepress/plugin-blog": "2.0.0-rc.21", - "@vuepress/plugin-catalog": "2.0.0-rc.21", - "@vuepress/plugin-comment": "2.0.0-rc.21", - "@vuepress/plugin-copy-code": "2.0.0-rc.21", - "@vuepress/plugin-copyright": "2.0.0-rc.21", - "@vuepress/plugin-external-link-icon": "2.0.0-rc.21", - "@vuepress/plugin-git": "2.0.0-rc.21", - "@vuepress/plugin-links-check": "2.0.0-rc.21", - "@vuepress/plugin-nprogress": "2.0.0-rc.21", - "@vuepress/plugin-photo-swipe": "2.0.0-rc.21", - "@vuepress/plugin-prismjs": "2.0.0-rc.21", - "@vuepress/plugin-reading-time": "2.0.0-rc.21", - "@vuepress/plugin-rtl": "2.0.0-rc.21", - "@vuepress/plugin-seo": "2.0.0-rc.21", - "@vuepress/plugin-sitemap": "2.0.0-rc.21", - "@vuepress/plugin-theme-data": "2.0.0-rc.21", - "@vueuse/core": "^10.9.0", + "version": "2.0.0-rc.58", + "resolved": "https://registry.npmjs.org/vuepress-theme-hope/-/vuepress-theme-hope-2.0.0-rc.58.tgz", + "integrity": "sha512-7C2UEhtNm1+ILoDLXyS+wNDz3Exjq6dwJnKbMIB1JnyZI+90kTmfZ/MtK1vCXBsA8Y4lbZE6dHxbhDLowwHypw==", + "dev": true, + "dependencies": { + "@vuepress/helper": "2.0.0-rc.52", + "@vuepress/plugin-active-header-links": "2.0.0-rc.52", + "@vuepress/plugin-back-to-top": "2.0.0-rc.52", + "@vuepress/plugin-blog": "2.0.0-rc.52", + "@vuepress/plugin-catalog": "2.0.0-rc.52", + "@vuepress/plugin-comment": "2.0.0-rc.53", + "@vuepress/plugin-copy-code": "2.0.0-rc.52", + "@vuepress/plugin-copyright": "2.0.0-rc.52", + "@vuepress/plugin-git": "2.0.0-rc.52", + "@vuepress/plugin-links-check": "2.0.0-rc.52", + "@vuepress/plugin-markdown-hint": "2.0.0-rc.52", + "@vuepress/plugin-markdown-image": "2.0.0-rc.52", + "@vuepress/plugin-markdown-math": "2.0.0-rc.52", + "@vuepress/plugin-markdown-tab": "2.0.0-rc.52", + "@vuepress/plugin-notice": "2.0.0-rc.52", + "@vuepress/plugin-nprogress": "2.0.0-rc.52", + "@vuepress/plugin-photo-swipe": "2.0.0-rc.52", + "@vuepress/plugin-reading-time": "2.0.0-rc.52", + "@vuepress/plugin-redirect": "2.0.0-rc.52", + "@vuepress/plugin-rtl": "2.0.0-rc.52", + "@vuepress/plugin-sass-palette": "2.0.0-rc.52", + "@vuepress/plugin-seo": "2.0.0-rc.52", + "@vuepress/plugin-shiki": "2.0.0-rc.52", + "@vuepress/plugin-sitemap": "2.0.0-rc.52", + "@vuepress/plugin-theme-data": "2.0.0-rc.52", + "@vuepress/plugin-watermark": "2.0.0-rc.52", + "@vueuse/core": "^11.1.0", "balloon-css": "^1.2.0", "bcrypt-ts": "^5.0.2", - "cheerio": "1.0.0-rc.12", "chokidar": "^3.6.0", - "gray-matter": "^4.0.3", - "vue": "^3.4.21", - "vuepress-plugin-components": "2.0.0-rc.32", - "vuepress-plugin-md-enhance": "2.0.0-rc.32", - "vuepress-plugin-sass-palette": "2.0.0-rc.32", - "vuepress-shared": "2.0.0-rc.32" + "vue": "^3.5.10", + "vuepress-plugin-components": "2.0.0-rc.57", + "vuepress-plugin-md-enhance": "2.0.0-rc.57", + "vuepress-shared": "2.0.0-rc.57" }, "engines": { - "node": ">=18.16.0", + "node": ">=18.19.0", "npm": ">=8", "pnpm": ">=7", "yarn": ">=2" }, "peerDependencies": { - "@vuepress/plugin-docsearch": "2.0.0-rc.21", - "@vuepress/plugin-feed": "2.0.0-rc.21", - "@vuepress/plugin-pwa": "2.0.0-rc.21", - "@vuepress/plugin-redirect": "2.0.0-rc.21", - "@vuepress/plugin-search": "2.0.0-rc.21", + "@vuepress/plugin-docsearch": "2.0.0-rc.52", + "@vuepress/plugin-feed": "2.0.0-rc.52", + "@vuepress/plugin-prismjs": "2.0.0-rc.52", + "@vuepress/plugin-pwa": "2.0.0-rc.52", + "@vuepress/plugin-revealjs": "2.0.0-rc.52", + "@vuepress/plugin-search": "2.0.0-rc.52", "nodejs-jieba": "^0.1.2", - "sass-loader": "^14.0.0", - "vuepress": "2.0.0-rc.9", - "vuepress-plugin-search-pro": "2.0.0-rc.32" + "sass": "^1.79.3", + "sass-embedded": "^1.79.3", + "sass-loader": "^16.0.2", + "vuepress": "2.0.0-rc.17", + "vuepress-plugin-search-pro": "2.0.0-rc.57" }, "peerDependenciesMeta": { "@vuepress/plugin-docsearch": { @@ -3912,10 +5783,13 @@ "@vuepress/plugin-feed": { "optional": true }, + "@vuepress/plugin-prismjs": { + "optional": true + }, "@vuepress/plugin-pwa": { "optional": true }, - "@vuepress/plugin-redirect": { + "@vuepress/plugin-revealjs": { "optional": true }, "@vuepress/plugin-search": { @@ -3924,6 +5798,12 @@ "nodejs-jieba": { "optional": true }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, "sass-loader": { "optional": true }, @@ -3932,6 +5812,36 @@ } } }, + "node_modules/watermark-js-plus": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/watermark-js-plus/-/watermark-js-plus-1.5.7.tgz", + "integrity": "sha512-KaQEUnvBX5em2hBeuKcpAASpV+sO1j8NbXY7FL7jb0w1TCKmMSyn8nkj2e+KeleuQ1iwyXHEMFdSWXDIQsACYQ==", + "dev": true, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4014,24 +5924,6 @@ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", @@ -4107,6 +5999,28 @@ "engines": { "node": ">=8" } + }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/docs/package.json b/docs/package.json index 4c911d911..a2da69dcb 100644 --- a/docs/package.json +++ b/docs/package.json @@ -11,14 +11,18 @@ "docs:update-package": "npx vp-update" }, "devDependencies": { - "@vuepress/bundler-vite": "2.0.0-rc.9", - "sass-loader": "14.1.1", - "vue": "3.4.21", - "vuepress": "2.0.0-rc.9", - "vuepress-plugin-search-pro": "2.0.0-rc.32", - "vuepress-theme-hope": "2.0.0-rc.32" + "@vuepress/bundler-vite": "2.0.0-rc.17", + "@vuepress/plugin-markdown-image": "2.0.0-rc.52", + "@vuepress/plugin-markdown-math": "2.0.0-rc.52", + "@vuepress/plugin-markdown-tab": "2.0.0-rc.52", + "katex": "^0.16.11", + "sass-loader": "16.0.2", + "vue": "3.5.12", + "vuepress": "2.0.0-rc.17", + "vuepress-plugin-search-pro": "2.0.0-rc.57", + "vuepress-theme-hope": "2.0.0-rc.58" }, "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "^4.13.2" + "@rollup/rollup-linux-x64-gnu": "^4.22.4" } } diff --git a/docs/src/.vuepress/styles/config.scss b/docs/src/.vuepress/styles/config.scss index f91061d7b..9960691d8 100644 --- a/docs/src/.vuepress/styles/config.scss +++ b/docs/src/.vuepress/styles/config.scss @@ -1,3 +1,4 @@ // you can change config here +$theme-color: #326F95; $colors: #c0392b, #d35400, #f39c12, #27ae60, #16a085, #2980b9, #8e44ad, #2c3e50, #7f8c8d !default; diff --git a/docs/src/.vuepress/styles/palette.scss b/docs/src/.vuepress/styles/palette.scss index e4a5c348d..d271cb056 100644 --- a/docs/src/.vuepress/styles/palette.scss +++ b/docs/src/.vuepress/styles/palette.scss @@ -1,10 +1 @@ // you can change colors here -$theme-color: #326F95; - - -/* -blue: "#2196f3", -red: "#f26d6d", -green: "#3eaf7c", -orange: "#fb9b5f", -*/ \ No newline at end of file diff --git a/docs/src/.vuepress/theme.ts b/docs/src/.vuepress/theme.ts index 3b72e9ba2..6ea33d1a5 100644 --- a/docs/src/.vuepress/theme.ts +++ b/docs/src/.vuepress/theme.ts @@ -1032,6 +1032,18 @@ export default hopeTheme({ plugins: { + markdownImage: { + figure: true, + lazyload: true, + mark: true, + size: true, + }, + markdownMath: { + }, + markdownTab: { + codeTabs: true, + tabs: false, + }, linksCheck: { dev: true, build: "error" @@ -1058,19 +1070,12 @@ export default hopeTheme({ align: true, attrs: true, chart: false, - codetabs: true, demo: false, echarts: false, - figure: true, flowchart: false, gfm: true, - imgLazyload: true, - imgSize: true, - imgMark: true, include: true, - katex: false, mark: true, - mathjax: false, mermaid: false, playground: { presets: [], @@ -1090,7 +1095,6 @@ export default hopeTheme({ ], sub: true, sup: true, - tabs: false, tasklist: false, vPre: false, vuePlayground: false From f8222a0a9c9e1cfa9fdc71f6b0b224b81a16cce6 Mon Sep 17 00:00:00 2001 From: Hauke Hund Date: Tue, 15 Oct 2024 17:16:15 +0200 Subject: [PATCH 5/6] fixed link --- docs/src/v1.0.0/maintain/allowList-mgm.md | 2 +- docs/src/v1.1.0/maintain/allowList-mgm.md | 3 +-- docs/src/v1.2.0/maintain/allowList-mgm.md | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/src/v1.0.0/maintain/allowList-mgm.md b/docs/src/v1.0.0/maintain/allowList-mgm.md index 5967196e6..3b8bf336a 100644 --- a/docs/src/v1.0.0/maintain/allowList-mgm.md +++ b/docs/src/v1.0.0/maintain/allowList-mgm.md @@ -4,7 +4,7 @@ icon: share --- :::danger -This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable//maintain/allowList-mgm), even if you use an outdated DSF version. +This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. ::: You can read all about the concept of Allow Lists [here](/intro/info/allowList.md). diff --git a/docs/src/v1.1.0/maintain/allowList-mgm.md b/docs/src/v1.1.0/maintain/allowList-mgm.md index 57f57509e..a66ad0f7b 100644 --- a/docs/src/v1.1.0/maintain/allowList-mgm.md +++ b/docs/src/v1.1.0/maintain/allowList-mgm.md @@ -4,10 +4,9 @@ icon: share --- :::danger -This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable//maintain/allowList-mgm), even if you use an outdated DSF version. +This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. ::: - You can read all about the concept of Allow Lists [here](/intro/info/allowList.md). ## Overview diff --git a/docs/src/v1.2.0/maintain/allowList-mgm.md b/docs/src/v1.2.0/maintain/allowList-mgm.md index c17b10496..a66ad0f7b 100644 --- a/docs/src/v1.2.0/maintain/allowList-mgm.md +++ b/docs/src/v1.2.0/maintain/allowList-mgm.md @@ -4,7 +4,7 @@ icon: share --- :::danger -This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable//maintain/allowList-mgm), even if you use an outdated DSF version. +This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. ::: You can read all about the concept of Allow Lists [here](/intro/info/allowList.md). From ba4c7dd6ae3b078da44af3f02a85799a812b3bfa Mon Sep 17 00:00:00 2001 From: Hauke Hund Date: Tue, 15 Oct 2024 17:22:11 +0200 Subject: [PATCH 6/6] added outdated version remarks --- docs/src/v1.3.0/maintain/allowList-mgm.md | 5 +++++ docs/src/v1.3.1/maintain/allowList-mgm.md | 5 +++++ docs/src/v1.3.2/maintain/allowList-mgm.md | 5 +++++ docs/src/v1.4.0/maintain/allowList-mgm.md | 5 +++++ docs/src/v1.5.0/maintain/allowList-mgm.md | 5 +++++ docs/src/v1.5.1/maintain/allowList-mgm.md | 5 +++++ docs/src/v1.5.2/maintain/allowList-mgm.md | 5 +++++ 7 files changed, 35 insertions(+) diff --git a/docs/src/v1.3.0/maintain/allowList-mgm.md b/docs/src/v1.3.0/maintain/allowList-mgm.md index 75cb43205..f19efc32f 100644 --- a/docs/src/v1.3.0/maintain/allowList-mgm.md +++ b/docs/src/v1.3.0/maintain/allowList-mgm.md @@ -2,6 +2,11 @@ title: Allow List Management icon: share --- + +:::danger +This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. +::: + You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). ## Overview diff --git a/docs/src/v1.3.1/maintain/allowList-mgm.md b/docs/src/v1.3.1/maintain/allowList-mgm.md index d04ae8c54..4e7a8f444 100644 --- a/docs/src/v1.3.1/maintain/allowList-mgm.md +++ b/docs/src/v1.3.1/maintain/allowList-mgm.md @@ -2,6 +2,11 @@ title: Allow List Management icon: share --- + +:::danger +This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. +::: + You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). ## Overview diff --git a/docs/src/v1.3.2/maintain/allowList-mgm.md b/docs/src/v1.3.2/maintain/allowList-mgm.md index d04ae8c54..4e7a8f444 100644 --- a/docs/src/v1.3.2/maintain/allowList-mgm.md +++ b/docs/src/v1.3.2/maintain/allowList-mgm.md @@ -2,6 +2,11 @@ title: Allow List Management icon: share --- + +:::danger +This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. +::: + You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). ## Overview diff --git a/docs/src/v1.4.0/maintain/allowList-mgm.md b/docs/src/v1.4.0/maintain/allowList-mgm.md index d04ae8c54..4e7a8f444 100644 --- a/docs/src/v1.4.0/maintain/allowList-mgm.md +++ b/docs/src/v1.4.0/maintain/allowList-mgm.md @@ -2,6 +2,11 @@ title: Allow List Management icon: share --- + +:::danger +This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. +::: + You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). ## Overview diff --git a/docs/src/v1.5.0/maintain/allowList-mgm.md b/docs/src/v1.5.0/maintain/allowList-mgm.md index d04ae8c54..4e7a8f444 100644 --- a/docs/src/v1.5.0/maintain/allowList-mgm.md +++ b/docs/src/v1.5.0/maintain/allowList-mgm.md @@ -2,6 +2,11 @@ title: Allow List Management icon: share --- + +:::danger +This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. +::: + You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). ## Overview diff --git a/docs/src/v1.5.1/maintain/allowList-mgm.md b/docs/src/v1.5.1/maintain/allowList-mgm.md index d04ae8c54..4e7a8f444 100644 --- a/docs/src/v1.5.1/maintain/allowList-mgm.md +++ b/docs/src/v1.5.1/maintain/allowList-mgm.md @@ -2,6 +2,11 @@ title: Allow List Management icon: share --- + +:::danger +This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. +::: + You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). ## Overview diff --git a/docs/src/v1.5.2/maintain/allowList-mgm.md b/docs/src/v1.5.2/maintain/allowList-mgm.md index d04ae8c54..4e7a8f444 100644 --- a/docs/src/v1.5.2/maintain/allowList-mgm.md +++ b/docs/src/v1.5.2/maintain/allowList-mgm.md @@ -2,6 +2,11 @@ title: Allow List Management icon: share --- + +:::danger +This is an outdated version of the Allow List Management documentation. Please use [the current version](/stable/maintain/allowList-mgm), even if you use an outdated DSF version. +::: + You can read all about the concept of Allow Lists [in our introduction](/intro/info/allowList.md). ## Overview