diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..95f1015
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,58 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+.bower_components
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Docusaurus build output
+build/
+.docusaurus/
+
+# Temporary files
+*.swp
+*.swo
+*~
+
+# IDE files
+.idea/
+.vscode/
+*.sublime-project
+*.sublime-workspace
+
+# MacOS system files
+.DS_Store
+
+DATA/
+
+**/node_modules
+**/snippets
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..e78de3f
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,11 @@
+FROM node:lts as base
+
+WORKDIR /home/node/app
+COPY --chown=node:node . /home/node/app/
+RUN npm install -g pnpm
+RUN pnpm install
+RUN pnpm build
+
+FROM nginx:stable-alpine as deploy
+
+COPY --chown=node:node --from=base /home/node/app/site/build /usr/share/nginx/html/
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f49a4e1
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..dee49c7
--- /dev/null
+++ b/README.md
@@ -0,0 +1,212 @@
+## Prerequisites
+
+Before you begin, ensure that you have the following installed on your local machine:
+
+- [Node.js](https://nodejs.org/) (version 18.16.0 or later)
+- [pnpm](https://pnpm.io/) (version 7.29.1 or later)
+- [Java Development Kit](https://en.wikipedia.org/wiki/Java_Development_Kit) (version 17, recommended via [SDKMan](https://sdkman.io/install), as described below)
+- [Xcode](https://developer.apple.com/xcode/) (Version 15, **optional**, needed to run Swift tests locally)
+- [Rust](https://www.rust-lang.org/tools/install) (Version 1.75.0, **optional**, needed to run Rust tests locally)
+
+### Node Installation
+
+We recommend installing Node via the `nvm` [Node Version Manager](https://github.com/nvm-sh/nvm). Once installed on your system, you can get Node:
+
+```shell
+$ nvm install v18.16.0
+...
+$ nvm use v18.16.0
+Now using node v18.16.0 (npm v9.5.1)
+```
+
+You should now see both `node` and `npm` available from your `$PATH`:
+
+```
+$ node --version
+v18.16.0
+$ npm --version
+9.5.1
+```
+
+Note: if you already have `node` `v18.16.0` installed, you can switch to use it using `nvm use`; this will automatically set your `node` version to the one defined in `.nvmrc` in the root of this repo.
+
+### PNPM Installation
+
+To install `pnpm` globally on your local machine, follow these steps:
+
+1. Open a terminal or command prompt.
+2. Run the following command:
+
+```shell
+npm install -g pnpm
+```
+
+3. Wait for the installation process to complete.
+
+> Note: If you already have `pnpm` installed globally, you can skip this step.
+
+### Java Development Kit
+
+This project has components written in [Kotlin](https://kotlinlang.org/), a concise programming language from JetBrains that runs on the Java Virtual Machine.
+
+To build the site including its test suites, you must have a Java Development Kit installed on your `$PATH`.
+
+You may verify your `java` installation via the terminal by running `java -version`.
+
+If you do not have Java, we recommend installing it via [SDKMan](https://sdkman.io/install). This project allows you to easily install the Java Development Kit (JDK), runtime (JRE), and related frameworks, build tools, and runtimes.
+
+After you've installed SDKMan, you may install Java:
+
+#### SDKMan (cross-platform instructions)
+
+```shell
+$ sdk install java 17.0.10-oracle
+...
+Do you want java 17.0.10-oracle to be set as default? (Y/n): Y
+Setting java 17.0.10-oracle as default.
+```
+
+You may test your installation:
+
+```shell
+$ java -version
+java version "17.0.10" 2024-01-16 LTS
+Java(TM) SE Runtime Environment (build 17.0.10+11-LTS-240)
+Java HotSpot(TM) 64-Bit Server VM (build 17.0.10+11-LTS-240, mixed mode, sharing)
+```
+
+### Playwright Installation
+
+[Playwright](https://playwright.dev/) is the test harness we use for browser-based examples. It can be installed from the `site` directory:
+
+```shell
+$ pnpm playwright install --with-deps
+```
+
+Note: Running `pnpm install` is required before running the Playwright install command above.
+
+This is required when running the tests, for instance via `pnpm test`.
+
+Note: At the time of this writing, Playwright is [not supported on Fedora systems](https://github.com/microsoft/playwright/issues/29559).
+
+### Xcode Installation
+
+[Xcode](https://developer.apple.com/xcode/) is Apple's development toolkit, used both as an IDE and runtime for Swift examples. Install via the site link for your platform.
+
+You can test your installation:
+
+```shell
+$ swift --version
+swift-driver version: 1.87.3 Apple Swift version 5.9.2 (swiftlang-5.9.2.2.56 clang-1500.1.0.2.5)
+Target: arm64-apple-macosx14.0
+```
+
+This optional prerequisite is required only when running the `pnpm test:swift` command. Once Swift tests are in place, we'll add the Swift environment to the `pnpm test` lifecycle, and this will become a required prerequisite.
+
+### Rust Installation
+
+[Rust](https://www.rust-lang.org/tools/install) is a modern, type-safe, compiled, performant language. Install via the site link for your platform.
+
+You may test your installation:
+
+```shell
+$ rustc --version
+rustc 1.75.0 (82e1608df 2023-12-21)
+```
+
+This optional prerequisite is required only when running the `pnpm test:rust` command. Once Rust tests are in place, we'll add the Rust environment to the `pnpm test` lifecycle, and this will become a required prerequisite.
+
+## Getting Started
+
+To get started with the project and run the available scripts, follow these instructions:
+
+1. Fork the repository
+
+2. Clone into your local workspace. Replace `$yourUsernameOrOrg` with your GitHub username or organization.
+
+````shell
+$ git clone
+
+3. Navigate to the project directory:
+
+```shell
+$ cd website/site
+````
+
+4. Install project dependencies using `pnpm`:
+
+```shell
+$ pnpm install
+```
+
+5. Once the installation is complete, you are ready to run the available scripts.
+
+## Scripts
+
+The following scripts are available for running specific tasks within the project. Run these scripts from the `site` directory.
+
+- `pnpm start`: Runs the site in development mode with auto-refresh.
+- `pnpm build`: Builds the production version of the site. The completed build will be in the `build` folder.
+- `pnpm clear`: Clears the Docusaurus build cache.
+- `pnpm serve`: Serves the production build locally.
+- `pnpm deploy`: Deploys the site (configure deployment settings as needed).
+- `pnpm swizzle`: Customizes Docusaurus theme components.
+- `pnpm write-translations`: Extracts strings for translation.
+- `pnpm write-heading-ids`: Generates heading IDs for content.
+- `pnpm snippets`: Runs `shnip` to extract code snippets (requires configuration).
+- `pnpm test`: Runs the test suites for the site in JavaScript, Kotlin, and Swift, including browser tests. Requires Playwright, Java Development Kit, and Swift, per installation instructions above.
+ - `pnpm test:js`: Runs the JavaScript test suite only.
+ - `pnpm test:js myFile.test.js`: Runs the tests within `myFile.test.js` only.
+ - `pnpm test:kotlin`: Runs the Kotlin test suite only.
+ - `pnpm test:rust`: Runs the Rust test suite (not included in the `pnpm test` lifecycle yet).
+ - `pnpm test:swift`: Runs the Swift test suite (not included in the `pnpm test` lifecycle yet).
+ - `pnpm test:watch`: Runs tests in watch mode.
+
+## Extra Features
+
+We have implemented extra features in the website that don't come enabled by default. For example, we have the Feedback Widget feature, which allows a user to upvote or downvote a docs page.
+
+These features are enabled via environment variables set in the `.env` file inside the `site` folder. To enable them, copy the example `.env` file:
+
+```shell
+cp .env.example .env
+```
+
+Then modify the parameters according to the feature you want to use. Check their instructions below:
+
+- `FEEDBACK_WIDGET_API_URL`: Enables the feedback widget API URL; see [Feedback server app instructions](./apps/feedback-server/README.md)
+- `DOC_SEARCH_*`: Enables the search bar powered by Algolia; see [Algolia connecting instructions](https://docusaurus.io/docs/search#connecting-algolia)
+
+Remember, when these environment variables are not set, these features are disabled by default.
+
+## Note on Package Manager
+
+This project uses `pnpm` as the package manager. If you have previously used `npm` or `yarn` in this project, you may encounter build failures. To fix this, remove any existing `node_modules` directories and reinstall dependencies using `pnpm`:
+
+```shell
+$ rm -rf node_modules
+$ pnpm install
+```
+
+Alternatively, you can use `npkill` to remove all `node_modules` directories:
+
+```shell
+$ npx npkill
+[Follow prompts to delete all node_modules folders]
+[Ctrl-C to exit]
+$ pnpm install
+```
+
+## Contributing
+
+If you wish to contribute to this project, please follow the guidelines outlined in the [CONTRIBUTING.md](CONTRIBUTING.md) file.
+
+## License
+
+This project is licensed under the [MIT License](LICENSE).
+
+## Breaking Files
+
+You'll notice that there's a directory at the root level labelled "breaking-files"
+
+Just a heads up that for some reason docusaurus is throwing an error when those docs are included in the docs directory. Might have something to do with conflicting dependencies between react/docusaurus versions.
diff --git a/generate-contributors-json.js b/generate-contributors-json.js
new file mode 100644
index 0000000..6304e9b
--- /dev/null
+++ b/generate-contributors-json.js
@@ -0,0 +1,41 @@
+import fs from "fs";
+import path from "path";
+import { fileURLToPath } from "url";
+
+// Get __dirname equivalent in ESM
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+
+try {
+ if (!fs.existsSync(".all-contributorsrc")) {
+ throw new Error(".all-contributorsrc file does not exist.");
+ }
+
+ const rawData = fs.readFileSync(".all-contributorsrc", "utf-8");
+ const parsedData = JSON.parse(rawData);
+
+ if (!parsedData.contributors) {
+ throw new Error("contributors key is missing in .all-contributorsrc");
+ }
+
+ const contributors = parsedData.contributors;
+
+ const filteredContributors = contributors.map((contributor) => ({
+ login: contributor.login,
+ avatar_url: contributor.avatar_url,
+ contributions: contributor.contributions,
+ }));
+
+ const outputPath = path.join(__dirname, "src", "contributors.json");
+
+ if (!fs.existsSync(path.dirname(outputPath))) {
+ fs.mkdirSync(path.dirname(outputPath), { recursive: true });
+ }
+
+ fs.writeFileSync(outputPath, JSON.stringify(filteredContributors, null, 2));
+
+ console.log("Contributors data has been updated successfully.");
+} catch (error) {
+ console.error("Error while generating contributors data:", error.message);
+ process.exit(1);
+}
diff --git a/site/.editorconfig b/site/.editorconfig
new file mode 100644
index 0000000..2cba593
--- /dev/null
+++ b/site/.editorconfig
@@ -0,0 +1,13 @@
+# EditorConfig: https://EditorConfig.org
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 2
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/site/.env b/site/.env
new file mode 100644
index 0000000..8264696
--- /dev/null
+++ b/site/.env
@@ -0,0 +1,3 @@
+INKEEP_API_KEY=0c653dd4ea4a927fa390db90e4b730b6362a02a6f131b5e9
+INKEEP_INTEGRATION_ID=clulkfai7000713j9miyatu4r
+INKEEP_ORG_ID=org_GW7VeRk82JIdk426
\ No newline at end of file
diff --git a/site/.env.example b/site/.env.example
new file mode 100644
index 0000000..a5e0c98
--- /dev/null
+++ b/site/.env.example
@@ -0,0 +1,7 @@
+# Algolia Config
+# DOC_SEARCH_API_KEY=
+# DOC_SEARCH_INDEX_NAME=
+# DOC_SEARCH_APP_ID=
+
+# Feedback Widget
+# FEEDBACK_WIDGET_API_URL=http://localhost:3001/api
\ No newline at end of file
diff --git a/site/.eslintrc.js b/site/.eslintrc.js
new file mode 100644
index 0000000..aee8747
--- /dev/null
+++ b/site/.eslintrc.js
@@ -0,0 +1,30 @@
+export default {
+ env: {
+ browser: true,
+ es2021: true,
+ jest: true,
+ node: true,
+ },
+ extends: ['eslint:recommended', 'plugin:react/recommended', 'prettier'],
+ parserOptions: {
+ ecmaFeatures: {
+ jsx: true,
+ },
+ ecmaVersion: 'latest',
+ sourceType: 'module',
+ },
+ plugins: ['prettier', 'react'],
+ rules: {
+ 'import/prefer-default-export': 0,
+ 'indent': ['error', 2],
+ 'linebreak-style': ['error', 'unix'],
+ 'prettier/prettier': ['error', {}, { usePrettierrc: true }],
+ 'quotes': ['error', 'single'],
+ 'semi': ['error', 'always'],
+ },
+ settings: {
+ react: {
+ version: 'detect',
+ },
+ },
+};
diff --git a/site/.nvmrc b/site/.nvmrc
new file mode 100644
index 0000000..55bffd6
--- /dev/null
+++ b/site/.nvmrc
@@ -0,0 +1 @@
+18.15.0
diff --git a/site/.prettierignore b/site/.prettierignore
new file mode 100644
index 0000000..d9cd20e
--- /dev/null
+++ b/site/.prettierignore
@@ -0,0 +1,3 @@
+# Ignore artifacts:
+build
+node_modules
diff --git a/site/.prettierrc.json b/site/.prettierrc.json
new file mode 100644
index 0000000..2eca0c6
--- /dev/null
+++ b/site/.prettierrc.json
@@ -0,0 +1,11 @@
+{
+ "arrowParens": "always",
+ "bracketSameLine": false,
+ "bracketSpacing": true,
+ "endOfLine": "lf",
+ "quoteProps": "consistent",
+ "semi": true,
+ "singleQuote": true,
+ "tabWidth": 2,
+ "trailingComma": "all"
+}
diff --git a/site/babel.config.js b/site/babel.config.js
new file mode 100644
index 0000000..e00595d
--- /dev/null
+++ b/site/babel.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
+};
diff --git a/site/breaking-files/kcc/_category_.json b/site/breaking-files/kcc/_category_.json
new file mode 100644
index 0000000..107909c
--- /dev/null
+++ b/site/breaking-files/kcc/_category_.json
@@ -0,0 +1,4 @@
+{
+ "label": "Known Customer Credential",
+ "position": 4
+}
diff --git a/site/breaking-files/kcc/kcc-issuer.mdx b/site/breaking-files/kcc/kcc-issuer.mdx
new file mode 100644
index 0000000..cd6b91c
--- /dev/null
+++ b/site/breaking-files/kcc/kcc-issuer.mdx
@@ -0,0 +1,502 @@
+---
+sidebar_position: 1
+title: Issuing a KCC
+hide_title: true
+---
+
+ # Issuing a Known Customer
+Credential
+
+Known Customer Credentials (KCCs) are [Verifiable Credentials](/) designed to streamline the Know Your Customer (KYC) process for tbDEX protocol users. KCCs help in gaining access to PFIs providing regulated financial services.
+
+For a comprehensive exploration of the practical applications and compliance considerations of KCCs, refer to our [KCC Compliance Guide](https://www.tbdex.io/guides/kcc) which provides detailed examples and insights into how KCCs align with certain regulatory requirements, offering valuable context for those overseeing the implementation and management of KCCs.
+
+:::danger Important
+This guide is intended for educational purposes only and does not constitute legal advice. Compliance programs may have varying requirements. Consult your legal and/or compliance advisors to ensure that the KCC is consistent with your legal and compliance obligations.
+:::
+
+In this guide, we'll cover:
+
+- Performing Identity Verification (IDV) as a necessary step **before** issuing a Known Customer Credential (KCC), by implementing an HTTP API conformant with [Self Issued OpenID Provider V2 (SIOPv2)](https://openid.github.io/SIOPv2/openid-connect-self-issued-v2-wg-draft.html) and [OpenID for Verifiable Presentation's (OID4VP)](https://openid.net/specs/openid-4-verifiable-presentations-1_0.html).
+- Designing and detailing the required properties of a KCC.
+- Issuing a KCC conformant with [OpenID for Verifiable Credential Issuance (OID4VCI)](https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html) following successful IDV.
+
+:::info
+For a detailed guide on managing Known Customer Credentials as a Wallet application, please refer to the [Known Customer Credential Guide for Wallet Apps](/docs/tbdex/issuer/kcc/kcc-wallet)
+:::
+
+## Environment Setup
+
+If you haven't already, please follow the [Credential Issuance Server Setup Guide](/docs/tbdex/issuer/vc-serverSetup) for detailed instructions on the dependencies and packages needed to set up your server.
+
+## IDV Process
+
+IDV is a critical component of typical KYC requirements, where certain types of Personally Identifying Information (PII) are collected and verified from an individual. IDV is a crucial step before a KCC can be issued.
+
+```mermaid
+%%{
+ init: {
+ 'theme': 'base',
+ 'themeVariables': {
+ 'background': '#000',
+ 'primaryColor': '#333',
+ 'primaryTextColor': '#fff',
+ 'secondaryColor': '#9a1aff',
+ 'tertiaryColor': '#000',
+ 'fontFamily': 'IBM Plex Mono',
+ 'primaryBorderColor': '#ffec19',
+ 'actorTextColor': '#24f2ff',
+ 'actorBorder': '#ffec19',
+ 'actorBkg': '#000',
+ 'sequenceNumberColor': '#f00',
+ 'loopTextColor': '#24f2ff'
+ }
+ }
+}%%
+
+sequenceDiagram
+autonumber
+participant W as Webview
+participant D as Mobile Wallet
+participant I as Issuer
+D->>+I: GET did:ex:issuer?service=IDV
+I->>I: Construct SIOPv2 Authorization Request
+I-->>-D: SIOPv2 Authorization Request
+D->>D: Construct SIOPv2 Authorization Response
+D->>+I: SIOPv2 Authorization Response
+I->>I: Construct IDV Request
+I-->>-D: IDV Request
+D->>D: Verify IDV Request
+D->>W: Load URL in IDV Request
+```
+
+The IDV flow begins when the customer's agent (e.g. Wallet application) sends an HTTP request to the Issuer's [IDV service endpoint](https://hackmd.io/4cW3D9BVQGCEuf1CEg47jA?both#Issuers-Identity) specified in the Issuer's [Decentralized Identifier (DID) Document](/docs/glossary#did-document).
+
+### 1. Handling Incoming Requests
+
+Implement an endpoint to handle incoming GET requests from the Wallet. When a request is received, you'll need to construct the [SIOPv2 Authorization Request](https://openid.github.io/SIOPv2/openid-connect-self-issued-v2-wg-draft.html#section-9).
+
+### Approach 1: Requesting only [`id_token`](https://openid.github.io/SIOPv2/openid-connect-self-issued-v2-wg-draft.html#name-self-issued-id-token)
+
+When a Verifiable Presentation is **not** an accepted form of IDV, you can respond to the customer's Wallet application by requesting only an `id_token` from them:
+
+
+
+:::note
+`id_token` is a Self Issued Identity Token, that authenticates the customer to the Issuer by sharing the customer's Decentralized Identifier. This guide will cover an example `id_token` to learn more refer to [OpenID's specs](https://openid.github.io/SIOPv2/openid-connect-self-issued-v2-wg-draft.html#name-self-issued-id-token).
+:::
+
+### Approach 2: Requesting both `id_token` and [`vp_token`](https://openid.net/specs/openid-4-verifiable-presentations-1_0.html#section-6.1-2.2)
+
+When a Verifiable Presentation is an accepted form of IDV, you can respond to the customer's Wallet application by requesting an `id_token` and a `vp_token` from them:
+
+
+
+The SOIPv2 Authorization request above that you as the issuer send to your customer contains the following key information about you as well as a [Presentation Definition](/docs/web5/verifiable-credentials/presentation-definition).
+
+- **`client_id`**: Issuer's DID, establishing the issuer/requestor's identity.
+- **`response_type`**: Lets the Wallet know the desired format, with `id_token` being required identity token and `vp_token` for _optional_ verifiable presentation token. The inclusion of `vp_token` means a presentation definition is required within the request.
+- **`response_uri`**: Indicates the callback url for the Wallet, ensuring direct communication between the Wallet and the Issuer.
+- **`nonce`**: A unique identifier tying together the request and its response.
+
+:::note
+`vp_token` is a [Verifiable Presentation](/docs/glossary#verifiable-presentation) that contains certified and authenticated claims about the customer. In this guide, we'll cover an example `vp_token`. To learn more refer to [OpenID's specs](https://openid.net/specs/openid-4-verifiable-presentations-1_0.html#section-6.1-2.2).
+:::
+
+### 2. Encode the SIOPv2 Authorization Request and respond:
+
+
+
+### 3. Wallet's SIOPv2 Authorization Response
+
+The Wallet will then respond with an HTTP POST [SIOPv2 Authorization Response](https://openid.github.io/SIOPv2/openid-connect-self-issued-v2-wg-draft.html#section-10). The HTTP request body must include an `id_token` and optionally a `vp_token`, both of which must be [JSON Web Tokens (JWTs)](https://datatracker.ietf.org/doc/html/rfc7519). Here is an example HTTP POST request body (which includes the optional `vp_token`):
+
+```javascript
+// Wallet.js example HTTP POST request body
+
+{
+ "id_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJkaWQ6ZGh0OmN1c3RvbWVyRGlkIiwic3ViIjoiZGlkOmRodDpjdXN0b21lckRpZCIsImF1ZCI6Imlzc3VlckRpZC51cmkiLCJub25jZSI6Im4tMFM2X1d6QTJNaiIsImV4cCI6MTYxODg4NDQ3MywiaWF0IjoxNjE4ODgwODczfQGUuY29tL2NyZWRlbnRpYWxzLzE4NzIiLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiSURDYXJkQ3JlZGVudGlhbCJdLCJpc3N1ZXIiOnsiaWQiOiJkaWQ6ZXhhbXBsZTppc3N1ZXIifSwiaXNzdWFuY2VEYXRlIjoiMjAxMC0wMS0wMVQxOToyMzoyNFoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJnaXZlbl9uYW1lIjoiRnJlZHJpayIsImZhbWlseV9uYW1.Imlzc3VlckRpZC51cmkiLCJub25jZSI6Im4tMFM2X1d6QTJNaiIsImV4cCI6MTYxODg4NDQ3MywiaWF0IjoxNjE4ODgwODcz",
+ "vp_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iXSwidmVyaWZpYWJsZUNyZWRlbnRpYWwiOlt7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIiwiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvZXhhbXBsZXMvdjEiXSwiaWQiOiJodHRwczovL2V4YW1wbGUuY29tL2NyZWRlbnRpYWxzLzE4NzIiLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiSURDYXJkQ3JlZGVudGlhbCJdLCJpc3N1ZXIiOnsiaWQiOiJkaWQ6ZXhhbXBsZTppc3N1ZXIifSwiaXNzdWFuY2VEYXRlIjoiMjAxMC0wMS0wMVQxOToyMzoyNFoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJnaXZlbl9uYW1lIjoiRnJlZHJpayIsImZhbWlseV9uYW1lIjoiU3RyJm9tYmVyZyIs.ImJpcnRoZGF0ZSI6IjE5NDktMDEtMjIifX1dLCJob2xkZXIiOiJkaWQ6ZXhhbXBsZTpob2xkZXIiLCJwcm9vZiI6eyJ0eXBlIjoiRWQyNTUxOVNpZ25hdHVyZTIwMTgiLCJjcmVhdGVkIjoiMjAyMS0wMy0xOVQxNTozMDoxNVoiLCJjaGFsbGVuZ2UiOiJuLTBTNl9XekEyTWoiLCJkb21haW4iOiJodHRwczovL2NsaWVudC5leGFtcGxlLm9yZy9jYiIsImp3cyI6ImV5SmhiR2NpT2lKSVV6STFOaUo5LkhvbGRlcl9GT1JfU0lHTkFUVVJFIiwicHJvb2ZQdXJwb3NlIjoiYXV0aGVudGljYXRpb24iLCJ2ZXJpZmljYXRpb25NZXRob2QiOiJkaWQ6ZXhhbXBsZTpob2xkZXIja2V5LTEifX0"
+}
+```
+
+The decoded [JWT Claims](https://datatracker.ietf.org/doc/html/rfc7519#section-4) for the `id_token` and `vp_token` are as follows:
+
+```javascript
+// Wallet.js id_token decoded JWT claims
+
+{
+ "iss": "did:dht:customerDid",
+ "sub": "did:dht:customerDid", // Customer's DID string
+ "aud": "did:dht:issuerDid", // Issuer's DID string
+ "nonce": "n-0S6_WzA2Mj", // Unique string from the Issuer's Auth request
+ "exp": 1618884473, // Expiration time
+ "iat": 1618880873 // issued at time
+}
+```
+
+```javascript
+// Wallet.js vp_token decoded JWT claims
+
+{
+ "@context": [
+ "https://www.w3.org/2018/credentials/v1",
+ "https://identity.foundation/presentation-exchange/submission/v1"
+ ],
+ "type": ["VerifiablePresentation", "PresentationSubmission"],
+ "presentation_submission": {
+ "id": "epzZXstAcVNt5MRrcyG91",
+ "definition_id": "IDCardCredentials",
+ "descriptor_map": [
+ {
+ "id": "IDCardCredential",
+ "format": "jwt_vc",
+ "path": "$.vp.verifiableCredential[0]"
+ },
+ {
+ "id": "nationalIdentifierVerification",
+ "format": "jwt_vc",
+ "path": "$.vp.verifiableCredential[1]"
+ }
+ ]
+ },
+ "verifiableCredential": [
+ "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDprZXk6ejZNa2VyNDlDbnVnN2hzdkhEZ3Y0NHl2cGR2dE1oNHlMaURYeFM2N2huclVodHQyI3o2TWtlcjQ5Q251Zzdoc3ZIRGd2NDR5dnBkdnRNaDR5TGlEWHhTNjdobnJVaHR0MiJ9.eyJpc3MiOiJkaWQ6a2V5Ono2TWtlcjQ5Q251Zzdoc3ZIRGd2NDR5dnBkdnRNaDR5TGlEWHhTNjdobnJVaHR0MiIsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJFbXBsb3ltZW50Q3JlZGVudGlhbCJdLCJpZCI6InVybjp1dWlkOjcyNDhiOTkyLTkwOTYtNDk2NS1hMGVjLTc3ZDhhODNhMWRmYiIsImlzc3VlciI6ImRpZDprZXk6ejZNa2VyNDlDbnVnN2hzdkhEZ3Y0NHl2cGR2dE1oNHlMaURYeFM2N2huclVodHQyIiwiaXNzdWFuY2VEYXRlIjoiMjAyMy0xMi0yMVQyMDoxMToyNVoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDppb246RWlEMTR4UmY0cTJNWlh1ZWY2X2ZXYnBGbVlTUG94dGFxTkp1SmdEMG96Wl84UTpleUprWld4MFlTSTZleUp3WVhSamFHVnpJanBiZXlKaFkzUnBiMjRpT2lKeVpYQnNZV05sSWl3aVpHOWpkVzFsYm5RaU9uc2ljSFZpYkdsalMyVjVjeUk2VzNzaWFXUWlPaUprZDI0dGMybG5JaXdpY0hWaWJHbGpTMlY1U25kcklqcDdJbU55ZGlJNklrVmtNalUxTVRraUxDSnJkSGtpT2lKUFMxQWlMQ0o0SWpvaWVubGFNbVYzTlhKeVVXdFVjbUV3WlZsVk16WlBTblJzTURCbFJWZHhhalZhV0dkNmNEZFpSVTVKUVNKOUxDSndkWEp3YjNObGN5STZXeUpoZFhSb1pXNTBhV05oZEdsdmJpSmRMQ0owZVhCbElqb2lTbk52YmxkbFlrdGxlVEl3TWpBaWZTeDdJbWxrSWpvaVpIZHVMV1Z1WXlJc0luQjFZbXhwWTB0bGVVcDNheUk2ZXlKamNuWWlPaUp6WldOd01qVTJhekVpTENKcmRIa2lPaUpGUXlJc0luZ2lPaUpQZDJZMFQyMUViamxKWm5SNFdYWnBkRTFHWm1jMVVXeDVMVVV6VWs1b1dsUkdPVlpFTWtnNVQzVjNJaXdpZVNJNkltUnZjVmxtV2s1c1NtRlRNVll4U201bU9HdEZObEF6VkRsd2QzaDNla3hFVTJWc1ZqTlRUa2s1U2xFaWZTd2ljSFZ5Y0c5elpYTWlPbHNpYTJWNVFXZHlaV1Z0Wlc1MElsMHNJblI1Y0dVaU9pSktjMjl1VjJWaVMyVjVNakF5TUNKOVhTd2ljMlZ5ZG1salpYTWlPbHQ3SW1sa0lqb2laSGR1SWl3aWMyVnlkbWxqWlVWdVpIQnZhVzUwSWpwN0ltVnVZM0o1Y0hScGIyNUxaWGx6SWpwYklpTmtkMjR0Wlc1aklsMHNJbTV2WkdWeklqcGJJbWgwZEhCek9pOHZaSGR1TG5SaVpHUmxkaTV2Y21jdlpIZHVOaUlzSW1oMGRIQnpPaTh2WkhkdUxuUmlaR1JsZGk1dmNtY3ZaSGR1TUNKZExDSnphV2R1YVc1blMyVjVjeUk2V3lJalpIZHVMWE5wWnlKZGZTd2lkSGx3WlNJNklrUmxZMlZ1ZEhKaGJHbDZaV1JYWldKT2IyUmxJbjFkZlgxZExDSjFjR1JoZEdWRGIyMXRhWFJ0Wlc1MElqb2lSV2xEWm05bVFUQkpVbU5uY2tWdVVHZHdRbU5RV1ZsV2VFWlliR0pTYjJRd2RVNWZRVkJwTkVrNUxVRmZRU0o5TENKemRXWm1hWGhFWVhSaElqcDdJbVJsYkhSaFNHRnphQ0k2SWtWcFFtd3pWWG80VldGT2REZGxlREJKYjJJMFJFNXNhbFJGVmpaelQwTmtjbFJ3TWxvNE5FTkJPVFJPUWtFaUxDSnlaV052ZG1WeWVVTnZiVzFwZEcxbGJuUWlPaUpGYVVOWk9WRldZbWRKYkUxemRraEZYMVJtTld4a1MxQjBkR3d3WVV4blNrdHNSbmt6Vms0d2QzQTJhVFpSSW4xOSIsImVtcGxveW1lbnRTdGF0dXMiOiJlbXBsb3llZCJ9fX0.Sazc8Ndhs-NKjxvtVMKeC9dxjEkI26fVsp2kFNWM-SYLtxMzKvl5ffeWd81ysHgPmBBSk2ar4dMqGgUsyM4gAQ",
+ "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDprZXk6ejZNa2pwUzRHVUFoYmdCSmg2azJnZTZvWTQ0UUxyRXA3NXJadHNqYVRLb3JSRGR0I3o2TWtqcFM0R1VBaGJnQkpoNmsyZ2U2b1k0NFFMckVwNzVyWnRzamFUS29yUkRkdCJ9.eyJpc3MiOiJkaWQ6a2V5Ono2TWtqcFM0R1VBaGJnQkpoNmsyZ2U2b1k0NFFMckVwNzVyWnRzamFUS29yUkRkdCIsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJOYW1lQW5kRG9iQ3JlZGVudGlhbCJdLCJpZCI6InVybjp1dWlkOjliZjM2YzY5LTI0ODAtNDllZC1iMTYyLTRlZDEwOWE3MTc3NyIsImlzc3VlciI6ImRpZDprZXk6ejZNa2pwUzRHVUFoYmdCSmg2azJnZTZvWTQ0UUxyRXA3NXJadHNqYVRLb3JSRGR0IiwiaXNzdWFuY2VEYXRlIjoiMjAyMy0xMi0yMVQyMDowNjowMVoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDppb246RWlDS2o2M0FyZlBGcEpsb2lTd3gxQUhxVWtpWlNoSDZGdnZoSzRaTl9fZDFtQTpleUprWld4MFlTSTZleUp3WVhSamFHVnpJanBiZXlKaFkzUnBiMjRpT2lKeVpYQnNZV05sSWl3aVpHOWpkVzFsYm5RaU9uc2ljSFZpYkdsalMyVjVjeUk2VzNzaWFXUWlPaUprZDI0dGMybG5JaXdpY0hWaWJHbGpTMlY1U25kcklqcDdJbU55ZGlJNklrVmtNalUxTVRraUxDSnJkSGtpT2lKUFMxQWlMQ0o0SWpvaWNscFdXbTVJVkVrNWFEWkJUVmxVV0dwT01HcFhTVkYwTTI5ak4xTnJTeTF4Y2kxcVVuSTBUalEzUlNKOUxDSndkWEp3YjNObGN5STZXeUpoZFhSb1pXNTBhV05oZEdsdmJpSmRMQ0owZVhCbElqb2lTbk52YmxkbFlrdGxlVEl3TWpBaWZTeDdJbWxrSWpvaVpIZHVMV1Z1WXlJc0luQjFZbXhwWTB0bGVVcDNheUk2ZXlKamNuWWlPaUp6WldOd01qVTJhekVpTENKcmRIa2lPaUpGUXlJc0luZ2lPaUpaVDFwRE5WSmlUMHQ1T0dadVVUWTJVWEZPUkc5aldFMXZPVXhUZEdNNVYyOWthMHd0ZFZCZlExQnZJaXdpZVNJNklsWnZZM0UxVERodFozQlhXVTFrYjFwS1JrWlJUa1ZDT0hsR0xXTndkRWQzZFdkcFRWVm5hR2t6Y21jaWZTd2ljSFZ5Y0c5elpYTWlPbHNpYTJWNVFXZHlaV1Z0Wlc1MElsMHNJblI1Y0dVaU9pSktjMjl1VjJWaVMyVjVNakF5TUNKOVhTd2ljMlZ5ZG1salpYTWlPbHQ3SW1sa0lqb2laSGR1SWl3aWMyVnlkbWxqWlVWdVpIQnZhVzUwSWpwN0ltVnVZM0o1Y0hScGIyNUxaWGx6SWpwYklpTmtkMjR0Wlc1aklsMHNJbTV2WkdWeklqcGJJbWgwZEhCek9pOHZaSGR1TG5SaVpHUmxkaTV2Y21jdlpIZHVOaUlzSW1oMGRIQnpPaTh2WkhkdUxuUmlaR1JsZGk1dmNtY3ZaSGR1TUNKZExDSnphV2R1YVc1blMyVjVjeUk2V3lJalpIZHVMWE5wWnlKZGZTd2lkSGx3WlNJNklrUmxZMlZ1ZEhKaGJHbDZaV1JYWldKT2IyUmxJbjFkZlgxZExDSjFjR1JoZEdWRGIyMXRhWFJ0Wlc1MElqb2lSV2xCTXpSMlMzb3llVmswZVV4dGRDMUdabkJuYWpWbGFFRm1ZWFI1YzFOa2MwNVNWbVpMYkhwUWRqTjVkeUo5TENKemRXWm1hWGhFWVhSaElqcDdJbVJsYkhSaFNHRnphQ0k2SWtWcFF6ZGZjMXBzTW1wMVVXNUdhRVJIV1RSb2NFVTRiMlF4YVU5MWRuZG1PVFJ5TVVkbk9HMWFWbVJCVmxFaUxDSnlaV052ZG1WeWVVTnZiVzFwZEcxbGJuUWlPaUpGYVVKdU5sTnJiSEpWYzNKdVFuaFJPVXBqVXkxTlNVaGtWelYwTXpRM1MxWjNaMXBwVEZwMFQwcDRRVkYzSW4xOSIsIm5hbWUiOiJhbGljZSBib2IiLCJkYXRlT2ZCaXJ0aCI6IjEwLTAxLTE5OTAifX19.mNCDv_JntH-wZpYONKNL58UbOWaYXCYJO_HPI_WVlSgwzo6dhYmV_9qtpFKd_exFb-aaEYPeSE43twWlrJeSBg"
+ ]
+}
+```
+
+### 4. Handle SIOPv2 Response
+
+Implement a `/siopv2/response` endpoint to process and verify the Wallet's response. The HTTP response body must always include a `credential_offer`. If the Wallet's response **does not** include a `vp_token`, as a valid form of IDV, then the HTTP response body must also include a URL directing the Wallet to an Identity Verification form:
+
+
+
+:::info
+The IDV Request Form points to a webpage for the customer to input their Personal Identifiable Information (PII) (e.g.; name, identification number, date of birth, etc).
+:::
+
+#### [Credential Offer Details:](https://openid.github.io/OpenID4VCI/openid-4-verifiable-credential-issuance-wg-draft.html#section-4.1)
+
+- **`credential_issuer`**: The base URL address of the Issuer's service. It is used by the Wallet to retrieve the Issuer's metadata and the Issuer's Authorization Server Metadata.
+- **`credential_configuration_ids`**: Unique strings that identify the credential you are offering. The Wallet can use these to request metadata.
+- **`grants`**: Contains grant types you will accept for this credential offer.
+- **`urn:ietf:params:oauth:grant-type:pre-authorized_code`**: Grant type required for the [OID4VCI](https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html#appendix-B.1) Pre-Authorization flow.
+- **`pre-authorized_code`**: The code representing the Credential Issuer's authorization for the Wallet to obtain an access token.
+
+:::info
+**Dynamic Metadata Retrieval by Wallets**
+
+Wallets use the `credential_issuer` from the Credential Offer to dynamically construct URLs for fetching Issuer and Authorization Server Metadata. These URLs, formed by appending `/.well-known/openid-credential-issuer` and `/.well-known/oauth-authorization-server` to the `credential_issuer`, allow wallets to access up-to-date information on issuer capabilities and OAuth 2.0 endpoints. The next steps will cover how to properly configure these endpoints.
+:::
+
+### 5. Create Issuer's Metadata Endpoint
+
+Configure the `/.well-known/openid-credential-issuer` endpoint that will return your Issuer Metadata:
+
+
+
+- `credential_issuer`: The base URL address of the Issuer's service. It is used by the Wallet to retrieve the Issuer's metadata and the Issuer's Authorization Server Metadata.
+- `credential_endpoint`: The endpoint the Wallet will use to submit requests to issue credentials. After obtaining an access token, the Wallet sends a credential request to this endpoint.
+- `credential_configurations_supported`: Defines the format `jwt_vc_json`, and the credential, including informative display markup.
+
+### 6. Create Issuer's Authorization Server Metadata Endpoint
+
+Configure the `/.well-known/oauth-authorization-server` endpoint that will return your Issuer Authorization Server Metadata:
+
+
+
+- `issuer`: The base URL of the Issuer's service.
+- `token_endpoint`: The endpoint where the Wallet can exchange the `pre_authorization_code` received in the `credential_offer` for an access token.
+
+### 7. Create Access Token Endpoint
+
+Set up the `/token` endpoint to process incoming requests from the Wallet containing the `pre_authorization_code`. This code, originally provided in the `credential_offer` object, is used to validate the Wallet's request:
+
+
+
+:::info
+
+**`authorization_pending` error response in the case IDV is incomplete**
+
+The Issuer must check if the IDV Process is completed prior to issuing an access token, and in the event IDV is incomplete must return an `authorization_pending` error response to the Wallet whereafter the Wallet will repeat the call to `/token` until IDV is completed.
+:::
+
+## Design Known Customer Credential
+
+When creating a Verifiable Credential, you can design a model class to represent the specific type of credential you'd like to issue.
+
+Define a `KccCredential` class with **required** and **optional** fields for a Known Customer Credential:
+
+
+- `countryOfResidence`: Is a `ISO-3166` 2-letter country code representing the customer’s
+verified country of residence (ex: US).
+
+- `tier`: The tier your customer falls into,
+ assuming you perform tier-based KYC.
+
+- `credentialSchema`: Schema used to define the shape of the credential including its required fields.
+
+- `evidence`: Is an Array of objects, where each object contains `kind` (String) and `checks` (array of Strings). `kind` states the **type** of evidence and `checks` details the specific proofs or checks used during IDV.
+
+- `jurisdiction`: Specifies the legal jurisdiction where the Issuer performed identity verification (IDV). This field is an object that includes the `country` key, which uses an `ISO-3166` 2-letter country code (ex: US).
+
+:::info
+
+- You'll need to assign `issuer`, `subject`, and `expirationDate` properties during the creation process. `issuanceDate` is managed and generated by the `Web5` SDK. You'll see how this works in the upcoming section.
+ :::
+
+## Issue Known Customer Credential
+
+Issuing a Known Customer Credential to a customer's Wallet confirms the successful completion of the Identity Verification Process. To create and securely sign this credential, we will utilize the [web5/credentials](https://www.npmjs.com/package/@web5/credentials) package.
+
+1. Once the customer accepts your Credential Offer, the Wallet will then send a request for credentials to the endpoint specified in the `credential_endpoint` field of the Issuer's metadata. Here is an example of the Wallet's request:
+
+```bash
+POST /credentials HTTP/1.1
+Host: issuer.example.com
+Authorization: Bearer eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpqd2s6ZXlKcmRIa2lPaUpQUzFBaUxDSmpjbllpT2lKRlpESTFOVEU1SWl3aWVDSTZJblIwY0VRNWF6SnNSSGQxV2tobmQyVllVbDluVUd4U2RHWk9hMEZUZVhZek1HVlhSSGx5VUU5Uk1VVWlmUSMwIn0.eyJleHAiOjE3MTA5NDkzODAsImlhdCI6MTcxMDg2Mjk1NywiaXNzIjoiZGlkOmp3azpleUpyZEhraU9pSlBTMUFpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpZUNJNkluUjBjRVE1YXpKc1JIZDFXa2huZDJWWVVsOW5VR3hTZEdaT2EwRlRlWFl6TUdWWFJIbHlVRTlSTVVVaWZRIiwic3ViIjoiZGlkOmp3azpleUpyZEhraU9pSlBTMUFpTENKamNuWWlPaUpGWkRJMU5URTVJaXdpZUNJNklqWnRMVTU0T0dad1IxbFRPRmhXTjFneFVWY3hhbEp1V0c0dFRXUnFVakkzWm1KS1lUaEZWa3RuYTJNaWZRIn0.5_CFzPpvvbxubtXyz7jsmwqaA3SPcebk9OvSWGnORMMfIgh6iWYj5DjXgTst3Mz7ZLjK0AaCF628hwis5hL3AA
+Content-Type: application/json
+{
+ "proof": {
+ "proof_type": "jwt",
+ "jwt": "eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpqd2s6ZXlKcmRIa2lPaUpQUzFBaUxDSmpjbllpT2lKRlpESTFOVEU1SWl3aWVDSTZJalp0TFU1NE9HWndSMWxUT0ZoV04xZ3hVVmN4YWxKdVdHNHRUV1JxVWpJM1ptSktZVGhGVmt0bmEyTWlmUSMwIiwidHlwIjoib3BlbmlkNHZjaS1wcm9vZitqd3QifQ.eyJhdWQiOiJkaWQ6andrOmV5SnJkSGtpT2lKUFMxQWlMQ0pqY25ZaU9pSkZaREkxTlRFNUlpd2llQ0k2SW5SMGNFUTVhekpzUkhkMVdraG5kMlZZVWw5blVHeFNkR1pPYTBGVGVYWXpNR1ZYUkhseVVFOVJNVVVpZlEiLCJpYXQiOjE3MTA4NjMxOTEsIm5vbmNlIjoidFppZ25zbkZicCJ9.MqxVdgX2tJMDJhNYuniYE7bjLyybRgRcPlDCY2ZN9FU2acLC5kU_wAZq-IF8vfIRXfmhbiFoBbfoPUZNBgdDAw"
+ }
+}
+```
+
+The `proof` JWT contains various claims, most notably a `nonce` to prevent replay attacks. For a detailed look at each field please refer to the [OpenID spec](https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html#section-7.2.1.1-2.1.1).
+
+- `Authorization: Bearer {jwt}`: The `access_token` that the Wallet received from the `/token` endpoint.
+
+:::danger Important
+Before issuing a Known Customer Credential, it's important to complete all necessary steps of your Know Your Customer (KYC) program. This may include further screenings on the user's DID/information, such as Sanctions Checks, Politically Exposed Persons (PEP) screenings, and Negative News Screenings, which aren't covered in this guide. Consult with your legal and compliance advisors to ensure that this process is consistent with your specific legal and compliance obligations.
+:::
+
+2. Implement the `/credentials` endpoint to handle incoming credential requests from the Wallet. This endpoint performs several important steps:
+
+- Extracts and validates the `access_token` from the Auth header
+- Validates the Signed Challenge Nonce (`c_nonce`)
+- Creates the Known Customer Credential
+- Responds with the Signed credential
+
+
+
+:::info
+
+- The `id` referenced in the `credentialSchema` field must correspond to a valid JSON schema that is hosted on an accessible server.
+- Signing will return a VC [JSON Web Token](https://jwt.io/), which is ideal for secure transmission of the credential.
+ :::
+
+To convert the signed VC JWT into a `VerifiableCredential` object you can use the [`parseJwt()` method](/docs/web5/verifiable-credentials/jwt-to-vc#decoding-jwt). Here is what your decoded **Known Customer Credential** would look like:
+
+
+
+
+
+```javascript
+{
+ "vcDataModel": {
+ "@context": ["https://www.w3.org/2018/credentials/v1"],
+ "type": ["VerifiableCredential"],
+ "id": "urn:uuid:12345678-1234-5678-1234-567812345678",
+ "issuer": "did:dht:z6Mkn4w6nSaWe4fjNJRvaHZwFnMm5VexvjzDeozEu2G7jC34",
+ "issuanceDate": "2024-05-29T19:23:24Z",
+ "expirationDate": "2026-05-19T08:02:04Z",
+ "credentialSubject": {
+ "id": "did:dht:z6MkjGSeekPGE9QfczHWyW8v2ZzJU68kqSHzV7L2dmQyuyDu",
+ "countryOfResidence": "US",
+ "tier": "Gold",
+ "jurisdiction": {
+ "country": "US"
+ }
+ },
+ "credentialSchema": [
+ {
+ id: "https://vc.schemas.host/kcc.schema.json",
+ type: "JsonSchema"
+ }
+ ],
+ "evidence": [
+ {
+ "kind": "document_verification",
+ "checks": ["passport", "utility_bill"]
+ },
+ {
+ "kind": "sanction_screening",
+ "checks": ["PEP"]
+ }
+ ]
+ }
+}
+```
+
+
+
+
+
+
+
+
+```javascript
+{
+ "@context": ["https://www.w3.org/2018/credentials/v1"],
+ "type": ["VerifiableCredential"],
+ "id": "urn:uuid:12345678-1234-5678-1234-567812345678",
+ "issuer": "did:dht:z6Mkn4w6nSaWe4fjNJRvaHZwFnMm5VexvjzDeozEu2G7jC34",
+ "issuanceDate": "2024-01-01T19:23:24Z",
+ "expirationDate": "2026-05-19T08:02:04Z",
+ "credentialSubject": {
+ "id": "did:dht:z6MkjGSeekPGE9QfczHWyW8v2ZzJU68kqSHzV7L2dmQyuyDu",
+ "countryOfResidence": "US",
+ "tier": "Gold",
+ "jurisdiction": {
+ "country": "US"
+ }
+ },
+ "credentialSchema": {
+ id: "https://vc.schemas.host/kcc.schema.json",
+ type: "JsonSchema"
+ },
+ "evidence": [
+ {
+ "kind": "document_verification",
+ "checks": ["passport", "utility_bill"]
+ },
+ {
+ "kind": "sanction_screening",
+ "checks": ["PEP"]
+ }
+ ]
+}
+```
+
+
+
+
+
+
+With that, you've successfully gone through the Identity Verification flow, and issued a Known Customer Credential. Please note that this example is a foundational implementation.
+For a production environment, it's crucial to enhance this basic setup with comprehensive error handling, and security measures.
+
+## Next Steps
+
+For an example of the flow covered in this guide, check out the [Known Customer Credential Exemplar](https://github.com/TBD54566975/kcc-prototype-exemplar) on GitHub. This exemplar provides a implementation of issuing a Known Customer Credential (KCC), demonstrating how to set up, manage, and issue KCCs.
diff --git a/site/breaking-files/kcc/kcc-wallet.mdx b/site/breaking-files/kcc/kcc-wallet.mdx
new file mode 100644
index 0000000..c13fc65
--- /dev/null
+++ b/site/breaking-files/kcc/kcc-wallet.mdx
@@ -0,0 +1,717 @@
+---
+sidebar_position: 2
+title: Requesting a KCC
+hide_title: true
+---
+
+
+
+# Requesting a Known Customer Credential
+
+Known Customer Credentials (KCCs) are [Verifiable Credentials](/) designed to streamline the [Know Your Customer (KYC)](https://www.tbdex.io/guides/compliance) process for tbDEX protocol users. KCCs help in gaining access to PFIs that provide regulated financial services.
+
+For a comprehensive exploration of the practical applications and compliance considerations of KCCs, refer to the [KCC Compliance Guide](https://www.tbdex.io/guides/kcc). It provides detailed examples and insights into how KCCs align with certain regulatory requirements. This offers valuable context for those overseeing the implementation and management of KCCs.
+
+In this guide, we'll cover:
+
+- **Identity Verification (IDV)**: How your Wallet App initiates and supports the IDV process conformant with [Self Issued OpenID Provider V2 (SIOPv2)](https://openid.net/specs/openid-connect-self-issued-v2-1_0.html) and [OpenID for Verifiable Presentations (OID4VP)](https://openid.net/specs/openid-4-verifiable-presentations-1_0.html), ensuring users can securely verify their identity.
+- **Credential Request**: The steps needed for your Wallet App to request a KCC on a user's behalf after successful IDV.
+- **Credential Management**: How the Wallet utilizes existing credentials for KCC requests and securely stores the KCC itself.
+
+:::info
+For a detailed guide on Known Customer Credentials for **Issuers**, please refer to the [Issuer's Known Customer Credential Guide](/docs/tbdex/issuer/kcc/kcc-issuer)
+:::
+
+## Environment Setup
+
+### Install Dependencies
+
+Your Wallet App will require libraries for handling HTTP requests and processing [JSON Web Tokens(JWTs)](https://jwt.io/). You can include these libraries in your project by installing the following dependencies:
+
+ {' '}
+
+### Framework Flexibility
+
+
+
+
+ The core logic provided in the code snippets of this guide is designed to
+ be adaptable across different development environments. The code examples
+ primarily cater to a **Ktor environment** however, the concepts shown can
+ be applied within various frameworks or platforms, including web
+ applications, server-side applications, and mobile applications. Depending
+ on your development context, you'll need to adjust aspects like HTTP
+ request handling and secure storage to align with the practices and
+ libraries of your chosen framework or platform.
+
+
+
+
+ The core logic provided in the code snippets of this guide is designed to
+ be adaptable across different development environments. The code examples
+ primarily cater to a **Node.js environment** however, the concepts shown
+ can be applied within various frameworks or platforms, including web
+ applications, server-side applications, and mobile applications. Depending
+ on your development context, you'll need to adjust aspects like HTTP
+ request handling, and secure storage to align with the practices and
+ libraries of your chosen framework or platform.
+
+
+
+
+ The core logic provided in the code snippets of this guide is designed to
+ be adaptable across different development environments. The code examples
+ primarily cater to a **Swift environment** utilizing Xcode however, the
+ concepts shown can be applied within various frameworks or platforms,
+ including web applications, server-side applications, and mobile
+ applications. Depending on your development context, you'll need to adjust
+ aspects like HTTP request handling, and secure storage to align with the
+ practices and libraries of your chosen framework or platform.
+
+
+
+
+## IDV Process
+
+Identity Verification is a critical component of typical KYC requirements, where certain types of Personally Identifiable Information (PII) are collected and verified from an individual. IDV is a crucial step before a KCC can be issued.
+
+```mermaid
+%%{
+ init: {
+ 'theme': 'base',
+ 'themeVariables': {
+ 'background': '#000',
+ 'primaryColor': '#333',
+ 'primaryTextColor': '#fff',
+ 'secondaryColor': '#9a1aff',
+ 'tertiaryColor': '#000',
+ 'fontFamily': 'IBM Plex Mono',
+ 'primaryBorderColor': '#ffec19',
+ 'actorTextColor': '#24f2ff',
+ 'actorBorder': '#ffec19',
+ 'actorBkg': '#000',
+ 'sequenceNumberColor': '#f00',
+ 'loopTextColor': '#24f2ff'
+ }
+ }
+}%%
+sequenceDiagram
+autonumber
+participant App as Customer's Wallet App
+participant DID as DID Resolver
+participant I as Issuer
+
+%% Step 1: Get IDV Endpoint
+App->>+DID: Resolve Issuer's DID
+DID-->>-App: DID Document with IDV Service Endpoint
+
+%% Step 2: Send HTTP Request to Service Endpoint
+App->>+I: HTTP Request to IDV Service Endpoint
+I->>I: Process Request
+I-->>-App: SIOPv2 Authorization Request
+
+%% Step 3: Handle SIOPv2 Authorization Request
+App->>App: Decode & Process SIOPv2 Auth Request
+App->>+I: SIOPv2 Authorization Response with id_token (& vp_token if applicable)
+I-->>-App: Process Authorization Response
+```
+
+The IDV flow begins when your app, as the customer's agent, sends an HTTP request to the Issuer's IDV service endpoint specified in the Issuer's [Decentralized Identifier (DID)](/) Document.
+
+### 1. Get IDV Endpoint
+
+Resolve the Issuer's DID to get the IDV service Endpoint that can be found in the Issuer's [DID Document](/#did-documents):
+
+
+
+### 2. Send HTTP request to Service Endpoint
+
+Send an HTTP request to the IDV Service Endpoint:
+
+
+
+The Issuer will then respond with a [SIOPv2 Authorization Request](https://openid.github.io/SIOPv2/openid-connect-self-issued-v2-wg-draft.html#section-) in the [JWT-Secured Authorization Request (JAR)](https://www.rfc-editor.org/rfc/rfc9101.html) format.
+This request contains information about the Issuer along with a [Presentation Definition](https://developer.tbd.website/docs/web5/verifiable-credentials/presentation-definition). Some of the key information included is:
+
+- **`client_id`**: Issuer's DID, establishing the Issuer/requestor's identity.
+- **`response_type`**: Indicates the desired format (e.g., `id_token`, `vp_token`) where `id_token` is required and `vp_token` is optional. If the desired format specifies `vp_token`, a verifiable presentation token should be provided to satisfy the presentation definition contained within the request.
+- **`response_uri`**: Indicates the callback url for the Wallet, ensuring direct communication between the Wallet and the Issuer.
+- **`nonce`**: A unique identifier tying together the request and its response.
+
+Here's a JSON example where `id_token` and `vp_token` are both requested:
+
+
+SIOPv2 Authorization Request
+
+```javascript
+// Issuer.js
+
+siopRequest = {
+ client_id: issuerDidUri, // Issuer's Decentralized Identifier
+ scope: 'openid', // Standard OpenID Connect scope
+ response_type: 'id_token vp_token', // Expected response formats: ID Token and optionally, Verifiable Presentation Token
+ response_uri: 'https://issuer.example.com/siopv2/response', // Endpoint for SIOP response delivery
+ response_mode: 'direct_post', // Delivery method of the SIOP response
+ nonce: 'n-0S6_WzA2Mj', // Unique string to link the request and response
+ client_metadata: {
+ // Descriptive metadata about the requesting party (Issuer)
+ subject_syntax_types_supported: 'did:dht did:jwk',
+ client_name: 'Issuance Service Name',
+ client_uri: 'https://issuer.example.com',
+ logo_uri: 'https://issuer.example.com/logo.png',
+ tos_uri: 'https://issuer.example.com/tos',
+ policy_uri: 'https://issuer.example.com/privacy',
+ },
+ presentation_definition: {
+ id: 'IDCardCredentials',
+ input_descriptors: [
+ {
+ id: 'IDCardCredential',
+ schema: {
+ uri: [
+ 'https://www.w3.org/2018/credentials#VerifiableCredential',
+ 'https://www.w3.org/2018/credentials/examples/v1#IDCardCredential',
+ ],
+ name: 'ID Card Credential',
+ purpose: 'We need to verify your identity.',
+ },
+ constraints: {
+ fields: [
+ {
+ path: ['$.vc.credentialSubject.given_name'],
+ purpose: 'The given name on your ID card.',
+ },
+ {
+ path: ['$.vc.credentialSubject.family_name'],
+ purpose: 'The family name on your ID card.',
+ },
+ {
+ path: ['$.vc.credentialSubject.birthdate'],
+ purpose: 'Your birth date.',
+ },
+ {
+ path: ['$.vc.credentialSubject.national_identifier'],
+ purpose: 'Your national identifier.',
+ },
+ ],
+ },
+ },
+ ],
+ },
+};
+```
+
+
+
+:::info
+
+- `id_token` is a self-issued Identity Token that authenticates the customer to the Issuer by sharing the customer's Decentralized Identifier.
+- `vp_token` is a Verifiable Presentation that contains certified and authenticated claims about the customer.
+
+In this guide, we'll cover an example `vp_token` and `id_token`.
+
+To learn more refer to OpenID's specs on [Issued Identity Token](https://openid.github.io/SIOPv2/openid-connect-self-issued-v2-wg-draft.html#name-self-issued-id-token) and [Verifiable Presentation Token](https://openid.net/specs/openid-4-verifiable-presentations-1_0.html#section-6.1-2.2).
+:::
+
+### 3. Create SIOPv2 Authorization Response
+
+Decode the Issuer's SIOPv2 Authorization Request and create a [SIOPv2 Authorization Response](https://openid.github.io/SIOPv2/openid-connect-self-issued-v2-wg-draft.html#section-10) with `id_token` and `vp_token`:
+
+
+
+:::info
+If the User's Verifiable Credentials do not satisfy the Authorization Request's Presentation Definition then only the `id_token` will be sent to the Issuer's `response_uri`. If the credentials **do** satisfy then a [Verifiable Presentation](https://developer.tbd.website/docs/glossary/#verifiable-presentation) (`vp_token`) will also be sent.
+:::
+
+If `vp_token` wasn't in the SIOPv2 Response, the Issuer will respond with a `credential_offer` and a `url` that points to a webpage (IDV form) for the customer to provide their Personally Identifiable Information. After successful completion of this form, the Wallet can proceed with the next steps, [processing the Credential Offer](#processing-the-credential-offer).
+
+![IDV Form](/img/pii-form.gif)
+
+> IDV Form being filled out
+
+## Processing the Credential Offer
+
+After successful completion of the Identity Verification - whether via form or the necessary VCs - your Wallet application will then begin processing the `credential_offer` from the Issuer. Here's an example of a `credential_offer`:
+
+```javascript
+// Issuer.js
+
+{
+ "credential_issuer": "https://issuer.example.com",
+ "credential_configuration_ids": [
+ "knownCustomerCredential-basic",
+ "knownCustomerCredential-extended"
+ ],
+ "grants": {
+ "urn:ietf:params:oauth:grant-type:pre-authorized_code": "abc123xyz"
+ }
+}
+```
+
+The `credential_offer` object contains vital information about the Issuer:
+
+- **`credential_issuer`**: The base URL address of the Issuer's service. It is used by the Wallet to retrieve the Issuer's Metadata and the Issuer's Authorization Server Metadata.
+- **`credential_configuration_ids`**: Unique strings that identify the credential you are offering. The Wallet can use these to request metadata.
+- **`grants`**: Contains grant types the Issuer will accept for this credential offer.
+- **`urn:ietf:params:oauth:grant-type:pre-authorized_code`**: Grant type required for the [OpenID for Verifiable Credential Issuance (OID4VCI)](https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html#appendix-B.1) Pre-Authorization flow.
+- **`pre-authorized_code`**: The code representing the Credential Issuer's authorization for the Wallet to obtain an access token.
+
+### 1. Extract Credential Offer
+
+Extract and store the `credential_issuer` URL and `pre_authorized_code` from the credential offer:
+
+
+
+:::info
+The `credential_issuer` URL is crucial for the next steps, as it will be used to construct the URLs for fetching the Issuer's Metadata and the Issuer's Authorization Server Metadata.
+:::
+
+### 2. Get Issuer's Metadata
+
+Fetch the Issuer's Metadata from the `credential_issuers` URL
+
+To construct the URL to fetch the Issuer's Metadata, the Wallet needs to append `/.well-known/openid-credential-issuer` to the `credential_issuer` URL provided in the `credential_offer`:
+
+
+
+The Issuer's Metadata includes information about the Issuer's capabilities, credential endpoint, supported credential configurations, and more. Some of the key information included is:
+
+- `credential_issuer`: The base URL address of the Issuer's service. It is used by the Wallet to retrieve the Issuer's Metadata and the Issuer's Authorization Server Metadata.
+- `credential_endpoint`: The endpoint the Wallet will use to submit requests to issue credentials. After obtaining an access token, the Wallet sends a credential request to this endpoint.
+- `credential_configurations_supported`: Defines the format `jwt_vc_json`, and the credential, including informative display markup.
+
+Here is an example of an Issuer's Metadata:
+
+
+Issuer's Metadata
+
+```javascript
+// Issuer.js
+
+{
+ "credential_issuer": "https://issuer.example.com",
+ "credential_endpoint": "https://issuer.example.com/credentials",
+ "credential_configurations_supported": {
+ "KnownCustomerCredential": {
+ "format": "jwt_vc_json",
+ "scope": "CustomerIdentity",
+ "cryptographic_binding_methods_supported": ["did:example"],
+ "credential_signing_alg_values_supported": ["EdDSA", "ES256K"],
+ "credential_definition": {
+ "type": ["VerifiableCredential", "KnownCustomerCredential"],
+ "credentialSubject": {
+ "country": {
+ "display": [
+ {
+ "name": "Country",
+ "locale": "en-US"
+ }
+ ]
+ }
+ }
+ },
+ "proof_types_supported": {
+ "jwt": {
+ "proof_signing_alg_values_supported": ["EdDSA", "ES256K"]
+ }
+ },
+ "display": [
+ {
+ "name": "Known Customer Credential",
+ "locale": "en-US",
+ "logo": {
+ "url": "https://issuer.example.com/public/logo.png",
+ "alt_text": "Issuer Logo"
+ },
+ "background_color": "#FFFFFF",
+ "text_color": "#000000"
+ }
+ ]
+ }
+ }
+}
+
+```
+
+
+
+### 3. Get Authorization Server's Metadata
+
+Fetch the Authorization Server's Metadata
+
+Before the Wallet can request a KCC from the Issuer, the Wallet needs to also fetch the Issuer's Authorization Server Metadata by appending `/.well-known/oauth-authorization-server` to the `credential_issuer` URL in `handleIssuerResponse()`:
+
+
+
+The Server Authorization Metadata can look like this:
+
+
+Server Authorization Metadata
+
+```javascript
+// Issuer.js
+
+{
+ "issuer": "https://issuer.example.com", // URL of the Credential Issuer
+ "token_endpoint": "https://issuer.example.com/token", // URL for the Access Token Request
+};
+```
+
+
+
+- `issuer`: The base URL of the Issuer's service.
+- `token_endpoint`: The endpoint where the Wallet can exchange the `pre_authorization_code` receieved in the `credential_offer` for an access token.
+
+### 4. Get Access Token
+
+Fetch the Access Token from the Issuer's `/token` endpoint:
+
+
+
+:::info
+If the IDV process is incomplete, the Issuer will return an `authorization_pending` error. In this case, the Wallet should wait for a short period before attempting another request to the Issuer's `/token` endpoint. This will allow time for the IDV process to be completed. The Wallet should continue these periodic attempts until an `access_token` is successfully received, indicating that the IDV process has concluded and authorization has been granted.
+:::
+
+Here's an example Access Token Response from the Issuer:
+
+
+Access Token Response
+```javascript
+// Issuer.js
+
+{
+"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkaWQ6ZXhhbXBsZTpPcTJ4T0J4NVVjIiwiaXNzIjoiZGlkOmV4YW1wbGU6SXNzdWVyRGlkIiwiaWF0IjoxNjE1MjM5MDIyLCJleHAiOjE2MTUzMjU0MjIsImNfbm9uY2UiOiJzYW1wbGVjbm9uY2UifQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
+"token_type": "bearer",
+"expires_in": 86400,
+"c_nonce": "adQssw5c",
+"c_nonce_expires_in": 86400
+}
+
+````
+
+
+## Request Known Customer Credential
+
+After receiving the `access_token` from the Issuer, the Wallet can now send a KCC request to the `credential_endpoint` that was in the Issuer's Metadata.
+
+### Send Request to Issuer's Credential Endpoint
+
+Sign and Send an HTTP POST request to the Issuer's credential endpoint:
+
+
+
+:::info
+To learn more about the **fields** within the `payload` and `header`, please refer to [OpenID's specs](https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html#section-7.2.1.1-2.1.1).
+
+The Known Customer Credential will be a signed VC [JSON Web Token](https://www.w3.org/TR/vc-data-model/#json-web-token) for secure transmission.
+:::
+
+## Example Known Customer Credential
+
+To convert the signed VC JWT into a `VerifiableCredential` object you can use the [`parseJwt()` method](/docs/web5/verifiable-credentials/jwt-to-vc#decoding-jwt). Here is what a decoded **Known Customer Credential** would look like:
+
+
+
+
+
+```javascript
+{
+ "vcDataModel": {
+ "@context": ["https://www.w3.org/2018/credentials/v1"],
+ "type": ["VerifiableCredential"],
+ "id": "urn:uuid:12345678-1234-5678-1234-567812345678",
+ "issuer": "did:dht:z6Mkn4w6nSaWe4fjNJRvaHZwFnMm5VexvjzDeozEu2G7jC34",
+ "issuanceDate": "2024-01-01T19:23:24Z",
+ "expirationDate": "2026-05-19T08:02:04Z",
+ "credentialSchema": {
+ id: "https://vc.schemas.host/kcc.schema.json",
+ type: "JsonSchema"
+ },
+ "evidence": [
+ {
+ kind: "document_verification",
+ checks: ["passport", "utility_bill"]
+ },
+ {
+ kind: "sanction_screening",
+ checks: ["PEP"]
+ }
+ ],
+ "credentialSubject": {
+ "id": "did:dht:z6MkjGSeekPGE9QfczHWyW8v2ZzJU68kqSHzV7L2dmQyuyDu",
+ "countryOfResidence": "US",
+ "tier": "Gold",
+ "jurisdiction": {
+ "country": "US"
+ }
+ }
+ }
+}
+````
+
+
+
+
+
+
+
+
+```javascript
+{
+ "@context": ["https://www.w3.org/2018/credentials/v1"],
+ "type": ["VerifiableCredential"],
+ "id": "urn:uuid:12345678-1234-5678-1234-567812345678",
+ "issuer": "did:dht:z6Mkn4w6nSaWe4fjNJRvaHZwFnMm5VexvjzDeozEu2G7jC34",
+ "issuanceDate": "2024-01-01T19:23:24Z",
+ "expirationDate": "2026-05-19T08:02:04Z",
+ "credentialSchema": {
+ id: "https://vc.schemas.host/kcc.schema.json",
+ type: "JsonSchema"
+ },
+ "evidence": [
+ {
+ kind: "document_verification",
+ checks: ["passport", "utility_bill"]
+ },
+ {
+ kind: "sanction_screening",
+ checks: ["PEP"]
+ }
+ ],
+ "credentialSubject": {
+ "id": "did:dht:z6MkjGSeekPGE9QfczHWyW8v2ZzJU68kqSHzV7L2dmQyuyDu",
+ "countryOfResidence": "US",
+ "tier": "Gold",
+ "jurisdiction": {
+ "country": "US"
+ }
+ }
+}
+```
+
+
+
+
+
+
+
+
+```javascript
+{
+ "@context": ["https://www.w3.org/2018/credentials/v1"],
+ "type": ["VerifiableCredential"],
+ "id": "urn:uuid:12345678-1234-5678-1234-567812345678",
+ "issuer": "did:dht:z6Mkn4w6nSaWe4fjNJRvaHZwFnMm5VexvjzDeozEu2G7jC34",
+ "issuanceDate": "2024-01-01T19:23:24Z",
+ "expirationDate": "2026-05-19T08:02:04Z",
+ "credentialSchema": {
+ id: "https://vc.schemas.host/kcc.schema.json",
+ type: "JsonSchema"
+ },
+ "evidence": [
+ {
+ kind: "document_verification",
+ checks: ["passport", "utility_bill"]
+ },
+ {
+ kind: "sanction_screening",
+ checks: ["PEP"]
+ }
+ ],
+ "credentialSubject": {
+ "id": "did:dht:z6MkjGSeekPGE9QfczHWyW8v2ZzJU68kqSHzV7L2dmQyuyDu",
+ "countryOfResidence": "US",
+ "tier": "Gold",
+ "jurisdiction": {
+ "country": "US"
+ }
+ }
+}
+```
+
+
+
+
+
+
+To the user, an example KCC may look like this:
+
+![example KCC](/img/aliceKcc.png)
+
+With that, you've successfully gone through the Identity Verification flow, requested a Known Customer Credential on behalf of the user, and securely stored the user's Known Customer Credential. Please note that this example is a foundational implementation. For a production environment, it's crucial to enhance this basic setup with comprehensive error handling, secure storage and security measures.
+
+## Next Steps
+
+For an example of the complete flow for requesting and issuing a KCC, check out the [Known Customer Credential Exemplar](https://github.com/TBD54566975/kcc-prototype-exemplar) on GitHub. This exemplar provides a implementation of requesting and issuing a Known Customer Credential (KCC).
diff --git a/site/code-snippets/api/web5-js/dwn/protocol.js b/site/code-snippets/api/web5-js/dwn/protocol.js
new file mode 100644
index 0000000..007cd2e
--- /dev/null
+++ b/site/code-snippets/api/web5-js/dwn/protocol.js
@@ -0,0 +1,48 @@
+export async function getProtocolDefinition(web5, protocolDefinition) {
+ const { protocol } = await web5.dwn.protocols.configure({
+ message: {
+ definition: protocolDefinition
+ }
+ });
+
+ //highlight-start
+ const definition = protocol.definition;
+ //highlight-end
+
+ return definition;
+}
+
+export async function configureProtocolAndSend(
+ web5,
+ myDid,
+ protocolDefinition,
+) {
+ const { protocol } = await web5.dwn.protocols.configure({
+ message: {
+ definition: protocolDefinition
+ }
+ });
+
+
+ //highlight-start
+ const {status} = await protocol.send(myDid);
+ //highlight-end
+
+ return status;
+}
+
+export async function queryProtocol(web5) {
+ const { protocols } = await web5.dwn.protocols.query({
+ message: {
+ filter: {
+ protocol: 'http://social-media.xyz'
+ }
+ }
+ });
+
+ //highlight-start
+ const protocolConfig = protocols[0].toJSON();
+ //highlight-end
+
+ return protocolConfig;
+}
diff --git a/site/code-snippets/api/web5-js/dwn/protocols.js b/site/code-snippets/api/web5-js/dwn/protocols.js
new file mode 100644
index 0000000..db513c1
--- /dev/null
+++ b/site/code-snippets/api/web5-js/dwn/protocols.js
@@ -0,0 +1,106 @@
+export async function configureProtocolWithDefinition(web5, myDid) {
+ const { protocol, status } = await web5.dwn.protocols.configure({
+ message: {
+ definition: {
+ "protocol": "https://photos.org/protocol",
+ "published": false,
+ "types": {
+ "album": {
+ "schema": "https://photos.org/protocol/album",
+ "dataFormats": ["application/json"]
+ },
+ "photo": {
+ "schema": "https://photos.org/protocols/photo",
+ "dataFormats": ["application/json"]
+ },
+ "binaryImage": {
+ "dataFormats": ["image/png", "jpeg", "gif"]
+ },
+ "comment": {
+ "schema": "https://photos.org/protocols/comment",
+ "dataFormats": ["application/json"]
+ }
+ },
+ "structure": {
+ "album": {
+ "$actions": [
+ { "who": "author", "of": "album", "can": ["create"] }
+ ]
+ },
+ "photo": {
+ "$actions": [
+ { "who": "recipient", "of": "photo", "can": ["read"] }
+ ],
+ "binaryImage": {
+ "$actions": [
+ { "who": "author", "of": "photo", "can": ["create"] }
+ ]
+ },
+ "comment": {
+ "$actions": [
+ { "who": "anyone", "can": ["create", "read"] },
+ { "who": "author", "of": "comment", "can": ["delete"] },
+ { "who": "recipient", "of": "comment", "can": ["delete"] },
+ { "who": "author", "of": "comment", "can": ["update"] }
+ ]
+ }
+ }
+ }
+ }
+ },
+ });
+
+ return { protocol, status };
+}
+
+export async function queryMusicProtocol(web5) {
+ const { protocols, status } = await web5.dwn.protocols.query({
+ message: {
+ filter: {
+ protocol: 'https://music.org/protocol',
+ },
+ },
+ });
+
+ // logs an array of protocol configurations installed on the user's DWN
+ console.log(protocols);
+
+ return { protocols, status };
+}
+
+export async function queryProtocolDescending(web5) {
+ // Sorting protocols by dateCreated in descending order
+
+ const { protocols, status } = await web5.dwn.protocols.query({
+ message: {
+ filter: {
+ protocol: 'http://social-media.xyz',
+ },
+ //highlight-start
+ dateSort: 'createdDescending',
+ //highlight-end
+ },
+ });
+
+ return { protocols, status };
+}
+
+export async function queryProtocolsFromDid(web5, bobDid) {
+ //Query protocol on someone else's DWN
+
+ const { protocols } = await web5.dwn.protocols.query({
+ //highlight-start
+ from: bobDid,
+ //highlight-end
+ message: {
+ filter: {
+ protocol: 'https://music.org/protocol',
+ },
+ },
+ });
+
+ // logs an array of protocol configurations installed on Bob's DWN
+ console.log(protocols);
+
+ return { protocols };
+}
diff --git a/site/code-snippets/api/web5-js/dwn/record.js b/site/code-snippets/api/web5-js/dwn/record.js
new file mode 100644
index 0000000..5032dda
--- /dev/null
+++ b/site/code-snippets/api/web5-js/dwn/record.js
@@ -0,0 +1,48 @@
+export async function createRecordWithHighlight(web5, myDid) {
+ const { record } = await web5.dwn.records.create({
+ data: 'Hello World!',
+ message: {
+ dataFormat: 'text/plain',
+ },
+ });
+
+ //highlight-start
+ const { status } = await record.send(myDid);
+ //highlight-end
+
+ return record;
+}
+
+export async function createRecord(web5, myDid) {
+ const { record } = await web5.dwn.records.create({
+ data: 'Hello World!',
+ message: {
+ dataFormat: 'text/plain',
+ },
+ });
+
+ const { status } = await record.send(myDid);
+
+ return record;
+}
+
+export async function readRecord(textRecord) {
+ const recordText = await textRecord.data.text();
+ return recordText;
+}
+
+export async function deleteRecord(web5, did, recordId) {
+ const response = await web5.dwn.records.delete({
+ from: did,
+ message: {
+ recordId: recordId
+ },
+ });
+
+ return response;
+}
+
+export async function updateRecord(record) {
+ const response = await record.update({ data: "Hello', I'm updated" });
+ return response;
+}
diff --git a/site/code-snippets/api/web5-js/index.js b/site/code-snippets/api/web5-js/index.js
new file mode 100644
index 0000000..6099a1b
--- /dev/null
+++ b/site/code-snippets/api/web5-js/index.js
@@ -0,0 +1,44 @@
+import { Web5 } from '@web5/api';
+
+let identityAgent = null;
+
+export async function connectWithDWNEndpoint() {
+ const { web5, did } = await Web5.connect({
+ techPreview: {
+ dwnEndpoints: ['https://dwn.your-domain.org/'],
+ },
+ });
+ return did;
+}
+
+export async function connectToCommunityNode(){
+ const {web5, did} = await Web5.connect({
+ didCreateOptions: {
+ dwnEndpoints: ['https://dwn.gcda.xyz'], // User provides google's community DWN instance
+ },
+ registration: {
+ onSuccess: () => {
+ // Registration succeeded, set a local storage value to indicate the user is registered and registration does not need to occur again.
+ },
+ onFailure: (error) => {
+ // Registration failed, display an error message to the user, and pass in the registration object again to retry next time the user connects.
+ },
+ },
+ })
+ return did
+}
+
+export async function connectWithAgentAndConnectedDid(existingDid) {
+ const { web5, did } = await Web5.connect({
+ agent: identityAgent,
+ connectedDid: existingDid,
+ });
+ return did;
+}
+
+export async function connectWithSyncConfig() {
+ const { web5, did } = await Web5.connect({
+ sync: '5s',
+ });
+ return did;
+}
diff --git a/site/code-snippets/blog/2023-05-23-dwas-vs-pwas.js b/site/code-snippets/blog/2023-05-23-dwas-vs-pwas.js
new file mode 100644
index 0000000..555ab76
--- /dev/null
+++ b/site/code-snippets/blog/2023-05-23-dwas-vs-pwas.js
@@ -0,0 +1,14 @@
+export async function createRecordWithTodoItem(
+ web5,
+ myDid,
+ todoItem = 'Some todo item',
+) {
+ const myRecord = await web5.dwn.records.create(myDid.id, {
+ data: 'todoItem',
+ message: {
+ dataFormat: 'text/plain',
+ },
+ });
+
+ return myRecord;
+}
diff --git a/site/code-snippets/tbdex/pfi-quickstart.js b/site/code-snippets/tbdex/pfi-quickstart.js
new file mode 100644
index 0000000..86df191
--- /dev/null
+++ b/site/code-snippets/tbdex/pfi-quickstart.js
@@ -0,0 +1,249 @@
+import { Quote, Offering, OrderStatus, Close, Rfq } from '@tbdex/http-client';
+import { DidDht } from '@web5/dids';
+import { VerifiableCredential } from '@web5/credentials'
+
+let context = {};
+
+export async function pfiQuickstartGetDid() {
+ context.pfiDid = await DidDht.create({
+ options:{
+ services: [{
+ id: 'pfi',
+ type: 'PFI',
+ serviceEndpoint: 'https://pfiexemplar.tbddev.org/'
+ }]
+ }
+ });
+
+ context.issuerDid = await DidDht.create();
+ context.customerDid = "did:dht:h8e3yqnhgjwhtkjhxwhfy5mmkn4nebqxr8idguwrsxgef6ow8efo";
+
+ return context.pfiDid.uri;
+}
+
+export async function pfiQuickstartAddOffering() {
+ context.offering = Offering.create({
+ metadata: { from: context.pfiDid.uri },
+ data: {
+ description: 'Exchange USD to KES',
+ payoutUnitsPerPayinUnit: '0.0069', // ex. we send 100 dollars, so that means 14550.00 KES
+ payin: {
+ currencyCode: 'USD',
+ methods: [
+ {
+ kind: 'USD_LEDGER',
+ requiredPaymentDetails: {},
+ },
+ ],
+ },
+ payout: {
+ currencyCode: 'KES',
+ methods: [
+ {
+ kind: 'MOMO_MPESA',
+ requiredPaymentDetails: {
+ $schema: 'http://json-schema.org/draft-07/schema#',
+ title: 'Mobile Money Required Payment Details',
+ type: 'object',
+ required: ['phoneNumber', 'reason'],
+ additionalProperties: false,
+ properties: {
+ phoneNumber: {
+ title: 'Mobile money phone number',
+ description: 'Phone number',
+ type: 'string',
+ },
+ reason: {
+ title: 'Reason for sending',
+ description:
+ 'Required for legal reasons',
+ type: 'string',
+ },
+ },
+ },
+ estimatedSettlementTime: 10
+ },
+ {
+ kind: 'BANK_FIRSTBANK',
+ requiredPaymentDetails: {
+ $schema: 'http://json-schema.org/draft-07/schema#',
+ title: 'Bank Transfer Required Payment Details',
+ type: 'object',
+ required: ['accountNumber', 'reason'],
+ additionalProperties: false,
+ properties: {
+ accountNumber: {
+ title: 'Bank account number',
+ description: 'Recepient bank account',
+ type: 'string',
+ },
+ reason: {
+ title: 'Reason for sending',
+ description:
+ 'Required for legal reasons',
+ type: 'string',
+ },
+ },
+ },
+ estimatedSettlementTime: 10
+ },
+ ],
+ },
+ requiredClaims: {
+ id: '7ce4004c-3c38-4853-968b-e411bafcd945',
+ input_descriptors: [
+ {
+ id: 'bbdb9b7c-5754-4f46-b63b-590bada959e0',
+ constraints: {
+ fields: [
+ {
+ path: ['$.type[*]'],
+ filter: {
+ type: 'string',
+ pattern: '^SanctionCredential$',
+ },
+ },
+ {
+ path: ['$.issuer'],
+ filter: {
+ type: 'string',
+ const: context.issuerDid.uri
+ }
+ }
+ ],
+ },
+ },
+ ],
+ },
+ },
+ })
+ const createdOffering = context.offering;
+
+ await context.offering.sign(context.issuerDid);
+
+ return [createdOffering];
+}
+
+export async function pfiQuickstartGetOfferings() {
+ await pfiQuickstartAddOffering();
+ return [context.offering];
+}
+
+export async function pfiQuickstartGetExchanges() {
+
+ const vc = await VerifiableCredential.create({
+ type : 'SanctionCredential',
+ issuer : context.issuerDid.uri,
+ subject : context.customerDid,
+ data : {
+ 'beep': 'boop'
+ }
+ });
+
+ const vcJwt = await vc.sign({ did: context.issuerDid});
+
+ let rfq = Rfq.create({
+ metadata: {
+ to: context.pfiDid.uri, // PFI's DID
+ from: context.customerDid, // Customer DID
+ protocol: '1.0' // Version of tbDEX protocol you're using
+ },
+ data: {
+ offeringId: context.offering.metadata.id, // The ID of the selected offering
+ payin: {
+ kind: 'USD_LEDGER', // The method of payment
+ amount: '500.65', // The amount of the payin currency
+ paymentDetails: {
+ cardNumber: '1234567890123456',
+ expiryDate: '05/25',
+ cardHolderName: 'Alice Doe',
+ cvv: '123'
+ }
+ },
+ payout: {
+ kind: 'MOMO_MPESA', // The method for receiving payout
+ paymentDetails: {
+ phoneNumber: '123-456-7890', // Details to execute payment
+ reason: "Payment for services rendered"
+ }
+ },
+ claims: vcJwt // Array of signed VCs required by the PFI
+ }
+ });
+
+ await rfq.sign(context.pfiDid);
+
+ return [rfq];
+}
+
+export async function pfiQuickstartGetQuote() {
+ // Set the Quote's expiration date for 1 day from now
+ var quoteExpiration = new Date();
+ quoteExpiration.setDate(quoteExpiration.getDate() + 1);
+
+ const quote = Quote.create({
+ metadata: {
+ from: context.pfiDid.uri,
+ to: context.customerDid,
+ exchangeId: "rfq_01j1xmd1v5eybr00ta4xevpvrj",
+ protocol: '1.0'
+ },
+ data: {
+ expiresAt: quoteExpiration.toLocaleDateString('en-us'),
+ payin: {
+ currencyCode: context.offering.data.payin.currencyCode,
+ amount: '0.01',
+ fee: '0.0001',
+ paymentInstruction : {
+ link: 'https://example.com/paymentInstructions',
+ instruction: 'Detailed payment instructions'
+ }
+ },
+ payout: {
+ currencyCode: context.offering.data.payout.currencyCode,
+ amount: '1000.00',
+ paymentInstruction : {
+ link: 'https://example.com/paymentInstructions',
+ instruction: 'Detailed payout instructions'
+ }
+ }
+ }
+ });
+
+ await quote.sign(context.pfiDid);
+
+ return quote;
+}
+
+export async function pfiQuickstartGetOrderStatus() {
+ const orderStatus = OrderStatus.create({
+ metadata: {
+ from: context.pfiDid.uri,
+ to: context.customerDid,
+ exchangeId: "rfq_01j1xmd1v5eybr00ta4xevpvrj"
+ },
+ data: { orderStatus: 'PROCESSING' }
+ })
+
+ await orderStatus.sign(context.pfiDid)
+
+ return orderStatus;
+}
+
+export async function pfiQuickstartGetClose() {
+ const closeMessage = Close.create({
+ metadata: {
+ from: context.pfiDid.uri,
+ to: context.customerDid,
+ exchangeId: "rfq_01j1xmd1v5eybr00ta4xevpvrj"
+ },
+ data: {
+ reason: 'COMPLETED',
+ success: true // Indicates the transaction was successful
+ }
+ })
+
+ await closeMessage.sign(context.pfiDid)
+
+ return closeMessage;
+}
diff --git a/site/code-snippets/tbdex/wallet-quickstart.js b/site/code-snippets/tbdex/wallet-quickstart.js
new file mode 100644
index 0000000..a1fede7
--- /dev/null
+++ b/site/code-snippets/tbdex/wallet-quickstart.js
@@ -0,0 +1,183 @@
+import { TbdexHttpClient, Rfq, Quote, Order, Close } from '@tbdex/http-client';
+import { PresentationExchange } from '@web5/credentials';
+import { DidDht } from '@web5/dids';
+import { VerifiableCredential } from '@web5/credentials'
+
+let context = {};
+
+export async function quickstartDidCreate() {
+ context.pfiDid = 'did:dht:3fkz5ssfxbriwks3iy5nwys3q5kyx64ettp9wfn1yfekfkiguj1y';
+ let customerDidString = '{"uri":"did:dht:h8e3yqnhgjwhtkjhxwhfy5mmkn4nebqxr8idguwrsxgef6ow8efo","document":{"id":"did:dht:h8e3yqnhgjwhtkjhxwhfy5mmkn4nebqxr8idguwrsxgef6ow8efo","verificationMethod":[{"id":"did:dht:h8e3yqnhgjwhtkjhxwhfy5mmkn4nebqxr8idguwrsxgef6ow8efo#0","type":"JsonWebKey","controller":"did:dht:h8e3yqnhgjwhtkjhxwhfy5mmkn4nebqxr8idguwrsxgef6ow8efo","publicKeyJwk":{"crv":"Ed25519","kty":"OKP","x":"4dGQOFwyacipPH04UG1rULQkBc8h6jNOhLPMgvoUOgs","kid":"XPokllC3LZAVGizIL0naDdByQHeyY12uLJaXO4j46Nw","alg":"EdDSA"}}],"authentication":["did:dht:h8e3yqnhgjwhtkjhxwhfy5mmkn4nebqxr8idguwrsxgef6ow8efo#0"],"assertionMethod":["did:dht:h8e3yqnhgjwhtkjhxwhfy5mmkn4nebqxr8idguwrsxgef6ow8efo#0"],"capabilityDelegation":["did:dht:h8e3yqnhgjwhtkjhxwhfy5mmkn4nebqxr8idguwrsxgef6ow8efo#0"],"capabilityInvocation":["did:dht:h8e3yqnhgjwhtkjhxwhfy5mmkn4nebqxr8idguwrsxgef6ow8efo#0"]},"metadata":{"published":true,"versionId":"1718740086"},"privateKeys":[{"crv":"Ed25519","d":"iTfn3Z8uPp3gTg-9LxQVZVODGqnP3M0UDjZiIwBEctc","kty":"OKP","x":"4dGQOFwyacipPH04UG1rULQkBc8h6jNOhLPMgvoUOgs","kid":"XPokllC3LZAVGizIL0naDdByQHeyY12uLJaXO4j46Nw","alg":"EdDSA"}]}'
+ const portableDid = JSON.parse(customerDidString);
+ context.customerDid = await DidDht.import({ portableDid });
+
+ return context.customerDid.uri;
+}
+
+export async function quickstartGetOfferings() {
+ try {
+ const offerings = await TbdexHttpClient.getOfferings({ pfiDid: context.pfiDid });
+
+ if (offerings) {
+ context.selectedOffering = offerings.find(
+ (offering) =>
+ offering.data.payin.currencyCode === 'USD' &&
+ offering.data.payout.currencyCode === 'KES'
+ );
+ }
+
+ } catch (e) {
+ console.log(e.message);
+ }
+
+ return context.selectedOffering;
+}
+
+export async function quickstartApplyForCredential() {
+ const vcJwt = await fetch(`https://mock-idv.tbddev.org/kcc?name=alice&country=US&did=${context.customerDid.uri}`).then(res => res.text());
+
+ context.credentials = [vcJwt];
+
+ return context.credentials;
+}
+
+export async function quickstartGetCredentials() {
+ let customerCredentials = context.credentials;
+
+ const selectedCredentials = PresentationExchange.selectCredentials({
+ vcJwts: customerCredentials,
+ presentationDefinition: context.selectedOffering.data.requiredClaims,
+ });
+
+ context.credentials = selectedCredentials;
+
+ return context.credentials;
+}
+
+export async function quickstartCreateRfq() {
+ context.rfq = Rfq.create({
+ metadata: {
+ to: context.pfiDid, // PFI's DID
+ from: context.customerDid.uri, // Customer DID
+ protocol: '1.0', // Version of tbDEX protocol you're using
+ },
+ data: {
+ offeringId: context.selectedOffering.metadata.id, // The ID of the selected offering
+ payin: {
+ kind: 'USD_BANK_TRANSFER', // The method of payment
+ amount: '500.65', // The amount of the payin currency
+ paymentDetails: {
+ accountNumber: '1234567890',
+ routingNumber: '123456789',
+ },
+ },
+ payout: {
+ kind: 'KES_BANK_TRANSFER', // The method for receiving payout
+ paymentDetails: {
+ accountNumber: '3245231234', // Details required to execute payment
+ },
+ },
+ claims: context.credentials, // Array of signed VCs required by the PFI
+ },
+ });
+ return context.rfq;
+}
+
+export async function quickstartSendRfq() {
+ try {
+ context.rfq.verifyOfferingRequirements(context.selectedOffering);
+ await context.rfq.sign(context.customerDid);
+ await TbdexHttpClient.createExchange(context.rfq);
+
+ return "Submitted RFQ";
+
+ } catch (e) {
+ throw e;
+ }
+
+}
+
+export async function quickstartProcessQuote() {
+ context.exchangeId = context.rfq.exchangeId;
+ while (!context.quote) {
+ try {
+ const exchange = await TbdexHttpClient.getExchange({
+ pfiDid: context.pfiDid,
+ did: context.customerDid,
+ exchangeId: context.exchangeId
+ });
+
+ context.quote = exchange.find(msg => msg instanceof Quote);
+
+ if (!context.quote) {
+ // Make sure the exchange is still open
+ context.close = exchange.find(msg => msg instanceof Close);
+
+ if(context.close) { break; }
+ else {
+ // Wait 2 seconds before making another request
+ await new Promise(resolve => setTimeout(resolve, 2000));
+ }
+ }
+ } catch (e) {
+ if (e.statusCode === 404 || e.statusCode === 401) {
+ //waiting on RFQ to be processed
+ }
+ else throw e;
+ }
+ }
+
+ return context.quote;
+}
+
+export async function quickstartCreateOrder() {
+ context.order = Order.create({
+ metadata: {
+ from: context.customerDid.uri, // Customer's DID
+ to: context.pfiDid, // PFI's DID
+ exchangeId: context.exchangeId, // Exchange ID from the Quote
+ protocol: "1.0" // Version of tbDEX protocol you're using
+ }
+ });
+
+ return context.order;
+}
+
+export async function quickstartSendOrder() {
+ try{
+ await context.order.sign(context.customerDid);
+ await TbdexHttpClient.submitOrder(context.order);
+
+ return "Submitted Order";
+ } catch (e) {
+ throw e;
+ }
+}
+
+export async function quickstartProcessClose() {
+ let close = null;
+ while (!close) {
+ try {
+ const exchange = await TbdexHttpClient.getExchange({
+ pfiDid: context.pfiDid,
+ did: context.customerDid,
+ exchangeId: context.exchangeId
+ })
+
+ for (const message of exchange) {
+ if (message instanceof Close) {
+ close = message
+ }
+ }
+ } catch (e) {
+ if (e.statusCode === 404 || e.statusCode === 401) {
+ //waiting on RFQ to be processed
+ }
+ else throw e;
+ }
+ }
+
+ context.reasonForClose = close.data.reason;
+
+ return context.reasonForClose;
+}
diff --git a/site/code-snippets/web5/quickstart.js b/site/code-snippets/web5/quickstart.js
new file mode 100644
index 0000000..91b6671
--- /dev/null
+++ b/site/code-snippets/web5/quickstart.js
@@ -0,0 +1,100 @@
+import { Web5 } from '@web5/api';
+import { VerifiableCredential } from '@web5/credentials'
+
+let context = {};
+
+export async function didCreate() {
+ const { web5, did: aliceDid } = await Web5.connect();
+ context.web5 = web5;
+ return { web5, did: aliceDid };
+}
+
+export const executeDidCreate = async () => {
+ const result = await didCreate();
+ context.did = result.did;
+ return result.did;
+};
+
+export async function executeGetBearerDid() {
+ const { did: bearerDid } = await context.web5.agent.identity.get({ didUri: context.did });
+ context.bearerDid = bearerDid;
+ return bearerDid;
+}
+
+export async function executeCreateVc(name) {
+ const vc = await VerifiableCredential.create({
+ type: 'Web5QuickstartCompletionCredential',
+ issuer: context.did,
+ subject: context.did,
+ data: {
+ name: name,
+ completionDate: new Date().toISOString(),
+ expertiseLevel: 'Beginner',
+ },
+ });
+ context.vc = vc;
+ return vc;
+}
+
+export async function executeSignVc() {
+ const signedVc = await context.vc.sign({ did: context.bearerDid })
+ context.signedJwt = signedVc;
+ return signedVc
+}
+
+export async function executeWriteVcToDwn() {
+ const { record } = await context.web5.dwn.records.create({
+ data: context.signedJwt,
+ message: {
+ schema: 'Web5QuickstartCompletionCredential',
+ dataFormat: 'application/json',
+ published: true
+ },
+ });
+ context.record = record
+ return record
+}
+
+export async function executeReadVcFromDwn() {
+ return await context.record.data.text()
+}
+
+export async function executeParseVc() {
+ return await VerifiableCredential.parseJwt({ vcJwt: context.signedJwt })
+}
+
+
+export async function createTextRecord(web5) {
+ const { record } = await web5.dwn.records.create({
+ data: 'Hello, Web5!',
+ message: {
+ dataFormat: 'text/plain',
+ },
+ });
+
+ return { record };
+}
+
+export async function readTextRecord(record) {
+ const readResult = await record.data.text();
+
+ return readResult;
+}
+
+export async function updateTextRecord(record) {
+ const updateResult = await record.update({
+ data: 'Hello, Web5! I am updated.',
+ });
+
+ return updateResult;
+}
+
+export async function deleteTextRecord(web5, did, record) {
+ const deleteResult = await web5.dwn.records.delete({
+ message: {
+ recordId: record.id,
+ },
+ });
+
+ return deleteResult;
+}
diff --git a/site/docs/api.mdx b/site/docs/api.mdx
new file mode 100644
index 0000000..1177a00
--- /dev/null
+++ b/site/docs/api.mdx
@@ -0,0 +1,33 @@
+# API Reference Guides
+
+import ApiCard from '@site/src/components/ApiCard';
+
+
diff --git a/site/docs/docs-index.js b/site/docs/docs-index.js
new file mode 100644
index 0000000..26eb2bb
--- /dev/null
+++ b/site/docs/docs-index.js
@@ -0,0 +1,91 @@
+import React from 'react';
+import HeroCard from '@site/src/components/HeroCard';
+import ExploreCard from '../src/components/ExploreCard';
+import Community from '../src/components/Community';
+import Head from '@docusaurus/Head';
+
+function DocsIndex() {
+ return (
+
+
+
+
+
+ Give your customers control of their identity, data, and finances.
+
+
+ Our toolkits bring decentralized identity, messaging, and data storage
+ to your applications. They let developers focus on creating delightful
+ user experiences, while returning ownership to individuals.
+
+
+
+
+
+
+
+
+
Learn More
+
+ Learn more about the components that enable decentralized applications.
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default DocsIndex;
diff --git a/site/docs/glossary.md b/site/docs/glossary.md
new file mode 100644
index 0000000..075bc20
--- /dev/null
+++ b/site/docs/glossary.md
@@ -0,0 +1,73 @@
+# Glossary
+
+## Agent
+
+An agent is software that acts on behalf of a user to manage identity, public or private data, and interactions with other apps in a decentralized network. Agents hold a user's [DIDs](#decentralized-identifier-did), private keys, and a [DWN](#decentralized-web-node-dwn), and are permissioned to use the private keys of DIDs to act on a user's behalf to sign and store messages within a DWN.
+
+[\<\< More on Agents \>\>](/)
+
+## Bearer DID
+
+A Bearer DID is a composite type that combines a [DID](#decentralized-identifier-did), its associated [DID Document](#did-document), and a [Key Manager](/) containing the DID's cryptographic keys. It provides methods for signing data, verifying signatures, and managing the DID's associated keys.
+
+## Centralized Authority
+
+A single entity or organization that has control over the network and its operations, potentially posing a risk to the principles of decentralization and autonomy.
+
+## Decentralized Identifier (DID)
+
+A Decentralized Identifier (DID) is a globally unique identifier that enables verifiable, decentralized digital identity, without the need for centralized intermediaries. DIDs are typically implemented using decentralized and distributed ledger technologies, such as blockchain, and provide a way to verify and authenticate digital identities, while ensuring privacy and control over personal data.
+
+[\<\< More on DIDs \>\>](/)
+
+## Decentralized Web Node (DWN)
+
+A Decentralized Web Node is a personal data store in a decentralized network that stores and shares information, serves as a communication channel, and executes transactions in a distributed manner, without relying on a centralized server, thereby enhancing security, privacy, and resilience of the network.
+
+[\<\< More on DWNs \>\>](/)
+
+## DID Document
+
+A JSON document containing details about a DID, including the DID itself, represented by an `id` field, as well as other data related to the verification and authentication methods of the DID.
+
+[\<\< More on DID Documents \>\>](/)
+
+## DID Method
+
+A specific scheme for creating, resolving, updating, and deactivating DIDs and their associated documents, as outlined in a DID method specification which provides detailed instructions on these operations.
+
+### DID Method - DHT
+
+The `did:dht` method is based on the Pkarr project and utilizes BitTorrent's Mainline Distributed Hash Table (DHT) to anchor DIDs and store DID Documents. This approach ensures that the identity information is maintained in a decentralized manner. This method allows operations like creating, reading, updating, and deactivating DIDs, and includes optional features like type indexing and gateway APIs for extended functionalities.
+
+### DID Method - Jwk
+
+The `did:jwk` method, similar to the `did:key` method, is designed for simplicity and self-containment in creating a DID. It involves encoding a JSON Web Key (JWK) using base64url. This method appeals to those seeking a straightforward approach.
+
+### DID Method - Web
+
+The `did:web` method is a type of Decentralized Identifier (DID) method that enables the creation of DIDs using a web domain name as the unique identifier, allowing for DIDs to be created and managed using existing web infrastructure and technologies, without requiring a specific blockchain or distributed ledger. The method utilizes HTTP(S) URLs to resolve DIDs and provides a flexible and decentralized way to manage digital identities on the web. However, the security and privacy of the `did:web:` method may depend on the web domain provider and the associated security measures in place.
+
+## Key Store
+
+A digital storage system that securely stores and manages a DID's cryptographic keys and key material, which is used for security protocols such as digital signing and verification.
+
+## Portable DID
+
+A Portable DID is a JSON-serialized representation of a [DID](#decentralized-identifier-did), including its URI, [DID Document](#did-document), and metadata. It's designed for easy storage, transfer, and reconstruction of a full DID across different systems or applications.
+
+[\<\< More on Portable DIDs \>\>](/)
+
+## Signature Algorithm
+
+A mathematical algorithm used to generate digital signatures. These are used to verify the authenticity, integrity, and non-repudiation of electronic documents, messages, or transactions by creating a unique digital signature that can be cryptographically validated.
+
+## Self-Sovereign Identity (SSI)
+
+SSI refers to a concept where individuals have full control and ownership over their digital identities. It empowers individuals to manage and control their personal information without relying on centralized authorities or intermediaries. SSI enables individuals to store their personal data and identity in a secure and private manner. With self-sovereign identity, individuals can selectively share their personal information with others, granting access on a need-to-know basis all while maintaining privacy and control over their data.
+
+## Verifiable Presentation
+
+A Verifiable Presentation is a standard data container that serves as an authenticated wrapper around a set of credentials to be verified. They impose no constraints on who can construct them or what may be presented, allowing you to present multiple VCs issued to different DIDs.
+
+[\<\< More on Verifiable Presentation \>\>](/)
diff --git a/site/docs/index.mdx b/site/docs/index.mdx
new file mode 100644
index 0000000..eb4b004
--- /dev/null
+++ b/site/docs/index.mdx
@@ -0,0 +1,14 @@
+---
+sidebar_position: 1
+title: Getting Started
+hide_title: true
+hide_table_of_contents: true
+---
+
+import ApiCard from '@site/src/components/ApiCard';
+import Card from '@site/src/components/Card';
+import Link from '@docusaurus/Link';
+import DocsIndexPage from './docs-index'
+
+
+
diff --git a/site/docs/tbdex/_category_.json b/site/docs/tbdex/_category_.json
new file mode 100644
index 0000000..ec08299
--- /dev/null
+++ b/site/docs/tbdex/_category_.json
@@ -0,0 +1,4 @@
+{
+ "label": "tbDEX SDK",
+ "position": 4
+}
diff --git a/site/docs/tbdex/index.mdx b/site/docs/tbdex/index.mdx
new file mode 100644
index 0000000..f5fa00c
--- /dev/null
+++ b/site/docs/tbdex/index.mdx
@@ -0,0 +1,152 @@
+# Overview of tbDEX
+
+## What is tbDEX?
+
+tbDEX is an open source liquidity and trust protocol that unlocks frictionless commerce and financial access globally.
+
+![illustration of tbDEX network](/img/tbdex-protocol-illustration.png)
+
+The protocol enables participants to securely validate counterparty identity and trust, as well as desired compliance with relevant laws and regulations.
+
+After trust establishment, tbDEX’s standard messaging protocol enables [Participating Financial Institutions (PFIs)](/docs/tbdex/pfi/overview) and counterparties to discover, negotiate, and confirm transactions.
+
+Once transaction details are confirmed, participants execute and settle these transactions outside of the protocol with PFIs directly.
+
+tbDEX is architected on Web5 infrastructure, utilizing decentralized technologies such as [Decentralized Identifiers (DIDs)](/) and [Verifiable Credentials (VCs)](/).
+
+## Why do we need tbDEX?
+
+The web connected us all, but money and payments have not kept pace. The legacy payment system is held together with proverbial duct tape, concealing fundamental problems. Final settlement of payments is slow, expensive, and never quite final. These inefficiencies result in costly account fees or outright exclusion from the system, disproportionately affecting the economically disadvantaged.
+
+Decentralized and trustless systems eliminate barriers to seamless online financial services such as international money movement.
+Yet, legacy fiat systems are projected to stay integral to our financial systems for the foreseeable future.
+This is why our global financial system and the customers it serves need a smooth method to transition between fiat and digital currencies.
+
+Put simply, tbDEX is a messaging protocol that allows for the decentralized transfer of value.
+This simplicity provides the opportunity to build whatever you want on top of it.
+tbDEX provides open and unbiased access to traditional financial services to enable everyone to participate in the world of digital currencies.
+
+The vision for tbDEX is one where any member of our financial system can utilize the protocol to allow for portability and interoperability across currencies, nationalities, and, most importantly, people.
+
+Furthermore, tbDEX is designed to encourage competition among financial institutions for customers' business, offering them a choice among multiple providers.
+This competitive landscape incentivizes PFIs to offer more reasonable transaction fees, as they vie to attract and retain users within the tbDEX ecosystem.
+
+The integration into one protocol ensures that every wallet application has access to every participating financial institution, fostering a customer-centric environment where quality of service and cost-efficiency become key differentiators.
+
+This is transformative for smaller companies where the challenge to integrate with all wallet applications is too high.
+With tbDEX, financial institutions can adopt the protocol once and enable thousands of wallets.
+
+## How does tbDEX work?
+
+tbDEX is a messaging service that provides a common protocol for establishing trust and accessing liquidity.
+
+Note that tbDEX is not an exchange, payment processor, bank, custody or self-custody wallet, or financial service provider of any kind.
+Instead, tbDEX is a protocol that enables efficient communication between two willing counterparties.
+
+### Actors
+
+There are essentially three types of actors involved in a tbDEX network:
+
+![Wallet, PFI, and VC Issuer](/img/tbdex-actors.png)
+
+- **[Wallet Applications:](/docs/tbdex/wallet/overview)** These hold identifiers and credentials, acting as an agent to facilitate exchanges on behalf of a person seeking liquidity
+- **[PFIs:](/docs/tbdex/pfi/overview)** The entities offering liquidity services on a tbDEX network
+- **[VC Issuers:](/docs/tbdex/issuer/overview)** Organizations that act as sources of verifiable credentials
+
+### Messages
+
+Using the tbDEX protocol, PFIs and Wallet Applications can exchange messages to negotiate a proposed transaction.
+
+As part of negotiating a proposed transaction, PFIs and Wallet Applications message each other using the following tbDEX message types:
+
+- **Request for Quote (RFQ)**: a request for the PFI to provide a quote specifically for the user based on the transaction they are proposing, the payment methods provided, etc. The RFQ also includes the proof of required credentials.
+
+- **Quote**: a formal offer from a PFI detailing exactly what the user will receive in exchange for a specific currency or asset, as per their RFQ. It also includes the total fees associated with the chosen payment methods, instructions for making the payment and receiving the funds, and an expiration time after which the terms of the quote are no longer guaranteed.
+
+- **Order**: an agreement to execute the proposed transaction. The parties may then settle their transaction outside of tbDEX.
+
+- **Order Status**: updates on execution of the order, sent by the PFI.
+
+- **Close**: signifies that the transaction has reached a terminal state. It can be used if the PFI is unable to provide a guaranteed quote to the RFQ, if the customer is no longer interested in the quote, if the order has failed, or if the order has completed. No messages can be added to a transaction after a Close has been sent.
+
+## Example Scenario
+
+Alice holds a digital wallet application that securely manages her identity, including her identifiers, credentials, and authorizations for external apps and entities.
+Alice wants to exchange 100 units of digital currency for USD.
+Because Alice is off-ramping from digital currency to fiat, a PFI will likely require verification of Alice’s identity in order to fulfill their regulatory and compliance obligations.
+
+1. **Alice** informs her wallet of her need to make the transaction.
+
+2. **Alice's Wallet** discovers PFIs that offer this currency pairing, compares their credential requirements with the VCs Alice holds, and if necessary, applies for any missing VCs.
+
+
+Related Guides
+
+ - [Onboard as PFI](/)
+ - [Allowlist PFIs](/docs/tbdex/wallet/allowlist-pfis)
+ - [Present Credentials](/docs/tbdex/wallet/managing-credentials)
+
+3. The **Credential Issuer** (if applicable) issues the required VCs to Alice, which are stored in her wallet.
+
+ Related Guides
+
+ - [Setup Credential Issuance Service](/docs/tbdex/issuer/vc-issuance)
+ - [Issue a VC](/)
+
+4. **Alice’s Wallet** presents the offerings to Alice, allowing her to choose the one she’d like to transact with.
+
+ Related Guides
+
+ - [Get Offerings](/docs/tbdex/wallet/get-offerings)
+
+5. **Alice** considers various factors such as the reputation of the PFIs as well as the transaction fees before choosing a PFI.
+
+6. **Alice's Wallet** creates a request for a quote (RFQ) with Alice's DID, the details of her request, and the required VC - which Alice has already obtained previously.
+
+ Related Guides
+
+ - [Send RFQs](/docs/tbdex/wallet/send-rfq)
+
+7. The **PFI** receives the RFQ, verifies the credentials, and responds with a quote.
+
+ Related Guides
+
+ - [Create Quotes](/docs/tbdex/pfi/creating-quotes)
+
+8. **Alice's Wallet** accepts the quote by placing the order.
+
+ Related Guides
+
+ - [Place Orders](/docs/tbdex/wallet/place-order)
+ - [Cancel Exchange](/docs/tbdex/wallet/receive-quote#cancel-exchange)
+
+9. The **PFI** sends order statuses to the Wallet to update Alice about the order.
+
+ Related Guides
+
+ - [PFI: Process Orders](/docs/tbdex/pfi/processing-orders)
+ - [Wallet: Listen for Order Status Updates](/docs/tbdex/wallet/place-order#listen-for-order-status-updates)
+
+10. The **PFI** fulfills the order then sends a close message to Alice’s Wallet.
+
+
+
+ Related Guides
+
+ - [PFI: Close Order](/docs/tbdex/pfi/processing-orders#close-the-order)
+ - [Wallet: Receive Close Message](/docs/tbdex/wallet/place-order#receive-close-message)
+ - [Wallet: Cancel Exchange](/docs/tbdex/wallet/receive-quote#cancel-exchange)
+
+
+
+## Try tbDEX
+
+By leveraging decentralized technologies, tbDEX:
+
+- Offers a permissionless and inclusive platform that allows for the transfer of funds across different currency systems and borders
+
+- Promotes competition among PFIs, ensuring more equitable transaction fees and services for users
+
+- Provides tools to meet regulatory requirements, including identity verifications
+
+As a result, tbDEX offers a versatile solution for seamless financial transactions for developers, institutions, and individuals alike. If you’re ready to build your own applications using tbDEX, check out our [SDKs](https://github.com/TBD54566975/tbdex).
diff --git a/site/docs/tbdex/issuer/_category_.json b/site/docs/tbdex/issuer/_category_.json
new file mode 100644
index 0000000..e288e8c
--- /dev/null
+++ b/site/docs/tbdex/issuer/_category_.json
@@ -0,0 +1,4 @@
+{
+ "label": "Issuers",
+ "position": 6
+}
diff --git a/site/docs/tbdex/issuer/kbc/_category_.json b/site/docs/tbdex/issuer/kbc/_category_.json
new file mode 100644
index 0000000..cc4b7f6
--- /dev/null
+++ b/site/docs/tbdex/issuer/kbc/_category_.json
@@ -0,0 +1,5 @@
+{
+ "label": "Known Business Credential",
+ "position": 5
+ }
+
\ No newline at end of file
diff --git a/site/docs/tbdex/issuer/kbc/kbc-issuer.mdx b/site/docs/tbdex/issuer/kbc/kbc-issuer.mdx
new file mode 100644
index 0000000..49fa735
--- /dev/null
+++ b/site/docs/tbdex/issuer/kbc/kbc-issuer.mdx
@@ -0,0 +1,88 @@
+---
+sidebar_position: 1
+title: Issuing a KBC
+hide_title: true
+unlisted: true
+---
+
+
+
+# Issuing a Known Business Credential
+
+Known Business Credentials (KBC) are [Verifiable Credentials](/) designed to streamline the Know Your Business (KYB) process for tbDEX protocol users.
+
+By issuing this credential, the PFI attests to the business’s legitimacy and compliance with regulations, allowing the PFI to engage in financial activities with the Wallet application without requiring individual KYC for each customer.
+
+:::danger Important
+This guide is intended for educational purposes only and does not constitute legal advice. Compliance programs may have varying requirements. Consult your legal and/or compliance advisors to ensure that the KBC is consistent with your legal and compliance obligations.
+:::
+
+In this guide, we'll cover how to:
+
+- Design and issue a KBC
+- Specify a KBC as a required claim in an [Offering](https://developer.tbd.website/docs/tbdex/pfi/creating-offerings)
+
+## Environment Setup
+
+If you haven't already, please follow the [Credential Issuance Server Setup Guide](/docs/tbdex/issuer/vc-serverSetup) for detailed instructions on the dependencies and packages needed to set up your server.
+
+## Issue Credential
+
+To issue a KBC, call `VerifiableCredential.create()` and pass in the URL to the credential schema the VC is based on.
+
+We've designed an open source schema for KBCs that you're welcome to use at https://vc.schemas.host/kbc.schema.json.
+
+
+
+In the example above, `signedKbc` is a [token](/) that you can safely provide to the business you're issuing the KBC to.
+
+## Specify KBC as Requirement
+
+If you issue a KBC to a business, you'll want to specify that credential as a [required claim](/docs/tbdex/pfi/creating-offerings#required-claims) on any applicable Offerings you may provide.
+
+:::note
+The `id` property is a string that uniquely identifies the `input_descriptor`. It is required and must be unique within the `presentation_definition`.
+:::
+
+### Create Presentation Definition
+
+
+
+## Add Required Claim to Offering
+
+Now that you've defined your requirements, you can add them to any relevant Offerings.
+
+
diff --git a/site/docs/tbdex/issuer/overview.mdx b/site/docs/tbdex/issuer/overview.mdx
new file mode 100644
index 0000000..4c09185
--- /dev/null
+++ b/site/docs/tbdex/issuer/overview.mdx
@@ -0,0 +1,40 @@
+---
+sidebar_position: 1
+title: Issuer Overview
+hide_title: true
+---
+
+# Credential Issuer Overview
+
+Credential Issuers are fundamental to the functioning of the tbDEX network.
+They not only ensure secure and compliant transactions but also establish a foundation of trust essential for digital financial exchanges.
+
+Credential Issuers are responsible for creating and distributing [Verifiable Credentials (VCs)](/) which serve as digital attestations of a party's identity or qualifications.
+These credentials play a crucial role in enabling transactions within the network, encapsulating authenticated information in a digital format for secure integration and use.
+
+The primary function of a Credential Issuer within the tbDEX network is to bridge trust between [Wallets](/docs/tbdex/wallet/overview) and [PFIs](/docs/tbdex/pfi/overview).
+By independently authenticating a party's claims and issuing VCs based on this verified data, Credential Issuers add a layer of assurance and authenticity to transactions.
+
+They enable parties to adhere to regulatory obligations and engage in financial exchanges with enhanced trust, thus upholding the network's integrity and compliance standards.
+
+Credential Issuers provide several key functions within a tbDEX network:
+
+- **Authentication and Attestation**
+
+ They authenticate and attest to the information provided by entities, ensuring that the data is both accurate and reliable.
+
+- **Credential Issuance**
+
+ Issuers then issue a VC based on this authenticated information, facilitating its secure storage in a Wallet.
+
+- **Compliance and Trust**
+
+ Through their activities, Credential Issuers assist entities in meeting regulatory and compliance requirements while enhancing the overall trustworthiness of the network. This dual role is crucial in maintaining the network's integrity and ensuring transactions adhere to established standards.
+
+The Credential Issuer guides are intended to provide you with what you need to begin issuing credentials to tbDEX network participants.
+
+## Recommended Path
+
+1. [tbDEX Overview](/docs/tbdex/)
+2. [Server Setup](/docs/tbdex/issuer/vc-serverSetup)
+3. [Credential
diff --git a/site/docs/tbdex/issuer/vc-issuance.mdx b/site/docs/tbdex/issuer/vc-issuance.mdx
new file mode 100644
index 0000000..9f0343c
--- /dev/null
+++ b/site/docs/tbdex/issuer/vc-issuance.mdx
@@ -0,0 +1,198 @@
+---
+sidebar_position: 3
+title: Credential Issuance
+hide_title: true
+---
+
+
+
+# Credential Issuance
+
+This guide introduces how to issue [verifiable credentials (VC)](/), a process for establishing trust between [Wallets](/docs/tbdex/wallet/overview) and [PFIs](/docs/tbdex/pfi/overview) in a tbDEX network.
+
+Common examples of credentials that are necessary in financial transactions are ones that verify the identity of a Wallet owner.
+
+Although credential issuance is not a concept that is exclusive to tbDEX, it's a key element in enabling compliant transactions.
+
+## Overview
+
+A Credential Issuance app operates as an API service, exposing endpoints for third parties to request credentials.
+
+If you already have an Issuance app up and running, check out the guide on [how to issue credentials with Web5](/).
+
+## Environment Setup
+
+If you need to create a Credential Issuance app from scratch, check out the [Credential Issuance Server Setup Guide](/) for detailed instructions on the dependencies and packages needed to set up your server.
+
+:::note
+If you'd like to view a full, runnable project, see our [VC Issuer Example](https://github.com/TBD54566975/super-simple-sanctions).
+:::
+
+## Design the Credential
+
+With your app set up to accept incoming routes, you can design a model class to represent the specific type of credential you'd like to issue.
+
+Let's design a VC that attests that a person isn't on a Sanctions list. You could model that class as follows:
+
+
+
+In the example above, you provide a class property that stores all the sanctions lists checked against.
+You have wide flexibility with what you can store in the credential model class, which means that you're free to include any attributes that may be relevant to the credential you are issuing.
+
+## Implement Issuance
+
+With your web server structure in place and credential designed, you're now ready to build out your issuance codepath.
+Within the `/check-sanctions` route, you'll add code to handle when a user requests to be issued a VC.
+
+In this code, you'll want to perform any checks required to issue them a credential which will later be verified by an interested third party.
+
+In the example below, assume the user has provided a JWT that contains their identity information (e.g. name, DOB, etc), and your application checks applicable sanctions lists to determine if this user is on them.
+
+If all checks pass, you'll issue them a credential.
+
+
+
+:::tip Signing credentials
+Signing will return a [VC JSON Web Token](/), which is ideal for secure transmission of the credential.
+
+A BearerDid is used to sign Verifiable Credentials that you issue.
+Refer to the [Create A DID](/) guide for steps on how to create one.
+:::
+
+
+
+
+In order to run this code, create a checkSanctionsLists()
function and a sanctionsListResult
class in your Application.kt
file:
+
+
+
+
+
+In order to run this code, create a checkSanctionsLists()
function in your api.js
file:
+
+
+
+
+
+
+The `sanctions_credential` object that's returned will be a raw VC that looks like this:
+
+
+
+
+
+```json
+vcDataModel: {
+ "@context": [ "https://www.w3.org/2018/credentials/v1" ],
+ type: [ "VerifiableCredential", "SanctionsCredential" ],
+ id: "urn:uuid:daa5ff01-9b7d-485b-9410-22a42952d46c",
+ issuer: "did:dht:yqun8fjakb7afu3rau9rhgdo4ahru9d68488e5mu5ihbaiwqjh3y",
+ issuanceDate: "2023-12-14T08:20:41Z",
+ credentialSubject: {
+ id: "did:dht:z6MkjGSeekPGE9QfczHWyW8v2ZzJU68kqSHzV7L2dmQyuyDu",
+ listsCleared: "FBI's Most Wanted", "USA Watchlist", "EU Watchlist"
+ }
+}
+```
+
+
+
+
+
+
+
+
+```json
+{
+ "@context": [ "https://www.w3.org/2018/credentials/v1" ],
+ type: [ "VerifiableCredential", "SanctionsCredential" ],
+ id: "urn:uuid:daa5ff01-9b7d-485b-9410-22a42952d46c",
+ issuer: "did:dht:yqun8fjakb7afu3rau9rhgdo4ahru9d68488e5mu5ihbaiwqjh3y",
+ issuanceDate: "2023-12-14T08:20:41Z",
+ credentialSubject: {
+ id: "did:dht:z6MkjGSeekPGE9QfczHWyW8v2ZzJU68kqSHzV7L2dmQyuyDu",
+ listsCleared: "FBI's Most Wanted", "USA Watchlist", "EU Watchlist"
+ }
+}
+```
+
+
+
+
+
+
+## Test Issuance Service
+
+1. Start the service by opening a terminal window and running the following commands:
+
+
+
+
+
+```bash
+node main.js
+```
+
+
+
+
+
+
+
+
+```bash
+./gradlew clean build
+./gradlew run
+```
+
+
+
+
+
+
+2. In a new terminal window send a test request. Below is an example command using `curl` that includes a JWT for authorization:
+
+```bash
+ curl -X GET http://localhost:3000/check-sanctions -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa3djSmkzeVVONDJFZ1N2cmNHRlFyQzRKY1pkenlWWkhQOVdmMXFRZWRuVlRQI3o2TWt3Y0ppM3lVTjQyRWdTdnJjR0ZRckM0SmNaZHp5VlpIUDlXZjFxUWVkblZUUCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiSWRlbnRpZmljYXRpb25DcmVkZW50aWFsIl0sImlkIjoidXJuOnV1aWQ6MDQ3ZTg0ZWItY2NhMS00NjFlLWFjZjAtMGMyZGE5ZDczOTNhIiwiaXNzdWVyIjoiZGlkOmtleTp6Nk1rd2NKaTN5VU40MkVnU3ZyY0dGUXJDNEpjWmR6eVZaSFA5V2YxcVFlZG5WVFAiLCJpc3N1YW5jZURhdGUiOiIyMDI0LTAyLTE1VDE5OjMyOjE2WiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6Nk1rd2NKaTN5VU40MkVnU3ZyY0dGUXJDNEpjWmR6eVZaSFA5V2YxcVFlZG5WVFAiLCJuYW1lIjoiam9obiJ9fSwiaXNzIjoiZGlkOmtleTp6Nk1rd2NKaTN5VU40MkVnU3ZyY0dGUXJDNEpjWmR6eVZaSFA5V2YxcVFlZG5WVFAiLCJzdWIiOiJkaWQ6a2V5Ono2TWt3Y0ppM3lVTjQyRWdTdnJjR0ZRckM0SmNaZHp5VlpIUDlXZjFxUWVkblZUUCJ9.7oFAPckx-vxCbbzKSk9bU7eXlnjBFvMborl9woHCbcvWaLt0LvTRuDfvGDPC24V9D1K5OFpTnnBiN5jtIOmbBg"
+```
+
+With that, you've implemented a basic credential issuance service to accept requests and issue VCs.
diff --git a/site/docs/tbdex/issuer/vc-serverSetup.mdx b/site/docs/tbdex/issuer/vc-serverSetup.mdx
new file mode 100644
index 0000000..74a1a41
--- /dev/null
+++ b/site/docs/tbdex/issuer/vc-serverSetup.mdx
@@ -0,0 +1,188 @@
+---
+sidebar_position: 2
+title: Server Setup
+hide_title: true
+---
+
+
+
+# Credential Issuance Server Setup
+
+
+
+
+
Setup Ktor Project
+
+This example demonstrates how to use Ktor to set up the VC issuance service. Follow these instructions to
create a new Ktor project .
+
+
+
+
+
+
+
+
Install Express
+
+This example demonstrates how to use Express to set up the VC issuance service. Follow these instructions to
install Express .
+
+
+
+
+
+
+### Install Credentials Package
+
+You'll also need to install `@web5/credentials` to create and issue credentials:
+
+
+
+### Create a DID
+
+Additionally, to issue credentials, you need a [Decentralized Identifier (DID)](/) which will serve as your Issuer's identity.
+
+If you don't already have one, you'll need to [create a DID](/) with an IDV (Identity Verification) service endpoint:
+
+
+
+If you have an existing DID you'll need to update that DID Document with an IDV service endpoint:
+
+
+
+### Create API Service
+
+
+
+
+1. Ensure you have a file, such as Application.kt
, to act as your API's entry point, which was created during the Ktor setup.
+
+2. Within the file, import the necessary libraries:
+
+```kt title=Application.kt
+import com.nimbusds.jwt.JWTParser
+import io.ktor.server.application.*
+import io.ktor.server.response.*
+import io.ktor.server.request.*
+import io.ktor.server.routing.*
+import io.ktor.http.*
+import io.ktor.server.engine.*
+import io.ktor.server.netty.*
+import web5.sdk.credentials.VerifiableCredential
+import java.security.SignatureException
+import com.nimbusds.jwt.JWTClaimsSet
+import web5.sdk.dids.Did
+```
+
+3. To start your API service, add the following:
+
+```kt title=Application.kt
+fun main() {
+ embeddedServer(Netty, port = 8082) { // this can be any port you want to listen on
+ configureRouting()
+ }.start(wait = true)
+}
+```
+
+4. In the same file, define your API routes:
+
+```kt title=Application.kt
+fun Application.configureRouting() {
+ routing {
+ get("/example-route") {
+ // implement the API route here
+ },
+ get("/next-example-route") {
+ // implement the API route here
+ }
+ }
+}
+```
+
+
+
+
+
+
+
+1. Ensure you have a file, such as main.js
, to act as your API's entry point, which was created during the Express setup.
+
+2. Within the file, import the following:
+
+```js title=main.js
+import { api } from './api.js';
+```
+
+3. To start your Express API service, add the following:
+
+```js title=main.js
+const config = {
+ port: 3000, // this can be any port you want to listen on
+};
+
+const server = api.listen(config.port, () => {
+ log.info(`Server listening on port ${config.port}`);
+});
+```
+
+4. Next, create an api.js
file. This file will define the core API routes and logic for issuing credentials:
+
+```js title=api.js
+import express from 'express';
+import { VerifiableCredential, Jwt } from '@web5/credentials';
+
+const app = express();
+app.use(express.json());
+
+app.get('/example-route', async (req, res) => {
+ // implement the API route here
+});
+
+// Export the app so it can be imported in your main.js
file
+export { app as api };
+```
+
+
+
+
+
+
+## Next Steps
+
+Now that you have your server environment set up, depending on your use case, you can proceed with one of the following guides:
+
+- [Credential Issuance Guide](/)
+
+- [Known Customer Credential Guide](/)
diff --git a/site/docs/tbdex/message-types.mdx b/site/docs/tbdex/message-types.mdx
new file mode 100644
index 0000000..6086ae0
--- /dev/null
+++ b/site/docs/tbdex/message-types.mdx
@@ -0,0 +1,32 @@
+---
+sidebar_position: 1
+---
+
+# Key Concepts
+
+Although each of the three actors in the tbDEX network have distinct roles and concepts associated with them, there are three concepts that bind them together: Messages, Offerings, and Exchanges.
+
+## Messages
+
+PFIs and Wallets are able to communicate with each other by using the following tbDEX message types:
+
+* [**RFQ**](/docs/tbdex/wallet/send-rfq) - A message sent by a wallet to a PFI requesting a quote for an ask
+
+* [**Quote**](/docs/tbdex/pfi/creating-quotes) - A quote sent by the PFI in response to an RFQ, including a locked-in price that the PFI is willing to honor until a built-in expiration date
+
+* [**Order**](/docs/tbdex/pfi/processing-orders) - A message sent by a wallet to a PFI to accept a quote
+
+* [**OrderStatus**](/docs/tbdex/pfi/processing-orders#provide-order-status) - A message sent by the PFI to a wallet to convey the current status of an order.
+
+* [**Close**](/docs/tbdex/pfi/processing-orders#close-the-order) - A message sent by a wallet or a PFI in response to an RFQ or Quote
+
+## Offerings
+
+[Offerings](/docs/tbdex/pfi/creating-offerings) describe a currency pair that can be exchanged and include requirements, conditions, and constraints needed to fulfill the described transaction.
+They are created and stored by PFIs, and they are consumed by Wallets.
+
+## Exchanges
+
+Within tbDEX, the term "exchange" refers to a thread of messages between a PFI and a Wallet. Whenever a Wallet submits an RFQ to a PFI, a new exchange is created that involves the Wallet owner and the PFI, and all subsequent messages about the transaction are a part of the exchange.
+
+For each RFQ, you'll want to create a new exchange object to store relevant data. Note that every RFQ is associated with an Offering, so each exchange represents all messages about a specific transaction.
\ No newline at end of file
diff --git a/site/docs/tbdex/pfi-quickstart.mdx b/site/docs/tbdex/pfi-quickstart.mdx
new file mode 100644
index 0000000..fbf6a85
--- /dev/null
+++ b/site/docs/tbdex/pfi-quickstart.mdx
@@ -0,0 +1,127 @@
+---
+sidebar_position: 3
+title: 'Quickstart: PFI'
+hide_title: true
+hide_table_of_contents: false
+---
+
+import { QuickstartExecutionProvider } from '@site/src/components/QuickstartExecutionContext';
+import Version from '@site/src/components/Version';
+import PackageJson from '@site/src/components/PackageJson';
+import CodeSnippet from '@site/src/components/CodeSnippet';
+import PfiQuickstartCodeRunner from '@site/src/components/PfiQuickstartCodeRunner';
+
+
+
+# tbDEX PFI in 5️⃣ Minutes
+
+## Overview
+
+In the tbDEX ecosystem, a [Participating Financial Institution (PFI)](/docs/tbdex/pfi/overview) provides liquidity offerings to customers via [Wallets](/docs/tbdex/wallet/overview), allowing eligible customers to place orders and execute transactions.
+
+**In this quickstart, you'll:**
+
+✅ Set up a basic PFI with a catalog of `Offerings`
+
+✅ Provide a `Quote` when requested
+
+✅ Process a `Order`
+
+Let's get started!
+
+## Set Up PFI
+
+### Create a DID
+
+On tbDEX, PFIs are identified using [Decentralized Identifiers (DIDs)](/). Let's create a DID for your PFI and specify a service endpoint that allows Wallet applications to interact with your PFI:
+
+
+
+
+### Structure Your PFI App
+
+To operate as a PFI on the tbDEX network, you'll need a server that handles incoming requests from Wallet applications, a database that holds Offerings and Exchanges, and implementations of the OfferingsApi and ExchangesApi. We'll spare you the details in this Quickstart, however, for more info, check out the guide on [Structuring a PFI App](/docs/tbdex/pfi/anatomy-of-a-pfi).
+
+### Fetching Offerings for Wallets
+
+With your database populated with Offerings and the OfferingsApi set up, Wallet applications can now call `getOfferings()` to obtain a list of the currency conversions you offer and the requirements to transact.
+
+Let's see what Offerings your PFI provides:
+
+```js
+const offerings = await offeringsApiProvider.getOfferings();
+```
+
+
+
+## Process tbDEX Messages
+
+PFIs and Wallet applications exchange [messages](/docs/tbdex/message-types#messages) to facilitate transactions.
+All messages are stored within an exchange in your PFI's database.
+
+Let's walk through the process of handling these messages.
+
+### Create Quote
+
+When a customer selects an `Offering`, the Wallet application calls `createExchange()` passing in an `RFQ` (Request for Quote) message.
+The RFQ is sent to your PFI and includes the customer's preferred methods of payment and the credentials that satisfy the `requiredClaims` of the selected `Offering`.
+
+Using this submitted data, your PFI generates a `Quote`:
+
+
+
+After creating this message, your PFI will sign it with your DID and write it to your database, where the Wallet app can retrieve it.
+
+
+
+
+### Process Order
+
+The Wallet application presents the `Quote` to the customer, and they accept it.
+The Wallet proceeds by calling `submitOrder()` to place an `Order`.
+
+When your PFI receives the `Order`, you'll settle the payin and payout outside of tbDEX using the rails of your choice, but will use the protocol to send `OrderStatus` updates so that the Wallet app can keep the customer informed:
+
+
+
+
+### Close Exchange
+
+Once the `Order` is completed (whether fulfilled or cancelled), you'll terminate the exchange with a `Close` message which can optionally include a `reason` and a `success` indicator:
+
+
+
+
+## Next Steps with tbDEX
+
+Congratulations on building your first PFI! To explore further, check out the full [PFI guide](/docs/tbdex/pfi/overview).
+
+
diff --git a/site/docs/tbdex/pfi/_category_.json b/site/docs/tbdex/pfi/_category_.json
new file mode 100644
index 0000000..1a0e7b2
--- /dev/null
+++ b/site/docs/tbdex/pfi/_category_.json
@@ -0,0 +1,4 @@
+{
+ "label": "PFIs",
+ "position": 4
+}
diff --git a/site/docs/tbdex/pfi/anatomy-of-a-pfi.mdx b/site/docs/tbdex/pfi/anatomy-of-a-pfi.mdx
new file mode 100644
index 0000000..e547a3f
--- /dev/null
+++ b/site/docs/tbdex/pfi/anatomy-of-a-pfi.mdx
@@ -0,0 +1,138 @@
+---
+title: Structuring a PFI App
+hide_title: true
+sidebar_position: 5
+---
+
+
+
+
+# Structuring a PFI App
+
+Every PFI on the tbDEX network is required to handle its end of the responsibilities as part of each [Message Type](/docs/tbdex/message-types). The tbDEX SDK is organized in such a way that there are three key components you'll be required to implement:
+
+* **A main server entry point** - this will leverage the tbDEX SDK to create an http server subscribed to tbDEX messaging.
+
+* **An offering API provider** - this class is responsible for implementing the OfferingsApi protocol, which is a common interface for managing the database containing your offerings data. When a Wallet queries your PFI for Offerings, the tbDEX SDK will use the interfaces in this class to automatically handle returning Offerings from your database to the Wallet.
+
+* **An exchange API provider** - this class is responsible for implementing the ExchangeApi protocol, which is a common interface for managing the database containing your tbDEX offer, order, quote, close, and RFQ data.
+
+## Main Server Entrypoint
+
+Your main server entrypoint should fulfill the following responsibilities:
+
+* Accept `GET` requests for Offerings and Exchanges data
+* Handle submission requests for new `RFQ`, `Order`, and `Close` messages
+
+Here is a list of the required routes you'll need to implement:
+
+
+
+
+ Method
+ Endpoint
+ Description
+
+
+
+
+ POST
+ /exchanges
+ Used to send an RFQ aka create an exchange
+
+
+ PUT
+ /exchanges/:id
+ Used to add additional messages (e.g. `Order`, `Close`) to an existing exchange
+
+
+ GET
+ /exchanges
+ Used to get the exchange IDs of all exchanges that match a specified filter
+
+
+ GET
+ /exchanges/:id
+ Used to get a single exchange
+
+
+
+
+To begin, you’ll want to configure your server with the required exchange and offerings API providers (the details of those API providers will be in the sections below):
+
+
+
+The [message types](/docs/tbdex/message-types) that are sent from Wallets to PFIs are: `RFQ`, `Order`, and `Close`.
+As a result, you’ll want to ensure that your PFI is programmed to accept those messages and create appropriate messages in response:
+
+
+
+With your routes configured, set your server to begin listening:
+
+
+
+Now your server is configured with the appropriate routing setup.
+
+:::note
+Error handling for things like duplicate RFQs, invalid data, and non-existent Offerings is automatically handled by the tbDEX SDK behind the scenes. Your app can focus on implementing business logic rather than needing to worry about input validation.
+:::
+
+## Offerings API Provider
+
+The `Offerings` API is the set of methods that deals with reading and writing any offering data, based on the class.
+Although the interface for `OfferingsApi` only requires to be filled out with read operations, you may find it useful to write operations into the class as well.
+
+Although the Offerings API isn’t directly exposed in the main server entrypoint, it is still used to fetch and write offerings to your PFI's database.
+Here's an example of how to get offerings as specified by the `OfferingsApi` interface:
+
+
+
+By implementing the `getOffering()` and `getOfferings()` methods, you'll allow Wallets to get a specific Offering they'd be interested in, or query all your Offerings, respectively. The convenience of the tbDEX SDK is that you aren't required to actually write an API endpoint yourself to handle interfacing with Wallets as the SDK handles it all for you.
+
+## Exchange API Provider
+
+The Exchanges API is the set of methods that deals with reading and writing messages, based on the [ExchangesApi](https://tbd54566975.github.io/tbdex-js/interfaces/_tbdex_http_server.ExchangesApi.html) class.
+Although the interface for `ExchangesApi` only requires read operations, you may find it useful to couple write operations into the class as well.
+
+Using the sample code above as reference, the submission of `RFQ`, `Order`, or `Close` data will result in the triggering of the Exchange API Provider’s `write()`, while the required methods such as `getOrder()` will serve as read methods.
+
+As a PFI developer, you’ll be responsible for designing your own data storage and provider to access your data.
+
+For example, after writing an `RFQ` to the database, you can [create a Quote](/docs/tbdex/pfi/creating-quotes).
+Similarly, after writing an `Order` to your database, you’ll want to ensure you properly [process that Order](/docs/tbdex/pfi/processing-orders).
+
+### Callbacks
+
+When sending an `RFQ` message, the Wallet may also provide [an optional `replyTo` property](/docs/tbdex/wallet/send-rfq#send-rfq-to-pfi) that allows for them to subscribe to subsequent messages.
+If you receive a `replyTo` property, which is a fully qualified URI (URL or DID), then as the PFI you are responsible for sending all new messages back to the endpoint provided.
+The callback URI should be scoped only to that exchange, allowing the caller to specify a different URI per exchange if they wish.
+If the `replyTo` property is not present, the caller will poll the exchange to get new messages.
+
+
+### Writing Messages
+
+Assuming a generic `dataProvider` class serves as your PFI’s means of accessing your Exchange data, here's an example of a `write()` implementation:
+
+
+
+
diff --git a/site/docs/tbdex/pfi/creating-offerings.mdx b/site/docs/tbdex/pfi/creating-offerings.mdx
new file mode 100644
index 0000000..c0579ce
--- /dev/null
+++ b/site/docs/tbdex/pfi/creating-offerings.mdx
@@ -0,0 +1,206 @@
+---
+title: Creating Offerings
+hide_title: true
+sidebar_position: 6
+---
+
+
+
+# Creating Offerings
+
+Offerings describe a currency pair that can be exchanged and specify the requirements, conditions, and constraints needed to fulfill the described transaction.
+In other words, an Offering is a way of describing a financial product you’re offering as a PFI on a tbDEX network.
+
+Any Wallet that has your PFI's DID will be able to query your PFI for all available Offerings, as well as fetch specific Offerings. Wallets will then use that data to make an [Request for Quote (RFQ)](/docs/tbdex/wallet/send-rfq) to your PFI to begin a potential transaction process.
+
+## Create an Offering
+
+You can use the tbDEX SDK to create Offerings.
+An Offering must adhere to the [Offering schema](https://github.com/TBD54566975/tbdex/tree/main/specs/protocol#offering).
+
+
+
+### Required Claims
+
+In order to comply with certain financial regulations, you may require information about the customer you are transacting with.
+You can obtain this information via [Verifiable Credentials](/).
+
+To specify the exact credentials you need, you can do so in the `requiredClaims` section of your Offering by [creating a Presentation Definition](/).
+You'll specify all required forms and details of proof, optional selection rules, and define flexibility where possible when different types of input may satisfy the requirements.
+
+For a full breakdown of all the available fields and combinations, [see the DIF website](/) for details.
+
+Below is an example of how you could specify that a [KnownCustomerCredential](/) is required to order this Offering:
+
+
+
+Once you've created your required claims, it's important to validate them to ensure there are no errors in the design.
+This will throw an error if it's not valid.
+
+
+
+### Sign Offering
+
+After creating your Offering, it's necessary to cryptographically sign it so that Wallet apps know that it's authentic.
+
+
+
+### Validate Offering
+
+After signing the Offering, you can validate that your Offering's structure is valid.
+This will throw an error if it's not valid.
+
+
+
+Once the Offering has been generated, you can store it in your database using code as shown in the [Offerings API Provider section](/docs/tbdex/pfi/anatomy-of-a-pfi#offerings-api-provider)
+
+## Sample Offering
+
+When combining all the data above, you can end up with a full Offering object that looks something like the following:
+
+```js
+{
+ "metadata": {
+ "from": "did:dht:d4sgiggd3dwimo4ubki7spo45q5dazxphrizbxhcgapapcnzpouy",
+ "protocol": "1.0",
+ "kind": "offering",
+ "id": "offering_01htkr88ybffzbxfea01rq3ht9",
+ "createdAt": "2024-04-04T05:10:38.796Z"
+ },
+ "data": {
+ "description": "Selling BTC for USD",
+ "payin": {
+ "currencyCode": "USD",
+ "methods": [
+ {
+ "kind": "DEBIT_CARD",
+ "requiredPaymentDetails": {
+ "$schema": "http://json-schema.org/draft-07/schema",
+ "type": "object",
+ "properties": {
+ "cardNumber": {
+ "type": "string",
+ "description": "The 16-digit debit card number",
+ "minLength": 16,
+ "maxLength": 16
+ },
+ "expiryDate": {
+ "type": "string",
+ "description": "The expiry date of the card in MM/YY format",
+ "pattern": "^(0[1-9]|1[0-2])\\/([0-9]{2})$"
+ },
+ "cardHolderName": {
+ "type": "string",
+ "description": "Name of the cardholder as it appears on the card"
+ },
+ "cvv": {
+ "type": "string",
+ "description": "The 3-digit CVV code",
+ "minLength": 3,
+ "maxLength": 3
+ }
+ }
+ }
+ }
+ ]
+ },
+ "payout": {
+ "currencyCode": "BTC",
+ "methods": [
+ {
+ "kind": "BITCOIN_ADDRESS",
+ "estimatedSettlementTime": 60,
+ "fee": "0.25"
+ }
+ ]
+ },
+ "payoutUnitsPerPayinUnit": "0.00003826",
+ "requiredClaims": {
+ "id": "presentation-definition-kcc",
+ "name": "Customer Verification",
+ "purpose": "We need to verify your customer status and conduct necessary checks.",
+ "format": {
+ "jwt_vc": {
+ "alg": [
+ "ES256K",
+ "EdDSA"
+ ]
+ }
+ },
+ "input_descriptors": [
+ {
+ "id": "known-customer-credential",
+ "name": "Known Customer Credential",
+ "purpose": "Please present your Known Customer Credential for verification.",
+ "constraints": {
+ "fields": [
+ {
+ "path": [
+ "$.credentialSchema[*].id"
+ ],
+ "filter": {
+ "type": "string",
+ "const": "https://vc.schemas.host/kcc.schema.json"
+ }
+ },
+ {
+ "path": [
+ "$.evidence[*].kind"
+ ],
+ "filter": {
+ "type": "string",
+ "pattern": "sanction_screening"
+ }
+ },
+ {
+ "path": [
+ "$.credentialSubject.countryOfResidence"
+ ],
+ "filter": {
+ "type": "string",
+ "const": "US"
+ }
+ },
+ {
+ "path": [
+ "$.issuer"
+ ],
+ "filter": {
+ "type": "string",
+ "const": "did:dht:d4sgiggd3dwimo4ubki7spo45q5dazxphrizbxhcgapapcnzpouy"
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ "signature": "eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpkaHQ6ZDRzZ2lnZ2QzZHdpbW80dWJraTdzcG80NXE1ZGF6eHBocml6YnhoY2dhcGFwY256cG91eSMwIn0..CcC0pWCpZXzqvPF-2z-axvJQyHhT6-Of4lavPIrrIrJ4WM5eyKRaR7YgEORh7xMwR_pXZ_KUHnPksmSQZsm2Ag"
+}
+```
diff --git a/site/docs/tbdex/pfi/creating-quotes.mdx b/site/docs/tbdex/pfi/creating-quotes.mdx
new file mode 100644
index 0000000..5a1b20a
--- /dev/null
+++ b/site/docs/tbdex/pfi/creating-quotes.mdx
@@ -0,0 +1,69 @@
+---
+title: Creating Quotes
+hide_title: true
+sidebar_position: 7
+---
+
+
+
+# Creating Quotes
+
+When you receive an `RFQ` message, you’ll want to do the following:
+
+1. Store the `RFQ` message in your database
+2. Get the `Offering` specified by `offeringId` in the `RFQ`
+3. Create a `Quote` and store it in your database
+
+## Store RFQ message
+
+An `RFQ` is the first message of an exchange.
+When a Wallet application sends your PFI an `RFQ` message, your server's `onCreateExchange()` callback parameter will be invoked.
+This is where you should implement your business logic for determining the customer's exact Quote.
+
+As a best practice, store the `RFQ` message in your [Exchanges database](/docs/tbdex/pfi/anatomy-of-a-pfi#main-server-entrypoint) so that both you and the Wallet app can access it.
+
+## Get the Offering
+
+After inserting the `RFQ` into your database, you can search your database for the `Offering` the `RFQ` is requesting.
+
+RFQs contain a required `offeringId` field that you pass to your Offerings API provider’s `getOffering()` method to obtain the exact Offering.
+
+Building on the example from the [Exchange API Provider section](/docs/tbdex/pfi/anatomy-of-a-pfi#exchange-api-provider), your code might look like this:
+
+
+
+## Verify Credentials
+
+Upon receiving an `RFQ`, the tbDEX SDK will automatically [verify the submitted credentials](/) to guarantee their integrity and authenticity as well as ensure that they meet the `requiredClaims` specified in the `Offering`.
+
+## Create a Quote
+
+Before creating a `Quote` in response to the received `RFQ`, you can review the [protocol definition for Quotes](https://github.com/TBD54566975/tbdex/tree/main/specs/protocol#quote).
+With that in mind, you can then create your quote using the `Quote.create()` method as shown below:
+
+
+
+With the `Quote` created, you’ll then sign it for authorization purposes and write it to your own database:
+
+
+
+:::tip Note
+If the Wallet Application supplied a `replyTo` address with their RFQ, the tbDEX SDK will send the Quote to that address.
+
+If not, the Wallet Application will poll your PFI awaiting the Quote message to appear within the exchange.
+:::
diff --git a/site/docs/tbdex/pfi/onboarding.mdx b/site/docs/tbdex/pfi/onboarding.mdx
new file mode 100644
index 0000000..940e6c4
--- /dev/null
+++ b/site/docs/tbdex/pfi/onboarding.mdx
@@ -0,0 +1,42 @@
+---
+sidebar_position: 3
+title: Onboarding
+hide_title: true
+---
+
+
+
+# Onboarding
+
+Before beginning development of your PFI’s code, you’ll need to create an identity to use on the network. A tbDEX network is built to be decentralized, which is why you’ll need to create your own [Decentralized Identifier](/) (DID) to assign to the PFI. That DID will represent the PFI, as well as serve as the signer for tbDEX messages and resources that are sent to other parties.
+
+DIDs are associated with [DID Documents](/) which describe how to engage with your PFI.
+
+To create a DID and identify yourself as a PFI, use the `web5/dids` package:
+
+### Import Classes
+
+
+
+### Create DID with Service Endpoint
+
+For a DID to be recognized as a PFI, it is important to include a service endpoint in the DID document. The value for `serviceEndpoint` should be the URL to your PFI's service entry.
+
+If you also have an existing key management system to secure your secrets e.g [AWS KMS](https://aws.amazon.com/kms/), [Google Cloud KMS](https://cloud.google.com/security/products/security-key-management) etc, creating a DID provides a `keyManager` interface that you can pass it through.
+
+
+
+:::note Notes
+
+- `LocalKeyManager` or `InMemoryKeyManager` should only be used in non-production environments. See [Key Management Service](/) for more details.
+ :::
diff --git a/site/docs/tbdex/pfi/overview.mdx b/site/docs/tbdex/pfi/overview.mdx
new file mode 100644
index 0000000..2ebfae8
--- /dev/null
+++ b/site/docs/tbdex/pfi/overview.mdx
@@ -0,0 +1,24 @@
+---
+sidebar_position: 1
+---
+
+# PFI Overview
+
+PFIs are **Participating Financial Institutions** that offer liquidity on a tbDEX network.
+
+PFIs make themselves known to [Wallet applications](/docs/tbdex/wallet/overview) and engage in verifying necessary information for transaction completion with [Verifiable Credential](/) Issuers.
+
+For more on how PFIs fit into the overall structure of tbDEX, please [refer to the tbDEX overview](/docs/tbdex/#example-scenario).
+
+The PFI guides are intended to provide you with what you need to begin participating on a tbDEX network.
+
+## Recommended Path
+
+1. [tbDEX Overview](/docs/tbdex/)
+2. [Review Message Types](/docs/tbdex/message-types)
+3. [Install Required SDKs](/docs/tbdex/pfi/required-sdks)
+4. [Onboard as a PFI](/)
+5. [Review Anatomy of a PFI](/docs/tbdex/pfi/anatomy-of-a-pfi)
+6. [Create Offerings](/docs/tbdex/pfi/creating-offerings)
+7. [Create Quotes](/docs/tbdex/pfi/creating-quotes)
+8. [Process Orders](/docs/tbdex/pfi/processing-orders)
diff --git a/site/docs/tbdex/pfi/processing-orders.mdx b/site/docs/tbdex/pfi/processing-orders.mdx
new file mode 100644
index 0000000..a976de2
--- /dev/null
+++ b/site/docs/tbdex/pfi/processing-orders.mdx
@@ -0,0 +1,65 @@
+---
+title: Processing Orders
+sidebar_position: 9
+hide_title: true
+---
+
+
+
+# Processing Orders
+
+After the Wallet app receives a [Quote](/docs/tbdex/pfi/creating-quotes) from your PFI, they are able to submit an Order.
+This guide covers how to use tbDEX to communicate progress on Orders you receive.
+
+## Receiving an Order
+
+When a Wallet application places an order, your server's `onSubmitOrder()` callback parameter will be invoked.
+This is where you should implement your business logic for handling these incoming orders.
+
+As a best practice, store the `Order` message in your [Exchanges database](/docs/tbdex/pfi/anatomy-of-a-pfi#main-server-entrypoint).
+
+## Accessing Hashed Data
+
+The payment details for the Order were specified in the that was sent by the Wallet application.
+
+Sensitive information such as payment details and claims are hashed and are accessible from the [privateData](https://github.com/TBD54566975/tbdex/tree/main/specs/protocol#privatedata-1) section of the RFQ:
+
+
+
+Using this information, you are free to use the logic of choice to fulfill the Order.
+
+:::note
+tbDEX is a messaging protocol that facilitates communication to enable transactions but does not actually provide the APIs to fulfill them.
+That responsibility lies with the transacting parties.
+:::
+
+## Provide Order Status
+As you deem appropriate for your customers, you can provide them with to keep them updated on the status of their `Order`:
+
+
+
+If the Wallet application supplied a `replyTo` address, the tbDEX SDK will send the `OrderStatus` message there.
+
+You should also write the `OrderStatus` to your database and the Wallet will poll for these updates.
+
+
+## Close the Order
+
+When the `Order` has reached a terminal state (e.g. order fulfilled, order rejected, etc), you can create a `Close` message, which will be the final message of the thread:
+
+
+
+After writing the `Close` message to your database, the Wallet will be able to know that their transaction has closed via polling or callback.
\ No newline at end of file
diff --git a/site/docs/tbdex/pfi/required-sdks.mdx b/site/docs/tbdex/pfi/required-sdks.mdx
new file mode 100644
index 0000000..ef0651d
--- /dev/null
+++ b/site/docs/tbdex/pfi/required-sdks.mdx
@@ -0,0 +1,54 @@
+---
+sidebar_position: 2
+title: Required SDKs
+hide_title: true
+---
+
+
+
+# Required SDKs
+
+To implement and operate as a PFI, you’ll need to use the following SDKs:
+
+- **@web5/dids** - To work with [Decentralized Identifiers (DID)](/), including creating an identity, and performing any other required cryptographic functions, you’ll need this package. Check out [Key Management Service](/) for DIDs in production environments.
+
+- **@web5/credentials** - Enable verification of your customer information, including information such as customer’s identity or whether a customer is on a sanctions list. [Verifiable Credentials (VC)](/) provide a decentralized and trustworthy way of verifying a customer.
+
+- **@tbdex/http-server** - Enable convenience methods for setting up routing and networking to facilitate your PFI.
+
+## Install SDKs
+
+
+
+## Import Classes
+
+To send and receive tbDEX messages, import the following classes:
+
+
diff --git a/site/docs/tbdex/wallet-quickstart.mdx b/site/docs/tbdex/wallet-quickstart.mdx
new file mode 100644
index 0000000..d145f84
--- /dev/null
+++ b/site/docs/tbdex/wallet-quickstart.mdx
@@ -0,0 +1,221 @@
+---
+sidebar_position: 2
+title: 'Quickstart: Wallet'
+hide_title: true
+---
+
+import { QuickstartExecutionProvider } from '@site/src/components/QuickstartExecutionContext';
+import Version from '@site/src/components/Version';
+import PackageJson from '@site/src/components/PackageJson';
+import CodeSnippet from '@site/src/components/CodeSnippet';
+import WalletQuickstartCodeRunner from '@site/src/components/WalletQuickstartCodeRunner';
+
+
+# tbDEX Wallet in 5️⃣ minutes
+
+## Overview
+
+The role of a Wallet App in a tbDEX ecosystem is to find liquidity for its customers. Let’s build a tbDEX-enabled wallet in under 5 minutes. You will learn how to:
+
+✅ Integrate the tbDEX SDK into a wallet app
+
+✅ Connect a wallet app with a PFI (Participating Financial Institution)
+
+✅ Use a wallet app to send tbDEX messages to a PFI to facilitate a transaction
+
+Let’s go!
+
+## Wallet App Basics
+
+In this exercise, your app is responsible for helping your customer, Alice, exchange `USD` for `KES`. First, we'll create a [DID (Decentralized Identifier)](/) for Alice.
+
+### Create Customer's DID
+
+In order for you to communicate with PFIs on your customers' behalf, they will need a DID. Let's [create a DID](/) for Alice now:
+
+
+
+
+
+## Connect to a PFI
+
+To connect to a PFI, all you need is their DID. Let's use the DID of a mock PFI:
+
+
+
+## Get Offerings
+
+All PFIs have [Offerings](/docs/tbdex/message-types#offerings) which are a menu of services they provide. Offerings describe the currency pairs and transaction parameters offered. Let's fetch all of the offerings from the PFI:
+
+
+
+
+
+Once you have all of the PFI's offerings, you can filter it based on a variety of factors, including the currency pair you're looking for. In this case, you're looking for an offering that exchanges `USD` for `KES`:
+
+
+
+#### Obtain Verifiable Credentials
+
+The Offering we selected has a `requiredClaims` section that specifies [Verifiable Credentials](/) (VCs) Alice needs in order to be eligible for the Offering. This PFI requires Alice to have a credential whose `credentialSchema` matches the schema of the `KnownCustomerCredential`, as outlined in the `requiredClaims` section of the Offering. Additionally, that credential must be issued by a specific issuer as described by the issuer's DID below:
+
+```js
+{"requiredClaims": {
+ "id": "3f78edc1-9f75-478b-a0d8-c9ee2550d366",
+ "format": {
+ "jwt_vc": {
+ "alg": [
+ "ES256K",
+ "EdDSA"
+ ]
+ }
+ },
+ "input_descriptors": [
+ {
+ "id": "73b86039-d07e-4f9a-9f3d-a8f7a8ec1635",
+ "constraints": {
+ "fields": [
+ {
+ "path": [
+ "$.vc.credentialSchema.id",
+ "$.credentialSchema.id"
+ ],
+ "filter": {
+ "type": "string",
+ //highlight-start
+ "const": "https://vc.schemas.host/kcc.schema.json"
+ //highlight-end
+ }
+ },
+ {
+ "path": [
+ "$.vc.issuer",
+ "$.issuer"
+ ],
+ "filter": {
+ "type": "string",
+ //highlight-start
+ "const": "did:dht:bh8me68fsdb6xuyy3dsh4aanczexga3k3m7fk4ie6hj5jy6inq5y"
+ //highlight-end
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+```
+
+As a result, we'll help Alice apply for the `SanctionsCredential` she needs to satisfy the PFI's requirements:
+
+
+
+VCs are stored as JSON Web Tokens (JWTs). Your wallet app has saved Alice's new VC into an array named `customerCredentials`. Let's now select Alice’s credential to meet the PFI's requirements:
+
+
+
+## Request Quote
+
+Now that you've found an offering that matches Alice's request, your app can request a quote from the PFI to obtain a formal offer based on Alice's preferred payment methods.
+
+
+
+
+
+After creating an RFQ message, you can verify that it is properly constructed and its data satisfies the Offering's requirements.
+
+If no exceptions are thrown, you'll sign the RFQ with Alice's DID to ensure its authenticity.
+
+Then finally, you'll send the RFQ to the PFI to initiate the transaction.
+
+
+
+
+
+## Process Quote
+
+In response to your RFQ, the PFI will write a Quote message to the exchange if they are able to fulfill Alice's request, or a Close message if not. Here's how to obtain that message:
+
+
+
+
+
+## Place Order
+
+The Quote contains the exact exchange rate including any fees. Your app can present this to Alice to determine if she wants to proceed with the transaction. If she does, you'll create an Order message:
+
+
+
+
+
+Once you have an order message, you can sign it with Alice's DID and send it to the PFI to execute the transaction.
+
+
+
+
+
+## End Transaction
+
+To end the transaction, the PFI will write a Close message indicating whether the transaction successfully completed or not. They'll also include a reason for closing the transaction which will contain more information that you may find helpful in event of a failure.
+
+
+
+
+
+## Next Steps with tbDEX
+
+Congratulations on creating your first Wallet! In just a few minutes you were able to contact a PFI for its offerings, request a quote, and place an order for Alice to swap USD for KES.
+
+If you’d like to get started building an even more robust wallet, you can see our full [Wallet guide](/docs/tbdex/wallet/overview). Additionally, you can learn more about [building your own PFI](/docs/tbdex/pfi/overview), as well as [becoming a Credential Issuer](/docs/tbdex/issuer/overview) on the tbDEX network too!
+
+
diff --git a/site/docs/tbdex/wallet/_category_.json b/site/docs/tbdex/wallet/_category_.json
new file mode 100644
index 0000000..832f1a1
--- /dev/null
+++ b/site/docs/tbdex/wallet/_category_.json
@@ -0,0 +1,4 @@
+{
+ "label": "Wallets",
+ "position": 5
+}
diff --git a/site/docs/tbdex/wallet/allowlist-pfis.mdx b/site/docs/tbdex/wallet/allowlist-pfis.mdx
new file mode 100644
index 0000000..ec21947
--- /dev/null
+++ b/site/docs/tbdex/wallet/allowlist-pfis.mdx
@@ -0,0 +1,44 @@
+---
+title: Allowlisting PFIs
+hide_title: true
+sidebar_position: 4
+---
+
+
+
+# Allowlisting PFIs
+
+While tbDEX is a permissionless network where any PFI can participate, you may want to curate your own list of PFIs in which you engage with. We refer to this as **allowlisting**.
+
+Allowlisting is the process of approving or recognizing specific PFIs as trusted entities.
+This is a recommended security measure to ensure that your application interacts only with verified and reliable PFIs within the tbDEX network.
+
+Here are general steps your application should follow to allowlist PFIs:
+
+## Identify Potential PFIs
+
+Research and identify PFIs that align with the types of transactions you'd like to offer to your customers.
+Consider factors like transaction fees, currency pairs offered, and reputation.
+
+To determine if a PFI is part of the tbDEX network, you can check their [DID document](/) for the `PFI` service type:
+
+
+
+## Verify PFI Credentials
+
+Determine if there are certain credentials you require from a PFI, such as regulatory compliance status.
+These may or may not be provided in the form of verifiable credentials.
+
+## Allowlist PFI
+
+The approach you take to maintain a list of verified PFIs is your choice.
+This could be a database table of allowlisted PFIs, where you store details such as the PFIs' DIDs.
+
+It's recommended that you regularly review the PFIs on your network.
+Monitor your customers' satisfaction when transacting with specific PFIs, and remove any that no longer meet your standards.
diff --git a/site/docs/tbdex/wallet/get-offerings.mdx b/site/docs/tbdex/wallet/get-offerings.mdx
new file mode 100644
index 0000000..f9d0b06
--- /dev/null
+++ b/site/docs/tbdex/wallet/get-offerings.mdx
@@ -0,0 +1,46 @@
+---
+title: Get Offerings
+hide_title: true
+sidebar_position: 5
+---
+
+
+
+# Get Offerings
+
+An [Offering](/docs/tbdex/pfi/creating-offerings#offering-object) describes a currency pair that can be exchanged.
+They also specify any requirements, conditions, and constraints needed to fulfill the described transaction.
+This can include exchange rates, minimum and maximum transaction sizes, and other relevant details.
+
+In other words, an Offering is a way of describing a financial product that a PFI is offering on a tbDEX network.
+
+## Get Offerings from PFI
+
+
+
+
+## Find Matching Offerings
+
+Let's say your customer is looking to exchange USD for KES.
+As a wallet application, you would loop through your list of PFIs and make a request to each to obtain their list of Offerings and determine if any offer this currency pair.
+You'd then provide a list of the matching Offerings to Alice, showing her the options available.
+
+Let's walk through how this is done.
+
+Given you have a list of PFIs on your network, you can check their Offerings for any matches:
+
+
+
+Now, you'd present the `matchedOfferings` to Alice.
\ No newline at end of file
diff --git a/site/docs/tbdex/wallet/managing-credentials.mdx b/site/docs/tbdex/wallet/managing-credentials.mdx
new file mode 100644
index 0000000..3a9f54e
--- /dev/null
+++ b/site/docs/tbdex/wallet/managing-credentials.mdx
@@ -0,0 +1,140 @@
+---
+title: Managing Credentials
+hide_title: true
+sidebar_position: 6
+---
+
+
+
+# Managing Credentials
+
+Within a tbDEX network, [Verifiable Credentials (VC)](/) play a critical role in establishing trust and ensuring regulatory compliance during transactions.
+
+VCs are digital proofs that may be required by PFIs in order to verify your customers.
+So, your application will serve as an agent who presents a customer's credentials to a PFI as part of the transaction flow.
+
+:::info KYC Credentials
+One of the most common credentials required during transactions via tbDEX are ones used to adhere to Know Your Customer (KYC) regulations.
+Learn how to request a [Known Customer Credential](/) that your customers can use with PFIs.
+:::
+
+## Storing Credentials
+
+As part of a customer's profile, your application can choose to store credentials that have been issued to them.
+
+Signed VCs are converted into a JSON Web Token ([JWT](https://jwt.io/)), which is a compact, URL-safe means of representing claims to be transferred between two parties.
+JWT format is used to encode the credentials, making them both secure and easily transmissible.
+
+Storing your customers' credentials in this format is sufficient for use on a tbDEX network.
+
+:::info Create a Decentralized Identifier (DID) for Customer
+Customer credentials are tied to their [DID](/). Wallets will have to [create a DID](/) for customers that don't have one yet.
+:::
+
+## Required Claims
+
+PFI Offerings contain a `requiredClaims` section that provides a definition of the credentials that must be presented as part of the [RFQ message](/docs/tbdex/wallet/send-rfq).
+
+You can obtain the `requiredClaims` from an Offering via:
+
+
+
+In the following example of a `requiredClaims` section of an Offering, the PFI has specified that the customer must provide a VC of type **SanctionsCredential**:
+
+```js
+{
+ 'id': '6bdaec32-e511-489d-b2fd-27a051bd819b',
+ 'input_descriptors': [
+ {
+ 'id': '65752b5a-a454-4605-85de-7f159b22ce01',
+ 'purpose': 'We need to know if you are a sanctioned individual',
+ 'constraints': {
+ 'fields': [
+ //highlight-start
+ {
+ 'path': [ '$.type[*]' ],
+ 'filter': {
+ 'type': 'string',
+ 'const': 'SanctionsCredential'
+ }
+ }
+ //highlight-end
+ ]
+ }
+ }
+ ]
+}
+```
+
+## Obtain Eligible Offerings
+
+With a network of multiple PFIs, there will likely be several Offerings that match your customer's desired currency pairing.
+You can narrow these options down even further by filtering for the ones where the customer's existing VCs satisfy the Offering's requirements:
+
+
+
+Here, we skip offerings where the customer's VCs do not satisfy the Offering's requirements.
+However, your application may choose to include these in the matched Offerings and still present them to the customer, indicating that they'd need to obtain the necessary credentials to satisfy the Offering's requirements.
+
+Your application could even apply for certain credentials on behalf of the customer, or [issue credentials](/) that you have the credibility to do so.
+
+## Select Credentials that Satisfy Requirements
+
+Once your customer selects the Offering they'd like to request a quote for, you'll need to choose the credentials needed for the RFQ.
+
+In the section above, we checked across all of the customer's VCs to see if they meet the PFI's specified combined criteria.
+However, you'll only want to select the ones that are actually required.
+
+To do so, pass the customer's credentials and the `requiredClaims` section of the Offering to `selectCredentials()`:
+
+
+
+The `selectedCredentials` will be a part of the [RFQ](/docs/tbdex/wallet/send-rfq) that you create on behalf of your customer.
diff --git a/site/docs/tbdex/wallet/overview.mdx b/site/docs/tbdex/wallet/overview.mdx
new file mode 100644
index 0000000..5a32cb7
--- /dev/null
+++ b/site/docs/tbdex/wallet/overview.mdx
@@ -0,0 +1,40 @@
+---
+sidebar_position: 1
+---
+
+# Wallet Overview
+
+
+ VIDEO
+
+
+Wallet applications serve as agents in facilitating transactions for individuals seeking liquidity offered by [Participating Financial Institutions (PFIs)](/docs/tbdex/pfi/overview).
+This network is instrumental in providing compliant and seamless transactions across various systems and international borders.
+
+As intermediaries, Wallets often manage [Decentralized Identifiers (DIDs)](/) and [Verifiable Credentials (VCs)](/) on behalf of their users.
+These elements are essential for identity verification and are strategically utilized during transactions to ensure security and compliance with regulatory standards.
+
+For a comprehensive understanding of how Wallet applications integrate and function within the broader tbDEX ecosystem, we recommend referring to the [tbDEX overview](/docs/tbdex/#example-scenario).
+
+The Wallet guides are designed to equip you with the necessary insights and tools to build your network of PFIs.
+This network enables you to effectively meet the diverse financial needs of your customers, fostering a secure and efficient transaction environment.
+
+## Recommended Path
+
+1. [tbDEX Overview](/docs/tbdex/)
+2. [Review Message Types](/docs/tbdex/message-types)
+3. [Install Required SDKs](/docs/tbdex/wallet/required-sdks)
+4. [Create Network of PFIs](/docs/tbdex/wallet/allowlist-pfis)
+5. [Get Offerings](/docs/tbdex/wallet/get-offerings)
+6. [Create Customer's DID](//)
+7. [Manage Credentials](/docs/tbdex/wallet/managing-credentials)
+8. [Request Quotes](/docs/tbdex/wallet/send-rfq)
+9. [Receive Quotes](/docs/tbdex/wallet/receive-quote)
+10. [Place Orders](/docs/tbdex/wallet/place-order)
diff --git a/site/docs/tbdex/wallet/place-order.mdx b/site/docs/tbdex/wallet/place-order.mdx
new file mode 100644
index 0000000..069778f
--- /dev/null
+++ b/site/docs/tbdex/wallet/place-order.mdx
@@ -0,0 +1,101 @@
+---
+title: Placing Orders
+hide_title: true
+sidebar_position: 9
+---
+
+
+
+# Placing Orders
+
+Once the PFI writes a [Quote](/docs/tbdex/wallet/receive-quote) message to the exchange in response to an [RFQ](/docs/tbdex/wallet/send-rfq), you'd present that Quote to your customer and give them the option to place an **Order**.
+
+If the customer chooses to place the order, your application will create an Order object, send it to the PFI, listen for status updates, and wait until the order is closed.
+
+## Create Order Object
+To place an Order in response to a Quote, the first step is to create the `Order` object.
+This instantiates a new Order, including metadata such as the customer's DID, the PFI's DID, the exchange ID obtained from the Quote, and the tbDEX protocol version being used.
+
+
+
+## Sign Order
+
+Then sign the Order with the customer's [Portable DID](/docs/glossary#portable-did):
+
+
+
+## Send Order
+After creating and signing the Order, it needs to be sent to the PFI via the following:
+
+
+
+
+## Listen for Order Status Updates
+As the PFI is processing the Order, they'll provide `OrderStatus` messages.
+Your application would likely want to show these status updates to your customer to keep them informed of progress.
+
+If you provided a [callback URI](/docs/tbdex/wallet/send-rfq#send-rfq-to-pfi) when sending the RFQ, the PFI will send the `OrderStatus` messages there.
+
+Otherwise, the PFI will write the `OrderStatus` messages to the exchange to keep you posted on the Order's status, and your application can poll the exchange to continuously check for `OrderStatus` messages until a `Close` message has been written to the exchange:
+
+
+
+## Receive Close Message
+
+Once a `Close` message is written, the exchange is ended and no additional messages can be added to the exchange.
+
+**Example of Close message**
+
+```js
+{
+ "metadata": {
+ "from": " /* PFI DID */ ",
+ "to": " /* CUSTOMER DID */ ",
+ "exchangeId": "rfq_01hj2g5wrzfp4tmrfkhz277g9w",
+ "protocol": "1.0",
+ "kind": "close",
+ "id": "close_01hj2g6493fadax5xazq2d2da6",
+ "createdAt": "2023-12-20T02:16:59.939Z"
+ },
+ "data": {
+ "reason": "Order fulfilled",
+ "success": true
+ },
+ "signature": " /* PFI's cryptographic signature */ "
+}
+```
+
+When the PFI closes the Order, it's important to check the `success` indicator to determine if the transaction was completed successfully.
+In the event that it was not, there is a `reason` on the Close message that should provide more detail.
+
+
diff --git a/site/docs/tbdex/wallet/receive-quote.mdx b/site/docs/tbdex/wallet/receive-quote.mdx
new file mode 100644
index 0000000..2f6f71f
--- /dev/null
+++ b/site/docs/tbdex/wallet/receive-quote.mdx
@@ -0,0 +1,83 @@
+---
+title: Receiving Quotes
+hide_title: true
+sidebar_position: 8
+---
+
+
+
+# Receiving Quotes
+
+After [sending an RFQ](/docs/tbdex/wallet/send-rfq#send-rfq-to-pfi), the PFI will respond with an exact **Quote** for your customer.
+This message will be written to the exchange.
+
+## Polling for Quote
+
+If you did not provide a [callback URI](/docs/tbdex/wallet/send-rfq#send-rfq-to-pfi) when sending a RFQ, your application will need to poll the exchange until the Quote message is written:
+
+
+
+## Quote Object
+
+Now that you've received a Quote, you can present it to your customer and give them the option to [place an Order](/docs/tbdex/wallet/place-order/) or cancel the exchange.
+
+The Quote will be returned in JSON form:
+
+```js
+{
+ "metadata": {
+ "exchangeId": "rfq_01hj07tb0rev8avhmqd8gggnkh",
+ "from": " /* PFI's DID */ ",
+ "to": " /* Customer's DID */ ",
+ "protocol": "1.0",
+ "kind": "quote",
+ "id": "quote_01hj07tb6be2htn8bbx8afcjw9",
+ "createdAt": "2023-12-19T05:12:16.331Z"
+ },
+ "data": {
+ "expiresAt": "2024-05-01T05:00:00.000Z",
+ "payin": {
+ "currencyCode": "BTC",
+ "amount": "0.01",
+ "fee": "0.0001",
+ "paymentInstruction": {
+ "link": "https://example.com/payinInstructions",
+ "instruction": "Instructions for customer to pay PFI"
+ }
+ },
+ "payout": {
+ "currencyCode": "KES",
+ "amount": "123456789",
+ "paymentInstruction": {
+ "link": "https://example.com/payoutInstructions",
+ "instruction": "Instructions for PFI to pay customer"
+ }
+ }
+ },
+ "signature": " /* PFI's cryptographic signature */ "
+}
+```
+
+
+## Cancel Exchange
+
+After receiving the exact Quote, your customer may decide not to place an order.
+In this case, you can send a **Close** message to the PFI which will end the exchange.
+
+To terminate the exchange, create a `Close` message, sign it with the customer's [Bearer DID](/docs/glossary#bearer-did), and send the message.
+
+
+
+At this point, the exchange has been closed, and your customer is free to start a new exchange with this PFI or any other.
diff --git a/site/docs/tbdex/wallet/required-sdks.mdx b/site/docs/tbdex/wallet/required-sdks.mdx
new file mode 100644
index 0000000..11ba4a6
--- /dev/null
+++ b/site/docs/tbdex/wallet/required-sdks.mdx
@@ -0,0 +1,94 @@
+---
+sidebar_position: 2
+title: Required SDKs
+hide_title: true
+---
+
+
+
+# Required SDKs
+
+To implement and operate as a Wallet on a tbDEX network, you’ll need to use the following SDKs:
+
+- **web5/dids** - Enables the creation of [Decentralized Identifiers (DID)](/) for your customers and perform any other required cryptographic functions, you can use the DIDs package. Check out [Key Management Service](/) for DIDs in production environments.
+
+- **web5/credentials** - Enable the presentation of [Verifiable Credentials (VC)](/) to PFIs on your customers' behalf. You may also want to verify that the PFIs you wish to engage with have certain credentials.
+
+- **tbdex/client** - Enables your application to send tbDEX messages to PFIs.
+
+## Install SDKs
+
+
+
+
+
+
+ Android Setup
+
+ In order to have a smooth Android development experience, we've found the following to be helpful. Firstly, be sure to exclude `META-INF/DEPENDENCIES` as follows in your `build.gradle.kts` file:
+
+ ```kotlin
+ android {
+ packagingOptions {
+ exclude("META-INF/DEPENDENCIES")
+ }
+ }
+ ```
+
+ Additionally, you'll want to modify your `dependencies` object to look like the following:
+
+ ```kotlin
+
+ dependencies {
+
+ implementation("xyz.block:tbdex-httpclient:0.11.0-beta") {
+ exclude(group = "com.google.protobuf", module = "protobuf-java")
+ exclude(group = "org.bouncycastle", module = "bcprov-jdk18on")
+ exclude(group = "com.github.stephenc.jcip", module = "jcip-annotations")
+ exclude(group = "com.google.crypto.tink", module="tink")
+ }
+
+ implementation("xyz.block:tbdex-protocol:0.11.0-beta") {
+ exclude(group = "com.google.protobuf", module = "protobuf-java")
+ exclude(group = "org.bouncycastle", module = "bcprov-jdk18on")
+ exclude(group = "com.github.stephenc.jcip", module = "jcip-annotations")
+ exclude(group = "com.google.crypto.tink", module="tink")
+
+ }
+
+ }
+ ```
+
+ Specifically, note the exclusion of a number of dependencies so that your app uses the versions of these libraries that are shipped with Android.
+
+
+
+
+
+## Import Classes
+
+To send and receive tbDEX messages, import the following classes:
+
+
diff --git a/site/docs/tbdex/wallet/send-rfq.mdx b/site/docs/tbdex/wallet/send-rfq.mdx
new file mode 100644
index 0000000..5f9e912
--- /dev/null
+++ b/site/docs/tbdex/wallet/send-rfq.mdx
@@ -0,0 +1,176 @@
+---
+title: Sending RFQs
+hide_title: true
+sidebar_position: 7
+---
+
+
+
+# Sending RFQs
+
+After your customer selects an [Offering](/docs/tbdex/pfi/creating-offerings), the next step is to send a **Request for Quote (RFQ)** to the PFI in order to initiate the transaction.
+The Offering provided an estimate, but the Quote will provide a formal offer based on the financial transaction the customer is requesting as well as the payment methods provided.
+
+## Create the RFQ
+An RFQ is a structured tbDEX message that specifies the details of the transaction your customer wishes to make.
+It includes information about the Offering, payment methods, and any required [verifiable credentials (VCs)](/docs/tbdex/wallet/managing-credentials).
+
+To create the message, construct an RFQ passing metadata and data:
+
+
+
+### metadata
+The metadata properties identify the DIDs of the sender (your customer), the recipient (the PFI), and the version of the tbDEX protocol you're using:
+
+
+
+### data
+The data properties contain the specifics of the transaction, such as the id of the Offering you're requesting the Quote for, payment methods, and credentials:
+
+* **offeringId** - The unique identifier of the PFI's Offering the customer is interested in
+* **payin** - How the customer intends to pay the PFI
+ * **kind** - Type of payment method e.g. BTC_ADDRESS, DEBIT_CARD, MOMO_MPESA
+ * **amount** - Total amount of currency the customer wants to pay in exchange for payout currency
+ * **paymentDetails** - The exact details of the payment method. As this information is sensitive, the SDK will convert these details into [salted hashes](https://github.com/TBD54566975/tbdex/tree/main/specs/protocol#privatedata-1)
+* **payout** - How the customer wishes to receive the payout from the PFI
+ * **kind** - Type of payment method e.g. BTC_ADDRESS, BANK_ACCOUNT, MOMO_MPESA
+ * **paymentDetails** - The exact details of the payment method. As this information is sensitive, the SDK will convert these details into [salted hashes](https://github.com/TBD54566975/tbdex/tree/main/specs/protocol#privatedata-1)
+* **claims** - The [VCs that satisfy the requirements of the Offer](/docs/tbdex/wallet/managing-credentials#select-credentials-that-satisfy-requirements). As this information is sensitive, the SDK will convert these details into [salted hashes](https://github.com/TBD54566975/tbdex/tree/main/specs/protocol#privatedata-1)
+
+
+
+## Verify RFQ Data
+Before sending the RFQ to the PFI, you can verify that the `data` within the RFQ satisfies the Offering's requirements.
+
+
+
+This will throw an error for any of the following:
+* `data.offeringId` doesn't match the provided Offering's id
+* `data.payin.amount` exceeds the provided Offering's max units allowed or is below the Offering's min units allowed
+* `data.payin.kind` does not match the provided Offering's payin kinds
+* `data.payout.kind` does not match the provided Offering's payout kinds
+* `data.payin.paymentDetails` doesn't satisfy the Offering's `requiredPaymentDetails`
+* `data.payout.paymentDetails` doesn't satisfy the Offering's `requiredPaymentDetails`
+* `data.claims` does not contain JWTs for VCs that match the Offering's `requiredClaims`
+
+**Example error output**
+
+> Error: offering does not support rfq's payinMethod kind. (rfq) BTC_ADDRESS was not found in: [BANK_ACCOUNT] (offering)
+
+
+
+## Sign the RFQ
+Signing the RFQ ensures its authenticity. You can do so with the customer's [Bearer DID](/docs/glossary#bearer-did):
+
+
+
+
+## Send RFQ to PFI
+Use `TbdexHttpClient` to send the RFQ to the PFI. If no error is thrown, the RFQ has been successfully sent to the PFI and an **exchange** has been created.
+This exchange serves as a thread of messages between your application and the PFI regarding this transaction.
+
+
+
+The next message written to the exchange will be a [Quote](/docs/tbdex/wallet/receive-quote) from the PFI.
+You'll need to [poll the PFI](/docs/tbdex/wallet/receive-quote#polling-for-quote) to receive the `Quote` and all other messages within the exchange, unless you provide an `replyTo` callback when sending the RFQ.
+
+### Optional Callback
+If your wallet application has a deployed server, you can provide a callback when sending the RFQ.
+Callbacks are fully qualified URIs (DID or URL) that can be provided to the PFI via the optional `replyTo` property.
+
+If `replyTo` is provided, the PFI will send all new messages of the exchange to the supplied URI.
+This URI is scoped to each exchange, allowing you to specify a different URI per exchange if desired.
+
+:::tip No Callback
+If a callback is not provided, you'll need to [poll the PFI](/docs/tbdex/wallet/receive-quote#polling-for-quote) to receive the `Quote` and all other messages within the exchange.
+:::
+
+#### Callback as a URL
+
+
+
+#### Callback as a DID
+
+To provide your wallet application's DID as the `replyTo` property, it must have a service type of `tbdex`.
+
+
+
+To use your DID as the `replyTo`, you'll provide its `uri`.
+
+
+
+
diff --git a/site/docusaurus.config.js b/site/docusaurus.config.js
new file mode 100644
index 0000000..01196bc
--- /dev/null
+++ b/site/docusaurus.config.js
@@ -0,0 +1,198 @@
+// @ts-check
+// Note: type annotations allow type checking and IDEs autocompletion
+
+import dotenv from 'dotenv';
+import { themes } from 'prism-react-renderer';
+import { dependencies } from './package.json';
+import SDK_VERSIONS from './sdk-versions.json';
+
+const lightCodeTheme = themes.github;
+const darkCodeTheme = themes.dracula;
+
+dotenv.config();
+
+const WEB5_VERSION = dependencies['@web5/api'];
+
+const algoliaApiKey = process.env.DOC_SEARCH_API_KEY;
+const algoliaIndexName = process.env.DOC_SEARCH_INDEX_NAME;
+const algoliaAppId = process.env.DOC_SEARCH_APP_ID;
+
+const feedbackWidgetApiUrl = process.env.FEEDBACK_WIDGET_API_URL;
+
+let algoliaConfig = null;
+if (algoliaApiKey && algoliaIndexName && algoliaAppId) {
+ algoliaConfig = {
+ appId: algoliaAppId,
+ apiKey: algoliaApiKey,
+ indexName: algoliaIndexName,
+ contextualSearch: true,
+ searchParameters: {},
+ };
+}
+
+/** @type {import('@docusaurus/types').Config} */
+let config = {
+ title: `Website`,
+ tagline: '',
+ organizationName: '54566975',
+ projectName: 'developer..website',
+ baseUrl: '/',
+ url: 'https://developer..website',
+ onBrokenLinks: 'warn',
+ onBrokenMarkdownLinks: 'warn',
+ favicon: '/img/favicon.ico',
+ markdown: {
+ mermaid: true,
+ },
+ themes: ['@docusaurus/theme-mermaid'],
+ customFields: {
+ WEB5_VERSION,
+ feedbackWidgetApiUrl,
+ SDK_VERSIONS,
+ },
+ plugins: ['docusaurus-tailwindcss', './webpackPlugin.js'],
+ scripts: [
+ {
+ src: 'https://www.datadoghq-browser-agent.com/us1/v4/datadog-rum.js',
+ async: true,
+ },
+ {
+ src: '/scripts/dd-analytics.js',
+ async: true,
+ },
+ {
+ src: '/scripts/custom.js',
+ async: true,
+ },
+ ],
+ presets: [
+ [
+ 'classic',
+ {
+ docs: {
+ sidebarPath: './sidebars.js',
+ breadcrumbs: false,
+ },
+ theme: {
+ customCss: './src/css/custom.css',
+ },
+ },
+ ],
+ [
+ 'redocusaurus',
+ {
+ specs: [],
+ theme: {
+ primaryColor: '#1890ff',
+ },
+ },
+ ],
+ ],
+
+ themeConfig: {
+ colorMode: {
+ defaultMode: 'dark',
+ disableSwitch: true,
+ respectPrefersColorScheme: false,
+ },
+ navbar: {
+ style: 'dark',
+
+ items: [
+ {
+ to: '/projects',
+ label: 'Projects',
+ position: 'left',
+ },
+ {
+ type: 'doc',
+ docId: 'index',
+ to: '/docs',
+ label: 'Docs',
+ position: 'left',
+ },
+ {
+ to: '#ask',
+ label: 'Ask 🤖',
+ },
+ ],
+ },
+ footer: {
+ style: 'dark',
+ links: [
+ {
+ title: 'Docs',
+ items: [
+ {
+ label: 'Tutorial',
+ to: '/docs/',
+ },
+ ],
+ },
+ {
+ title: 'Community',
+ items: [
+ {
+ label: 'Stack Overflow',
+ href: 'https://stackoverflow.com/questions/tagged/docusaurus',
+ },
+ {
+ label: 'Discord',
+ href: 'https://discordapp.com/invite/docusaurus',
+ },
+ {
+ label: 'Twitter',
+ href: 'https://twitter.com/docusaurus',
+ },
+ ],
+ },
+ {
+ title: 'More',
+ items: [
+ {
+ label: 'Blog',
+ to: '/blog',
+ },
+ {
+ label: 'GitHub',
+ href: 'https://github.com/facebook/docusaurus',
+ },
+ ],
+ },
+ ],
+ copyright: `Copyright © ${new Date().getFullYear()} My Project, Inc. Built with Docusaurus.`,
+ },
+ prism: {
+ theme: lightCodeTheme,
+ darkTheme: {
+ ...darkCodeTheme,
+ styles: [
+ ...darkCodeTheme.styles,
+ {
+ types: ['keyword', 'variable'],
+ style: {
+ color: 'rgb(189, 147, 249)',
+ },
+ },
+ ],
+ },
+ additionalLanguages: [
+ 'kotlin',
+ 'swift',
+ 'dart',
+ 'rust',
+ 'bash',
+ 'gradle',
+ ],
+ },
+ },
+};
+
+if (algoliaConfig) {
+ config.themeConfig = {
+ ...config.themeConfig,
+ algolia: algoliaConfig,
+ };
+}
+
+export default config;
diff --git a/site/event-sidebars.js b/site/event-sidebars.js
new file mode 100644
index 0000000..6e50254
--- /dev/null
+++ b/site/event-sidebars.js
@@ -0,0 +1,16 @@
+/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
+const sidebars = {
+ tutorialSidebar: [
+ {
+ type: 'category',
+ label: 'Events',
+ link: {
+ type: 'doc',
+ id: 'index',
+ },
+ items: [{ type: 'autogenerated', dirName: 'events' }],
+ },
+ ],
+};
+
+export default sidebars;
diff --git a/site/events/events/2023-01-13-areweweb5yet.md b/site/events/events/2023-01-13-areweweb5yet.md
new file mode 100644
index 0000000..1c452ad
--- /dev/null
+++ b/site/events/events/2023-01-13-areweweb5yet.md
@@ -0,0 +1,18 @@
+---
+title: Twitter Space - Are We Web5 Yet?
+
+sidebar_custom_props:
+ #type: video
+ timeEvent: '12pm ET'
+ thumbnail: '/img/twitter_space_are_we_web5_yet.png' #size: 2202 x 1242 px
+ locationEvent: 'Twitter'
+ locationLink: 'https://twitter.com/i/spaces/1mrGmkbnWQkxy'
+ dateEvent: January 13, 2023
+ description: 'Join our engineering team for updates on Web5'
+---
+
+##### January 13, 2023 Location: Twitter
+
+![Twitter Space: Are We Web5 Yet?](/img/twitter_space_are_we_web5_yet.png)
+
+Curious about the status of #Web5? [Join our engineering team for updates!](https://twitter.com/i/spaces/1mrGmkbnWQkxy)
\ No newline at end of file
diff --git a/site/events/events/2023-02-22-verifiable_credentials.md b/site/events/events/2023-02-22-verifiable_credentials.md
new file mode 100644
index 0000000..ca476be
--- /dev/null
+++ b/site/events/events/2023-02-22-verifiable_credentials.md
@@ -0,0 +1,18 @@
+---
+title: Twitter Space - Verifiable Credentials
+
+sidebar_custom_props:
+ #type: video
+ timeEvent: '12:30pm ET'
+ thumbnail: '/img/twitter_space_verifiable_credentials.png' #size: 2202 x 1242 px
+ locationEvent: 'Twitter'
+ #locationLink: ''
+ dateEvent: February 22, 2023
+ description: 'Auth0 and TBD discuss the state of Verifiable Credentials'
+---
+
+##### February 22, 2023 Location: Twitter
+
+![Twitter Space: Verifiable Credentials](/img/twitter_space_verifiable_credentials.png)
+
+The panel will discuss what are verifiable credentials, how are they being used today and how they envision them being used in the future.
\ No newline at end of file
diff --git a/site/events/events/2023-03-02-advancing_bitcoin_conf.md b/site/events/events/2023-03-02-advancing_bitcoin_conf.md
new file mode 100644
index 0000000..c120fb9
--- /dev/null
+++ b/site/events/events/2023-03-02-advancing_bitcoin_conf.md
@@ -0,0 +1,18 @@
+---
+title: Advancing Bitcoin Developer Conference
+
+sidebar_custom_props:
+ #type: video
+ #timeEvent: '12pm ET'
+ thumbnail: '/img/abc_conf_angie.png' #size: 2202 x 1242 px
+ locationEvent: 'London, UK'
+ locationLink: 'https://www.advancingbitcoin.com/'
+ dateEvent: March 2-3, 2023
+ description: 'Angie Jones will provide an overview of Web5 and how it can be used to build decentralized apps and protocols.'
+---
+
+##### March 2 - 3, 2023 Location: Twitter
+
+![Twitter Space: Are We Web5 Yet?](/img/abc_conf_angie.png)
+
+At Advancing Bitcoin Developer Conference, experienced Bitcoin developers will share their knowledge through 25 minute talks and panel discussions. Our very own Angie Jones will provide an overview of Web5 and how it can be used to build decentralized apps and protocols. [Register!](https://www.advancingbitcoin.com/)
diff --git a/site/events/index.mdx b/site/events/index.mdx
new file mode 100644
index 0000000..ce64355
--- /dev/null
+++ b/site/events/index.mdx
@@ -0,0 +1,10 @@
+---
+title: 'TBD in the wild...'
+---
+
+import { useCurrentSidebarCategory } from '@docusaurus/theme-common';
+import EventCardList from '@site/src/components/EventCardList';
+
+
+
+Event Cards
diff --git a/site/learn-sidebars.js b/site/learn-sidebars.js
new file mode 100644
index 0000000..4aa6176
--- /dev/null
+++ b/site/learn-sidebars.js
@@ -0,0 +1,17 @@
+/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
+const sidebars = {
+ tutorialSidebar: [
+ {
+ type: 'category',
+ label: 'Discussions',
+ collapsed: true,
+ link: {
+ type: 'doc',
+ id: 'index',
+ },
+ items: [{ type: 'autogenerated', dirName: 'discussions' }],
+ },
+ ],
+};
+
+export default sidebars;
diff --git a/site/learn/_index-concepts.mdx b/site/learn/_index-concepts.mdx
new file mode 100644
index 0000000..9d3de26
--- /dev/null
+++ b/site/learn/_index-concepts.mdx
@@ -0,0 +1,11 @@
+---
+title: 'Concept landing title will go here'
+---
+
+import DocCardList from '@theme/DocCardList';
+import { useCurrentSidebarCategory } from '@docusaurus/theme-common';
+import LearnCardList from '@site/src/components/LearnCardList';
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Neque volutpat ac tincidunt vitae semper quis lectus. Pellentesque habitant morbi tristique senectus et netus. Viverra aliquet eget sit amet tellus cras adipiscing enim eu.
+
+
diff --git a/site/learn/discussions/architectural-concerns-blockchain.mdx b/site/learn/discussions/architectural-concerns-blockchain.mdx
new file mode 100644
index 0000000..ff1f9b7
--- /dev/null
+++ b/site/learn/discussions/architectural-concerns-blockchain.mdx
@@ -0,0 +1,46 @@
+---
+title: Architectural Concerns with Blockchain
+sidebar_position: 5
+sidebar_custom_props:
+ type: audio
+ duration: '1:26:00'
+ guestslist: [Grady Booch]
+ description: 'An open discussion about the architecture of various blockchains and why experienced software architects are concerned.'
+ thumbnail: /img/learn/architectural_concerns_with_blockchain.png
+---
+
+import HighlightsEmbedGrid from '@site/src/components/HighlightsEmbedGrid';
+import Audio from '@site/src/components/Audio';
+import BiographyList from '@site/src/components/BiographyList';
+
+
+
+An open discussion about the architecture of various blockchains and why experienced software architects are concerned.
+
+
+
+
+
+
diff --git a/site/learn/discussions/blockchain-crypto-tbd.mdx b/site/learn/discussions/blockchain-crypto-tbd.mdx
new file mode 100644
index 0000000..952a809
--- /dev/null
+++ b/site/learn/discussions/blockchain-crypto-tbd.mdx
@@ -0,0 +1,46 @@
+---
+title: 'Blockchain, Crypto, and TBD...oh my!'
+sidebar_position: 1
+sidebar_custom_props:
+ type: audio
+ duration: '1:30:25'
+ guestslist: [Mike Brock]
+ description: "An open discussion about blockchain, bitcoin, web3, and decentralization with TBD's General Manager."
+ thumbnail: /img/learn/blockchain_crypto_tbd.png
+---
+
+import HighlightsEmbedGrid from '@site/src/components/HighlightsEmbedGrid';
+import Audio from '@site/src/components/Audio';
+import BiographyList from '@site/src/components/BiographyList';
+
+
+
+An open discussion about blockchain, bitcoin, web3, and decentralization with TBD's General Manager.
+
+
+
+
+
+
diff --git a/site/learn/discussions/blockchain-skepticism.mdx b/site/learn/discussions/blockchain-skepticism.mdx
new file mode 100644
index 0000000..8bc2a25
--- /dev/null
+++ b/site/learn/discussions/blockchain-skepticism.mdx
@@ -0,0 +1,35 @@
+---
+title: 'Blockchain Skepticism'
+sidebar_position: 6
+sidebar_custom_props:
+ type: audio
+ duration: '1:32:07'
+ guestslist: [Kelsey Hightower]
+ description: 'An open discussion between builders, spectators, and critics.'
+ thumbnail: /img/learn/blockchain_skepticism.png
+---
+
+import HighlightsEmbedGrid from '@site/src/components/HighlightsEmbedGrid';
+import Audio from '@site/src/components/Audio';
+import BiographyList from '@site/src/components/BiographyList';
+
+
+
+An open discussion between builders, spectators, and critics.
+
+
+
+
diff --git a/site/learn/discussions/decentralized-identity.mdx b/site/learn/discussions/decentralized-identity.mdx
new file mode 100644
index 0000000..cae79c1
--- /dev/null
+++ b/site/learn/discussions/decentralized-identity.mdx
@@ -0,0 +1,64 @@
+---
+title: Decentralized Identity
+sidebar_position: 3
+sidebar_custom_props:
+ type: audio
+ duration: '1:33:43'
+ guestslist: [Daniel Buchner, Kim Hamilton Duffy, Brooklyn Zelenka]
+ description: "A panel discussion on Decentralized Identity (DID) where we talk use cases, benefits, DIDs vs NFTs, and what should and shouldn't go on a blockchain."
+ thumbnail: /img/learn/decentralized_identity.png
+---
+
+import HighlightsEmbedGrid from '@site/src/components/HighlightsEmbedGrid';
+import Audio from '@site/src/components/Audio';
+import BiographyList from '@site/src/components/BiographyList';
+
+
+
+A panel discussion on Decentralized Identity (DID) where we talk use cases, benefits,
+DIDs vs NFTs, and what should and shouldn't go on a blockchain.
+
+
+
+
+
+
+
diff --git a/site/learn/discussions/history-of-blockchains.mdx b/site/learn/discussions/history-of-blockchains.mdx
new file mode 100644
index 0000000..550d74e
--- /dev/null
+++ b/site/learn/discussions/history-of-blockchains.mdx
@@ -0,0 +1,35 @@
+---
+title: 'History of Blockchains'
+sidebar_position: 2
+sidebar_custom_props:
+ type: audio
+ duration: '1:30:26'
+ guestslist: [Rhian Lewis]
+ description: 'Rhian Lewis, author of The Cryptocurrency Revolution, discusses the history of money, how and why blockchain was invented, and the threats and opportunities digital currencies pose.'
+ thumbnail: /img/learn/history_of_blockchains.png
+---
+
+import Audio from '@site/src/components/Audio';
+import BiographyList from '@site/src/components/BiographyList';
+
+
+
+Rhian Lewis, author of The Cryptocurrency Revolution, discusses the history of money, how and why blockchain was invented, and the threats and opportunities digital currencies pose.
+
+
+
+
diff --git a/site/learn/discussions/realities-working-blockchain.mdx b/site/learn/discussions/realities-working-blockchain.mdx
new file mode 100644
index 0000000..b6ad21c
--- /dev/null
+++ b/site/learn/discussions/realities-working-blockchain.mdx
@@ -0,0 +1,34 @@
+---
+title: 'Realities of Working on Blockchain Technologies'
+sidebar_position: 7
+sidebar_custom_props:
+ type: audio
+ duration: '1:09:47'
+ guestslist: [Nader Dabit]
+ description: "After a year of leaving AWS to work on blockchain technologies, Nader Dabit, shares what it's really like working in the space."
+ thumbnail: /img/learn/nader_dabit_banner.png
+---
+
+import Audio from '@site/src/components/Audio';
+import BiographyList from '@site/src/components/BiographyList';
+
+
+
+After a year of leaving AWS to work on blockchain technologies, Nader Dabit, shares what it's really like working in the space.
+
+
+
+
diff --git a/site/learn/discussions/web5-ask-me-anything.mdx b/site/learn/discussions/web5-ask-me-anything.mdx
new file mode 100644
index 0000000..291df10
--- /dev/null
+++ b/site/learn/discussions/web5-ask-me-anything.mdx
@@ -0,0 +1,50 @@
+---
+title: 'Web5: Ask Me Anything'
+sidebar_position: 4
+sidebar_custom_props:
+ type: audio
+ duration: '1:20:09'
+ guestslist: [Daniel Buchner, Moe Jangda, Henry Tsia]
+ description: 'Members of the TBD Team answer questions about Web5.
+'
+ thumbnail: /img/learn/web5_ama_banner.png
+---
+
+import Audio from '@site/src/components/Audio';
+import BiographyList from '@site/src/components/BiographyList';
+
+
+
+Members of the TBD Team answer questions about Web5.
+
+
+
+
diff --git a/site/learn/index.mdx b/site/learn/index.mdx
new file mode 100644
index 0000000..e40fb83
--- /dev/null
+++ b/site/learn/index.mdx
@@ -0,0 +1,10 @@
+---
+title: 'Learn Portal'
+---
+
+import { useCurrentSidebarCategory } from '@docusaurus/theme-common';
+import LearnCardList from '@site/src/components/LearnCardList';
+
+Whether you're looking to learn more about TBD projects and components, hear discussions from industry leaders about decentralized technologies, or get your hands dirty with step-by-step tutorials, we have you covered.
+
+
diff --git a/site/netlify.toml b/site/netlify.toml
new file mode 100644
index 0000000..f8539df
--- /dev/null
+++ b/site/netlify.toml
@@ -0,0 +1,66 @@
+[[redirects]]
+from = "/code-of-conduct"
+to = "/open-source/code-of-conduct"
+
+[[redirects]]
+from = "/docs/Decentralized%20Web%20Platform%20-%20Public.pdf"
+to = "/files/Decentralized-Web-Platform.pdf"
+
+[[redirects]]
+from = "/docs/web5/build/troubleshooting-guide"
+to = "/docs/web5/decentralized-web-nodes/troubleshooting/common-errors"
+
+[[redirects]]
+from = "/docs/web5/troubleshooting-guide"
+to = "/docs/web5/decentralized-web-nodes/troubleshooting/common-errors"
+
+[[redirects]]
+from = "/docs/web5/build/frameworks/next"
+to = "/docs/web5/decentralized-web-nodes/troubleshooting/next"
+
+[[redirects]]
+from = "/docs/web5/build/frameworks/vue"
+to = "/docs/web5/decentralized-web-nodes/troubleshooting/vue"
+
+[[redirects]]
+from = "/docs/web5/troubleshooting/*"
+to = "/docs/web5/decentralized-web-nodes/troubleshooting/:splat"
+status = 301
+
+[[redirects]]
+from = "/docs/web5/build/*"
+to = "/docs/web5/:splat"
+status = 301
+force = true
+
+[[redirects]]
+from = "/docs/web5/learn/decentralized-identifiers"
+to = "/"
+
+[[redirects]]
+from = "/docs/web5/learn/decentralized-web-nodes"
+to = "/docs/web5/decentralized-web-nodes/what-are-dwns"
+
+[[redirects]]
+from = "/docs/web5/learn/verifiable-credentials"
+to = "/"
+
+[[redirects]]
+from = "/docs/web5/learn/did_documents"
+to = "/s"
+
+[[redirects]]
+from = "/docs/web5/learn/agents"
+to = "/docs/web5/decentralized-web-nodes/agents"
+
+[[redirects]]
+from = "/docs/web5/learn/protocols"
+to = "/docs/web5/decentralized-web-nodes/what-are-protocols"
+
+[[redirects]]
+from = "/docs/web5/learn/sync"
+to = "/docs/web5/decentralized-web-nodes/sync"
+
+[[redirects]]
+from = "/docs/web5/decentralized-web-nodes/protocols"
+to = "/docs/web5/decentralized-web-nodes/what-are-protocols"
diff --git a/site/package.json b/site/package.json
new file mode 100644
index 0000000..faefaf0
--- /dev/null
+++ b/site/package.json
@@ -0,0 +1,125 @@
+{
+ "name": "site",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "preinstall": "npx only-allow pnpm",
+ "postinstall": "node propagateSdkVersions.js",
+ "start": "pnpm run snippets && docusaurus start",
+ "build": "pnpm run snippets && docusaurus build",
+ "clear": "docusaurus clear",
+ "serve": "docusaurus serve",
+ "deploy": "docusaurus deploy",
+ "swizzle": "docusaurus swizzle",
+ "write-translations": "docusaurus write-translations",
+ "write-heading-ids": "docusaurus write-heading-ids",
+ "snippets": "pnpm shnip --config ./shnip.config.cjs",
+ "test": "pnpm test:js && pnpm test:kotlin && pnpm test:swift",
+ "test:js": "vitest run --config vite.config.ts --no-threads",
+ "test:kotlin": "./testsuites/testsuite-kotlin/mvnw clean verify -f testsuites/testsuite-kotlin --batch-mode",
+ "test:rust": "cd ./testsuites/testsuite-rust && cargo test",
+ "test:swift": "swift test --package-path ./testsuites/testsuite-swift",
+ "test:watch": "pnpm run shnip && vitest --config vite.config.ts --watch"
+ },
+ "dependencies": {
+ "@docusaurus/core": "3.5.2",
+ "@docusaurus/preset-classic": "3.5.2",
+ "@docusaurus/theme-common": "3.5.2",
+ "@docusaurus/theme-mermaid": "3.5.2",
+ "@docusaurus/types": "3.5.2",
+ "@docusaurus/utils": "3.5.2",
+ "@mdx-js/react": "3.0.1",
+ "@react-aria/ssr": "3.6.0",
+ "@react-aria/tooltip": "3.2.0",
+ "@react-aria/utils": "3.17.0",
+ "@react-stately/tooltip": "3.4.1",
+ "@tailwindcss/typography": "0.5.9",
+ "@fortawesome/fontawesome-svg-core": "6.4.2",
+ "@fortawesome/free-solid-svg-icons": "6.4.2",
+ "@fortawesome/react-fontawesome": "0.2.0",
+ "@tbdex/http-client": "1.1.0",
+ "@tbdex/http-server": "1.1.0",
+ "@tbdex/protocol": "1.1.0",
+ "@web5/api": "0.12.0",
+ "@web5/common": "1.0.0",
+ "@web5/credentials": "1.1.1",
+ "@web5/crypto": "1.0.5",
+ "@web5/crypto-aws-kms": "1.0.5",
+ "@web5/dids": "1.1.5",
+ "@web5/identity-agent": "0.6.4",
+ "autoprefixer": "10.4.13",
+ "bluehawk": "1.4.0",
+ "buffer": "6.0.3",
+ "clsx": "1.2.1",
+ "crypto-browserify": "3.12.0",
+ "docusaurus-plugin-remote-content": "4.0.0",
+ "docusaurus-tailwindcss": "0.1.0",
+ "dotenv": "16.3.1",
+ "express": "4.18.2",
+ "font-awesome": "4.7.0",
+ "googleapis": "128.0.0",
+ "msw": "2.1.7",
+ "node-fetch": "3.3.2",
+ "postcss": "8.4.31",
+ "prism-react-renderer": "2.3.1",
+ "process": "0.11.10",
+ "qrcode": "^1.5.3",
+ "raw-loader": "4.0.2",
+ "react": "18.2.0",
+ "react-confetti": "^6.1.0",
+ "react-dom": "18.2.0",
+ "react-fontawesome": "1.7.1",
+ "react-markdown": "8.0.7",
+ "react-modal": "3.16.1",
+ "react-player": "2.11.2",
+ "react-qr-reader": "^3.0.0-beta-1",
+ "react-slick": "0.29.0",
+ "react18-json-view": "^0.2.8",
+ "redocusaurus": "2.1.1",
+ "shnip": "0.0.3-alpha",
+ "slick-carousel": "1.8.1",
+ "stream-browserify": "3.0.0",
+ "tailwind-component-classes": "2.0.4",
+ "tailwindcss": "3.2.7",
+ "url": "^0.11.4",
+ "xml2js": "0.6.2"
+ },
+ "devDependencies": {
+ "@docusaurus/module-type-aliases": "3.5.2",
+ "@vitest/browser": "0.34.1",
+ "@vitest/coverage-istanbul": "0.34.1",
+ "fake-indexeddb": "4.0.2",
+ "glob": "10.3.10",
+ "husky": "8.0.3",
+ "playwright": "1.39.0",
+ "prop-types": "15.8.1",
+ "rimraf": "5.0.5",
+ "start-server-and-test": "2.0.3",
+ "vitest": "0.34.1",
+ "webdriverio": "8.13.13"
+ },
+ "browserslist": {
+ "production": [
+ ">0.5%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
+ },
+ "engines": {
+ "node": ">=18.16"
+ },
+ "pnpm": {
+ "overrides": {
+ "vite": "5.1.4",
+ "nuxt": "3.10.3",
+ "postcss": "8.4.31",
+ "axios": "1.7.4",
+ "elliptic": "6.5.7"
+ }
+ }
+}
\ No newline at end of file
diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml
new file mode 100644
index 0000000..3610fe4
--- /dev/null
+++ b/site/pnpm-lock.yaml
@@ -0,0 +1,17841 @@
+lockfileVersion: '6.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+overrides:
+ vite: 5.1.4
+ nuxt: 3.10.3
+ postcss: 8.4.31
+ axios: 1.7.4
+ elliptic: 6.5.7
+
+dependencies:
+ '@docusaurus/core':
+ specifier: 3.5.2
+ version: 3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/preset-classic':
+ specifier: 3.5.2
+ version: 3.5.2(@algolia/client-search@5.14.0)(@mdx-js/react@3.0.1)(@types/react@18.3.12)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.17.2)(typescript@5.6.3)
+ '@docusaurus/theme-common':
+ specifier: 3.5.2
+ version: 3.5.2(@docusaurus/plugin-content-docs@3.6.1)(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/theme-mermaid':
+ specifier: 3.5.2
+ version: 3.5.2(@docusaurus/plugin-content-docs@3.6.1)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/types':
+ specifier: 3.5.2
+ version: 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils':
+ specifier: 3.5.2
+ version: 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@fortawesome/fontawesome-svg-core':
+ specifier: 6.4.2
+ version: 6.4.2
+ '@fortawesome/free-solid-svg-icons':
+ specifier: 6.4.2
+ version: 6.4.2
+ '@fortawesome/react-fontawesome':
+ specifier: 0.2.0
+ version: 0.2.0(@fortawesome/fontawesome-svg-core@6.4.2)(react@18.2.0)
+ '@mdx-js/react':
+ specifier: 3.0.1
+ version: 3.0.1(@types/react@18.3.12)(react@18.2.0)
+ '@react-aria/ssr':
+ specifier: 3.6.0
+ version: 3.6.0(react@18.2.0)
+ '@react-aria/tooltip':
+ specifier: 3.2.0
+ version: 3.2.0(react@18.2.0)
+ '@react-aria/utils':
+ specifier: 3.17.0
+ version: 3.17.0(react@18.2.0)
+ '@react-stately/tooltip':
+ specifier: 3.4.1
+ version: 3.4.1(react@18.2.0)
+ '@tailwindcss/typography':
+ specifier: 0.5.9
+ version: 0.5.9(tailwindcss@3.2.7)
+ '@tbdex/http-client':
+ specifier: 1.1.0
+ version: 1.1.0
+ '@tbdex/http-server':
+ specifier: 1.1.0
+ version: 1.1.0
+ '@tbdex/protocol':
+ specifier: 1.1.0
+ version: 1.1.0
+ '@web5/api':
+ specifier: 0.12.0
+ version: 0.12.0(ws@8.18.0)
+ '@web5/common':
+ specifier: 1.0.0
+ version: 1.0.0
+ '@web5/credentials':
+ specifier: 1.1.1
+ version: 1.1.1
+ '@web5/crypto':
+ specifier: 1.0.5
+ version: 1.0.5
+ '@web5/crypto-aws-kms':
+ specifier: 1.0.5
+ version: 1.0.5
+ '@web5/dids':
+ specifier: 1.1.5
+ version: 1.1.5
+ '@web5/identity-agent':
+ specifier: 0.6.4
+ version: 0.6.4(ws@8.18.0)
+ autoprefixer:
+ specifier: 10.4.13
+ version: 10.4.13(postcss@8.4.31)
+ bluehawk:
+ specifier: 1.4.0
+ version: 1.4.0
+ buffer:
+ specifier: 6.0.3
+ version: 6.0.3
+ clsx:
+ specifier: 1.2.1
+ version: 1.2.1
+ crypto-browserify:
+ specifier: 3.12.0
+ version: 3.12.0
+ docusaurus-plugin-remote-content:
+ specifier: 4.0.0
+ version: 4.0.0(@docusaurus/core@3.5.2)
+ docusaurus-tailwindcss:
+ specifier: 0.1.0
+ version: 0.1.0(@docusaurus/core@3.5.2)
+ dotenv:
+ specifier: 16.3.1
+ version: 16.3.1
+ express:
+ specifier: 4.18.2
+ version: 4.18.2
+ font-awesome:
+ specifier: 4.7.0
+ version: 4.7.0
+ googleapis:
+ specifier: 128.0.0
+ version: 128.0.0
+ msw:
+ specifier: 2.1.7
+ version: 2.1.7(typescript@5.6.3)
+ node-fetch:
+ specifier: 3.3.2
+ version: 3.3.2
+ postcss:
+ specifier: 8.4.31
+ version: 8.4.31
+ prism-react-renderer:
+ specifier: 2.3.1
+ version: 2.3.1(react@18.2.0)
+ process:
+ specifier: 0.11.10
+ version: 0.11.10
+ qrcode:
+ specifier: ^1.5.3
+ version: 1.5.4
+ raw-loader:
+ specifier: 4.0.2
+ version: 4.0.2(webpack@5.96.1)
+ react:
+ specifier: 18.2.0
+ version: 18.2.0
+ react-confetti:
+ specifier: ^6.1.0
+ version: 6.1.0(react@18.2.0)
+ react-dom:
+ specifier: 18.2.0
+ version: 18.2.0(react@18.2.0)
+ react-fontawesome:
+ specifier: 1.7.1
+ version: 1.7.1(react@18.2.0)
+ react-markdown:
+ specifier: 8.0.7
+ version: 8.0.7(@types/react@18.3.12)(react@18.2.0)
+ react-modal:
+ specifier: 3.16.1
+ version: 3.16.1(react-dom@18.2.0)(react@18.2.0)
+ react-player:
+ specifier: 2.11.2
+ version: 2.11.2(react@18.2.0)
+ react-qr-reader:
+ specifier: ^3.0.0-beta-1
+ version: 3.0.0-beta-1(react-dom@18.2.0)(react@18.2.0)
+ react-slick:
+ specifier: 0.29.0
+ version: 0.29.0(react-dom@18.2.0)(react@18.2.0)
+ react18-json-view:
+ specifier: ^0.2.8
+ version: 0.2.8(react@18.2.0)
+ redocusaurus:
+ specifier: 2.1.1
+ version: 2.1.1(@docusaurus/theme-common@3.5.2)(@docusaurus/utils@3.5.2)(core-js@3.39.0)(enzyme@3.11.0)(mobx@6.13.5)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.13)(webpack@5.96.1)
+ shnip:
+ specifier: 0.0.3-alpha
+ version: 0.0.3-alpha
+ slick-carousel:
+ specifier: 1.8.1
+ version: 1.8.1(jquery@3.7.1)
+ stream-browserify:
+ specifier: 3.0.0
+ version: 3.0.0
+ tailwind-component-classes:
+ specifier: 2.0.4
+ version: 2.0.4(tailwindcss@3.2.7)
+ tailwindcss:
+ specifier: 3.2.7
+ version: 3.2.7(postcss@8.4.31)
+ url:
+ specifier: ^0.11.4
+ version: 0.11.4
+ xml2js:
+ specifier: 0.6.2
+ version: 0.6.2
+
+devDependencies:
+ '@docusaurus/module-type-aliases':
+ specifier: 3.5.2
+ version: 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@vitest/browser':
+ specifier: 0.34.1
+ version: 0.34.1(rollup@2.79.2)(vitest@0.34.1)
+ '@vitest/coverage-istanbul':
+ specifier: 0.34.1
+ version: 0.34.1(vitest@0.34.1)
+ fake-indexeddb:
+ specifier: 4.0.2
+ version: 4.0.2
+ glob:
+ specifier: 10.3.10
+ version: 10.3.10
+ husky:
+ specifier: 8.0.3
+ version: 8.0.3
+ playwright:
+ specifier: 1.39.0
+ version: 1.39.0
+ prop-types:
+ specifier: 15.8.1
+ version: 15.8.1
+ rimraf:
+ specifier: 5.0.5
+ version: 5.0.5
+ start-server-and-test:
+ specifier: 2.0.3
+ version: 2.0.3
+ vitest:
+ specifier: 0.34.1
+ version: 0.34.1(@vitest/browser@0.34.1)(playwright@1.39.0)(webdriverio@8.13.13)
+ webdriverio:
+ specifier: 8.13.13
+ version: 8.13.13(typescript@5.6.3)
+
+packages:
+
+ /@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.14.0)(algoliasearch@5.14.0)(search-insights@2.17.2):
+ resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==}
+ dependencies:
+ '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.14.0)(algoliasearch@5.14.0)(search-insights@2.17.2)
+ '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.14.0)(algoliasearch@5.14.0)
+ transitivePeerDependencies:
+ - '@algolia/client-search'
+ - algoliasearch
+ - search-insights
+ dev: false
+
+ /@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.14.0)(algoliasearch@5.14.0)(search-insights@2.17.2):
+ resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==}
+ peerDependencies:
+ search-insights: '>= 1 < 3'
+ dependencies:
+ '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.14.0)(algoliasearch@5.14.0)
+ search-insights: 2.17.2
+ transitivePeerDependencies:
+ - '@algolia/client-search'
+ - algoliasearch
+ dev: false
+
+ /@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.14.0)(algoliasearch@5.14.0):
+ resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==}
+ peerDependencies:
+ '@algolia/client-search': '>= 4.9.1 < 6'
+ algoliasearch: '>= 4.9.1 < 6'
+ dependencies:
+ '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.14.0)(algoliasearch@5.14.0)
+ '@algolia/client-search': 5.14.0
+ algoliasearch: 5.14.0
+ dev: false
+
+ /@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.14.0)(algoliasearch@5.14.0):
+ resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==}
+ peerDependencies:
+ '@algolia/client-search': '>= 4.9.1 < 6'
+ algoliasearch: '>= 4.9.1 < 6'
+ dependencies:
+ '@algolia/client-search': 5.14.0
+ algoliasearch: 5.14.0
+ dev: false
+
+ /@algolia/cache-browser-local-storage@4.24.0:
+ resolution: {integrity: sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==}
+ dependencies:
+ '@algolia/cache-common': 4.24.0
+ dev: false
+
+ /@algolia/cache-common@4.24.0:
+ resolution: {integrity: sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==}
+ dev: false
+
+ /@algolia/cache-in-memory@4.24.0:
+ resolution: {integrity: sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==}
+ dependencies:
+ '@algolia/cache-common': 4.24.0
+ dev: false
+
+ /@algolia/client-abtesting@5.14.0:
+ resolution: {integrity: sha512-HR4kbCmq4RO8vhafLrVcR11q3BvuPYA4o+Nn8hzJRgpDu2fauIlgIBgVDsoxaK90xuaPLSNdoT5tWXag+L8vCw==}
+ engines: {node: '>= 14.0.0'}
+ dependencies:
+ '@algolia/client-common': 5.14.0
+ '@algolia/requester-browser-xhr': 5.14.0
+ '@algolia/requester-fetch': 5.14.0
+ '@algolia/requester-node-http': 5.14.0
+ dev: false
+
+ /@algolia/client-account@4.24.0:
+ resolution: {integrity: sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==}
+ dependencies:
+ '@algolia/client-common': 4.24.0
+ '@algolia/client-search': 4.24.0
+ '@algolia/transporter': 4.24.0
+ dev: false
+
+ /@algolia/client-analytics@4.24.0:
+ resolution: {integrity: sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==}
+ dependencies:
+ '@algolia/client-common': 4.24.0
+ '@algolia/client-search': 4.24.0
+ '@algolia/requester-common': 4.24.0
+ '@algolia/transporter': 4.24.0
+ dev: false
+
+ /@algolia/client-analytics@5.14.0:
+ resolution: {integrity: sha512-EnmouGUQdIvwmI8plglt3HP9hXwNNwCJshszfU/Hqi2n21//iwmWLmMb5gXDfiLhyMa6u8eya8c03QT79s3/tQ==}
+ engines: {node: '>= 14.0.0'}
+ dependencies:
+ '@algolia/client-common': 5.14.0
+ '@algolia/requester-browser-xhr': 5.14.0
+ '@algolia/requester-fetch': 5.14.0
+ '@algolia/requester-node-http': 5.14.0
+ dev: false
+
+ /@algolia/client-common@4.24.0:
+ resolution: {integrity: sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==}
+ dependencies:
+ '@algolia/requester-common': 4.24.0
+ '@algolia/transporter': 4.24.0
+ dev: false
+
+ /@algolia/client-common@5.14.0:
+ resolution: {integrity: sha512-xYaswEqv+mTeazOJV0PELs4LYXaETYGwlntQxvOTHsICaj1e+ylKeMr+C+ZvN74RpCRDoEN3a2n33bRU9/MHTw==}
+ engines: {node: '>= 14.0.0'}
+ dev: false
+
+ /@algolia/client-insights@5.14.0:
+ resolution: {integrity: sha512-1dWxjTmpNCgLWLl6GSAaOACs55JvioAIdno7jvq7KVfpLLXehHaSaiij8ssbbIM8HqHZPwC8ShaUHtSt2jLdBg==}
+ engines: {node: '>= 14.0.0'}
+ dependencies:
+ '@algolia/client-common': 5.14.0
+ '@algolia/requester-browser-xhr': 5.14.0
+ '@algolia/requester-fetch': 5.14.0
+ '@algolia/requester-node-http': 5.14.0
+ dev: false
+
+ /@algolia/client-personalization@4.24.0:
+ resolution: {integrity: sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==}
+ dependencies:
+ '@algolia/client-common': 4.24.0
+ '@algolia/requester-common': 4.24.0
+ '@algolia/transporter': 4.24.0
+ dev: false
+
+ /@algolia/client-personalization@5.14.0:
+ resolution: {integrity: sha512-HDOYm38nUwflxaemKrxlV91pYg3L9JkmLnuSQCJ7bzivqP+aBTZ8mGRvanFzwayNMRZWLuGsstJMpGET6FYaDQ==}
+ engines: {node: '>= 14.0.0'}
+ dependencies:
+ '@algolia/client-common': 5.14.0
+ '@algolia/requester-browser-xhr': 5.14.0
+ '@algolia/requester-fetch': 5.14.0
+ '@algolia/requester-node-http': 5.14.0
+ dev: false
+
+ /@algolia/client-query-suggestions@5.14.0:
+ resolution: {integrity: sha512-yDPf3E3MS2RUg1br7r1+PEqKOxUftxjLLtD35yW9voZ9oV45XZnAPnHCqgmyzjcK5/dM1dzXHhmZGf4VbjYn7Q==}
+ engines: {node: '>= 14.0.0'}
+ dependencies:
+ '@algolia/client-common': 5.14.0
+ '@algolia/requester-browser-xhr': 5.14.0
+ '@algolia/requester-fetch': 5.14.0
+ '@algolia/requester-node-http': 5.14.0
+ dev: false
+
+ /@algolia/client-search@4.24.0:
+ resolution: {integrity: sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==}
+ dependencies:
+ '@algolia/client-common': 4.24.0
+ '@algolia/requester-common': 4.24.0
+ '@algolia/transporter': 4.24.0
+ dev: false
+
+ /@algolia/client-search@5.14.0:
+ resolution: {integrity: sha512-x5/GVLDyGad8aiWA/vfj8X4NXOZ3FlwXw/gb7t+Mxo3O0g3VxSFQdyrZ8Oduv/Y/Y8cxMVEOx1u3Azs6tlSZbg==}
+ engines: {node: '>= 14.0.0'}
+ dependencies:
+ '@algolia/client-common': 5.14.0
+ '@algolia/requester-browser-xhr': 5.14.0
+ '@algolia/requester-fetch': 5.14.0
+ '@algolia/requester-node-http': 5.14.0
+ dev: false
+
+ /@algolia/events@4.0.1:
+ resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==}
+ dev: false
+
+ /@algolia/ingestion@1.14.0:
+ resolution: {integrity: sha512-HU9AoZDFMEIT/+xzIa9l1XkPRTH7S0jWbYWrNkeb/62TxQFvL5x/XYEa6Yf/WCFU6Qa0W+ivua8NDzxL15NVGQ==}
+ engines: {node: '>= 14.0.0'}
+ dependencies:
+ '@algolia/client-common': 5.14.0
+ '@algolia/requester-browser-xhr': 5.14.0
+ '@algolia/requester-fetch': 5.14.0
+ '@algolia/requester-node-http': 5.14.0
+ dev: false
+
+ /@algolia/logger-common@4.24.0:
+ resolution: {integrity: sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==}
+ dev: false
+
+ /@algolia/logger-console@4.24.0:
+ resolution: {integrity: sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==}
+ dependencies:
+ '@algolia/logger-common': 4.24.0
+ dev: false
+
+ /@algolia/monitoring@1.14.0:
+ resolution: {integrity: sha512-tGKip5Dvusw8z4ajIJBBYxdPUOGIqV1CGat55eCaAmX97Oko2adIOq9MKvdC3d7SMuQt3j28QIHpV6wvihnsKA==}
+ engines: {node: '>= 14.0.0'}
+ dependencies:
+ '@algolia/client-common': 5.14.0
+ '@algolia/requester-browser-xhr': 5.14.0
+ '@algolia/requester-fetch': 5.14.0
+ '@algolia/requester-node-http': 5.14.0
+ dev: false
+
+ /@algolia/recommend@4.24.0:
+ resolution: {integrity: sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==}
+ dependencies:
+ '@algolia/cache-browser-local-storage': 4.24.0
+ '@algolia/cache-common': 4.24.0
+ '@algolia/cache-in-memory': 4.24.0
+ '@algolia/client-common': 4.24.0
+ '@algolia/client-search': 4.24.0
+ '@algolia/logger-common': 4.24.0
+ '@algolia/logger-console': 4.24.0
+ '@algolia/requester-browser-xhr': 4.24.0
+ '@algolia/requester-common': 4.24.0
+ '@algolia/requester-node-http': 4.24.0
+ '@algolia/transporter': 4.24.0
+ dev: false
+
+ /@algolia/recommend@5.14.0:
+ resolution: {integrity: sha512-wXOWFG4L0Y/EyWKuDXQA7FoB7Ukuss+O8zaxZSlla4h19UGWak+22RcZ2eDFoAhVOJxC8RoLg9opMfDbZtPW9Q==}
+ engines: {node: '>= 14.0.0'}
+ dependencies:
+ '@algolia/client-common': 5.14.0
+ '@algolia/requester-browser-xhr': 5.14.0
+ '@algolia/requester-fetch': 5.14.0
+ '@algolia/requester-node-http': 5.14.0
+ dev: false
+
+ /@algolia/requester-browser-xhr@4.24.0:
+ resolution: {integrity: sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==}
+ dependencies:
+ '@algolia/requester-common': 4.24.0
+ dev: false
+
+ /@algolia/requester-browser-xhr@5.14.0:
+ resolution: {integrity: sha512-5zk1sol+WTDskAx1AMBGGDChCVBHuPTmclGZO844/ljqH7AcJpkFnfUeAMXfx2m4tW3Ax+M+uaC+XjVoQRb9Hg==}
+ engines: {node: '>= 14.0.0'}
+ dependencies:
+ '@algolia/client-common': 5.14.0
+ dev: false
+
+ /@algolia/requester-common@4.24.0:
+ resolution: {integrity: sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==}
+ dev: false
+
+ /@algolia/requester-fetch@5.14.0:
+ resolution: {integrity: sha512-B9grYSKH34UlJPkUdds14I/m8Yp7/a4PbqRuZsrP1L4kBW2FGinMtpQOK3N6gEy8YkVNA1iKlTC24yro8z8a8A==}
+ engines: {node: '>= 14.0.0'}
+ dependencies:
+ '@algolia/client-common': 5.14.0
+ dev: false
+
+ /@algolia/requester-node-http@4.24.0:
+ resolution: {integrity: sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==}
+ dependencies:
+ '@algolia/requester-common': 4.24.0
+ dev: false
+
+ /@algolia/requester-node-http@5.14.0:
+ resolution: {integrity: sha512-2EPhRqbxWzrsSXX0/70jIGtjQTj8VILi+uqmgBweyQIzCNlGoNbyMs+E7iwHVtUSrE/9IDd8rrewkVHOI6h2IQ==}
+ engines: {node: '>= 14.0.0'}
+ dependencies:
+ '@algolia/client-common': 5.14.0
+ dev: false
+
+ /@algolia/transporter@4.24.0:
+ resolution: {integrity: sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==}
+ dependencies:
+ '@algolia/cache-common': 4.24.0
+ '@algolia/logger-common': 4.24.0
+ '@algolia/requester-common': 4.24.0
+ dev: false
+
+ /@ampproject/remapping@2.3.0:
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+
+ /@assemblyscript/loader@0.9.4:
+ resolution: {integrity: sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==}
+ dev: false
+
+ /@astronautlabs/jsonpath@1.1.2:
+ resolution: {integrity: sha512-FqL/muoreH7iltYC1EB5Tvox5E8NSOOPGkgns4G+qxRKl6k5dxEVljUjB5NcKESzkqwnUqWjSZkL61XGYOuV+A==}
+ dependencies:
+ static-eval: 2.0.2
+ dev: false
+
+ /@aws-crypto/sha256-browser@5.2.0:
+ resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==}
+ dependencies:
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-crypto/supports-web-crypto': 5.2.0
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-locate-window': 3.679.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-crypto/sha256-js@5.2.0:
+ resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-crypto/util': 5.2.0
+ '@aws-sdk/types': 3.609.0
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-crypto/supports-web-crypto@5.2.0:
+ resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-crypto/util@5.2.0:
+ resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/util-utf8': 2.3.0
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/client-kms@3.616.0:
+ resolution: {integrity: sha512-40fu8xNcj03kWqeKg5pBrNdAp1Wbcn26yml1opQkg83LfmeF/y1htX/HiAlZcu4vBvQMMznFUU/vdd8qGgjZNA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/client-sso-oidc': 3.616.0(@aws-sdk/client-sts@3.616.0)
+ '@aws-sdk/client-sts': 3.616.0
+ '@aws-sdk/core': 3.616.0
+ '@aws-sdk/credential-provider-node': 3.616.0(@aws-sdk/client-sso-oidc@3.616.0)(@aws-sdk/client-sts@3.616.0)
+ '@aws-sdk/middleware-host-header': 3.616.0
+ '@aws-sdk/middleware-logger': 3.609.0
+ '@aws-sdk/middleware-recursion-detection': 3.616.0
+ '@aws-sdk/middleware-user-agent': 3.616.0
+ '@aws-sdk/region-config-resolver': 3.614.0
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-endpoints': 3.614.0
+ '@aws-sdk/util-user-agent-browser': 3.609.0
+ '@aws-sdk/util-user-agent-node': 3.614.0
+ '@smithy/config-resolver': 3.0.10
+ '@smithy/core': 2.5.1
+ '@smithy/fetch-http-handler': 3.2.9
+ '@smithy/hash-node': 3.0.8
+ '@smithy/invalid-dependency': 3.0.8
+ '@smithy/middleware-content-length': 3.0.10
+ '@smithy/middleware-endpoint': 3.2.1
+ '@smithy/middleware-retry': 3.0.25
+ '@smithy/middleware-serde': 3.0.8
+ '@smithy/middleware-stack': 3.0.8
+ '@smithy/node-config-provider': 3.1.9
+ '@smithy/node-http-handler': 3.2.5
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/smithy-client': 3.4.2
+ '@smithy/types': 3.6.0
+ '@smithy/url-parser': 3.0.8
+ '@smithy/util-base64': 3.0.0
+ '@smithy/util-body-length-browser': 3.0.0
+ '@smithy/util-body-length-node': 3.0.0
+ '@smithy/util-defaults-mode-browser': 3.0.25
+ '@smithy/util-defaults-mode-node': 3.0.25
+ '@smithy/util-endpoints': 2.1.4
+ '@smithy/util-middleware': 3.0.8
+ '@smithy/util-retry': 3.0.8
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/client-sso-oidc@3.616.0(@aws-sdk/client-sts@3.616.0):
+ resolution: {integrity: sha512-YY1hpYS/G1uRGjQf88dL8VLHkP/IjGxKeXdhy+JnzMdCkAWl3V9j0fEALw40NZe0x79gr6R2KUOUH/IKYQfUmg==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ '@aws-sdk/client-sts': ^3.616.0
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/client-sts': 3.616.0
+ '@aws-sdk/core': 3.616.0
+ '@aws-sdk/credential-provider-node': 3.616.0(@aws-sdk/client-sso-oidc@3.616.0)(@aws-sdk/client-sts@3.616.0)
+ '@aws-sdk/middleware-host-header': 3.616.0
+ '@aws-sdk/middleware-logger': 3.609.0
+ '@aws-sdk/middleware-recursion-detection': 3.616.0
+ '@aws-sdk/middleware-user-agent': 3.616.0
+ '@aws-sdk/region-config-resolver': 3.614.0
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-endpoints': 3.614.0
+ '@aws-sdk/util-user-agent-browser': 3.609.0
+ '@aws-sdk/util-user-agent-node': 3.614.0
+ '@smithy/config-resolver': 3.0.10
+ '@smithy/core': 2.5.1
+ '@smithy/fetch-http-handler': 3.2.9
+ '@smithy/hash-node': 3.0.8
+ '@smithy/invalid-dependency': 3.0.8
+ '@smithy/middleware-content-length': 3.0.10
+ '@smithy/middleware-endpoint': 3.2.1
+ '@smithy/middleware-retry': 3.0.25
+ '@smithy/middleware-serde': 3.0.8
+ '@smithy/middleware-stack': 3.0.8
+ '@smithy/node-config-provider': 3.1.9
+ '@smithy/node-http-handler': 3.2.5
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/smithy-client': 3.4.2
+ '@smithy/types': 3.6.0
+ '@smithy/url-parser': 3.0.8
+ '@smithy/util-base64': 3.0.0
+ '@smithy/util-body-length-browser': 3.0.0
+ '@smithy/util-body-length-node': 3.0.0
+ '@smithy/util-defaults-mode-browser': 3.0.25
+ '@smithy/util-defaults-mode-node': 3.0.25
+ '@smithy/util-endpoints': 2.1.4
+ '@smithy/util-middleware': 3.0.8
+ '@smithy/util-retry': 3.0.8
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/client-sso@3.616.0:
+ resolution: {integrity: sha512-hwW0u1f8U4dSloAe61/eupUiGd5Q13B72BuzGxvRk0cIpYX/2m0KBG8DDl7jW1b2QQ+CflTLpG2XUf2+vRJxGA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/core': 3.616.0
+ '@aws-sdk/middleware-host-header': 3.616.0
+ '@aws-sdk/middleware-logger': 3.609.0
+ '@aws-sdk/middleware-recursion-detection': 3.616.0
+ '@aws-sdk/middleware-user-agent': 3.616.0
+ '@aws-sdk/region-config-resolver': 3.614.0
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-endpoints': 3.614.0
+ '@aws-sdk/util-user-agent-browser': 3.609.0
+ '@aws-sdk/util-user-agent-node': 3.614.0
+ '@smithy/config-resolver': 3.0.10
+ '@smithy/core': 2.5.1
+ '@smithy/fetch-http-handler': 3.2.9
+ '@smithy/hash-node': 3.0.8
+ '@smithy/invalid-dependency': 3.0.8
+ '@smithy/middleware-content-length': 3.0.10
+ '@smithy/middleware-endpoint': 3.2.1
+ '@smithy/middleware-retry': 3.0.25
+ '@smithy/middleware-serde': 3.0.8
+ '@smithy/middleware-stack': 3.0.8
+ '@smithy/node-config-provider': 3.1.9
+ '@smithy/node-http-handler': 3.2.5
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/smithy-client': 3.4.2
+ '@smithy/types': 3.6.0
+ '@smithy/url-parser': 3.0.8
+ '@smithy/util-base64': 3.0.0
+ '@smithy/util-body-length-browser': 3.0.0
+ '@smithy/util-body-length-node': 3.0.0
+ '@smithy/util-defaults-mode-browser': 3.0.25
+ '@smithy/util-defaults-mode-node': 3.0.25
+ '@smithy/util-endpoints': 2.1.4
+ '@smithy/util-middleware': 3.0.8
+ '@smithy/util-retry': 3.0.8
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/client-sts@3.616.0:
+ resolution: {integrity: sha512-FP7i7hS5FpReqnysQP1ukQF1OUWy8lkomaOnbu15H415YUrfCp947SIx6+BItjmx+esKxPkEjh/fbCVzw2D6hQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/client-sso-oidc': 3.616.0(@aws-sdk/client-sts@3.616.0)
+ '@aws-sdk/core': 3.616.0
+ '@aws-sdk/credential-provider-node': 3.616.0(@aws-sdk/client-sso-oidc@3.616.0)(@aws-sdk/client-sts@3.616.0)
+ '@aws-sdk/middleware-host-header': 3.616.0
+ '@aws-sdk/middleware-logger': 3.609.0
+ '@aws-sdk/middleware-recursion-detection': 3.616.0
+ '@aws-sdk/middleware-user-agent': 3.616.0
+ '@aws-sdk/region-config-resolver': 3.614.0
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-endpoints': 3.614.0
+ '@aws-sdk/util-user-agent-browser': 3.609.0
+ '@aws-sdk/util-user-agent-node': 3.614.0
+ '@smithy/config-resolver': 3.0.10
+ '@smithy/core': 2.5.1
+ '@smithy/fetch-http-handler': 3.2.9
+ '@smithy/hash-node': 3.0.8
+ '@smithy/invalid-dependency': 3.0.8
+ '@smithy/middleware-content-length': 3.0.10
+ '@smithy/middleware-endpoint': 3.2.1
+ '@smithy/middleware-retry': 3.0.25
+ '@smithy/middleware-serde': 3.0.8
+ '@smithy/middleware-stack': 3.0.8
+ '@smithy/node-config-provider': 3.1.9
+ '@smithy/node-http-handler': 3.2.5
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/smithy-client': 3.4.2
+ '@smithy/types': 3.6.0
+ '@smithy/url-parser': 3.0.8
+ '@smithy/util-base64': 3.0.0
+ '@smithy/util-body-length-browser': 3.0.0
+ '@smithy/util-body-length-node': 3.0.0
+ '@smithy/util-defaults-mode-browser': 3.0.25
+ '@smithy/util-defaults-mode-node': 3.0.25
+ '@smithy/util-endpoints': 2.1.4
+ '@smithy/util-middleware': 3.0.8
+ '@smithy/util-retry': 3.0.8
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/core@3.616.0:
+ resolution: {integrity: sha512-O/urkh2kECs/IqZIVZxyeyHZ7OR2ZWhLNK7btsVQBQvJKrEspLrk/Fp20Qfg5JDerQfBN83ZbyRXLJOOucdZpw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/core': 2.5.1
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/signature-v4': 4.2.1
+ '@smithy/smithy-client': 3.4.2
+ '@smithy/types': 3.6.0
+ fast-xml-parser: 4.2.5
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/credential-provider-env@3.609.0:
+ resolution: {integrity: sha512-v69ZCWcec2iuV9vLVJMa6fAb5xwkzN4jYIT8yjo2c4Ia/j976Q+TPf35Pnz5My48Xr94EFcaBazrWedF+kwfuQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/property-provider': 3.1.8
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/credential-provider-http@3.616.0:
+ resolution: {integrity: sha512-1rgCkr7XvEMBl7qWCo5BKu3yAxJs71dRaZ55Xnjte/0ZHH6Oc93ZrHzyYy6UH6t0nZrH+FAuw7Yko2YtDDwDeg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/fetch-http-handler': 3.2.9
+ '@smithy/node-http-handler': 3.2.5
+ '@smithy/property-provider': 3.1.8
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/smithy-client': 3.4.2
+ '@smithy/types': 3.6.0
+ '@smithy/util-stream': 3.2.1
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/credential-provider-ini@3.616.0(@aws-sdk/client-sso-oidc@3.616.0)(@aws-sdk/client-sts@3.616.0):
+ resolution: {integrity: sha512-5gQdMr9cca3xV7FF2SxpxWGH2t6+t4o+XBGiwsHm8muEjf4nUmw7Ij863x25Tjt2viPYV0UStczSb5Sihp7bkA==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ '@aws-sdk/client-sts': ^3.616.0
+ dependencies:
+ '@aws-sdk/client-sts': 3.616.0
+ '@aws-sdk/credential-provider-env': 3.609.0
+ '@aws-sdk/credential-provider-http': 3.616.0
+ '@aws-sdk/credential-provider-process': 3.614.0
+ '@aws-sdk/credential-provider-sso': 3.616.0(@aws-sdk/client-sso-oidc@3.616.0)
+ '@aws-sdk/credential-provider-web-identity': 3.609.0(@aws-sdk/client-sts@3.616.0)
+ '@aws-sdk/types': 3.609.0
+ '@smithy/credential-provider-imds': 3.2.5
+ '@smithy/property-provider': 3.1.8
+ '@smithy/shared-ini-file-loader': 3.1.9
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@aws-sdk/client-sso-oidc'
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/credential-provider-node@3.616.0(@aws-sdk/client-sso-oidc@3.616.0)(@aws-sdk/client-sts@3.616.0):
+ resolution: {integrity: sha512-Se+u6DAxjDPjKE3vX1X2uxjkWgGq69BTo0uTB0vDUiWwBVgh16s9BsBhSAlKEH1CCbbJHvOg4YdTrzjwzqyClg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/credential-provider-env': 3.609.0
+ '@aws-sdk/credential-provider-http': 3.616.0
+ '@aws-sdk/credential-provider-ini': 3.616.0(@aws-sdk/client-sso-oidc@3.616.0)(@aws-sdk/client-sts@3.616.0)
+ '@aws-sdk/credential-provider-process': 3.614.0
+ '@aws-sdk/credential-provider-sso': 3.616.0(@aws-sdk/client-sso-oidc@3.616.0)
+ '@aws-sdk/credential-provider-web-identity': 3.609.0(@aws-sdk/client-sts@3.616.0)
+ '@aws-sdk/types': 3.609.0
+ '@smithy/credential-provider-imds': 3.2.5
+ '@smithy/property-provider': 3.1.8
+ '@smithy/shared-ini-file-loader': 3.1.9
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@aws-sdk/client-sso-oidc'
+ - '@aws-sdk/client-sts'
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/credential-provider-process@3.614.0:
+ resolution: {integrity: sha512-Q0SI0sTRwi8iNODLs5+bbv8vgz8Qy2QdxbCHnPk/6Cx6LMf7i3dqmWquFbspqFRd8QiqxStrblwxrUYZi09tkA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/property-provider': 3.1.8
+ '@smithy/shared-ini-file-loader': 3.1.9
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/credential-provider-sso@3.616.0(@aws-sdk/client-sso-oidc@3.616.0):
+ resolution: {integrity: sha512-3rsWs9GBi8Z8Gps5ROwqguxtw+J6OIg1vawZMLRNMqqZoBvbOToe9wEnpid8ylU+27+oG8uibJNlNuRyXApUjw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/client-sso': 3.616.0
+ '@aws-sdk/token-providers': 3.614.0(@aws-sdk/client-sso-oidc@3.616.0)
+ '@aws-sdk/types': 3.609.0
+ '@smithy/property-provider': 3.1.8
+ '@smithy/shared-ini-file-loader': 3.1.9
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@aws-sdk/client-sso-oidc'
+ - aws-crt
+ dev: false
+
+ /@aws-sdk/credential-provider-web-identity@3.609.0(@aws-sdk/client-sts@3.616.0):
+ resolution: {integrity: sha512-U+PG8NhlYYF45zbr1km3ROtBMYqyyj/oK8NRp++UHHeuavgrP+4wJ4wQnlEaKvJBjevfo3+dlIBcaeQ7NYejWg==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ '@aws-sdk/client-sts': ^3.609.0
+ dependencies:
+ '@aws-sdk/client-sts': 3.616.0
+ '@aws-sdk/types': 3.609.0
+ '@smithy/property-provider': 3.1.8
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/middleware-host-header@3.616.0:
+ resolution: {integrity: sha512-mhNfHuGhCDZwYCABebaOvTgOM44UCZZRq2cBpgPZLVKP0ydAv5aFHXv01goexxXHqgHoEGx0uXWxlw0s2EpFDg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/middleware-logger@3.609.0:
+ resolution: {integrity: sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/middleware-recursion-detection@3.616.0:
+ resolution: {integrity: sha512-LQKAcrZRrR9EGez4fdCIVjdn0Ot2HMN12ChnoMGEU6oIxnQ2aSC7iASFFCV39IYfeMh7iSCPj7Wopqw8rAouzg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/middleware-user-agent@3.616.0:
+ resolution: {integrity: sha512-iMcAb4E+Z3vuEcrDsG6T2OBNiqWAquwahP9qepHqfmnmJqHr1mSHtXDYTGBNid31+621sUQmneUQ+fagpGAe4w==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@aws-sdk/util-endpoints': 3.614.0
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/region-config-resolver@3.614.0:
+ resolution: {integrity: sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/node-config-provider': 3.1.9
+ '@smithy/types': 3.6.0
+ '@smithy/util-config-provider': 3.0.0
+ '@smithy/util-middleware': 3.0.8
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/token-providers@3.614.0(@aws-sdk/client-sso-oidc@3.616.0):
+ resolution: {integrity: sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ '@aws-sdk/client-sso-oidc': ^3.614.0
+ dependencies:
+ '@aws-sdk/client-sso-oidc': 3.616.0(@aws-sdk/client-sts@3.616.0)
+ '@aws-sdk/types': 3.609.0
+ '@smithy/property-provider': 3.1.8
+ '@smithy/shared-ini-file-loader': 3.1.9
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/types@3.609.0:
+ resolution: {integrity: sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/util-endpoints@3.614.0:
+ resolution: {integrity: sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/types': 3.6.0
+ '@smithy/util-endpoints': 2.1.4
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/util-locate-window@3.679.0:
+ resolution: {integrity: sha512-zKTd48/ZWrCplkXpYDABI74rQlbR0DNHs8nH95htfSLj9/mWRSwaGptoxwcihaq/77vi/fl2X3y0a1Bo8bt7RA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/util-user-agent-browser@3.609.0:
+ resolution: {integrity: sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==}
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/types': 3.6.0
+ bowser: 2.11.0
+ tslib: 2.8.1
+ dev: false
+
+ /@aws-sdk/util-user-agent-node@3.614.0:
+ resolution: {integrity: sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ aws-crt: '>=1.0.0'
+ peerDependenciesMeta:
+ aws-crt:
+ optional: true
+ dependencies:
+ '@aws-sdk/types': 3.609.0
+ '@smithy/node-config-provider': 3.1.9
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@babel/code-frame@7.26.2:
+ resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.25.9
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ /@babel/compat-data@7.26.2:
+ resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/core@7.26.0:
+ resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.26.2
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helpers': 7.26.0
+ '@babel/parser': 7.26.2
+ '@babel/template': 7.25.9
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ convert-source-map: 2.0.0
+ debug: 4.3.7
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/generator@7.26.2:
+ resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/parser': 7.26.2
+ '@babel/types': 7.26.0
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 3.0.2
+
+ /@babel/helper-annotate-as-pure@7.25.9:
+ resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.26.0
+ dev: false
+
+ /@babel/helper-builder-binary-assignment-operator-visitor@7.25.9:
+ resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-compilation-targets@7.25.9:
+ resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/compat-data': 7.26.2
+ '@babel/helper-validator-option': 7.25.9
+ browserslist: 4.24.2
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ /@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-member-expression-to-functions': 7.25.9
+ '@babel/helper-optimise-call-expression': 7.25.9
+ '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ '@babel/traverse': 7.25.9
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ regexpu-core: 6.1.1
+ semver: 6.3.1
+ dev: false
+
+ /@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0):
+ resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ debug: 4.3.7
+ lodash.debounce: 4.0.8
+ resolve: 1.22.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-member-expression-to-functions@7.25.9:
+ resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-module-imports@7.25.9:
+ resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+ '@babel/traverse': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/helper-optimise-call-expression@7.25.9:
+ resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.26.0
+ dev: false
+
+ /@babel/helper-plugin-utils@7.25.9:
+ resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==}
+ engines: {node: '>=6.9.0'}
+ dev: false
+
+ /@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-wrap-function': 7.25.9
+ '@babel/traverse': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-member-expression-to-functions': 7.25.9
+ '@babel/helper-optimise-call-expression': 7.25.9
+ '@babel/traverse': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-simple-access@7.25.9:
+ resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-skip-transparent-expression-wrappers@7.25.9:
+ resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-string-parser@7.25.9:
+ resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-validator-identifier@7.25.9:
+ resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-validator-option@7.25.9:
+ resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-wrap-function@7.25.9:
+ resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.25.9
+ '@babel/traverse': 7.25.9
+ '@babel/types': 7.26.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helpers@7.26.0:
+ resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.0
+
+ /@babel/parser@7.26.2:
+ resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': 7.26.0
+
+ /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/traverse': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.13.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/traverse': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0):
+ resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ dev: false
+
+ /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.26.0):
+ resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0):
+ resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0)
+ '@babel/traverse': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.12.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0)
+ '@babel/traverse': 7.25.9
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/template': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/traverse': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-simple-access': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+ '@babel/traverse': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0)
+ dev: false
+
+ /@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-react-constant-elements@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/types': 7.26.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ regenerator-transform: 0.15.2
+ dev: false
+
+ /@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-runtime@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0)
+ babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0)
+ babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0)
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-typescript@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-annotate-as-pure': 7.25.9
+ '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-skip-transparent-expression-wrappers': 7.25.9
+ '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0)
+ '@babel/helper-plugin-utils': 7.25.9
+ dev: false
+
+ /@babel/preset-env@7.26.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/compat-data': 7.26.2
+ '@babel/core': 7.26.0
+ '@babel/helper-compilation-targets': 7.25.9
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-validator-option': 7.25.9
+ '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)
+ '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0)
+ '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-exponentiation-operator': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0)
+ '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0)
+ babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0)
+ babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0)
+ babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0)
+ core-js-compat: 3.39.0
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0):
+ resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/types': 7.26.0
+ esutils: 2.0.3
+ dev: false
+
+ /@babel/preset-react@7.25.9(@babel/core@7.26.0):
+ resolution: {integrity: sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-validator-option': 7.25.9
+ '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.26.0)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/preset-typescript@7.26.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.25.9
+ '@babel/helper-validator-option': 7.25.9
+ '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-typescript': 7.25.9(@babel/core@7.26.0)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/runtime-corejs3@7.26.0:
+ resolution: {integrity: sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ core-js-pure: 3.39.0
+ regenerator-runtime: 0.14.1
+ dev: false
+
+ /@babel/runtime@7.26.0:
+ resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ /@babel/template@7.25.9:
+ resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/parser': 7.26.2
+ '@babel/types': 7.26.0
+
+ /@babel/traverse@7.25.9:
+ resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.26.2
+ '@babel/parser': 7.26.2
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.0
+ debug: 4.3.7
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/types@7.26.0:
+ resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-string-parser': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+
+ /@braintree/sanitize-url@6.0.4:
+ resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==}
+ dev: false
+
+ /@bundled-es-modules/cookie@2.0.1:
+ resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==}
+ dependencies:
+ cookie: 0.7.2
+ dev: false
+
+ /@bundled-es-modules/statuses@1.0.1:
+ resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==}
+ dependencies:
+ statuses: 2.0.1
+ dev: false
+
+ /@cfaester/enzyme-adapter-react-18@0.8.0(enzyme@3.11.0)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-3Z3ThTUouHwz8oIyhTYQljEMNRFtlVyc3VOOHCbxs47U6cnXs8K9ygi/c1tv49s7MBlTXeIcuN+Ttd9aPtILFQ==}
+ peerDependencies:
+ enzyme: ^3.11.0
+ react: '>=18'
+ react-dom: '>=18'
+ dependencies:
+ enzyme: 3.11.0
+ enzyme-shallow-equal: 1.0.7
+ function.prototype.name: 1.1.6
+ has: 1.0.4
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-is: 18.3.1
+ react-shallow-renderer: 16.15.0(react@18.2.0)
+ dev: false
+
+ /@chevrotain/cst-dts-gen@10.5.0:
+ resolution: {integrity: sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==}
+ dependencies:
+ '@chevrotain/gast': 10.5.0
+ '@chevrotain/types': 10.5.0
+ lodash: 4.17.21
+ dev: false
+
+ /@chevrotain/gast@10.5.0:
+ resolution: {integrity: sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==}
+ dependencies:
+ '@chevrotain/types': 10.5.0
+ lodash: 4.17.21
+ dev: false
+
+ /@chevrotain/types@10.5.0:
+ resolution: {integrity: sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==}
+ dev: false
+
+ /@chevrotain/utils@10.5.0:
+ resolution: {integrity: sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==}
+ dev: false
+
+ /@colors/colors@1.5.0:
+ resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
+ engines: {node: '>=0.1.90'}
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@decentralized-identity/ion-sdk@1.0.4:
+ resolution: {integrity: sha512-pOWrlTH5ChxUKRHOgfG2ZeTioWEFJXADyErCQOJ0BqYNDKfP+CM09Vss+9ei6PNOABQlcDn0mEDFZtpO+DXl8A==}
+ dependencies:
+ '@noble/ed25519': 2.1.0
+ '@noble/secp256k1': 2.1.0
+ canonicalize: 2.0.0
+ multiformats: 12.1.3
+ uri-js: 4.4.1
+ dev: false
+
+ /@discoveryjs/json-ext@0.5.7:
+ resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==}
+ engines: {node: '>=10.0.0'}
+ dev: false
+
+ /@dnsquery/dns-packet@6.1.1:
+ resolution: {integrity: sha512-WXTuFvL3G+74SchFAtz3FgIYVOe196ycvGsMgvSH/8Goptb1qpIQtIuM4SOK9G9lhMWYpHxnXyy544ZhluFOew==}
+ engines: {node: '>=6'}
+ dependencies:
+ '@leichtgewicht/ip-codec': 2.0.5
+ utf8-codec: 1.0.0
+ dev: false
+
+ /@docsearch/css@3.8.0:
+ resolution: {integrity: sha512-pieeipSOW4sQ0+bE5UFC51AOZp9NGxg89wAlZ1BAQFaiRAGK1IKUaPQ0UGZeNctJXyqZ1UvBtOQh2HH+U5GtmA==}
+ dev: false
+
+ /@docsearch/react@3.8.0(@algolia/client-search@5.14.0)(@types/react@18.3.12)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.17.2):
+ resolution: {integrity: sha512-WnFK720+iwTVt94CxY3u+FgX6exb3BfN5kE9xUY6uuAH/9W/UFboBZFLlrw/zxFRHoHZCOXRtOylsXF+6LHI+Q==}
+ peerDependencies:
+ '@types/react': '>= 16.8.0 < 19.0.0'
+ react: '>= 16.8.0 < 19.0.0'
+ react-dom: '>= 16.8.0 < 19.0.0'
+ search-insights: '>= 1 < 3'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+ search-insights:
+ optional: true
+ dependencies:
+ '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.14.0)(algoliasearch@5.14.0)(search-insights@2.17.2)
+ '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.14.0)(algoliasearch@5.14.0)
+ '@docsearch/css': 3.8.0
+ '@types/react': 18.3.12
+ algoliasearch: 5.14.0
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ search-insights: 2.17.2
+ transitivePeerDependencies:
+ - '@algolia/client-search'
+ dev: false
+
+ /@docusaurus/babel@3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-JcKaunW8Ml2nTnfnvFc55T00Y+aCpNWnf1KY/gG+wWxHYDH0IdXOOz+k6NAlEAerW8+VYLfUqRIqHZ7N/DVXvQ==}
+ engines: {node: '>=18.0'}
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/generator': 7.26.2
+ '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.26.0)
+ '@babel/preset-env': 7.26.0(@babel/core@7.26.0)
+ '@babel/preset-react': 7.25.9(@babel/core@7.26.0)
+ '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0)
+ '@babel/runtime': 7.26.0
+ '@babel/runtime-corejs3': 7.26.0
+ '@babel/traverse': 7.25.9
+ '@docusaurus/logger': 3.6.1
+ '@docusaurus/utils': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ babel-plugin-dynamic-import-node: 2.3.3
+ fs-extra: 11.2.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@swc/core'
+ - acorn
+ - esbuild
+ - react
+ - react-dom
+ - supports-color
+ - typescript
+ - uglify-js
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/bundler@3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-vHSEx8Ku9x/gfIC6k4xb8J2nTxagLia0KvZkPZhxfkD1+n8i+Dj4BZPWTmv+kCA17RbgAvECG0XRZ0/ZEspQBQ==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ '@docusaurus/faster': '*'
+ peerDependenciesMeta:
+ '@docusaurus/faster':
+ optional: true
+ dependencies:
+ '@babel/core': 7.26.0
+ '@docusaurus/babel': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/cssnano-preset': 3.6.1
+ '@docusaurus/logger': 3.6.1
+ '@docusaurus/types': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ autoprefixer: 10.4.20(postcss@8.4.31)
+ babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.96.1)
+ clean-css: 5.3.3
+ copy-webpack-plugin: 11.0.0(webpack@5.96.1)
+ css-loader: 6.11.0(webpack@5.96.1)
+ css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.96.1)
+ cssnano: 6.1.2(postcss@8.4.31)
+ file-loader: 6.2.0(webpack@5.96.1)
+ html-minifier-terser: 7.2.0
+ mini-css-extract-plugin: 2.9.2(webpack@5.96.1)
+ null-loader: 4.0.1(webpack@5.96.1)
+ postcss: 8.4.31
+ postcss-loader: 7.3.4(postcss@8.4.31)(typescript@5.6.3)(webpack@5.96.1)
+ react-dev-utils: 12.0.1(typescript@5.6.3)(webpack@5.96.1)
+ terser-webpack-plugin: 5.3.10(webpack@5.96.1)
+ tslib: 2.8.1
+ url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.96.1)
+ webpack: 5.96.1
+ webpackbar: 6.0.1(webpack@5.96.1)
+ transitivePeerDependencies:
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - acorn
+ - csso
+ - esbuild
+ - eslint
+ - lightningcss
+ - react
+ - react-dom
+ - supports-color
+ - typescript
+ - uglify-js
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/core@3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-4Z1WkhCSkX4KO0Fw5m/Vuc7Q3NxBG53NE5u59Rs96fWkMPZVSrzEPP16/Nk6cWb/shK7xXPndTmalJtw7twL/w==}
+ engines: {node: '>=18.0'}
+ hasBin: true
+ peerDependencies:
+ '@mdx-js/react': ^3.0.0
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/generator': 7.26.2
+ '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.26.0)
+ '@babel/preset-env': 7.26.0(@babel/core@7.26.0)
+ '@babel/preset-react': 7.25.9(@babel/core@7.26.0)
+ '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0)
+ '@babel/runtime': 7.26.0
+ '@babel/runtime-corejs3': 7.26.0
+ '@babel/traverse': 7.25.9
+ '@docusaurus/cssnano-preset': 3.5.2
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@mdx-js/react': 3.0.1(@types/react@18.3.12)(react@18.2.0)
+ autoprefixer: 10.4.20(postcss@8.4.31)
+ babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.96.1)
+ babel-plugin-dynamic-import-node: 2.3.3
+ boxen: 6.2.1
+ chalk: 4.1.2
+ chokidar: 3.6.0
+ clean-css: 5.3.3
+ cli-table3: 0.6.5
+ combine-promises: 1.2.0
+ commander: 5.1.0
+ copy-webpack-plugin: 11.0.0(webpack@5.96.1)
+ core-js: 3.39.0
+ css-loader: 6.11.0(webpack@5.96.1)
+ css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.96.1)
+ cssnano: 6.1.2(postcss@8.4.31)
+ del: 6.1.1
+ detect-port: 1.6.1
+ escape-html: 1.0.3
+ eta: 2.2.0
+ eval: 0.1.8
+ file-loader: 6.2.0(webpack@5.96.1)
+ fs-extra: 11.2.0
+ html-minifier-terser: 7.2.0
+ html-tags: 3.3.1
+ html-webpack-plugin: 5.6.3(webpack@5.96.1)
+ leven: 3.1.0
+ lodash: 4.17.21
+ mini-css-extract-plugin: 2.9.2(webpack@5.96.1)
+ p-map: 4.0.0
+ postcss: 8.4.31
+ postcss-loader: 7.3.4(postcss@8.4.31)(typescript@5.6.3)(webpack@5.96.1)
+ prompts: 2.4.2
+ react: 18.2.0
+ react-dev-utils: 12.0.1(typescript@5.6.3)(webpack@5.96.1)
+ react-dom: 18.2.0(react@18.2.0)
+ react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0)
+ react-loadable: /@docusaurus/react-loadable@6.0.0(react@18.2.0)
+ react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0)(webpack@5.96.1)
+ react-router: 5.3.4(react@18.2.0)
+ react-router-config: 5.1.1(react-router@5.3.4)(react@18.2.0)
+ react-router-dom: 5.3.4(react@18.2.0)
+ rtl-detect: 1.1.2
+ semver: 7.6.3
+ serve-handler: 6.1.6
+ shelljs: 0.8.5
+ terser-webpack-plugin: 5.3.10(webpack@5.96.1)
+ tslib: 2.8.1
+ update-notifier: 6.0.2
+ url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.96.1)
+ webpack: 5.96.1
+ webpack-bundle-analyzer: 4.10.2
+ webpack-dev-server: 4.15.2(webpack@5.96.1)
+ webpack-merge: 5.10.0
+ webpackbar: 5.0.2(webpack@5.96.1)
+ transitivePeerDependencies:
+ - '@docusaurus/types'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - acorn
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - eslint
+ - lightningcss
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/core@3.6.1(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-cDKxPihiM2z7G+4QtpTczS7uxNfNG6naSqM65OmAJET0CFRHbc9mDlLFtQF0lsVES91SHqfcGaaLZmi2FjdwWA==}
+ engines: {node: '>=18.0'}
+ hasBin: true
+ peerDependencies:
+ '@mdx-js/react': ^3.0.0
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/babel': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/bundler': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/logger': 3.6.1
+ '@docusaurus/mdx-loader': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/utils': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils-validation': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@mdx-js/react': 3.0.1(@types/react@18.3.12)(react@18.2.0)
+ boxen: 6.2.1
+ chalk: 4.1.2
+ chokidar: 3.6.0
+ cli-table3: 0.6.5
+ combine-promises: 1.2.0
+ commander: 5.1.0
+ core-js: 3.39.0
+ del: 6.1.1
+ detect-port: 1.6.1
+ escape-html: 1.0.3
+ eta: 2.2.0
+ eval: 0.1.8
+ fs-extra: 11.2.0
+ html-tags: 3.3.1
+ html-webpack-plugin: 5.6.3(webpack@5.96.1)
+ leven: 3.1.0
+ lodash: 4.17.21
+ p-map: 4.0.0
+ prompts: 2.4.2
+ react: 18.2.0
+ react-dev-utils: 12.0.1(typescript@5.6.3)(webpack@5.96.1)
+ react-dom: 18.2.0(react@18.2.0)
+ react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0)
+ react-loadable: /@docusaurus/react-loadable@6.0.0(react@18.2.0)
+ react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0)(webpack@5.96.1)
+ react-router: 5.3.4(react@18.2.0)
+ react-router-config: 5.1.1(react-router@5.3.4)(react@18.2.0)
+ react-router-dom: 5.3.4(react@18.2.0)
+ rtl-detect: 1.1.2
+ semver: 7.6.3
+ serve-handler: 6.1.6
+ shelljs: 0.8.5
+ tslib: 2.8.1
+ update-notifier: 6.0.2
+ webpack: 5.96.1
+ webpack-bundle-analyzer: 4.10.2
+ webpack-dev-server: 4.15.2(webpack@5.96.1)
+ webpack-merge: 6.0.1
+ transitivePeerDependencies:
+ - '@docusaurus/faster'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - acorn
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - eslint
+ - lightningcss
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/cssnano-preset@3.5.2:
+ resolution: {integrity: sha512-D3KiQXOMA8+O0tqORBrTOEQyQxNIfPm9jEaJoALjjSjc2M/ZAWcUfPQEnwr2JB2TadHw2gqWgpZckQmrVWkytA==}
+ engines: {node: '>=18.0'}
+ dependencies:
+ cssnano-preset-advanced: 6.1.2(postcss@8.4.31)
+ postcss: 8.4.31
+ postcss-sort-media-queries: 5.2.0(postcss@8.4.31)
+ tslib: 2.8.1
+ dev: false
+
+ /@docusaurus/cssnano-preset@3.6.1:
+ resolution: {integrity: sha512-ZxYUmNeyQHW2w4/PJ7d07jQDuxzmKr9uPAQ6IVe5dTkeIeV0mDBB3jOLeJkNoI42Ru9JKEqQ9aVDtM9ct6QHnw==}
+ engines: {node: '>=18.0'}
+ dependencies:
+ cssnano-preset-advanced: 6.1.2(postcss@8.4.31)
+ postcss: 8.4.31
+ postcss-sort-media-queries: 5.2.0(postcss@8.4.31)
+ tslib: 2.8.1
+ dev: false
+
+ /@docusaurus/logger@3.5.2:
+ resolution: {integrity: sha512-LHC540SGkeLfyT3RHK3gAMK6aS5TRqOD4R72BEU/DE2M/TY8WwEUAMY576UUc/oNJXv8pGhBmQB6N9p3pt8LQw==}
+ engines: {node: '>=18.0'}
+ dependencies:
+ chalk: 4.1.2
+ tslib: 2.8.1
+ dev: false
+
+ /@docusaurus/logger@3.6.1:
+ resolution: {integrity: sha512-OvetI/nnOMBSqCkUzKAQhnIjhxduECK4qTu3tq/8/h/qqvLsvKURojm04WPE54L+Uy+UXMas0hnbBJd8zDlEOw==}
+ engines: {node: '>=18.0'}
+ dependencies:
+ chalk: 4.1.2
+ tslib: 2.8.1
+ dev: false
+
+ /@docusaurus/mdx-loader@3.5.2(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-ku3xO9vZdwpiMIVd8BzWV0DCqGEbCP5zs1iHfKX50vw6jX8vQo0ylYo1YJMZyz6e+JFJ17HYHT5FzVidz2IflA==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@mdx-js/mdx': 3.1.0(acorn@8.14.0)
+ '@slorber/remark-comment': 1.0.0
+ escape-html: 1.0.3
+ estree-util-value-to-estree: 3.2.1
+ file-loader: 6.2.0(webpack@5.96.1)
+ fs-extra: 11.2.0
+ image-size: 1.1.1
+ mdast-util-mdx: 3.0.0
+ mdast-util-to-string: 4.0.0
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ rehype-raw: 7.0.0
+ remark-directive: 3.0.0
+ remark-emoji: 4.0.1
+ remark-frontmatter: 5.0.0
+ remark-gfm: 4.0.0
+ stringify-object: 3.3.0
+ tslib: 2.8.1
+ unified: 11.0.5
+ unist-util-visit: 5.0.0
+ url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.96.1)
+ vfile: 6.0.3
+ webpack: 5.96.1
+ transitivePeerDependencies:
+ - '@docusaurus/types'
+ - '@swc/core'
+ - acorn
+ - esbuild
+ - supports-color
+ - typescript
+ - uglify-js
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/mdx-loader@3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-KPIsYi0S3X3/rNrW3V1fgOu5t6ahYWc31zTHHod8pacFxdmk9Uf6uuw+Jd6Cly1ilgal+41Ku+s0gmMuqKqiqg==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/logger': 3.6.1
+ '@docusaurus/utils': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/utils-validation': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@mdx-js/mdx': 3.1.0(acorn@8.14.0)
+ '@slorber/remark-comment': 1.0.0
+ escape-html: 1.0.3
+ estree-util-value-to-estree: 3.2.1
+ file-loader: 6.2.0(webpack@5.96.1)
+ fs-extra: 11.2.0
+ image-size: 1.1.1
+ mdast-util-mdx: 3.0.0
+ mdast-util-to-string: 4.0.0
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ rehype-raw: 7.0.0
+ remark-directive: 3.0.0
+ remark-emoji: 4.0.1
+ remark-frontmatter: 5.0.0
+ remark-gfm: 4.0.0
+ stringify-object: 3.3.0
+ tslib: 2.8.1
+ unified: 11.0.5
+ unist-util-visit: 5.0.0
+ url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.96.1)
+ vfile: 6.0.3
+ webpack: 5.96.1
+ transitivePeerDependencies:
+ - '@swc/core'
+ - acorn
+ - esbuild
+ - supports-color
+ - typescript
+ - uglify-js
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/module-type-aliases@3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg==}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+ dependencies:
+ '@docusaurus/types': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@types/history': 4.7.11
+ '@types/react': 18.3.12
+ '@types/react-router-config': 5.0.11
+ '@types/react-router-dom': 5.3.3
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-helmet-async: 2.0.5(react@18.2.0)
+ react-loadable: /@docusaurus/react-loadable@6.0.0(react@18.2.0)
+ transitivePeerDependencies:
+ - '@swc/core'
+ - acorn
+ - esbuild
+ - supports-color
+ - uglify-js
+ - webpack-cli
+
+ /@docusaurus/module-type-aliases@3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-J+q1jgm7TnEfVIUZImSFeLA1rghb6nwtoB9siHdcgKpDqFJ9/S7xhQL2aEKE7iZMZYzpu+2F390E9A7GkdEJNA==}
+ peerDependencies:
+ react: '*'
+ react-dom: '*'
+ dependencies:
+ '@docusaurus/types': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@types/history': 4.7.11
+ '@types/react': 18.3.12
+ '@types/react-router-config': 5.0.11
+ '@types/react-router-dom': 5.3.3
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-helmet-async: 2.0.5(react@18.2.0)
+ react-loadable: /@docusaurus/react-loadable@6.0.0(react@18.2.0)
+ transitivePeerDependencies:
+ - '@swc/core'
+ - acorn
+ - esbuild
+ - supports-color
+ - uglify-js
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/plugin-content-blog@3.5.2(@docusaurus/plugin-content-docs@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-R7ghWnMvjSf+aeNDH0K4fjyQnt5L0KzUEnUhmf1e3jZrv3wogeytZNN6n7X8yHcMsuZHPOrctQhXWnmxu+IRRg==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ '@docusaurus/plugin-content-docs': '*'
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2)(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ cheerio: 1.0.0-rc.12
+ feed: 4.2.2
+ fs-extra: 11.2.0
+ lodash: 4.17.21
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ reading-time: 1.5.0
+ srcset: 4.0.0
+ tslib: 2.8.1
+ unist-util-visit: 5.0.0
+ utility-types: 3.11.0
+ webpack: 5.96.1
+ transitivePeerDependencies:
+ - '@mdx-js/react'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - acorn
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - eslint
+ - lightningcss
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/plugin-content-docs@3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-Bt+OXn/CPtVqM3Di44vHjE7rPCEsRCB/DMo2qoOuozB9f7+lsdrHvD0QCHdBs0uhz6deYJDppAr2VgqybKPlVQ==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/module-type-aliases': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2)(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@types/react-router-config': 5.0.11
+ combine-promises: 1.2.0
+ fs-extra: 11.2.0
+ js-yaml: 4.1.0
+ lodash: 4.17.21
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.8.1
+ utility-types: 3.11.0
+ webpack: 5.96.1
+ transitivePeerDependencies:
+ - '@mdx-js/react'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - acorn
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - eslint
+ - lightningcss
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/plugin-content-docs@3.6.1(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-Uq8kyn5DYCDmkUlB9sWChhWghS4lUFNiQU+RXcAXJ3qCVXsBpPsh6RF+npQG1N+j4wAbjydM1iLLJJzp+x3eMQ==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/core': 3.6.1(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/logger': 3.6.1
+ '@docusaurus/mdx-loader': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/module-type-aliases': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/theme-common': 3.6.1(@docusaurus/plugin-content-docs@3.6.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/types': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils-validation': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@types/react-router-config': 5.0.11
+ combine-promises: 1.2.0
+ fs-extra: 11.2.0
+ js-yaml: 4.1.0
+ lodash: 4.17.21
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.8.1
+ utility-types: 3.11.0
+ webpack: 5.96.1
+ transitivePeerDependencies:
+ - '@docusaurus/faster'
+ - '@mdx-js/react'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - acorn
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - eslint
+ - lightningcss
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/plugin-content-pages@3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-WzhHjNpoQAUz/ueO10cnundRz+VUtkjFhhaQ9jApyv1a46FPURO4cef89pyNIOMny1fjDz/NUN2z6Yi+5WUrCw==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ fs-extra: 11.2.0
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.8.1
+ webpack: 5.96.1
+ transitivePeerDependencies:
+ - '@mdx-js/react'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - acorn
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - eslint
+ - lightningcss
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/plugin-debug@3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-kBK6GlN0itCkrmHuCS6aX1wmoWc5wpd5KJlqQ1FyrF0cLDnvsYSnh7+ftdwzt7G6lGBho8lrVwkkL9/iQvaSOA==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ fs-extra: 11.2.0
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-json-view-lite: 1.5.0(react@18.2.0)
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@mdx-js/react'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - acorn
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - eslint
+ - lightningcss
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/plugin-google-analytics@3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-rjEkJH/tJ8OXRE9bwhV2mb/WP93V441rD6XnM6MIluu7rk8qg38iSxS43ga2V2Q/2ib53PcqbDEJDG/yWQRJhQ==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@mdx-js/react'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - acorn
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - eslint
+ - lightningcss
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/plugin-google-gtag@3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-lm8XL3xLkTPHFKKjLjEEAHUrW0SZBSHBE1I+i/tmYMBsjCcUB5UJ52geS5PSiOCFVR74tbPGcPHEV/gaaxFeSA==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@types/gtag.js': 0.0.12
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@mdx-js/react'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - acorn
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - eslint
+ - lightningcss
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/plugin-google-tag-manager@3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-QkpX68PMOMu10Mvgvr5CfZAzZQFx8WLlOiUQ/Qmmcl6mjGK6H21WLT5x7xDmcpCoKA/3CegsqIqBR+nA137lQg==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@mdx-js/react'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - acorn
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - eslint
+ - lightningcss
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/plugin-sitemap@3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-DnlqYyRAdQ4NHY28TfHuVk414ft2uruP4QWCH//jzpHjqvKyXjj2fmDtI8RPUBh9K8iZKFMHRnLtzJKySPWvFA==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/types': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ fs-extra: 11.2.0
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ sitemap: 7.1.2
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@mdx-js/react'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - acorn
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - eslint
+ - lightningcss
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/preset-classic@3.5.2(@algolia/client-search@5.14.0)(@mdx-js/react@3.0.1)(@types/react@18.3.12)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.17.2)(typescript@5.6.3):
+ resolution: {integrity: sha512-3ihfXQ95aOHiLB5uCu+9PRy2gZCeSZoDcqpnDvf3B+sTrMvMTr8qRUzBvWkoIqc82yG5prCboRjk1SVILKx6sg==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/plugin-debug': 3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/plugin-google-analytics': 3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/plugin-google-gtag': 3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/plugin-google-tag-manager': 3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/plugin-sitemap': 3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/theme-classic': 3.5.2(@types/react@18.3.12)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2)(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/theme-search-algolia': 3.5.2(@algolia/client-search@5.14.0)(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(@types/react@18.3.12)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.17.2)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ transitivePeerDependencies:
+ - '@algolia/client-search'
+ - '@mdx-js/react'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - '@types/react'
+ - acorn
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - eslint
+ - lightningcss
+ - search-insights
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/react-loadable@6.0.0(react@18.2.0):
+ resolution: {integrity: sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==}
+ peerDependencies:
+ react: '*'
+ dependencies:
+ '@types/react': 18.3.12
+ react: 18.2.0
+
+ /@docusaurus/theme-classic@3.5.2(@types/react@18.3.12)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-XRpinSix3NBv95Rk7xeMF9k4safMkwnpSgThn0UNQNumKvmcIYjfkwfh2BhwYh/BxMXQHJ/PdmNh22TQFpIaYg==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/module-type-aliases': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/plugin-content-blog': 3.5.2(@docusaurus/plugin-content-docs@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/plugin-content-pages': 3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2)(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/theme-translations': 3.5.2
+ '@docusaurus/types': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@mdx-js/react': 3.0.1(@types/react@18.3.12)(react@18.2.0)
+ clsx: 2.1.1
+ copy-text-to-clipboard: 3.2.0
+ infima: 0.2.0-alpha.44
+ lodash: 4.17.21
+ nprogress: 0.2.0
+ postcss: 8.4.31
+ prism-react-renderer: 2.3.1(react@18.2.0)
+ prismjs: 1.29.0
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-router-dom: 5.3.4(react@18.2.0)
+ rtlcss: 4.3.0
+ tslib: 2.8.1
+ utility-types: 3.11.0
+ transitivePeerDependencies:
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - '@types/react'
+ - acorn
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - eslint
+ - lightningcss
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.5.2)(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-QXqlm9S6x9Ibwjs7I2yEDgsCocp708DrCrgHgKwg2n2AY0YQ6IjU0gAK35lHRLOvAoJUfCKpQAwUykB0R7+Eew==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ '@docusaurus/plugin-content-docs': '*'
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/module-type-aliases': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2)
+ '@types/history': 4.7.11
+ '@types/react': 18.3.12
+ '@types/react-router-config': 5.0.11
+ clsx: 2.1.1
+ parse-numeric-range: 1.3.0
+ prism-react-renderer: 2.3.1(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.8.1
+ utility-types: 3.11.0
+ transitivePeerDependencies:
+ - '@docusaurus/types'
+ - '@swc/core'
+ - acorn
+ - esbuild
+ - supports-color
+ - typescript
+ - uglify-js
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/theme-common@3.5.2(@docusaurus/plugin-content-docs@3.6.1)(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-QXqlm9S6x9Ibwjs7I2yEDgsCocp708DrCrgHgKwg2n2AY0YQ6IjU0gAK35lHRLOvAoJUfCKpQAwUykB0R7+Eew==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ '@docusaurus/plugin-content-docs': '*'
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/mdx-loader': 3.5.2(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/module-type-aliases': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/plugin-content-docs': 3.6.1(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2)
+ '@types/history': 4.7.11
+ '@types/react': 18.3.12
+ '@types/react-router-config': 5.0.11
+ clsx: 2.1.1
+ parse-numeric-range: 1.3.0
+ prism-react-renderer: 2.3.1(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.8.1
+ utility-types: 3.11.0
+ transitivePeerDependencies:
+ - '@docusaurus/types'
+ - '@swc/core'
+ - acorn
+ - esbuild
+ - supports-color
+ - typescript
+ - uglify-js
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/theme-common@3.6.1(@docusaurus/plugin-content-docs@3.6.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-18iEYNpMvarGfq9gVRpGowSZD24vZ39Iz4acqaj64180i54V9el8tVnhNr/wRvrUm1FY30A1NHLqnMnDz4rYEQ==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ '@docusaurus/plugin-content-docs': '*'
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/mdx-loader': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/module-type-aliases': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/plugin-content-docs': 3.6.1(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/utils': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@types/history': 4.7.11
+ '@types/react': 18.3.12
+ '@types/react-router-config': 5.0.11
+ clsx: 2.1.1
+ parse-numeric-range: 1.3.0
+ prism-react-renderer: 2.3.1(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.8.1
+ utility-types: 3.11.0
+ transitivePeerDependencies:
+ - '@swc/core'
+ - acorn
+ - esbuild
+ - supports-color
+ - typescript
+ - uglify-js
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/theme-mermaid@3.5.2(@docusaurus/plugin-content-docs@3.6.1)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-7vWCnIe/KoyTN1Dc55FIyqO5hJ3YaV08Mr63Zej0L0mX1iGzt+qKSmeVUAJ9/aOalUhF0typV0RmNUSy5FAmCg==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/module-type-aliases': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.6.1)(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/types': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ mermaid: 10.9.3
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@docusaurus/plugin-content-docs'
+ - '@mdx-js/react'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - acorn
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - eslint
+ - lightningcss
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/theme-search-algolia@3.5.2(@algolia/client-search@5.14.0)(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(@types/react@18.3.12)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.17.2)(typescript@5.6.3):
+ resolution: {integrity: sha512-qW53kp3VzMnEqZGjakaV90sst3iN1o32PH+nawv1uepROO8aEGxptcq2R5rsv7aBShSRbZwIobdvSYKsZ5pqvA==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@docsearch/react': 3.8.0(@algolia/client-search@5.14.0)(@types/react@18.3.12)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.17.2)
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/plugin-content-docs': 3.5.2(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.5.2)(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/theme-translations': 3.5.2
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@docusaurus/utils-validation': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ algoliasearch: 4.24.0
+ algoliasearch-helper: 3.22.5(algoliasearch@4.24.0)
+ clsx: 2.1.1
+ eta: 2.2.0
+ fs-extra: 11.2.0
+ lodash: 4.17.21
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ tslib: 2.8.1
+ utility-types: 3.11.0
+ transitivePeerDependencies:
+ - '@algolia/client-search'
+ - '@docusaurus/types'
+ - '@mdx-js/react'
+ - '@parcel/css'
+ - '@rspack/core'
+ - '@swc/core'
+ - '@swc/css'
+ - '@types/react'
+ - acorn
+ - bufferutil
+ - csso
+ - debug
+ - esbuild
+ - eslint
+ - lightningcss
+ - search-insights
+ - supports-color
+ - typescript
+ - uglify-js
+ - utf-8-validate
+ - vue-template-compiler
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/theme-translations@3.5.2:
+ resolution: {integrity: sha512-GPZLcu4aT1EmqSTmbdpVrDENGR2yObFEX8ssEFYTCiAIVc0EihNSdOIBTazUvgNqwvnoU1A8vIs1xyzc3LITTw==}
+ engines: {node: '>=18.0'}
+ dependencies:
+ fs-extra: 11.2.0
+ tslib: 2.8.1
+ dev: false
+
+ /@docusaurus/types@3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@mdx-js/mdx': 3.1.0(acorn@8.14.0)
+ '@types/history': 4.7.11
+ '@types/react': 18.3.12
+ commander: 5.1.0
+ joi: 17.13.3
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0)
+ utility-types: 3.11.0
+ webpack: 5.96.1
+ webpack-merge: 5.10.0
+ transitivePeerDependencies:
+ - '@swc/core'
+ - acorn
+ - esbuild
+ - supports-color
+ - uglify-js
+ - webpack-cli
+
+ /@docusaurus/types@3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-hCB1hj9DYutVYBisnPNobz9SzEmCcf1EetJv09O49Cov3BqOkm+vnnjB3d957YJMtpLGQoKBeN/FF1DZ830JwQ==}
+ peerDependencies:
+ react: ^18.0.0
+ react-dom: ^18.0.0
+ dependencies:
+ '@mdx-js/mdx': 3.1.0(acorn@8.14.0)
+ '@types/history': 4.7.11
+ '@types/react': 18.3.12
+ commander: 5.1.0
+ joi: 17.13.3
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0)
+ utility-types: 3.11.0
+ webpack: 5.96.1
+ webpack-merge: 5.10.0
+ transitivePeerDependencies:
+ - '@swc/core'
+ - acorn
+ - esbuild
+ - supports-color
+ - uglify-js
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/utils-common@3.5.2(@docusaurus/types@3.5.2):
+ resolution: {integrity: sha512-i0AZjHiRgJU6d7faQngIhuHKNrszpL/SHQPgF1zH4H+Ij6E9NBYGy6pkcGWToIv7IVPbs+pQLh1P3whn0gWXVg==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ '@docusaurus/types': '*'
+ peerDependenciesMeta:
+ '@docusaurus/types':
+ optional: true
+ dependencies:
+ '@docusaurus/types': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ tslib: 2.8.1
+ dev: false
+
+ /@docusaurus/utils-common@3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-LX1qiTiC0aS8c92uZ+Wj2iNCNJyYZJIKY8/nZDKNMBfo759VYVS3RX3fKP3DznB+16sYp7++MyCz/T6fOGaRfw==}
+ engines: {node: '>=18.0'}
+ dependencies:
+ '@docusaurus/types': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@swc/core'
+ - acorn
+ - esbuild
+ - react
+ - react-dom
+ - supports-color
+ - uglify-js
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/utils-validation@3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3):
+ resolution: {integrity: sha512-m+Foq7augzXqB6HufdS139PFxDC5d5q2QKZy8q0qYYvGdI6nnlNsGH4cIGsgBnV7smz+mopl3g4asbSDvMV0jA==}
+ engines: {node: '>=18.0'}
+ dependencies:
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2)
+ fs-extra: 11.2.0
+ joi: 17.13.3
+ js-yaml: 4.1.0
+ lodash: 4.17.21
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@docusaurus/types'
+ - '@swc/core'
+ - esbuild
+ - supports-color
+ - typescript
+ - uglify-js
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/utils-validation@3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-+iMd6zRl5cJQm7nUP+7pSO/oAXsN79eHO34ME7l2YJt4GEAr70l5kkD58u2jEPpp+wSXT70c7x2A2lzJI1E8jw==}
+ engines: {node: '>=18.0'}
+ dependencies:
+ '@docusaurus/logger': 3.6.1
+ '@docusaurus/utils': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ fs-extra: 11.2.0
+ joi: 17.13.3
+ js-yaml: 4.1.0
+ lodash: 4.17.21
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - '@swc/core'
+ - acorn
+ - esbuild
+ - react
+ - react-dom
+ - supports-color
+ - typescript
+ - uglify-js
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/utils@3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3):
+ resolution: {integrity: sha512-33QvcNFh+Gv+C2dP9Y9xWEzMgf3JzrpL2nW9PopidiohS1nDcyknKRx2DWaFvyVTTYIkkABVSr073VTj/NITNA==}
+ engines: {node: '>=18.0'}
+ peerDependencies:
+ '@docusaurus/types': '*'
+ peerDependenciesMeta:
+ '@docusaurus/types':
+ optional: true
+ dependencies:
+ '@docusaurus/logger': 3.5.2
+ '@docusaurus/types': 3.5.2(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils-common': 3.5.2(@docusaurus/types@3.5.2)
+ '@svgr/webpack': 8.1.0(typescript@5.6.3)
+ escape-string-regexp: 4.0.0
+ file-loader: 6.2.0(webpack@5.96.1)
+ fs-extra: 11.2.0
+ github-slugger: 1.5.0
+ globby: 11.1.0
+ gray-matter: 4.0.3
+ jiti: 1.21.6
+ js-yaml: 4.1.0
+ lodash: 4.17.21
+ micromatch: 4.0.8
+ prompts: 2.4.2
+ resolve-pathname: 3.0.0
+ shelljs: 0.8.5
+ tslib: 2.8.1
+ url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.96.1)
+ utility-types: 3.11.0
+ webpack: 5.96.1
+ transitivePeerDependencies:
+ - '@swc/core'
+ - esbuild
+ - supports-color
+ - typescript
+ - uglify-js
+ - webpack-cli
+ dev: false
+
+ /@docusaurus/utils@3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-nS3WCvepwrnBEgSG5vQu40XG95lC9Jeh/odV5u5IhU1eQFEGDst9xBi6IK5yZdsGvbuaXBZLZtOqWYtuuFa/rQ==}
+ engines: {node: '>=18.0'}
+ dependencies:
+ '@docusaurus/logger': 3.6.1
+ '@docusaurus/types': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@docusaurus/utils-common': 3.6.1(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)
+ '@svgr/webpack': 8.1.0(typescript@5.6.3)
+ escape-string-regexp: 4.0.0
+ file-loader: 6.2.0(webpack@5.96.1)
+ fs-extra: 11.2.0
+ github-slugger: 1.5.0
+ globby: 11.1.0
+ gray-matter: 4.0.3
+ jiti: 1.21.6
+ js-yaml: 4.1.0
+ lodash: 4.17.21
+ micromatch: 4.0.8
+ prompts: 2.4.2
+ resolve-pathname: 3.0.0
+ shelljs: 0.8.5
+ tslib: 2.8.1
+ url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.96.1)
+ utility-types: 3.11.0
+ webpack: 5.96.1
+ transitivePeerDependencies:
+ - '@swc/core'
+ - acorn
+ - esbuild
+ - react
+ - react-dom
+ - supports-color
+ - typescript
+ - uglify-js
+ - webpack-cli
+ dev: false
+
+ /@emotion/is-prop-valid@1.2.2:
+ resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==}
+ dependencies:
+ '@emotion/memoize': 0.8.1
+ dev: false
+
+ /@emotion/memoize@0.8.1:
+ resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==}
+ dev: false
+
+ /@emotion/unitless@0.8.1:
+ resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==}
+ dev: false
+
+ /@esbuild/aix-ppc64@0.19.12:
+ resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [aix]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-arm64@0.19.12:
+ resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-arm@0.19.12:
+ resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-x64@0.19.12:
+ resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-arm64@0.19.12:
+ resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-x64@0.19.12:
+ resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-arm64@0.19.12:
+ resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-x64@0.19.12:
+ resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm64@0.19.12:
+ resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm@0.19.12:
+ resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ia32@0.19.12:
+ resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-loong64@0.14.54:
+ resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-loong64@0.19.12:
+ resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-mips64el@0.19.12:
+ resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ppc64@0.19.12:
+ resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-riscv64@0.19.12:
+ resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-s390x@0.19.12:
+ resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-x64@0.19.12:
+ resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/netbsd-x64@0.19.12:
+ resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/openbsd-x64@0.19.12:
+ resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/sunos-x64@0.19.12:
+ resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-arm64@0.19.12:
+ resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-ia32@0.19.12:
+ resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-x64@0.19.12:
+ resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@exodus/schemasafe@1.3.0:
+ resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==}
+ dev: false
+
+ /@fortawesome/fontawesome-common-types@6.4.2:
+ resolution: {integrity: sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==}
+ engines: {node: '>=6'}
+ requiresBuild: true
+ dev: false
+
+ /@fortawesome/fontawesome-svg-core@6.4.2:
+ resolution: {integrity: sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==}
+ engines: {node: '>=6'}
+ requiresBuild: true
+ dependencies:
+ '@fortawesome/fontawesome-common-types': 6.4.2
+ dev: false
+
+ /@fortawesome/free-solid-svg-icons@6.4.2:
+ resolution: {integrity: sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA==}
+ engines: {node: '>=6'}
+ requiresBuild: true
+ dependencies:
+ '@fortawesome/fontawesome-common-types': 6.4.2
+ dev: false
+
+ /@fortawesome/react-fontawesome@0.2.0(@fortawesome/fontawesome-svg-core@6.4.2)(react@18.2.0):
+ resolution: {integrity: sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==}
+ peerDependencies:
+ '@fortawesome/fontawesome-svg-core': ~1 || ~6
+ react: '>=16.3'
+ dependencies:
+ '@fortawesome/fontawesome-svg-core': 6.4.2
+ prop-types: 15.8.1
+ react: 18.2.0
+ dev: false
+
+ /@hapi/hoek@9.3.0:
+ resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
+
+ /@hapi/topo@5.1.0:
+ resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==}
+ dependencies:
+ '@hapi/hoek': 9.3.0
+
+ /@ipld/dag-cbor@9.0.3:
+ resolution: {integrity: sha512-A2UFccS0+sARK9xwXiVZIaWbLbPxLGP3UZOjBeOMWfDY04SXi8h1+t4rHBzOlKYF/yWNm3RbFLyclWO7hZcy4g==}
+ engines: {node: '>=16.0.0', npm: '>=7.0.0'}
+ dependencies:
+ cborg: 2.0.5
+ multiformats: 12.1.3
+ dev: false
+
+ /@ipld/dag-pb@4.1.3:
+ resolution: {integrity: sha512-ueULCaaSCcD+dQga6nKiRr+RSeVgdiYiEPKVUu5iQMNYDN+9osd0KpR3UDd9uQQ+6RWuv9L34SchfEwj7YIbOA==}
+ engines: {node: '>=16.0.0', npm: '>=7.0.0'}
+ dependencies:
+ multiformats: 13.3.1
+ dev: false
+
+ /@isaacs/cliui@8.0.2:
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: /string-width@4.2.3
+ strip-ansi: 7.1.0
+ strip-ansi-cjs: /strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: /wrap-ansi@7.0.0
+
+ /@isaacs/ttlcache@1.4.1:
+ resolution: {integrity: sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /@istanbuljs/schema@0.1.3:
+ resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /@jest/schemas@29.6.3:
+ resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@sinclair/typebox': 0.27.8
+
+ /@jest/types@29.6.3:
+ resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/schemas': 29.6.3
+ '@types/istanbul-lib-coverage': 2.0.6
+ '@types/istanbul-reports': 3.0.4
+ '@types/node': 22.9.0
+ '@types/yargs': 17.0.33
+ chalk: 4.1.2
+ dev: false
+
+ /@jridgewell/gen-mapping@0.3.5:
+ resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/set-array': 1.2.1
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@jridgewell/trace-mapping': 0.3.25
+
+ /@jridgewell/resolve-uri@3.1.2:
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ /@jridgewell/set-array@1.2.1:
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+ engines: {node: '>=6.0.0'}
+
+ /@jridgewell/source-map@0.3.6:
+ resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+
+ /@jridgewell/sourcemap-codec@1.5.0:
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+ /@jridgewell/trace-mapping@0.3.25:
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ /@js-temporal/polyfill@0.4.4:
+ resolution: {integrity: sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==}
+ engines: {node: '>=12'}
+ dependencies:
+ jsbi: 4.3.0
+ tslib: 2.8.1
+ dev: false
+
+ /@jspm/core@2.0.0-beta.24:
+ resolution: {integrity: sha512-a4Bo/80Z6CoJNor5ldgs6002utmmbttP4JYd/FJ0Ob2fVdf6O6ha5SORBCqrnDnBvMc1TlrHY7dCfat5+H0a6A==}
+ dev: true
+
+ /@leichtgewicht/ip-codec@2.0.5:
+ resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==}
+ dev: false
+
+ /@mdx-js/mdx@3.1.0(acorn@8.14.0):
+ resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==}
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdx': 2.0.13
+ collapse-white-space: 2.1.0
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-util-scope: 1.0.0
+ estree-walker: 3.0.3
+ hast-util-to-jsx-runtime: 2.3.2
+ markdown-extensions: 2.0.0
+ recma-build-jsx: 1.0.0
+ recma-jsx: 1.0.0(acorn@8.14.0)
+ recma-stringify: 1.0.0
+ rehype-recma: 1.0.0
+ remark-mdx: 3.1.0
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.1
+ source-map: 0.7.4
+ unified: 11.0.5
+ unist-util-position-from-estree: 2.0.0
+ unist-util-stringify-position: 4.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - acorn
+ - supports-color
+
+ /@mdx-js/react@3.0.1(@types/react@18.3.12)(react@18.2.0):
+ resolution: {integrity: sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==}
+ peerDependencies:
+ '@types/react': '>=16'
+ react: '>=16'
+ dependencies:
+ '@types/mdx': 2.0.13
+ '@types/react': 18.3.12
+ react: 18.2.0
+ dev: false
+
+ /@mswjs/cookies@1.1.1:
+ resolution: {integrity: sha512-W68qOHEjx1iD+4VjQudlx26CPIoxmIAtK4ZCexU0/UJBG6jYhcuyzKJx+Iw8uhBIGd9eba64XgWVgo20it1qwA==}
+ engines: {node: '>=18'}
+ dev: false
+
+ /@mswjs/interceptors@0.25.16:
+ resolution: {integrity: sha512-8QC8JyKztvoGAdPgyZy49c9vSHHAZjHagwl4RY9E8carULk8ym3iTaiawrT1YoLF/qb449h48f71XDPgkUSOUg==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@open-draft/deferred-promise': 2.2.0
+ '@open-draft/logger': 0.3.0
+ '@open-draft/until': 2.1.0
+ is-node-process: 1.2.0
+ outvariant: 1.4.3
+ strict-event-emitter: 0.5.1
+ dev: false
+
+ /@multiformats/murmur3@2.1.8:
+ resolution: {integrity: sha512-6vId1C46ra3R1sbJUOFCZnsUIveR9oF20yhPmAFxPm0JfrX3/ZRCgP3YDrBzlGoEppOXnA9czHeYc0T9mB6hbA==}
+ engines: {node: '>=16.0.0', npm: '>=7.0.0'}
+ dependencies:
+ multiformats: 13.3.1
+ murmurhash3js-revisited: 3.0.0
+ dev: false
+
+ /@noble/ciphers@0.3.0:
+ resolution: {integrity: sha512-ldbrnOjmNRwFdXcTM6uXDcxpMIFrbzAWNnpBPp4oTJTFF0XByGD6vf45WrehZGXRQTRVV+Zm8YP+EgEf+e4cWA==}
+ dev: false
+
+ /@noble/ciphers@0.4.1:
+ resolution: {integrity: sha512-QCOA9cgf3Rc33owG0AYBB9wszz+Ul2kramWN8tXG44Gyciud/tbkEqvxRF/IpqQaBpRBNi9f4jdNxqB2CQCIXg==}
+ dev: false
+
+ /@noble/ciphers@0.5.3:
+ resolution: {integrity: sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==}
+ dev: false
+
+ /@noble/curves@1.3.0:
+ resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==}
+ dependencies:
+ '@noble/hashes': 1.3.3
+ dev: false
+
+ /@noble/curves@1.4.2:
+ resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==}
+ dependencies:
+ '@noble/hashes': 1.4.0
+ dev: false
+
+ /@noble/ed25519@2.0.0:
+ resolution: {integrity: sha512-/extjhkwFupyopDrt80OMWKdLgP429qLZj+z6sYJz90rF2Iz0gjZh2ArMKPImUl13Kx+0EXI2hN9T/KJV0/Zng==}
+ dev: false
+
+ /@noble/ed25519@2.1.0:
+ resolution: {integrity: sha512-KM4qTyXPinyCgMzeYJH/UudpdL+paJXtY3CHtHYZQtBkS8MZoPr4rOikZllIutJe0d06QDQKisyn02gxZ8TcQA==}
+ dev: false
+
+ /@noble/hashes@1.3.3:
+ resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==}
+ engines: {node: '>= 16'}
+ dev: false
+
+ /@noble/hashes@1.4.0:
+ resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==}
+ engines: {node: '>= 16'}
+ dev: false
+
+ /@noble/hashes@1.5.0:
+ resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==}
+ engines: {node: ^14.21.3 || >=16}
+ dev: false
+
+ /@noble/secp256k1@2.0.0:
+ resolution: {integrity: sha512-rUGBd95e2a45rlmFTqQJYEFA4/gdIARFfuTuTqLglz0PZ6AKyzyXsEZZq7UZn8hZsvaBgpCzKKBJizT2cJERXw==}
+ dev: false
+
+ /@noble/secp256k1@2.1.0:
+ resolution: {integrity: sha512-XLEQQNdablO0XZOIniFQimiXsZDNwaYgL96dZwC54Q30imSbAOFf3NKtepc+cXyuZf5Q1HCgbqgZ2UFFuHVcEw==}
+ dev: false
+
+ /@nodelib/fs.scandir@2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+ dev: false
+
+ /@nodelib/fs.stat@2.0.5:
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+ dev: false
+
+ /@nodelib/fs.walk@1.2.8:
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.17.1
+ dev: false
+
+ /@open-draft/deferred-promise@2.2.0:
+ resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==}
+ dev: false
+
+ /@open-draft/logger@0.3.0:
+ resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==}
+ dependencies:
+ is-node-process: 1.2.0
+ outvariant: 1.4.3
+ dev: false
+
+ /@open-draft/until@2.1.0:
+ resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==}
+ dev: false
+
+ /@pkgjs/parseargs@0.11.0:
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+ requiresBuild: true
+ optional: true
+
+ /@pnpm/config.env-replace@1.1.0:
+ resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==}
+ engines: {node: '>=12.22.0'}
+ dev: false
+
+ /@pnpm/network.ca-file@1.0.2:
+ resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==}
+ engines: {node: '>=12.22.0'}
+ dependencies:
+ graceful-fs: 4.2.10
+ dev: false
+
+ /@pnpm/npm-conf@2.3.1:
+ resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@pnpm/config.env-replace': 1.1.0
+ '@pnpm/network.ca-file': 1.0.2
+ config-chain: 1.1.13
+ dev: false
+
+ /@polka/url@1.0.0-next.28:
+ resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
+
+ /@puppeteer/browsers@1.3.0(typescript@5.6.3):
+ resolution: {integrity: sha512-an3QdbNPkuU6qpxpbssxAbjRLJcF+eP4L8UqIY3+6n0sbaVxw5pz7PiCLy9g32XEZuoamUlV5ZQPnA6FxvkIHA==}
+ engines: {node: '>=16.0.0'}
+ hasBin: true
+ peerDependencies:
+ typescript: '>= 4.7.4'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ debug: 4.3.4
+ extract-zip: 2.0.1
+ http-proxy-agent: 5.0.0
+ https-proxy-agent: 5.0.1
+ progress: 2.0.3
+ proxy-from-env: 1.1.0
+ tar-fs: 2.1.1
+ typescript: 5.6.3
+ unbzip2-stream: 1.4.3
+ yargs: 17.7.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@react-aria/focus@3.18.4(react@18.2.0):
+ resolution: {integrity: sha512-91J35077w9UNaMK1cpMUEFRkNNz0uZjnSwiyBCFuRdaVuivO53wNC9XtWSDNDdcO5cGy87vfJRVAiyoCn/mjqA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ dependencies:
+ '@react-aria/interactions': 3.22.4(react@18.2.0)
+ '@react-aria/utils': 3.25.3(react@18.2.0)
+ '@react-types/shared': 3.25.0(react@18.2.0)
+ '@swc/helpers': 0.5.15
+ clsx: 2.1.1
+ react: 18.2.0
+ dev: false
+
+ /@react-aria/interactions@3.22.4(react@18.2.0):
+ resolution: {integrity: sha512-E0vsgtpItmknq/MJELqYJwib+YN18Qag8nroqwjk1qOnBa9ROIkUhWJerLi1qs5diXq9LHKehZDXRlwPvdEFww==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ dependencies:
+ '@react-aria/ssr': 3.9.6(react@18.2.0)
+ '@react-aria/utils': 3.25.3(react@18.2.0)
+ '@react-types/shared': 3.25.0(react@18.2.0)
+ '@swc/helpers': 0.5.15
+ react: 18.2.0
+ dev: false
+
+ /@react-aria/ssr@3.6.0(react@18.2.0):
+ resolution: {integrity: sha512-OFiYQdv+Yk7AO7IsQu/fAEPijbeTwrrEYvdNoJ3sblBBedD5j5fBTNWrUPNVlwC4XWWnWTCMaRIVsJujsFiWXg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@swc/helpers': 0.4.37
+ react: 18.2.0
+ dev: false
+
+ /@react-aria/ssr@3.9.6(react@18.2.0):
+ resolution: {integrity: sha512-iLo82l82ilMiVGy342SELjshuWottlb5+VefO3jOQqQRNYnJBFpUSadswDPbRimSgJUZuFwIEYs6AabkP038fA==}
+ engines: {node: '>= 12'}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ dependencies:
+ '@swc/helpers': 0.5.15
+ react: 18.2.0
+ dev: false
+
+ /@react-aria/tooltip@3.2.0(react@18.2.0):
+ resolution: {integrity: sha512-JnchvAwt3N+F76gfpxfRLoHU2FRI8hUfMKr1CrcmLGJs996kINiBSIsETobTZhLnPzYk+pLZ26ZoqJYjP1bJwg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.26.0
+ '@react-aria/focus': 3.18.4(react@18.2.0)
+ '@react-aria/interactions': 3.22.4(react@18.2.0)
+ '@react-aria/utils': 3.17.0(react@18.2.0)
+ '@react-stately/tooltip': 3.4.1(react@18.2.0)
+ '@react-types/shared': 3.25.0(react@18.2.0)
+ '@react-types/tooltip': 3.4.12(react@18.2.0)
+ react: 18.2.0
+ dev: false
+
+ /@react-aria/utils@3.17.0(react@18.2.0):
+ resolution: {integrity: sha512-NEul0cQ6tQPdNSHYzNYD+EfFabeYNvDwEiHB82kK/Tsfhfm84SM+baben/at2N51K7iRrJPr5hC5fi4+P88lNg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-aria/ssr': 3.6.0(react@18.2.0)
+ '@react-stately/utils': 3.10.4(react@18.2.0)
+ '@react-types/shared': 3.25.0(react@18.2.0)
+ '@swc/helpers': 0.4.37
+ clsx: 1.2.1
+ react: 18.2.0
+ dev: false
+
+ /@react-aria/utils@3.25.3(react@18.2.0):
+ resolution: {integrity: sha512-PR5H/2vaD8fSq0H/UB9inNbc8KDcVmW6fYAfSWkkn+OAdhTTMVKqXXrZuZBWyFfSD5Ze7VN6acr4hrOQm2bmrA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ dependencies:
+ '@react-aria/ssr': 3.9.6(react@18.2.0)
+ '@react-stately/utils': 3.10.4(react@18.2.0)
+ '@react-types/shared': 3.25.0(react@18.2.0)
+ '@swc/helpers': 0.5.15
+ clsx: 2.1.1
+ react: 18.2.0
+ dev: false
+
+ /@react-stately/overlays@3.6.11(react@18.2.0):
+ resolution: {integrity: sha512-usuxitwOx4FbmOW7Og4VM8R8ZjerbHZLLbFaxZW7pWLs7Ypway1YhJ3SWcyNTYK7NEk4o602kSoU6MSev1Vgag==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ dependencies:
+ '@react-stately/utils': 3.10.4(react@18.2.0)
+ '@react-types/overlays': 3.8.10(react@18.2.0)
+ '@swc/helpers': 0.5.15
+ react: 18.2.0
+ dev: false
+
+ /@react-stately/tooltip@3.4.1(react@18.2.0):
+ resolution: {integrity: sha512-ZHqyN/mqciKtUfQ/bwdPPPAKwVFeFfyMLkHSA34NrXr9/swj/ONBQtdRUzbu56rlajMUSw5R60hmyJOGNXZb3A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0
+ dependencies:
+ '@react-stately/overlays': 3.6.11(react@18.2.0)
+ '@react-stately/utils': 3.10.4(react@18.2.0)
+ '@react-types/tooltip': 3.4.12(react@18.2.0)
+ '@swc/helpers': 0.4.37
+ react: 18.2.0
+ dev: false
+
+ /@react-stately/utils@3.10.4(react@18.2.0):
+ resolution: {integrity: sha512-gBEQEIMRh5f60KCm7QKQ2WfvhB2gLUr9b72sqUdIZ2EG+xuPgaIlCBeSicvjmjBvYZwOjoOEnmIkcx2GHp/HWw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ dependencies:
+ '@swc/helpers': 0.5.15
+ react: 18.2.0
+ dev: false
+
+ /@react-types/overlays@3.8.10(react@18.2.0):
+ resolution: {integrity: sha512-IcnB+VYfAJazRjWhBKZTmVMh3KTp/B1rRbcKkPx6t8djP9UQhKcohP7lAALxjJ56Jjz/GFC6rWyUcnYH0NFVRA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ dependencies:
+ '@react-types/shared': 3.25.0(react@18.2.0)
+ react: 18.2.0
+ dev: false
+
+ /@react-types/shared@3.25.0(react@18.2.0):
+ resolution: {integrity: sha512-OZSyhzU6vTdW3eV/mz5i6hQwQUhkRs7xwY2d1aqPvTdMe0+2cY7Fwp45PAiwYLEj73i9ro2FxF9qC4DvHGSCgQ==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ dependencies:
+ react: 18.2.0
+ dev: false
+
+ /@react-types/tooltip@3.4.12(react@18.2.0):
+ resolution: {integrity: sha512-FwsdSQ3UDIDORanQMGMLyzSUabw4AkKhwcRdPv4d5OT8GmJr7mBdZynfcsrKLJ0fzskIypMqspoutZidsI0MQg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0
+ dependencies:
+ '@react-types/overlays': 3.8.10(react@18.2.0)
+ '@react-types/shared': 3.25.0(react@18.2.0)
+ react: 18.2.0
+ dev: false
+
+ /@redocly/ajv@8.11.2:
+ resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js-replace: 1.0.1
+ dev: false
+
+ /@redocly/config@0.6.3:
+ resolution: {integrity: sha512-hGWJgCsXRw0Ow4rplqRlUQifZvoSwZipkYnt11e3SeH1Eb23VUIDBcRuaQOUqy1wn0eevXkU2GzzQ8fbKdQ7Mg==}
+ dev: false
+
+ /@redocly/openapi-core@1.16.0:
+ resolution: {integrity: sha512-z06h+svyqbUcdAaePq8LPSwTPlm6Ig7j2VlL8skPBYnJvyaQ2IN7x/JkOvRL4ta+wcOCBdAex5JWnZbKaNktJg==}
+ engines: {node: '>=14.19.0', npm: '>=7.0.0'}
+ dependencies:
+ '@redocly/ajv': 8.11.2
+ '@redocly/config': 0.6.3
+ colorette: 1.4.0
+ https-proxy-agent: 7.0.5
+ js-levenshtein: 1.1.6
+ js-yaml: 4.1.0
+ lodash.isequal: 4.5.0
+ minimatch: 5.1.6
+ node-fetch: 2.7.0
+ pluralize: 8.0.0
+ yaml-ast-parser: 0.0.43
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
+ /@rollup/pluginutils@3.1.0(rollup@2.79.2):
+ resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==}
+ engines: {node: '>= 8.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0
+ dependencies:
+ '@types/estree': 0.0.39
+ estree-walker: 1.0.1
+ picomatch: 2.3.1
+ rollup: 2.79.2
+ dev: true
+
+ /@rollup/rollup-android-arm-eabi@4.26.0:
+ resolution: {integrity: sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-android-arm64@4.26.0:
+ resolution: {integrity: sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-darwin-arm64@4.26.0:
+ resolution: {integrity: sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-darwin-x64@4.26.0:
+ resolution: {integrity: sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-freebsd-arm64@4.26.0:
+ resolution: {integrity: sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-freebsd-x64@4.26.0:
+ resolution: {integrity: sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-arm-gnueabihf@4.26.0:
+ resolution: {integrity: sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-arm-musleabihf@4.26.0:
+ resolution: {integrity: sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-arm64-gnu@4.26.0:
+ resolution: {integrity: sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-arm64-musl@4.26.0:
+ resolution: {integrity: sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-powerpc64le-gnu@4.26.0:
+ resolution: {integrity: sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-riscv64-gnu@4.26.0:
+ resolution: {integrity: sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-s390x-gnu@4.26.0:
+ resolution: {integrity: sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-x64-gnu@4.26.0:
+ resolution: {integrity: sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-x64-musl@4.26.0:
+ resolution: {integrity: sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-win32-arm64-msvc@4.26.0:
+ resolution: {integrity: sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-win32-ia32-msvc@4.26.0:
+ resolution: {integrity: sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-win32-x64-msvc@4.26.0:
+ resolution: {integrity: sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@scure/base@1.1.9:
+ resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==}
+ dev: false
+
+ /@scure/bip39@1.2.2:
+ resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==}
+ dependencies:
+ '@noble/hashes': 1.3.3
+ '@scure/base': 1.1.9
+ dev: false
+
+ /@sd-jwt/decode@0.6.1:
+ resolution: {integrity: sha512-QgTIoYd5zyKKLgXB4xEYJTrvumVwtsj5Dog0v0L9UH9ZvHekDaeexS247X7A4iSdzTvmZzUpGskgABOa4D8NmQ==}
+ engines: {node: '>=16'}
+ dependencies:
+ '@sd-jwt/types': 0.6.1
+ '@sd-jwt/utils': 0.6.1
+ dev: false
+
+ /@sd-jwt/present@0.6.1:
+ resolution: {integrity: sha512-QRD3TUDLj4PqQNZ70bBxh8FLLrOE9mY8V9qiZrJSsaDOLFs2p1CtZG+v9ig62fxFYJZMf4bWKwYjz+qqGAtxCg==}
+ engines: {node: '>=16'}
+ dependencies:
+ '@sd-jwt/decode': 0.6.1
+ '@sd-jwt/types': 0.6.1
+ '@sd-jwt/utils': 0.6.1
+ dev: false
+
+ /@sd-jwt/types@0.6.1:
+ resolution: {integrity: sha512-LKpABZJGT77jNhOLvAHIkNNmGqXzyfwBT+6r+DN9zNzMx1CzuNR0qXk1GMUbast9iCfPkGbnEpUv/jHTBvlIvg==}
+ engines: {node: '>=16'}
+ dev: false
+
+ /@sd-jwt/utils@0.6.1:
+ resolution: {integrity: sha512-1NHZ//+GecGQJb+gSdDicnrHG0DvACUk9jTnXA5yLZhlRjgkjyfJLNsCZesYeCyVp/SiyvIC9B+JwoY4kI0TwQ==}
+ engines: {node: '>=16'}
+ dependencies:
+ '@sd-jwt/types': 0.6.1
+ js-base64: 3.7.7
+ dev: false
+
+ /@sideway/address@4.1.5:
+ resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==}
+ dependencies:
+ '@hapi/hoek': 9.3.0
+
+ /@sideway/formula@3.0.1:
+ resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==}
+
+ /@sideway/pinpoint@2.0.0:
+ resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==}
+
+ /@sinclair/typebox@0.27.8:
+ resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
+
+ /@sindresorhus/is@4.6.0:
+ resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /@sindresorhus/is@5.6.0:
+ resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==}
+ engines: {node: '>=14.16'}
+
+ /@slorber/remark-comment@1.0.0:
+ resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==}
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /@smithy/abort-controller@3.1.6:
+ resolution: {integrity: sha512-0XuhuHQlEqbNQZp7QxxrFTdVWdwxch4vjxYgfInF91hZFkPxf9QDrdQka0KfxFMPqLNzSw0b95uGTrLliQUavQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/config-resolver@3.0.10:
+ resolution: {integrity: sha512-Uh0Sz9gdUuz538nvkPiyv1DZRX9+D15EKDtnQP5rYVAzM/dnYk3P8cg73jcxyOitPgT3mE3OVj7ky7sibzHWkw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/node-config-provider': 3.1.9
+ '@smithy/types': 3.6.0
+ '@smithy/util-config-provider': 3.0.0
+ '@smithy/util-middleware': 3.0.8
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/core@2.5.1:
+ resolution: {integrity: sha512-DujtuDA7BGEKExJ05W5OdxCoyekcKT3Rhg1ZGeiUWaz2BJIWXjZmsG/DIP4W48GHno7AQwRsaCb8NcBgH3QZpg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/middleware-serde': 3.0.8
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/types': 3.6.0
+ '@smithy/util-body-length-browser': 3.0.0
+ '@smithy/util-middleware': 3.0.8
+ '@smithy/util-stream': 3.2.1
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/credential-provider-imds@3.2.5:
+ resolution: {integrity: sha512-4FTQGAsuwqTzVMmiRVTn0RR9GrbRfkP0wfu/tXWVHd2LgNpTY0uglQpIScXK4NaEyXbB3JmZt8gfVqO50lP8wg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/node-config-provider': 3.1.9
+ '@smithy/property-provider': 3.1.8
+ '@smithy/types': 3.6.0
+ '@smithy/url-parser': 3.0.8
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/fetch-http-handler@3.2.9:
+ resolution: {integrity: sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==}
+ dependencies:
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/querystring-builder': 3.0.8
+ '@smithy/types': 3.6.0
+ '@smithy/util-base64': 3.0.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/fetch-http-handler@4.0.0:
+ resolution: {integrity: sha512-MLb1f5tbBO2X6K4lMEKJvxeLooyg7guq48C2zKr4qM7F2Gpkz4dc+hdSgu77pCJ76jVqFBjZczHYAs6dp15N+g==}
+ dependencies:
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/querystring-builder': 3.0.8
+ '@smithy/types': 3.6.0
+ '@smithy/util-base64': 3.0.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/hash-node@3.0.8:
+ resolution: {integrity: sha512-tlNQYbfpWXHimHqrvgo14DrMAgUBua/cNoz9fMYcDmYej7MAmUcjav/QKQbFc3NrcPxeJ7QClER4tWZmfwoPng==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.6.0
+ '@smithy/util-buffer-from': 3.0.0
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/invalid-dependency@3.0.8:
+ resolution: {integrity: sha512-7Qynk6NWtTQhnGTTZwks++nJhQ1O54Mzi7fz4PqZOiYXb4Z1Flpb2yRvdALoggTS8xjtohWUM+RygOtB30YL3Q==}
+ dependencies:
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/is-array-buffer@2.2.0:
+ resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/is-array-buffer@3.0.0:
+ resolution: {integrity: sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/middleware-content-length@3.0.10:
+ resolution: {integrity: sha512-T4dIdCs1d/+/qMpwhJ1DzOhxCZjZHbHazEPJWdB4GDi2HjIZllVzeBEcdJUN0fomV8DURsgOyrbEUzg3vzTaOg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/middleware-endpoint@3.2.1:
+ resolution: {integrity: sha512-wWO3xYmFm6WRW8VsEJ5oU6h7aosFXfszlz3Dj176pTij6o21oZnzkCLzShfmRaaCHDkBXWBdO0c4sQAvLFP6zA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/core': 2.5.1
+ '@smithy/middleware-serde': 3.0.8
+ '@smithy/node-config-provider': 3.1.9
+ '@smithy/shared-ini-file-loader': 3.1.9
+ '@smithy/types': 3.6.0
+ '@smithy/url-parser': 3.0.8
+ '@smithy/util-middleware': 3.0.8
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/middleware-retry@3.0.25:
+ resolution: {integrity: sha512-m1F70cPaMBML4HiTgCw5I+jFNtjgz5z5UdGnUbG37vw6kh4UvizFYjqJGHvicfgKMkDL6mXwyPp5mhZg02g5sg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/node-config-provider': 3.1.9
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/service-error-classification': 3.0.8
+ '@smithy/smithy-client': 3.4.2
+ '@smithy/types': 3.6.0
+ '@smithy/util-middleware': 3.0.8
+ '@smithy/util-retry': 3.0.8
+ tslib: 2.8.1
+ uuid: 9.0.1
+ dev: false
+
+ /@smithy/middleware-serde@3.0.8:
+ resolution: {integrity: sha512-Xg2jK9Wc/1g/MBMP/EUn2DLspN8LNt+GMe7cgF+Ty3vl+Zvu+VeZU5nmhveU+H8pxyTsjrAkci8NqY6OuvZnjA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/middleware-stack@3.0.8:
+ resolution: {integrity: sha512-d7ZuwvYgp1+3682Nx0MD3D/HtkmZd49N3JUndYWQXfRZrYEnCWYc8BHcNmVsPAp9gKvlurdg/mubE6b/rPS9MA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/node-config-provider@3.1.9:
+ resolution: {integrity: sha512-qRHoah49QJ71eemjuS/WhUXB+mpNtwHRWQr77J/m40ewBVVwvo52kYAmb7iuaECgGTTcYxHS4Wmewfwy++ueew==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/property-provider': 3.1.8
+ '@smithy/shared-ini-file-loader': 3.1.9
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/node-http-handler@3.2.5:
+ resolution: {integrity: sha512-PkOwPNeKdvX/jCpn0A8n9/TyoxjGZB8WVoJmm9YzsnAgggTj4CrjpRHlTQw7dlLZ320n1mY1y+nTRUDViKi/3w==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/abort-controller': 3.1.6
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/querystring-builder': 3.0.8
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/property-provider@3.1.8:
+ resolution: {integrity: sha512-ukNUyo6rHmusG64lmkjFeXemwYuKge1BJ8CtpVKmrxQxc6rhUX0vebcptFA9MmrGsnLhwnnqeH83VTU9hwOpjA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/protocol-http@4.1.5:
+ resolution: {integrity: sha512-hsjtwpIemmCkm3ZV5fd/T0bPIugW1gJXwZ/hpuVubt2hEUApIoUTrf6qIdh9MAWlw0vjMrA1ztJLAwtNaZogvg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/querystring-builder@3.0.8:
+ resolution: {integrity: sha512-btYxGVqFUARbUrN6VhL9c3dnSviIwBYD9Rz1jHuN1hgh28Fpv2xjU1HeCeDJX68xctz7r4l1PBnFhGg1WBBPuA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.6.0
+ '@smithy/util-uri-escape': 3.0.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/querystring-parser@3.0.8:
+ resolution: {integrity: sha512-BtEk3FG7Ks64GAbt+JnKqwuobJNX8VmFLBsKIwWr1D60T426fGrV2L3YS5siOcUhhp6/Y6yhBw1PSPxA5p7qGg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/service-error-classification@3.0.8:
+ resolution: {integrity: sha512-uEC/kCCFto83bz5ZzapcrgGqHOh/0r69sZ2ZuHlgoD5kYgXJEThCoTuw/y1Ub3cE7aaKdznb+jD9xRPIfIwD7g==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.6.0
+ dev: false
+
+ /@smithy/shared-ini-file-loader@3.1.9:
+ resolution: {integrity: sha512-/+OsJRNtoRbtsX0UpSgWVxFZLsJHo/4sTr+kBg/J78sr7iC+tHeOvOJrS5hCpVQ6sWBbhWLp1UNiuMyZhE6pmA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/signature-v4@4.2.1:
+ resolution: {integrity: sha512-NsV1jF4EvmO5wqmaSzlnTVetemBS3FZHdyc5CExbDljcyJCEEkJr8ANu2JvtNbVg/9MvKAWV44kTrGS+Pi4INg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/is-array-buffer': 3.0.0
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/types': 3.6.0
+ '@smithy/util-hex-encoding': 3.0.0
+ '@smithy/util-middleware': 3.0.8
+ '@smithy/util-uri-escape': 3.0.0
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/smithy-client@3.4.2:
+ resolution: {integrity: sha512-dxw1BDxJiY9/zI3cBqfVrInij6ShjpV4fmGHesGZZUiP9OSE/EVfdwdRz0PgvkEvrZHpsj2htRaHJfftE8giBA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/core': 2.5.1
+ '@smithy/middleware-endpoint': 3.2.1
+ '@smithy/middleware-stack': 3.0.8
+ '@smithy/protocol-http': 4.1.5
+ '@smithy/types': 3.6.0
+ '@smithy/util-stream': 3.2.1
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/types@3.6.0:
+ resolution: {integrity: sha512-8VXK/KzOHefoC65yRgCn5vG1cysPJjHnOVt9d0ybFQSmJgQj152vMn4EkYhGuaOmnnZvCPav/KnYyE6/KsNZ2w==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/url-parser@3.0.8:
+ resolution: {integrity: sha512-4FdOhwpTW7jtSFWm7SpfLGKIBC9ZaTKG5nBF0wK24aoQKQyDIKUw3+KFWCQ9maMzrgTJIuOvOnsV2lLGW5XjTg==}
+ dependencies:
+ '@smithy/querystring-parser': 3.0.8
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-base64@3.0.0:
+ resolution: {integrity: sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/util-buffer-from': 3.0.0
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-body-length-browser@3.0.0:
+ resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-body-length-node@3.0.0:
+ resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-buffer-from@2.2.0:
+ resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/is-array-buffer': 2.2.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-buffer-from@3.0.0:
+ resolution: {integrity: sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/is-array-buffer': 3.0.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-config-provider@3.0.0:
+ resolution: {integrity: sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-defaults-mode-browser@3.0.25:
+ resolution: {integrity: sha512-fRw7zymjIDt6XxIsLwfJfYUfbGoO9CmCJk6rjJ/X5cd20+d2Is7xjU5Kt/AiDt6hX8DAf5dztmfP5O82gR9emA==}
+ engines: {node: '>= 10.0.0'}
+ dependencies:
+ '@smithy/property-provider': 3.1.8
+ '@smithy/smithy-client': 3.4.2
+ '@smithy/types': 3.6.0
+ bowser: 2.11.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-defaults-mode-node@3.0.25:
+ resolution: {integrity: sha512-H3BSZdBDiVZGzt8TG51Pd2FvFO0PAx/A0mJ0EH8a13KJ6iUCdYnw/Dk/MdC1kTd0eUuUGisDFaxXVXo4HHFL1g==}
+ engines: {node: '>= 10.0.0'}
+ dependencies:
+ '@smithy/config-resolver': 3.0.10
+ '@smithy/credential-provider-imds': 3.2.5
+ '@smithy/node-config-provider': 3.1.9
+ '@smithy/property-provider': 3.1.8
+ '@smithy/smithy-client': 3.4.2
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-endpoints@2.1.4:
+ resolution: {integrity: sha512-kPt8j4emm7rdMWQyL0F89o92q10gvCUa6sBkBtDJ7nV2+P7wpXczzOfoDJ49CKXe5CCqb8dc1W+ZdLlrKzSAnQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/node-config-provider': 3.1.9
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-hex-encoding@3.0.0:
+ resolution: {integrity: sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-middleware@3.0.8:
+ resolution: {integrity: sha512-p7iYAPaQjoeM+AKABpYWeDdtwQNxasr4aXQEA/OmbOaug9V0odRVDy3Wx4ci8soljE/JXQo+abV0qZpW8NX0yA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-retry@3.0.8:
+ resolution: {integrity: sha512-TCEhLnY581YJ+g1x0hapPz13JFqzmh/pMWL2KEFASC51qCfw3+Y47MrTmea4bUE5vsdxQ4F6/KFbUeSz22Q1ow==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/service-error-classification': 3.0.8
+ '@smithy/types': 3.6.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-stream@3.2.1:
+ resolution: {integrity: sha512-R3ufuzJRxSJbE58K9AEnL/uSZyVdHzud9wLS8tIbXclxKzoe09CRohj2xV8wpx5tj7ZbiJaKYcutMm1eYgz/0A==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/fetch-http-handler': 4.0.0
+ '@smithy/node-http-handler': 3.2.5
+ '@smithy/types': 3.6.0
+ '@smithy/util-base64': 3.0.0
+ '@smithy/util-buffer-from': 3.0.0
+ '@smithy/util-hex-encoding': 3.0.0
+ '@smithy/util-utf8': 3.0.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-uri-escape@3.0.0:
+ resolution: {integrity: sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-utf8@2.3.0:
+ resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@smithy/util-buffer-from': 2.2.0
+ tslib: 2.8.1
+ dev: false
+
+ /@smithy/util-utf8@3.0.0:
+ resolution: {integrity: sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@smithy/util-buffer-from': 3.0.0
+ tslib: 2.8.1
+ dev: false
+
+ /@sphereon/pex-models@2.3.1:
+ resolution: {integrity: sha512-SByU4cJ0XYA6VZQ/L6lsSiRcFtBPHbFioCeQ4GP7/W/jQ+PSBD7uK2oTnKQ9/0iEiMK/6JYqhKgLs4a9UX3UTQ==}
+ dev: false
+
+ /@sphereon/pex@2.1.0:
+ resolution: {integrity: sha512-108iEqbu6D421pK9Q6bq4wnWcL8V+fEtw4Ry6NhBidIlDHuJehdLM8Z70A/axgNYMB1C0smMDYt1Xur/ROLwvQ==}
+ engines: {node: '>=16'}
+ dependencies:
+ '@astronautlabs/jsonpath': 1.1.2
+ '@sphereon/pex-models': 2.3.1
+ '@sphereon/ssi-types': 0.13.0
+ ajv: 8.17.1
+ ajv-formats: 2.1.1(ajv@8.17.1)
+ jwt-decode: 3.1.2
+ nanoid: 3.3.7
+ string.prototype.matchall: 4.0.11
+ dev: false
+
+ /@sphereon/pex@3.3.3:
+ resolution: {integrity: sha512-CXwdEcMTUh2z/5AriBn3OuShEG06l2tgiIr7qDJthnkez8DQ3sZo2vr4NEQWKKAL+DeAWAI4FryQGO4KuK7yfg==}
+ engines: {node: '>=18'}
+ requiresBuild: true
+ dependencies:
+ '@astronautlabs/jsonpath': 1.1.2
+ '@sd-jwt/decode': 0.6.1
+ '@sd-jwt/present': 0.6.1
+ '@sd-jwt/types': 0.6.1
+ '@sphereon/pex-models': 2.3.1
+ '@sphereon/ssi-types': 0.22.0
+ ajv: 8.17.1
+ ajv-formats: 2.1.1(ajv@8.17.1)
+ jwt-decode: 3.1.2
+ nanoid: 3.3.7
+ string.prototype.matchall: 4.0.11
+ uint8arrays: 3.1.1
+ dev: false
+
+ /@sphereon/ssi-types@0.13.0:
+ resolution: {integrity: sha512-THzkvgY6AN4/0INgGowinzOFX6NeUQJ/KmAcXrBXx2Rny5v5wCp7LhBIlK21KF2/76fbiCyJvwcd/+Yeb0fjwQ==}
+ dependencies:
+ jwt-decode: 3.1.2
+ dev: false
+
+ /@sphereon/ssi-types@0.22.0:
+ resolution: {integrity: sha512-YPJAZlKmzNALXK8ohP3ETxj1oVzL4+M9ljj3fD5xrbacvYax1JPCVKc8BWSubGcQckKHPbgbpcS7LYEeghyT9Q==}
+ dependencies:
+ '@sd-jwt/decode': 0.6.1
+ jwt-decode: 3.1.2
+ dev: false
+
+ /@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ dev: false
+
+ /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ dev: false
+
+ /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ dev: false
+
+ /@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ dev: false
+
+ /@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ dev: false
+
+ /@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ dev: false
+
+ /@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ dev: false
+
+ /@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ dev: false
+
+ /@svgr/babel-preset@8.1.0(@babel/core@7.26.0):
+ resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.26.0)
+ '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.26.0)
+ dev: false
+
+ /@svgr/core@8.1.0(typescript@5.6.3):
+ resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==}
+ engines: {node: '>=14'}
+ dependencies:
+ '@babel/core': 7.26.0
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0)
+ camelcase: 6.3.0
+ cosmiconfig: 8.3.6(typescript@5.6.3)
+ snake-case: 3.0.4
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: false
+
+ /@svgr/hast-util-to-babel-ast@8.0.0:
+ resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==}
+ engines: {node: '>=14'}
+ dependencies:
+ '@babel/types': 7.26.0
+ entities: 4.5.0
+ dev: false
+
+ /@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0):
+ resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@svgr/core': '*'
+ dependencies:
+ '@babel/core': 7.26.0
+ '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0)
+ '@svgr/core': 8.1.0(typescript@5.6.3)
+ '@svgr/hast-util-to-babel-ast': 8.0.0
+ svg-parser: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0)(typescript@5.6.3):
+ resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@svgr/core': '*'
+ dependencies:
+ '@svgr/core': 8.1.0(typescript@5.6.3)
+ cosmiconfig: 8.3.6(typescript@5.6.3)
+ deepmerge: 4.3.1
+ svgo: 3.3.2
+ transitivePeerDependencies:
+ - typescript
+ dev: false
+
+ /@svgr/webpack@8.1.0(typescript@5.6.3):
+ resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==}
+ engines: {node: '>=14'}
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/plugin-transform-react-constant-elements': 7.25.9(@babel/core@7.26.0)
+ '@babel/preset-env': 7.26.0(@babel/core@7.26.0)
+ '@babel/preset-react': 7.25.9(@babel/core@7.26.0)
+ '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0)
+ '@svgr/core': 8.1.0(typescript@5.6.3)
+ '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0)
+ '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0)(typescript@5.6.3)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: false
+
+ /@swc/helpers@0.4.14:
+ resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /@swc/helpers@0.4.37:
+ resolution: {integrity: sha512-O4U8DmGtYvuWDrqmkAqhmA+sV8D3eJzvKSUgg5L5eaCCPdywZBLc97UgJT/fQaCkQ5onJzJWNojgErJk1bThaw==}
+ dependencies:
+ '@swc/legacy-helpers': /@swc/helpers@0.4.14
+ tslib: 2.8.1
+ dev: false
+
+ /@swc/helpers@0.5.15:
+ resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /@szmarczak/http-timer@5.0.1:
+ resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ defer-to-connect: 2.0.1
+
+ /@tailwindcss/typography@0.5.9(tailwindcss@3.2.7):
+ resolution: {integrity: sha512-t8Sg3DyynFysV9f4JDOVISGsjazNb48AeIYQwcL+Bsq5uf4RYL75C1giZ43KISjeDGBaTN3Kxh7Xj/vRSMJUUg==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders'
+ dependencies:
+ lodash.castarray: 4.4.0
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ postcss-selector-parser: 6.0.10
+ tailwindcss: 3.2.7(postcss@8.4.31)
+ dev: false
+
+ /@tbd54566975/dwn-sdk-js@0.4.7:
+ resolution: {integrity: sha512-VYaLT4FKdHfVvUPZbicUpF77erkOSi1xBP/EVQIpnp0khPujp2lYcojbRcw4c4JR23CrRvLPy/iWXmEhdP8LqA==}
+ engines: {node: '>= 18'}
+ dependencies:
+ '@ipld/dag-cbor': 9.0.3
+ '@js-temporal/polyfill': 0.4.4
+ '@noble/ciphers': 0.5.3
+ '@noble/curves': 1.4.2
+ '@noble/ed25519': 2.0.0
+ '@noble/secp256k1': 2.0.0
+ '@web5/dids': 1.1.5
+ abstract-level: 1.0.3
+ ajv: 8.12.0
+ blockstore-core: 4.2.0
+ cross-fetch: 4.0.0
+ eciesjs: 0.4.5
+ interface-blockstore: 5.2.3
+ interface-store: 5.1.2
+ ipfs-unixfs-exporter: 13.1.5
+ ipfs-unixfs-importer: 15.1.5
+ level: 8.0.0
+ lodash: 4.17.21
+ lru-cache: 9.1.2
+ ms: 2.1.3
+ multiformats: 11.0.2
+ randombytes: 2.1.0
+ readable-stream: 4.5.2
+ uint8arrays: 5.1.0
+ ulidx: 2.1.0
+ uuid: 8.3.2
+ varint: 6.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
+ /@tbd54566975/dwn-sdk-js@0.5.1:
+ resolution: {integrity: sha512-4xfDttiXOzs7h3PHODflHxHP7Z1HlNod6BN+HX6elXKlqOlBueORrzB72BnzVBbv35eDRJR5w2upmGsUoq3dGg==}
+ engines: {node: '>= 18'}
+ dependencies:
+ '@ipld/dag-cbor': 9.0.3
+ '@js-temporal/polyfill': 0.4.4
+ '@noble/ciphers': 0.5.3
+ '@noble/curves': 1.4.2
+ '@noble/ed25519': 2.0.0
+ '@noble/secp256k1': 2.0.0
+ '@web5/dids': 1.1.5
+ abstract-level: 1.0.3
+ ajv: 8.12.0
+ blockstore-core: 4.2.0
+ cross-fetch: 4.0.0
+ eciesjs: 0.4.5
+ interface-blockstore: 5.2.3
+ interface-store: 5.1.2
+ ipfs-unixfs-exporter: 13.1.5
+ ipfs-unixfs-importer: 15.1.5
+ level: 8.0.0
+ lodash: 4.17.21
+ lru-cache: 9.1.2
+ ms: 2.1.3
+ multiformats: 11.0.2
+ randombytes: 2.1.0
+ readable-stream: 4.5.2
+ uint8arrays: 5.1.0
+ ulidx: 2.1.0
+ uuid: 8.3.2
+ varint: 6.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
+ /@tbdex/http-client@1.1.0:
+ resolution: {integrity: sha512-Rvp4Jdg4VzFQN55vea5VbWKO0yM4LjOVNnmr+Z5gqKDZQWNjMnIDzLSJgxMjVkYwYRnaqQT8mlyCTuGm0IhQkQ==}
+ dependencies:
+ '@tbdex/protocol': 1.1.0
+ '@web5/common': 1.0.1
+ '@web5/credentials': 1.0.3
+ '@web5/crypto': 1.0.1
+ '@web5/dids': 1.1.1
+ ms: 2.1.3
+ query-string: 8.2.0
+ typeid-js: 0.3.0
+ dev: false
+
+ /@tbdex/http-server@1.1.0:
+ resolution: {integrity: sha512-ndJdoKiWAb0H4ULtF+rNDIcVzpyaI7ZmCsdDIXc2yzohOI7XlJKm1Oa2GC4Zn6wY61kxYVgo1motkszOlv37ig==}
+ dependencies:
+ '@tbdex/http-client': 1.1.0
+ '@tbdex/protocol': 1.1.0
+ '@web5/dids': 1.1.1
+ cors: 2.8.5
+ express: 4.19.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@tbdex/protocol@1.1.0:
+ resolution: {integrity: sha512-248oewFwfbtmyrea9KXmhZPxYzjzyF1DEwtCqGXTMjV8aGN1j6AQ2UvzQIarU2o/0Z0NBkJ9AsEidFq/4ISqgw==}
+ dependencies:
+ '@noble/hashes': 1.3.3
+ '@types/node': 7.10.14
+ '@web5/common': 1.0.1
+ '@web5/credentials': 1.0.3
+ '@web5/crypto': 1.0.1
+ '@web5/dids': 1.1.1
+ ajv: 8.12.0
+ bignumber.js: 9.1.2
+ canonicalize: 2.0.0
+ lodash: 4.17.21
+ typeid-js: 0.3.0
+ dev: false
+
+ /@tootallnate/once@2.0.0:
+ resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
+ engines: {node: '>= 10'}
+ dev: true
+
+ /@trysound/sax@0.2.0:
+ resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
+ engines: {node: '>=10.13.0'}
+ dev: false
+
+ /@types/acorn@4.0.6:
+ resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==}
+ dependencies:
+ '@types/estree': 1.0.6
+
+ /@types/body-parser@1.19.5:
+ resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==}
+ dependencies:
+ '@types/connect': 3.4.38
+ '@types/node': 22.9.0
+ dev: false
+
+ /@types/bonjour@3.5.13:
+ resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==}
+ dependencies:
+ '@types/node': 22.9.0
+ dev: false
+
+ /@types/chai-subset@1.3.5:
+ resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==}
+ dependencies:
+ '@types/chai': 4.3.20
+ dev: true
+
+ /@types/chai@4.3.20:
+ resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==}
+ dev: true
+
+ /@types/connect-history-api-fallback@1.5.4:
+ resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==}
+ dependencies:
+ '@types/express-serve-static-core': 5.0.1
+ '@types/node': 22.9.0
+ dev: false
+
+ /@types/connect@3.4.38:
+ resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+ dependencies:
+ '@types/node': 22.9.0
+ dev: false
+
+ /@types/cookie@0.6.0:
+ resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
+ dev: false
+
+ /@types/d3-scale-chromatic@3.0.3:
+ resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==}
+ dev: false
+
+ /@types/d3-scale@4.0.8:
+ resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==}
+ dependencies:
+ '@types/d3-time': 3.0.3
+ dev: false
+
+ /@types/d3-time@3.0.3:
+ resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==}
+ dev: false
+
+ /@types/debug@4.1.12:
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+ dependencies:
+ '@types/ms': 0.7.34
+
+ /@types/eslint-scope@3.7.7:
+ resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==}
+ dependencies:
+ '@types/eslint': 9.6.1
+ '@types/estree': 1.0.6
+
+ /@types/eslint@9.6.1:
+ resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/json-schema': 7.0.15
+
+ /@types/estree-jsx@1.0.5:
+ resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
+ dependencies:
+ '@types/estree': 1.0.6
+
+ /@types/estree@0.0.39:
+ resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==}
+ dev: true
+
+ /@types/estree@1.0.6:
+ resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+
+ /@types/express-serve-static-core@4.19.6:
+ resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==}
+ dependencies:
+ '@types/node': 22.9.0
+ '@types/qs': 6.9.17
+ '@types/range-parser': 1.2.7
+ '@types/send': 0.17.4
+ dev: false
+
+ /@types/express-serve-static-core@5.0.1:
+ resolution: {integrity: sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==}
+ dependencies:
+ '@types/node': 22.9.0
+ '@types/qs': 6.9.17
+ '@types/range-parser': 1.2.7
+ '@types/send': 0.17.4
+ dev: false
+
+ /@types/express@4.17.21:
+ resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==}
+ dependencies:
+ '@types/body-parser': 1.19.5
+ '@types/express-serve-static-core': 4.19.6
+ '@types/qs': 6.9.17
+ '@types/serve-static': 1.15.7
+ dev: false
+
+ /@types/gtag.js@0.0.12:
+ resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==}
+ dev: false
+
+ /@types/hast@2.3.10:
+ resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==}
+ dependencies:
+ '@types/unist': 2.0.11
+ dev: false
+
+ /@types/hast@3.0.4:
+ resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+ dependencies:
+ '@types/unist': 3.0.3
+
+ /@types/history@4.7.11:
+ resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==}
+
+ /@types/html-minifier-terser@6.1.0:
+ resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==}
+ dev: false
+
+ /@types/http-cache-semantics@4.0.4:
+ resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==}
+
+ /@types/http-errors@2.0.4:
+ resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==}
+ dev: false
+
+ /@types/http-proxy@1.17.15:
+ resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==}
+ dependencies:
+ '@types/node': 22.9.0
+ dev: false
+
+ /@types/istanbul-lib-coverage@2.0.6:
+ resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
+ dev: false
+
+ /@types/istanbul-lib-report@3.0.3:
+ resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==}
+ dependencies:
+ '@types/istanbul-lib-coverage': 2.0.6
+ dev: false
+
+ /@types/istanbul-reports@3.0.4:
+ resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
+ dependencies:
+ '@types/istanbul-lib-report': 3.0.3
+ dev: false
+
+ /@types/json-schema@7.0.15:
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ /@types/mdast@3.0.15:
+ resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==}
+ dependencies:
+ '@types/unist': 2.0.11
+ dev: false
+
+ /@types/mdast@4.0.4:
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+ dependencies:
+ '@types/unist': 3.0.3
+
+ /@types/mdx@2.0.13:
+ resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==}
+
+ /@types/mime@1.3.5:
+ resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
+ dev: false
+
+ /@types/ms@0.7.34:
+ resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+
+ /@types/node-forge@1.3.11:
+ resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
+ dependencies:
+ '@types/node': 22.9.0
+ dev: false
+
+ /@types/node@17.0.45:
+ resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
+ dev: false
+
+ /@types/node@20.17.6:
+ resolution: {integrity: sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==}
+ dependencies:
+ undici-types: 6.19.8
+
+ /@types/node@22.9.0:
+ resolution: {integrity: sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==}
+ dependencies:
+ undici-types: 6.19.8
+
+ /@types/node@7.10.14:
+ resolution: {integrity: sha512-29GS75BE8asnTno3yB6ubOJOO0FboExEqNJy4bpz0GSmW/8wPTNL4h9h63c6s1uTrOopCmJYe/4yJLh5r92ZUA==}
+ dev: false
+
+ /@types/normalize-package-data@2.4.4:
+ resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
+ dev: true
+
+ /@types/parse-json@4.0.2:
+ resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
+ dev: false
+
+ /@types/prismjs@1.26.5:
+ resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==}
+ dev: false
+
+ /@types/prop-types@15.7.13:
+ resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==}
+
+ /@types/qs@6.9.17:
+ resolution: {integrity: sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==}
+ dev: false
+
+ /@types/range-parser@1.2.7:
+ resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
+ dev: false
+
+ /@types/react-router-config@5.0.11:
+ resolution: {integrity: sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==}
+ dependencies:
+ '@types/history': 4.7.11
+ '@types/react': 18.3.12
+ '@types/react-router': 5.1.20
+
+ /@types/react-router-dom@5.3.3:
+ resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==}
+ dependencies:
+ '@types/history': 4.7.11
+ '@types/react': 18.3.12
+ '@types/react-router': 5.1.20
+
+ /@types/react-router@5.1.20:
+ resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==}
+ dependencies:
+ '@types/history': 4.7.11
+ '@types/react': 18.3.12
+
+ /@types/react@18.3.12:
+ resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==}
+ dependencies:
+ '@types/prop-types': 15.7.13
+ csstype: 3.1.3
+
+ /@types/retry@0.12.0:
+ resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==}
+ dev: false
+
+ /@types/sax@1.2.7:
+ resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
+ dependencies:
+ '@types/node': 17.0.45
+ dev: false
+
+ /@types/send@0.17.4:
+ resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==}
+ dependencies:
+ '@types/mime': 1.3.5
+ '@types/node': 22.9.0
+ dev: false
+
+ /@types/serve-index@1.9.4:
+ resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==}
+ dependencies:
+ '@types/express': 4.17.21
+ dev: false
+
+ /@types/serve-static@1.15.7:
+ resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==}
+ dependencies:
+ '@types/http-errors': 2.0.4
+ '@types/node': 22.9.0
+ '@types/send': 0.17.4
+ dev: false
+
+ /@types/sockjs@0.3.36:
+ resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==}
+ dependencies:
+ '@types/node': 22.9.0
+ dev: false
+
+ /@types/statuses@2.0.5:
+ resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==}
+ dev: false
+
+ /@types/stylis@4.2.5:
+ resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==}
+ dev: false
+
+ /@types/unist@2.0.11:
+ resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
+
+ /@types/unist@3.0.3:
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+
+ /@types/which@2.0.2:
+ resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==}
+ dev: true
+
+ /@types/ws@8.5.13:
+ resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==}
+ dependencies:
+ '@types/node': 20.17.6
+
+ /@types/yargs-parser@21.0.3:
+ resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
+ dev: false
+
+ /@types/yargs@17.0.33:
+ resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==}
+ dependencies:
+ '@types/yargs-parser': 21.0.3
+ dev: false
+
+ /@types/yauzl@2.10.3:
+ resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
+ requiresBuild: true
+ dependencies:
+ '@types/node': 20.17.6
+ dev: true
+ optional: true
+
+ /@ungap/structured-clone@1.2.0:
+ resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+
+ /@vitest/browser@0.34.1(rollup@2.79.2)(vitest@0.34.1):
+ resolution: {integrity: sha512-b3yNO9be7jW7rMzYfSE5dj/feCv4kbLyaSQUmaqHnVtmO+wxZYbcJqiJYnoCtwU7pCkA152F44f7RXrYjcH1FQ==}
+ peerDependencies:
+ vitest: '>=0.34.0'
+ dependencies:
+ estree-walker: 3.0.3
+ magic-string: 0.30.12
+ modern-node-polyfills: 0.1.3(rollup@2.79.2)
+ sirv: 2.0.4
+ vitest: 0.34.1(@vitest/browser@0.34.1)(playwright@1.39.0)(webdriverio@8.13.13)
+ transitivePeerDependencies:
+ - rollup
+ dev: true
+
+ /@vitest/coverage-istanbul@0.34.1(vitest@0.34.1):
+ resolution: {integrity: sha512-5GprlyY2t1g6+RrssWcN/w5RnZV3qIOM0eoaSDJw3jXbHpBpMvAfTg791zXo7PIqNYs5ORUqBWXIIU0gyAfZxA==}
+ peerDependencies:
+ vitest: '>=0.32.0 <1'
+ dependencies:
+ istanbul-lib-coverage: 3.2.2
+ istanbul-lib-instrument: 6.0.3
+ istanbul-lib-report: 3.0.1
+ istanbul-lib-source-maps: 4.0.1
+ istanbul-reports: 3.1.7
+ test-exclude: 6.0.0
+ vitest: 0.34.1(@vitest/browser@0.34.1)(playwright@1.39.0)(webdriverio@8.13.13)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@vitest/expect@0.34.1:
+ resolution: {integrity: sha512-q2CD8+XIsQ+tHwypnoCk8Mnv5e6afLFvinVGCq3/BOT4kQdVQmY6rRfyKkwcg635lbliLPqbunXZr+L1ssUWiQ==}
+ dependencies:
+ '@vitest/spy': 0.34.1
+ '@vitest/utils': 0.34.1
+ chai: 4.5.0
+ dev: true
+
+ /@vitest/runner@0.34.1:
+ resolution: {integrity: sha512-YfQMpYzDsYB7yqgmlxZ06NI4LurHWfrH7Wy3Pvf/z/vwUSgq1zLAb1lWcItCzQG+NVox+VvzlKQrYEXb47645g==}
+ dependencies:
+ '@vitest/utils': 0.34.1
+ p-limit: 4.0.0
+ pathe: 1.1.2
+ dev: true
+
+ /@vitest/snapshot@0.34.1:
+ resolution: {integrity: sha512-0O9LfLU0114OqdF8lENlrLsnn024Tb1CsS9UwG0YMWY2oGTQfPtkW+B/7ieyv0X9R2Oijhi3caB1xgGgEgclSQ==}
+ dependencies:
+ magic-string: 0.30.12
+ pathe: 1.1.2
+ pretty-format: 29.7.0
+ dev: true
+
+ /@vitest/spy@0.34.1:
+ resolution: {integrity: sha512-UT4WcI3EAPUNO8n6y9QoEqynGGEPmmRxC+cLzneFFXpmacivjHZsNbiKD88KUScv5DCHVDgdBsLD7O7s1enFcQ==}
+ dependencies:
+ tinyspy: 2.2.1
+ dev: true
+
+ /@vitest/utils@0.34.1:
+ resolution: {integrity: sha512-/ql9dsFi4iuEbiNcjNHQWXBum7aL8pyhxvfnD9gNtbjR9fUKAjxhj4AA3yfLXg6gJpMGGecvtF8Au2G9y3q47Q==}
+ dependencies:
+ diff-sequences: 29.6.3
+ loupe: 2.3.7
+ pretty-format: 29.7.0
+ dev: true
+
+ /@wdio/config@8.13.13:
+ resolution: {integrity: sha512-tYTlblk8ykbzKRWC7j1MSjvDQwUnh/agSBEbcuVSZUFRAaIOu3HRqWeDKJreEuV1VkrmS8+X6rxXpTYGnNEGzw==}
+ engines: {node: ^16.13 || >=18}
+ dependencies:
+ '@wdio/logger': 8.11.0
+ '@wdio/types': 8.10.4
+ '@wdio/utils': 8.13.13
+ decamelize: 6.0.0
+ deepmerge-ts: 5.1.0
+ glob: 10.3.10
+ import-meta-resolve: 3.1.1
+ read-pkg-up: 9.1.0
+ dev: true
+
+ /@wdio/logger@8.11.0:
+ resolution: {integrity: sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==}
+ engines: {node: ^16.13 || >=18}
+ dependencies:
+ chalk: 5.3.0
+ loglevel: 1.9.2
+ loglevel-plugin-prefix: 0.8.4
+ strip-ansi: 7.1.0
+ dev: true
+
+ /@wdio/protocols@8.11.0:
+ resolution: {integrity: sha512-eXTMYt/XoaX53H/Q2qmsn1uWthIC5aSTGtX9YyXD/AkagG2hXeX3lLmzNWBaSIvKR+vWXRYbg3Y/7IvL2s25Wg==}
+ dev: true
+
+ /@wdio/repl@8.10.1:
+ resolution: {integrity: sha512-VZ1WFHTNKjR8Ga97TtV2SZM6fvRjWbYI2i/f4pJB4PtusorKvONAMJf2LQcUBIyzbVobqr7KSrcjmSwRolI+yw==}
+ engines: {node: ^16.13 || >=18}
+ dependencies:
+ '@types/node': 20.17.6
+ dev: true
+
+ /@wdio/types@8.10.4:
+ resolution: {integrity: sha512-aLJ1QQW+hhALeRK3bvMLjIrlUVyhOs3Od+91pR4Z4pLwyeNG1bJZCJRD5bAJK/mm7CnFa0NsdixPS9jJxZcRrw==}
+ engines: {node: ^16.13 || >=18}
+ dependencies:
+ '@types/node': 20.17.6
+ dev: true
+
+ /@wdio/utils@8.13.13:
+ resolution: {integrity: sha512-Bg6Xe+PqueDoDhHDxF63mBclWJ2pj9PMVLtZyHJ8dZjZ37JR1WNM4OUgcVBmYjpukZkF3mdESsXDL7lmY4JNYA==}
+ engines: {node: ^16.13 || >=18}
+ dependencies:
+ '@wdio/logger': 8.11.0
+ '@wdio/types': 8.10.4
+ import-meta-resolve: 3.1.1
+ dev: true
+
+ /@web5/agent@0.7.4(ws@8.18.0):
+ resolution: {integrity: sha512-BS5SlBfhShlfyvUsCPSoLfpqmMrfm3y7meahQMgzB63O4g397hwV2wrpT80AGYVvkSL2IfZcgEN9LP0+Z0pD6A==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@noble/ciphers': 0.5.3
+ '@scure/bip39': 1.2.2
+ '@tbd54566975/dwn-sdk-js': 0.4.7
+ '@web5/common': 1.0.2
+ '@web5/crypto': 1.0.5
+ '@web5/dids': 1.1.5
+ abstract-level: 1.0.4
+ ed25519-keygen: 0.4.11
+ isomorphic-ws: 5.0.0(ws@8.18.0)
+ level: 8.0.0
+ ms: 2.1.3
+ readable-web-to-node-stream: 3.0.2
+ ulidx: 2.1.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ - ws
+ dev: false
+
+ /@web5/agent@0.8.1(ws@8.18.0):
+ resolution: {integrity: sha512-W7x0yMaBcUcDQ5mbSqfoswD6gNhnnmMy4O7W3CQz/mMStcrUQoqKV8+x/DbS0MU4J7GEqJuJg1z7FrgOdkdJXg==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@noble/ciphers': 0.5.3
+ '@scure/bip39': 1.2.2
+ '@tbd54566975/dwn-sdk-js': 0.5.1
+ '@web5/common': 1.1.0
+ '@web5/crypto': 1.0.6
+ '@web5/dids': 1.2.0
+ abstract-level: 1.0.4
+ ed25519-keygen: 0.4.11
+ isomorphic-ws: 5.0.0(ws@8.18.0)
+ level: 8.0.0
+ ms: 2.1.3
+ readable-web-to-node-stream: 3.0.2
+ ulidx: 2.1.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ - ws
+ dev: false
+
+ /@web5/api@0.12.0(ws@8.18.0):
+ resolution: {integrity: sha512-RN2o2GmkFAJuUyA6+6a+zv2cYKmFrefUlWIjmZbcW6G8HvCDnHD1nH9AuPSrZNfcmMb6iVeqbG1U1aMNv39H9w==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@web5/agent': 0.8.1(ws@8.18.0)
+ '@web5/common': 1.1.0
+ '@web5/crypto': 1.0.6
+ '@web5/dids': 1.2.0
+ '@web5/user-agent': 0.7.1(ws@8.18.0)
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ - ws
+ dev: false
+
+ /@web5/common@1.0.0:
+ resolution: {integrity: sha512-3JHF6X5o0h+3oAVQeBC4XpMoZeEYZYdEmQdgpOfKv/rnSru2yHQSAM+0wbIvEFcSCmelBT3u7rUAcpJjelLB0w==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@isaacs/ttlcache': 1.4.1
+ level: 8.0.0
+ multiformats: 11.0.2
+ readable-stream: 4.4.2
+ dev: false
+
+ /@web5/common@1.0.1:
+ resolution: {integrity: sha512-dxczXqzWt6HCwuNyOVBeakg6GgOpP74tVEVxBeKkb+D3XcSP96mYaDtky5ZnjY4iBYb16SaCgwje+sgevOL51A==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@isaacs/ttlcache': 1.4.1
+ level: 8.0.1
+ multiformats: 13.1.0
+ readable-stream: 4.4.2
+ dev: false
+
+ /@web5/common@1.0.2:
+ resolution: {integrity: sha512-SerGdrxZF47yidvhrRa8sGLEOunIlDHppxrtWYCuKMVgtQKgheEmaS4+xchGAc/mZggJX4LlwJbRuniIiSaXrw==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@isaacs/ttlcache': 1.4.1
+ level: 8.0.1
+ multiformats: 13.1.0
+ readable-stream: 4.5.2
+ dev: false
+
+ /@web5/common@1.1.0:
+ resolution: {integrity: sha512-h08WsnMK7eyCfCgrV++6/h/0xoQeVbJJ/D5uqb2d+wUeTMpQ99bJWAt0if/2AOOB4+8CvyfVc4e9gRZM/YyN+Q==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@isaacs/ttlcache': 1.4.1
+ level: 8.0.1
+ multiformats: 13.1.0
+ readable-stream: 4.5.2
+ dev: false
+
+ /@web5/credentials@1.0.3:
+ resolution: {integrity: sha512-xWLey8+c8yv8XuYhiCkV0aUaxII5g4zDaVxEd84megsGl7RyjFNxxsx7cZBhr0BEYO/lcZRFGsMsBz4HKRYYpQ==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@sphereon/pex': 2.1.0
+ '@web5/common': 1.0.1
+ '@web5/crypto': 1.0.1
+ '@web5/dids': 1.1.1
+ pako: 2.1.0
+ dev: false
+
+ /@web5/credentials@1.1.1:
+ resolution: {integrity: sha512-SlTpW4rg+HJ6ipLV4uzQ0Sg4HmSeuwWnWa6JOIG+cBWAOgCwgY/PL0F57wI3p4b8qcx/ey2R2yZyKkpN0sr8UQ==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@sphereon/pex': 3.3.3
+ '@web5/common': 1.0.1
+ '@web5/crypto': 1.0.4
+ '@web5/dids': 1.1.1
+ jsonschema: 1.4.1
+ pako: 2.1.0
+ dev: false
+
+ /@web5/crypto-aws-kms@1.0.5:
+ resolution: {integrity: sha512-cu3/kpFy0+qvgi6LXR9Wzin+U2C67eje1Vz0pOLBIQgqnBoguVxegtBmCvyLJOWNAuIeccZYVdvR8d2/ySjrag==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@aws-sdk/client-kms': 3.616.0
+ '@web5/crypto': 1.0.5
+ transitivePeerDependencies:
+ - aws-crt
+ dev: false
+
+ /@web5/crypto@1.0.0:
+ resolution: {integrity: sha512-z1CsgycTqiXEsS6pPlJDDLGAeGsgzfdBeWvyxLXTgh08Q8ACULmEGRXjSsgWHFn6DO6MpWFn55h/hF4wZZRxvA==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@noble/ciphers': 0.4.1
+ '@noble/curves': 1.3.0
+ '@noble/hashes': 1.3.3
+ '@web5/common': 1.0.0
+ dev: false
+
+ /@web5/crypto@1.0.1:
+ resolution: {integrity: sha512-LqJsJTDgzEZoxsYSWjhIKDTE3xwjfPF3rpkClMFAxmK4dur/KmYHgeZW2/HjRrFrUhNeaNVClcl7Fg2ZnvjsWw==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@noble/ciphers': 0.4.1
+ '@noble/curves': 1.3.0
+ '@noble/hashes': 1.4.0
+ '@web5/common': 1.0.0
+ dev: false
+
+ /@web5/crypto@1.0.4:
+ resolution: {integrity: sha512-XjYkwQG28zo6UXusl5djca9/Qv74H259fjofrUY87qeb1Y/lPrgtpVTSNaqdLu4RB1gwyzFZwOGRaphWNjK1Ug==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@noble/ciphers': 0.5.3
+ '@noble/curves': 1.3.0
+ '@noble/hashes': 1.4.0
+ '@web5/common': 1.0.1
+ dev: false
+
+ /@web5/crypto@1.0.5:
+ resolution: {integrity: sha512-btVYrv6G29VQgdLVtqH4IbaH6DvvEA2UWgF3y0AMv/wAmT4EKSdwVUHhEWt16gtpN05UT5qEYmnKLZUOxk1zzw==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@noble/ciphers': 0.5.3
+ '@noble/curves': 1.3.0
+ '@noble/hashes': 1.4.0
+ '@web5/common': 1.0.2
+ dev: false
+
+ /@web5/crypto@1.0.6:
+ resolution: {integrity: sha512-sxlMZZTEc5hgkavyn+2gRilSaY8N8mKQZkurW0T59XXFbTTD5GDIS+L2z57YXX9Jwdj+mOc5YtSI7Evjvrf+CQ==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@noble/ciphers': 0.5.3
+ '@noble/curves': 1.3.0
+ '@noble/hashes': 1.4.0
+ '@web5/common': 1.1.0
+ dev: false
+
+ /@web5/dids@1.1.1:
+ resolution: {integrity: sha512-LKc6Okl2iz78QGJCsd8QKQq3LdtmfQ9cfiRKu1BU4ITWteWsg4JD089hKmslNDd2KKnEf9LE72TqEYWxr/e8JA==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@decentralized-identity/ion-sdk': 1.0.4
+ '@dnsquery/dns-packet': 6.1.1
+ '@web5/common': 1.0.0
+ '@web5/crypto': 1.0.0
+ abstract-level: 1.0.4
+ bencode: 4.0.0
+ buffer: 6.0.3
+ level: 8.0.1
+ ms: 2.1.3
+ dev: false
+
+ /@web5/dids@1.1.5:
+ resolution: {integrity: sha512-vGRWeSZkNX7Whz2fZelpnhYmuQ3FMxgkdCP08lSpfN9mz9Tk0TbVlZx3vD6Lh8oUyHi/v//0nhr/NdzGqb8jgQ==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@decentralized-identity/ion-sdk': 1.0.4
+ '@dnsquery/dns-packet': 6.1.1
+ '@web5/common': 1.0.2
+ '@web5/crypto': 1.0.5
+ abstract-level: 1.0.4
+ bencode: 4.0.0
+ buffer: 6.0.3
+ level: 8.0.1
+ ms: 2.1.3
+ dev: false
+
+ /@web5/dids@1.2.0:
+ resolution: {integrity: sha512-1YkmKaBHA0QRIxANg3dziCG0yY/9XYY6e2KVNUhv1zq2RcPVmIVAcivG4OSwwfcmWieG+H3bE2A4fCLftj3U3g==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@decentralized-identity/ion-sdk': 1.0.4
+ '@dnsquery/dns-packet': 6.1.1
+ '@web5/common': 1.1.0
+ '@web5/crypto': 1.0.6
+ abstract-level: 1.0.4
+ bencode: 4.0.0
+ buffer: 6.0.3
+ level: 8.0.1
+ ms: 2.1.3
+ dev: false
+
+ /@web5/identity-agent@0.6.4(ws@8.18.0):
+ resolution: {integrity: sha512-Ka0iVDllwJgq9LoEPF3C0GaaDG9SCFtKMudYBKZEgZwRNtCPp0n21xcq0t2K+U09qkADm40OFIZ0X7QzOI54Tg==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@web5/agent': 0.7.4(ws@8.18.0)
+ '@web5/common': 1.0.2
+ '@web5/crypto': 1.0.5
+ '@web5/dids': 1.1.5
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ - ws
+ dev: false
+
+ /@web5/user-agent@0.7.1(ws@8.18.0):
+ resolution: {integrity: sha512-6Wr7aPB4tZmdp27hJzee2fy0Tfxoo+KpPkkccCSTfto7W7KqdotNZotZGKi55wHjYBNfkCOjRn2L4XLfOUIonA==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ '@web5/agent': 0.8.1(ws@8.18.0)
+ '@web5/common': 1.1.0
+ '@web5/crypto': 1.0.6
+ '@web5/dids': 1.2.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ - ws
+ dev: false
+
+ /@webassemblyjs/ast@1.14.1:
+ resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
+ dependencies:
+ '@webassemblyjs/helper-numbers': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+
+ /@webassemblyjs/floating-point-hex-parser@1.13.2:
+ resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==}
+
+ /@webassemblyjs/helper-api-error@1.13.2:
+ resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==}
+
+ /@webassemblyjs/helper-buffer@1.14.1:
+ resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==}
+
+ /@webassemblyjs/helper-numbers@1.13.2:
+ resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==}
+ dependencies:
+ '@webassemblyjs/floating-point-hex-parser': 1.13.2
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@xtuc/long': 4.2.2
+
+ /@webassemblyjs/helper-wasm-bytecode@1.13.2:
+ resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==}
+
+ /@webassemblyjs/helper-wasm-section@1.14.1:
+ resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==}
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/wasm-gen': 1.14.1
+
+ /@webassemblyjs/ieee754@1.13.2:
+ resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==}
+ dependencies:
+ '@xtuc/ieee754': 1.2.0
+
+ /@webassemblyjs/leb128@1.13.2:
+ resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==}
+ dependencies:
+ '@xtuc/long': 4.2.2
+
+ /@webassemblyjs/utf8@1.13.2:
+ resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==}
+
+ /@webassemblyjs/wasm-edit@1.14.1:
+ resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==}
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/helper-wasm-section': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-opt': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ '@webassemblyjs/wast-printer': 1.14.1
+
+ /@webassemblyjs/wasm-gen@1.14.1:
+ resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==}
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ /@webassemblyjs/wasm-opt@1.14.1:
+ resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==}
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-buffer': 1.14.1
+ '@webassemblyjs/wasm-gen': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+
+ /@webassemblyjs/wasm-parser@1.14.1:
+ resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==}
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/helper-api-error': 1.13.2
+ '@webassemblyjs/helper-wasm-bytecode': 1.13.2
+ '@webassemblyjs/ieee754': 1.13.2
+ '@webassemblyjs/leb128': 1.13.2
+ '@webassemblyjs/utf8': 1.13.2
+
+ /@webassemblyjs/wast-printer@1.14.1:
+ resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==}
+ dependencies:
+ '@webassemblyjs/ast': 1.14.1
+ '@xtuc/long': 4.2.2
+
+ /@xtuc/ieee754@1.2.0:
+ resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
+
+ /@xtuc/long@4.2.2:
+ resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+
+ /@zxing/browser@0.0.7(@zxing/library@0.18.6):
+ resolution: {integrity: sha512-AepzMgDnD6EjxewqmXpHJsi4S3Gw9ilZJLIbTf6fWuWySEcHBodnGu3p7FWlgq1Sd5QyfPhTum5z3CBkkhMVng==}
+ peerDependencies:
+ '@zxing/library': ^0.18.3
+ dependencies:
+ '@zxing/library': 0.18.6
+ optionalDependencies:
+ '@zxing/text-encoding': 0.9.0
+ dev: false
+
+ /@zxing/library@0.18.6:
+ resolution: {integrity: sha512-bulZ9JHoLFd9W36pi+7e7DnEYNJhljYjZ1UTsKPOoLMU3qtC+REHITeCRNx40zTRJZx18W5TBRXt5pq2Uopjsw==}
+ engines: {node: '>= 10.4.0'}
+ dependencies:
+ ts-custom-error: 3.3.1
+ optionalDependencies:
+ '@zxing/text-encoding': 0.9.0
+ dev: false
+
+ /@zxing/text-encoding@0.9.0:
+ resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==}
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /abort-controller@3.0.0:
+ resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
+ engines: {node: '>=6.5'}
+ dependencies:
+ event-target-shim: 5.0.1
+ dev: false
+
+ /abstract-level@1.0.3:
+ resolution: {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==}
+ engines: {node: '>=12'}
+ dependencies:
+ buffer: 6.0.3
+ catering: 2.1.1
+ is-buffer: 2.0.5
+ level-supports: 4.0.1
+ level-transcoder: 1.0.1
+ module-error: 1.0.2
+ queue-microtask: 1.2.3
+ dev: false
+
+ /abstract-level@1.0.4:
+ resolution: {integrity: sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==}
+ engines: {node: '>=12'}
+ dependencies:
+ buffer: 6.0.3
+ catering: 2.1.1
+ is-buffer: 2.0.5
+ level-supports: 4.0.1
+ level-transcoder: 1.0.1
+ module-error: 1.0.2
+ queue-microtask: 1.2.3
+ dev: false
+
+ /accepts@1.3.8:
+ resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-types: 2.1.35
+ negotiator: 0.6.3
+ dev: false
+
+ /acorn-jsx@5.3.2(acorn@8.14.0):
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 8.14.0
+
+ /acorn-node@1.8.2:
+ resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==}
+ dependencies:
+ acorn: 7.4.1
+ acorn-walk: 7.2.0
+ xtend: 4.0.2
+ dev: false
+
+ /acorn-walk@7.2.0:
+ resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==}
+ engines: {node: '>=0.4.0'}
+ dev: false
+
+ /acorn-walk@8.3.4:
+ resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
+ engines: {node: '>=0.4.0'}
+ dependencies:
+ acorn: 8.14.0
+
+ /acorn@7.4.1:
+ resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: false
+
+ /acorn@8.14.0:
+ resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ /address@1.2.2:
+ resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==}
+ engines: {node: '>= 10.0.0'}
+ dev: false
+
+ /agent-base@6.0.2:
+ resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
+ engines: {node: '>= 6.0.0'}
+ dependencies:
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /agent-base@7.1.1:
+ resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==}
+ engines: {node: '>= 14'}
+ dependencies:
+ debug: 4.3.7
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /aggregate-error@3.1.0:
+ resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
+ engines: {node: '>=8'}
+ dependencies:
+ clean-stack: 2.2.0
+ indent-string: 4.0.0
+ dev: false
+
+ /ajv-formats@2.1.1(ajv@8.17.1):
+ resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+ dependencies:
+ ajv: 8.17.1
+ dev: false
+
+ /ajv-keywords@3.5.2(ajv@6.12.6):
+ resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
+ peerDependencies:
+ ajv: ^6.9.1
+ dependencies:
+ ajv: 6.12.6
+
+ /ajv-keywords@5.1.0(ajv@8.17.1):
+ resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==}
+ peerDependencies:
+ ajv: ^8.8.2
+ dependencies:
+ ajv: 8.17.1
+ fast-deep-equal: 3.1.3
+ dev: false
+
+ /ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ /ajv@8.12.0:
+ resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js: 4.4.1
+ dev: false
+
+ /ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.0.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ dev: false
+
+ /algoliasearch-helper@3.22.5(algoliasearch@4.24.0):
+ resolution: {integrity: sha512-lWvhdnc+aKOKx8jyA3bsdEgHzm/sglC4cYdMG4xSQyRiPLJVJtH/IVYZG3Hp6PkTEhQqhyVYkeP9z2IlcHJsWw==}
+ peerDependencies:
+ algoliasearch: '>= 3.1 < 6'
+ dependencies:
+ '@algolia/events': 4.0.1
+ algoliasearch: 4.24.0
+ dev: false
+
+ /algoliasearch@4.24.0:
+ resolution: {integrity: sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==}
+ dependencies:
+ '@algolia/cache-browser-local-storage': 4.24.0
+ '@algolia/cache-common': 4.24.0
+ '@algolia/cache-in-memory': 4.24.0
+ '@algolia/client-account': 4.24.0
+ '@algolia/client-analytics': 4.24.0
+ '@algolia/client-common': 4.24.0
+ '@algolia/client-personalization': 4.24.0
+ '@algolia/client-search': 4.24.0
+ '@algolia/logger-common': 4.24.0
+ '@algolia/logger-console': 4.24.0
+ '@algolia/recommend': 4.24.0
+ '@algolia/requester-browser-xhr': 4.24.0
+ '@algolia/requester-common': 4.24.0
+ '@algolia/requester-node-http': 4.24.0
+ '@algolia/transporter': 4.24.0
+ dev: false
+
+ /algoliasearch@5.14.0:
+ resolution: {integrity: sha512-qr21NtvIkpptwj9z6W5guICK8yijXIGzw7Ka26zAPofnefofVXoXtuAopjtmk1ZKDu4YpACj38n9mgKKc5Zuhw==}
+ engines: {node: '>= 14.0.0'}
+ dependencies:
+ '@algolia/client-abtesting': 5.14.0
+ '@algolia/client-analytics': 5.14.0
+ '@algolia/client-common': 5.14.0
+ '@algolia/client-insights': 5.14.0
+ '@algolia/client-personalization': 5.14.0
+ '@algolia/client-query-suggestions': 5.14.0
+ '@algolia/client-search': 5.14.0
+ '@algolia/ingestion': 1.14.0
+ '@algolia/monitoring': 1.14.0
+ '@algolia/recommend': 5.14.0
+ '@algolia/requester-browser-xhr': 5.14.0
+ '@algolia/requester-fetch': 5.14.0
+ '@algolia/requester-node-http': 5.14.0
+ dev: false
+
+ /ansi-align@3.0.1:
+ resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+ dependencies:
+ string-width: 4.2.3
+ dev: false
+
+ /ansi-escapes@4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.21.3
+ dev: false
+
+ /ansi-html-community@0.0.8:
+ resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==}
+ engines: {'0': node >= 0.8.0}
+ hasBin: true
+ dev: false
+
+ /ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ /ansi-regex@6.1.0:
+ resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
+ engines: {node: '>=12'}
+
+ /ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ color-convert: 2.0.1
+
+ /ansi-styles@5.2.0:
+ resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /ansi-styles@6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+
+ /anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+ dev: false
+
+ /archiver-utils@2.1.0:
+ resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==}
+ engines: {node: '>= 6'}
+ dependencies:
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ lazystream: 1.0.1
+ lodash.defaults: 4.2.0
+ lodash.difference: 4.5.0
+ lodash.flatten: 4.4.0
+ lodash.isplainobject: 4.0.6
+ lodash.union: 4.6.0
+ normalize-path: 3.0.0
+ readable-stream: 2.3.8
+ dev: true
+
+ /archiver-utils@3.0.4:
+ resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==}
+ engines: {node: '>= 10'}
+ dependencies:
+ glob: 7.2.3
+ graceful-fs: 4.2.11
+ lazystream: 1.0.1
+ lodash.defaults: 4.2.0
+ lodash.difference: 4.5.0
+ lodash.flatten: 4.4.0
+ lodash.isplainobject: 4.0.6
+ lodash.union: 4.6.0
+ normalize-path: 3.0.0
+ readable-stream: 3.6.2
+ dev: true
+
+ /archiver@5.3.2:
+ resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==}
+ engines: {node: '>= 10'}
+ dependencies:
+ archiver-utils: 2.1.0
+ async: 3.2.6
+ buffer-crc32: 0.2.13
+ readable-stream: 3.6.2
+ readdir-glob: 1.1.3
+ tar-stream: 2.2.0
+ zip-stream: 4.1.1
+ dev: true
+
+ /arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+
+ /argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+ dependencies:
+ sprintf-js: 1.0.3
+ dev: false
+
+ /argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ dev: false
+
+ /aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /array-buffer-byte-length@1.0.1:
+ resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ is-array-buffer: 3.0.4
+ dev: false
+
+ /array-flatten@1.1.1:
+ resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+ dev: false
+
+ /array-union@2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /array.prototype.filter@1.0.4:
+ resolution: {integrity: sha512-r+mCJ7zXgXElgR4IRC+fkvNCeoaavWBs6EdCso5Tbcf+iEMKzBU/His60lt34WEZ9vlb8wDkZvQGcVI5GwkfoQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.4
+ es-array-method-boxes-properly: 1.0.0
+ es-object-atoms: 1.0.0
+ is-string: 1.0.7
+ dev: false
+
+ /array.prototype.flat@1.3.2:
+ resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.4
+ es-shim-unscopables: 1.0.2
+ dev: false
+
+ /arraybuffer.prototype.slice@1.0.3:
+ resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ array-buffer-byte-length: 1.0.1
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ is-array-buffer: 3.0.4
+ is-shared-array-buffer: 1.0.3
+ dev: false
+
+ /asn1.js@4.10.1:
+ resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==}
+ dependencies:
+ bn.js: 4.12.1
+ inherits: 2.0.4
+ minimalistic-assert: 1.0.1
+ dev: false
+
+ /assertion-error@1.1.0:
+ resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
+ dev: true
+
+ /astring@1.9.0:
+ resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
+ hasBin: true
+
+ /async@3.2.6:
+ resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
+ dev: true
+
+ /asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ /at-least-node@1.0.0:
+ resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
+ engines: {node: '>= 4.0.0'}
+ dev: false
+
+ /autoprefixer@10.3.4(postcss@8.4.31):
+ resolution: {integrity: sha512-EKjKDXOq7ug+jagLzmnoTRpTT0q1KVzEJqrJd0hCBa7FiG0WbFOBCcJCy2QkW1OckpO3qgttA1aWjVbeIPAecw==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ browserslist: 4.24.2
+ caniuse-lite: 1.0.30001680
+ colorette: 1.4.0
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /autoprefixer@10.4.13(postcss@8.4.31):
+ resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ browserslist: 4.24.2
+ caniuse-lite: 1.0.30001680
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ picocolors: 1.1.1
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /autoprefixer@10.4.20(postcss@8.4.31):
+ resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ browserslist: 4.24.2
+ caniuse-lite: 1.0.30001680
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ picocolors: 1.1.1
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ possible-typed-array-names: 1.0.0
+ dev: false
+
+ /axios@1.7.4(debug@4.3.4):
+ resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==}
+ dependencies:
+ follow-redirects: 1.15.9(debug@4.3.4)
+ form-data: 4.0.1
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
+
+ /babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.96.1):
+ resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==}
+ engines: {node: '>= 14.15.0'}
+ peerDependencies:
+ '@babel/core': ^7.12.0
+ webpack: '>=5'
+ dependencies:
+ '@babel/core': 7.26.0
+ find-cache-dir: 4.0.0
+ schema-utils: 4.2.0
+ webpack: 5.96.1
+ dev: false
+
+ /babel-plugin-dynamic-import-node@2.3.3:
+ resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==}
+ dependencies:
+ object.assign: 4.1.5
+ dev: false
+
+ /babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0):
+ resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ dependencies:
+ '@babel/compat-data': 7.26.2
+ '@babel/core': 7.26.0
+ '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0)
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0):
+ resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0)
+ core-js-compat: 3.39.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0):
+ resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==}
+ peerDependencies:
+ '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0)
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+
+ /balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ /base64-arraybuffer-es6@0.7.0:
+ resolution: {integrity: sha512-ESyU/U1CFZDJUdr+neHRhNozeCv72Y7Vm0m1DCbjX3KBjT6eYocvAJlSk6+8+HkVwXlT1FNxhGW6q3UKAlCvvw==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /base64-arraybuffer@1.0.2:
+ resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==}
+ engines: {node: '>= 0.6.0'}
+ dev: false
+
+ /base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ /batch@0.6.1:
+ resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==}
+ dev: false
+
+ /bencode@4.0.0:
+ resolution: {integrity: sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==}
+ engines: {node: '>=12.20.0'}
+ dependencies:
+ uint8-util: 2.2.5
+ dev: false
+
+ /big.js@5.2.2:
+ resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+ dev: false
+
+ /bignumber.js@9.1.2:
+ resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==}
+ dev: false
+
+ /binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ /bl@5.1.0:
+ resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==}
+ dependencies:
+ buffer: 6.0.3
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ dev: false
+
+ /blockstore-core@4.2.0:
+ resolution: {integrity: sha512-F8BCobc75D+9/+hUD+5cixbU6zmZA+lBgNiuBkNlJqRgmAaBBvLOQF6Ad9Jei0Nvmy2a1jaF4CiN76W1apIghA==}
+ engines: {node: '>=16.0.0', npm: '>=7.0.0'}
+ dependencies:
+ err-code: 3.0.1
+ interface-blockstore: 5.2.3
+ interface-store: 5.1.2
+ multiformats: 11.0.2
+ dev: false
+
+ /bluebird@3.7.2:
+ resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
+ dev: true
+
+ /bluehawk@1.4.0:
+ resolution: {integrity: sha512-dboTMAyX4+h8RXPTgtUSKwNlLZ6BE90VbjscQk3fPUg8jy2ZF9k++5g+Wry7Bs7EY7cxdeyYzCQft3wJsPqVAA==}
+ hasBin: true
+ dependencies:
+ ajv: 8.17.1
+ chevrotain: 10.5.0
+ ignore: 5.3.2
+ isbinaryfile: 5.0.4
+ magic-string: 0.27.0
+ memfs: 3.5.3
+ source-map: 0.7.4
+ yargs: 17.7.2
+ dev: false
+
+ /bn.js@4.12.1:
+ resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==}
+ dev: false
+
+ /bn.js@5.2.1:
+ resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==}
+ dev: false
+
+ /body-parser@1.20.1:
+ resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ on-finished: 2.4.1
+ qs: 6.11.0
+ raw-body: 2.5.1
+ type-is: 1.6.18
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /body-parser@1.20.2:
+ resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.5
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ on-finished: 2.4.1
+ qs: 6.11.0
+ raw-body: 2.5.2
+ type-is: 1.6.18
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /bonjour-service@1.2.1:
+ resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ multicast-dns: 7.2.5
+ dev: false
+
+ /boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+ dev: false
+
+ /bowser@2.11.0:
+ resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==}
+ dev: false
+
+ /boxen@6.2.1:
+ resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ ansi-align: 3.0.1
+ camelcase: 6.3.0
+ chalk: 4.1.2
+ cli-boxes: 3.0.0
+ string-width: 5.1.2
+ type-fest: 2.19.0
+ widest-line: 4.0.1
+ wrap-ansi: 8.1.0
+ dev: false
+
+ /boxen@7.1.1:
+ resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ ansi-align: 3.0.1
+ camelcase: 7.0.1
+ chalk: 5.3.0
+ cli-boxes: 3.0.0
+ string-width: 5.1.2
+ type-fest: 2.19.0
+ widest-line: 4.0.1
+ wrap-ansi: 8.1.0
+ dev: false
+
+ /brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ /brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ dependencies:
+ balanced-match: 1.0.2
+
+ /braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.1.1
+ dev: false
+
+ /brorand@1.1.0:
+ resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==}
+ dev: false
+
+ /browser-level@1.0.1:
+ resolution: {integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==}
+ dependencies:
+ abstract-level: 1.0.4
+ catering: 2.1.1
+ module-error: 1.0.2
+ run-parallel-limit: 1.1.0
+ dev: false
+
+ /browserify-aes@1.2.0:
+ resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==}
+ dependencies:
+ buffer-xor: 1.0.3
+ cipher-base: 1.0.4
+ create-hash: 1.2.0
+ evp_bytestokey: 1.0.3
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+ dev: false
+
+ /browserify-cipher@1.0.1:
+ resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==}
+ dependencies:
+ browserify-aes: 1.2.0
+ browserify-des: 1.0.2
+ evp_bytestokey: 1.0.3
+ dev: false
+
+ /browserify-des@1.0.2:
+ resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==}
+ dependencies:
+ cipher-base: 1.0.4
+ des.js: 1.1.0
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+ dev: false
+
+ /browserify-rsa@4.1.1:
+ resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==}
+ engines: {node: '>= 0.10'}
+ dependencies:
+ bn.js: 5.2.1
+ randombytes: 2.1.0
+ safe-buffer: 5.2.1
+ dev: false
+
+ /browserify-sign@4.2.3:
+ resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==}
+ engines: {node: '>= 0.12'}
+ dependencies:
+ bn.js: 5.2.1
+ browserify-rsa: 4.1.1
+ create-hash: 1.2.0
+ create-hmac: 1.1.7
+ elliptic: 6.5.7
+ hash-base: 3.0.4
+ inherits: 2.0.4
+ parse-asn1: 5.1.7
+ readable-stream: 2.3.8
+ safe-buffer: 5.2.1
+ dev: false
+
+ /browserslist@4.24.2:
+ resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+ dependencies:
+ caniuse-lite: 1.0.30001680
+ electron-to-chromium: 1.5.58
+ node-releases: 2.0.18
+ update-browserslist-db: 1.1.1(browserslist@4.24.2)
+
+ /buffer-crc32@0.2.13:
+ resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+ dev: true
+
+ /buffer-equal-constant-time@1.0.1:
+ resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
+ dev: false
+
+ /buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ /buffer-xor@1.0.3:
+ resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==}
+ dev: false
+
+ /buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ /buffer@6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+ dev: false
+
+ /bytes@3.0.0:
+ resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /bytes@3.1.2:
+ resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /cacheable-lookup@7.0.0:
+ resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==}
+ engines: {node: '>=14.16'}
+
+ /cacheable-request@10.2.14:
+ resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ '@types/http-cache-semantics': 4.0.4
+ get-stream: 6.0.1
+ http-cache-semantics: 4.1.1
+ keyv: 4.5.4
+ mimic-response: 4.0.0
+ normalize-url: 8.0.1
+ responselike: 3.0.0
+
+ /call-bind@1.0.7:
+ resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ set-function-length: 1.2.2
+ dev: false
+
+ /call-me-maybe@1.0.2:
+ resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==}
+ dev: false
+
+ /callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /camel-case@4.1.2:
+ resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
+ dependencies:
+ pascal-case: 3.1.2
+ tslib: 2.8.1
+ dev: false
+
+ /camelcase-css@2.0.1:
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
+ engines: {node: '>= 6'}
+ dev: false
+
+ /camelcase@5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /camelcase@7.0.1:
+ resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==}
+ engines: {node: '>=14.16'}
+ dev: false
+
+ /camelize@1.0.1:
+ resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
+ dev: false
+
+ /caniuse-api@3.0.0:
+ resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==}
+ dependencies:
+ browserslist: 4.24.2
+ caniuse-lite: 1.0.30001680
+ lodash.memoize: 4.1.2
+ lodash.uniq: 4.5.0
+ dev: false
+
+ /caniuse-lite@1.0.30001680:
+ resolution: {integrity: sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==}
+
+ /canonicalize@2.0.0:
+ resolution: {integrity: sha512-ulDEYPv7asdKvqahuAY35c1selLdzDwHqugK92hfkzvlDCwXRRelDkR+Er33md/PtnpqHemgkuDPanZ4fiYZ8w==}
+ dev: false
+
+ /catering@2.1.1:
+ resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /cborg@2.0.5:
+ resolution: {integrity: sha512-xVW1rSIw1ZXbkwl2XhJ7o/jAv0vnVoQv/QlfQxV8a7V5PlA4UU/AcIiXqmpyybwNWy/GPQU1m/aBVNIWr7/T0w==}
+ hasBin: true
+ dev: false
+
+ /ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
+ /chai@4.5.0:
+ resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==}
+ engines: {node: '>=4'}
+ dependencies:
+ assertion-error: 1.1.0
+ check-error: 1.0.3
+ deep-eql: 4.1.4
+ get-func-name: 2.0.2
+ loupe: 2.3.7
+ pathval: 1.1.1
+ type-detect: 4.1.0
+ dev: true
+
+ /chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+ dev: false
+
+ /chalk@5.3.0:
+ resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ /char-regex@1.0.2:
+ resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /character-entities-html4@2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
+
+ /character-entities-legacy@3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
+
+ /character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
+ /character-reference-invalid@2.0.1:
+ resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
+
+ /chardet@0.7.0:
+ resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+ dev: false
+
+ /check-error@1.0.3:
+ resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
+ dependencies:
+ get-func-name: 2.0.2
+ dev: true
+
+ /check-more-types@2.24.0:
+ resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /cheerio-select@2.1.0:
+ resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==}
+ dependencies:
+ boolbase: 1.0.0
+ css-select: 5.1.0
+ css-what: 6.1.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ dev: false
+
+ /cheerio@1.0.0:
+ resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==}
+ engines: {node: '>=18.17'}
+ dependencies:
+ cheerio-select: 2.1.0
+ dom-serializer: 2.0.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ encoding-sniffer: 0.2.0
+ htmlparser2: 9.1.0
+ parse5: 7.2.1
+ parse5-htmlparser2-tree-adapter: 7.1.0
+ parse5-parser-stream: 7.1.2
+ undici: 6.21.0
+ whatwg-mimetype: 4.0.0
+ dev: false
+
+ /cheerio@1.0.0-rc.12:
+ resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==}
+ engines: {node: '>= 6'}
+ dependencies:
+ cheerio-select: 2.1.0
+ dom-serializer: 2.0.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ htmlparser2: 8.0.2
+ parse5: 7.2.1
+ parse5-htmlparser2-tree-adapter: 7.1.0
+ dev: false
+
+ /chevrotain@10.5.0:
+ resolution: {integrity: sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==}
+ dependencies:
+ '@chevrotain/cst-dts-gen': 10.5.0
+ '@chevrotain/gast': 10.5.0
+ '@chevrotain/types': 10.5.0
+ '@chevrotain/utils': 10.5.0
+ lodash: 4.17.21
+ regexp-to-ast: 0.5.0
+ dev: false
+
+ /chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+ dev: false
+
+ /chownr@1.1.4:
+ resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
+ dev: true
+
+ /chrome-launcher@0.15.2:
+ resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==}
+ engines: {node: '>=12.13.0'}
+ hasBin: true
+ dependencies:
+ '@types/node': 20.17.6
+ escape-string-regexp: 4.0.0
+ is-wsl: 2.2.0
+ lighthouse-logger: 1.4.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /chrome-trace-event@1.0.4:
+ resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
+ engines: {node: '>=6.0'}
+
+ /chromium-bidi@0.4.9(devtools-protocol@0.0.1120988):
+ resolution: {integrity: sha512-u3DC6XwgLCA9QJ5ak1voPslCmacQdulZNCPsI3qNXxSnEcZS7DFIbww+5RM2bznMEje7cc0oydavRLRvOIZtHw==}
+ peerDependencies:
+ devtools-protocol: '*'
+ dependencies:
+ devtools-protocol: 0.0.1120988
+ mitt: 3.0.0
+ dev: true
+
+ /ci-info@3.9.0:
+ resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /cipher-base@1.0.4:
+ resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==}
+ dependencies:
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+ dev: false
+
+ /classic-level@1.4.1:
+ resolution: {integrity: sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==}
+ engines: {node: '>=12'}
+ requiresBuild: true
+ dependencies:
+ abstract-level: 1.0.4
+ catering: 2.1.1
+ module-error: 1.0.2
+ napi-macros: 2.2.2
+ node-gyp-build: 4.8.3
+ dev: false
+
+ /classnames@2.5.1:
+ resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
+ dev: false
+
+ /clean-css@5.3.3:
+ resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==}
+ engines: {node: '>= 10.0'}
+ dependencies:
+ source-map: 0.6.1
+ dev: false
+
+ /clean-stack@2.2.0:
+ resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /cli-boxes@3.0.0:
+ resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /cli-cursor@3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ engines: {node: '>=8'}
+ dependencies:
+ restore-cursor: 3.1.0
+ dev: false
+
+ /cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /cli-table3@0.6.5:
+ resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==}
+ engines: {node: 10.* || >= 12.*}
+ dependencies:
+ string-width: 4.2.3
+ optionalDependencies:
+ '@colors/colors': 1.5.0
+ dev: false
+
+ /cli-width@3.0.0:
+ resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==}
+ engines: {node: '>= 10'}
+ dev: false
+
+ /cliui@6.0.0:
+ resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
+ dev: false
+
+ /cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ /clone-deep@4.0.1:
+ resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==}
+ engines: {node: '>=6'}
+ dependencies:
+ is-plain-object: 2.0.4
+ kind-of: 6.0.3
+ shallow-clone: 3.0.1
+
+ /clone@1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+ dev: false
+
+ /clsx@1.2.1:
+ resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /collapse-white-space@2.1.0:
+ resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
+
+ /color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+ dependencies:
+ color-name: 1.1.4
+
+ /color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ /color-string@1.9.1:
+ resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+ dependencies:
+ color-name: 1.1.4
+ simple-swizzle: 0.2.2
+ dev: false
+
+ /color@4.2.3:
+ resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
+ engines: {node: '>=12.5.0'}
+ dependencies:
+ color-convert: 2.0.1
+ color-string: 1.9.1
+ dev: false
+
+ /colord@2.9.3:
+ resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
+ dev: false
+
+ /colorette@1.4.0:
+ resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==}
+ dev: false
+
+ /colorette@2.0.20:
+ resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+ dev: false
+
+ /combine-promises@1.2.0:
+ resolution: {integrity: sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ delayed-stream: 1.0.0
+
+ /comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
+ /commander@10.0.1:
+ resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
+ engines: {node: '>=14'}
+ dev: false
+
+ /commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+ /commander@5.1.0:
+ resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==}
+ engines: {node: '>= 6'}
+
+ /commander@7.2.0:
+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+ dev: false
+
+ /commander@8.3.0:
+ resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
+ engines: {node: '>= 12'}
+ dev: false
+
+ /common-path-prefix@3.0.0:
+ resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==}
+ dev: false
+
+ /compress-commons@4.1.2:
+ resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==}
+ engines: {node: '>= 10'}
+ dependencies:
+ buffer-crc32: 0.2.13
+ crc32-stream: 4.0.3
+ normalize-path: 3.0.0
+ readable-stream: 3.6.2
+ dev: true
+
+ /compressible@2.0.18:
+ resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.53.0
+ dev: false
+
+ /compression@1.7.5:
+ resolution: {integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ bytes: 3.1.2
+ compressible: 2.0.18
+ debug: 2.6.9
+ negotiator: 0.6.4
+ on-headers: 1.0.2
+ safe-buffer: 5.2.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ /confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+ dev: true
+
+ /config-chain@1.1.13:
+ resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+ dependencies:
+ ini: 1.3.8
+ proto-list: 1.2.4
+ dev: false
+
+ /configstore@6.0.0:
+ resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==}
+ engines: {node: '>=12'}
+ dependencies:
+ dot-prop: 6.0.1
+ graceful-fs: 4.2.11
+ unique-string: 3.0.0
+ write-file-atomic: 3.0.3
+ xdg-basedir: 5.1.0
+ dev: false
+
+ /connect-history-api-fallback@2.0.0:
+ resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==}
+ engines: {node: '>=0.8'}
+ dev: false
+
+ /consola@2.15.3:
+ resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==}
+ dev: false
+
+ /consola@3.2.3:
+ resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==}
+ engines: {node: ^14.18.0 || >=16.10.0}
+ dev: false
+
+ /content-disposition@0.5.2:
+ resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /content-disposition@0.5.4:
+ resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: false
+
+ /content-type@1.0.5:
+ resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ /cookie-signature@1.0.6:
+ resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+ dev: false
+
+ /cookie@0.5.0:
+ resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /cookie@0.6.0:
+ resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /cookie@0.7.2:
+ resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /copy-text-to-clipboard@3.2.0:
+ resolution: {integrity: sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /copy-webpack-plugin@11.0.0(webpack@5.96.1):
+ resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==}
+ engines: {node: '>= 14.15.0'}
+ peerDependencies:
+ webpack: ^5.1.0
+ dependencies:
+ fast-glob: 3.3.2
+ glob-parent: 6.0.2
+ globby: 13.2.2
+ normalize-path: 3.0.0
+ schema-utils: 4.2.0
+ serialize-javascript: 6.0.2
+ webpack: 5.96.1
+ dev: false
+
+ /core-js-compat@3.39.0:
+ resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==}
+ dependencies:
+ browserslist: 4.24.2
+ dev: false
+
+ /core-js-pure@3.39.0:
+ resolution: {integrity: sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==}
+ requiresBuild: true
+ dev: false
+
+ /core-js@3.39.0:
+ resolution: {integrity: sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==}
+ requiresBuild: true
+ dev: false
+
+ /core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
+ /cors@2.8.5:
+ resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+ engines: {node: '>= 0.10'}
+ dependencies:
+ object-assign: 4.1.1
+ vary: 1.1.2
+ dev: false
+
+ /cose-base@1.0.3:
+ resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==}
+ dependencies:
+ layout-base: 1.0.2
+ dev: false
+
+ /cosmiconfig@6.0.0:
+ resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@types/parse-json': 4.0.2
+ import-fresh: 3.3.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ yaml: 1.10.2
+ dev: false
+
+ /cosmiconfig@7.1.0:
+ resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@types/parse-json': 4.0.2
+ import-fresh: 3.3.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ yaml: 1.10.2
+ dev: false
+
+ /cosmiconfig@8.3.6(typescript@5.6.3):
+ resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ path-type: 4.0.0
+ typescript: 5.6.3
+ dev: false
+
+ /crc-32@1.2.2:
+ resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
+ engines: {node: '>=0.8'}
+ hasBin: true
+ dev: true
+
+ /crc32-stream@4.0.3:
+ resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==}
+ engines: {node: '>= 10'}
+ dependencies:
+ crc-32: 1.2.2
+ readable-stream: 3.6.2
+ dev: true
+
+ /create-ecdh@4.0.4:
+ resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==}
+ dependencies:
+ bn.js: 4.12.1
+ elliptic: 6.5.7
+ dev: false
+
+ /create-hash@1.2.0:
+ resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
+ dependencies:
+ cipher-base: 1.0.4
+ inherits: 2.0.4
+ md5.js: 1.3.5
+ ripemd160: 2.0.2
+ sha.js: 2.4.11
+ dev: false
+
+ /create-hmac@1.1.7:
+ resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==}
+ dependencies:
+ cipher-base: 1.0.4
+ create-hash: 1.2.0
+ inherits: 2.0.4
+ ripemd160: 2.0.2
+ safe-buffer: 5.2.1
+ sha.js: 2.4.11
+ dev: false
+
+ /cross-fetch@3.1.6:
+ resolution: {integrity: sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==}
+ dependencies:
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+ dev: true
+
+ /cross-fetch@4.0.0:
+ resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==}
+ dependencies:
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /cross-spawn@7.0.5:
+ resolution: {integrity: sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==}
+ engines: {node: '>= 8'}
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ /crypto-browserify@3.12.0:
+ resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==}
+ dependencies:
+ browserify-cipher: 1.0.1
+ browserify-sign: 4.2.3
+ create-ecdh: 4.0.4
+ create-hash: 1.2.0
+ create-hmac: 1.1.7
+ diffie-hellman: 5.0.3
+ inherits: 2.0.4
+ pbkdf2: 3.1.2
+ public-encrypt: 4.0.3
+ randombytes: 2.1.0
+ randomfill: 1.0.4
+ dev: false
+
+ /crypto-random-string@4.0.0:
+ resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==}
+ engines: {node: '>=12'}
+ dependencies:
+ type-fest: 1.4.0
+ dev: false
+
+ /css-color-keywords@1.0.0:
+ resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /css-color-names@0.0.4:
+ resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==}
+ dev: false
+
+ /css-declaration-sorter@7.2.0(postcss@8.4.31):
+ resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==}
+ engines: {node: ^14 || ^16 || >=18}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ dev: false
+
+ /css-loader@6.11.0(webpack@5.96.1):
+ resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==}
+ engines: {node: '>= 12.13.0'}
+ peerDependencies:
+ '@rspack/core': 0.x || 1.x
+ webpack: ^5.0.0
+ peerDependenciesMeta:
+ '@rspack/core':
+ optional: true
+ webpack:
+ optional: true
+ dependencies:
+ icss-utils: 5.1.0(postcss@8.4.31)
+ postcss: 8.4.31
+ postcss-modules-extract-imports: 3.1.0(postcss@8.4.31)
+ postcss-modules-local-by-default: 4.1.0(postcss@8.4.31)
+ postcss-modules-scope: 3.2.1(postcss@8.4.31)
+ postcss-modules-values: 4.0.0(postcss@8.4.31)
+ postcss-value-parser: 4.2.0
+ semver: 7.6.3
+ webpack: 5.96.1
+ dev: false
+
+ /css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.96.1):
+ resolution: {integrity: sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==}
+ engines: {node: '>= 14.15.0'}
+ peerDependencies:
+ '@parcel/css': '*'
+ '@swc/css': '*'
+ clean-css: '*'
+ csso: '*'
+ esbuild: '*'
+ lightningcss: '*'
+ webpack: ^5.0.0
+ peerDependenciesMeta:
+ '@parcel/css':
+ optional: true
+ '@swc/css':
+ optional: true
+ clean-css:
+ optional: true
+ csso:
+ optional: true
+ esbuild:
+ optional: true
+ lightningcss:
+ optional: true
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ clean-css: 5.3.3
+ cssnano: 6.1.2(postcss@8.4.31)
+ jest-worker: 29.7.0
+ postcss: 8.4.31
+ schema-utils: 4.2.0
+ serialize-javascript: 6.0.2
+ webpack: 5.96.1
+ dev: false
+
+ /css-select@4.3.0:
+ resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.1.0
+ domhandler: 4.3.1
+ domutils: 2.8.0
+ nth-check: 2.1.1
+ dev: false
+
+ /css-select@5.1.0:
+ resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 6.1.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ nth-check: 2.1.1
+ dev: false
+
+ /css-shorthand-properties@1.1.2:
+ resolution: {integrity: sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==}
+ dev: true
+
+ /css-to-react-native@3.2.0:
+ resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==}
+ dependencies:
+ camelize: 1.0.1
+ css-color-keywords: 1.0.0
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /css-tree@2.2.1:
+ resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+ dependencies:
+ mdn-data: 2.0.28
+ source-map-js: 1.2.1
+ dev: false
+
+ /css-tree@2.3.1:
+ resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+ dependencies:
+ mdn-data: 2.0.30
+ source-map-js: 1.2.1
+ dev: false
+
+ /css-unit-converter@1.1.2:
+ resolution: {integrity: sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==}
+ dev: false
+
+ /css-value@0.0.1:
+ resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==}
+ dev: true
+
+ /css-what@6.1.0:
+ resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+ engines: {node: '>= 6'}
+ dev: false
+
+ /cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: false
+
+ /cssnano-preset-advanced@6.1.2(postcss@8.4.31):
+ resolution: {integrity: sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ autoprefixer: 10.4.20(postcss@8.4.31)
+ browserslist: 4.24.2
+ cssnano-preset-default: 6.1.2(postcss@8.4.31)
+ postcss: 8.4.31
+ postcss-discard-unused: 6.0.5(postcss@8.4.31)
+ postcss-merge-idents: 6.0.3(postcss@8.4.31)
+ postcss-reduce-idents: 6.0.3(postcss@8.4.31)
+ postcss-zindex: 6.0.2(postcss@8.4.31)
+ dev: false
+
+ /cssnano-preset-default@6.1.2(postcss@8.4.31):
+ resolution: {integrity: sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ browserslist: 4.24.2
+ css-declaration-sorter: 7.2.0(postcss@8.4.31)
+ cssnano-utils: 4.0.2(postcss@8.4.31)
+ postcss: 8.4.31
+ postcss-calc: 9.0.1(postcss@8.4.31)
+ postcss-colormin: 6.1.0(postcss@8.4.31)
+ postcss-convert-values: 6.1.0(postcss@8.4.31)
+ postcss-discard-comments: 6.0.2(postcss@8.4.31)
+ postcss-discard-duplicates: 6.0.3(postcss@8.4.31)
+ postcss-discard-empty: 6.0.3(postcss@8.4.31)
+ postcss-discard-overridden: 6.0.2(postcss@8.4.31)
+ postcss-merge-longhand: 6.0.5(postcss@8.4.31)
+ postcss-merge-rules: 6.1.1(postcss@8.4.31)
+ postcss-minify-font-values: 6.1.0(postcss@8.4.31)
+ postcss-minify-gradients: 6.0.3(postcss@8.4.31)
+ postcss-minify-params: 6.1.0(postcss@8.4.31)
+ postcss-minify-selectors: 6.0.4(postcss@8.4.31)
+ postcss-normalize-charset: 6.0.2(postcss@8.4.31)
+ postcss-normalize-display-values: 6.0.2(postcss@8.4.31)
+ postcss-normalize-positions: 6.0.2(postcss@8.4.31)
+ postcss-normalize-repeat-style: 6.0.2(postcss@8.4.31)
+ postcss-normalize-string: 6.0.2(postcss@8.4.31)
+ postcss-normalize-timing-functions: 6.0.2(postcss@8.4.31)
+ postcss-normalize-unicode: 6.1.0(postcss@8.4.31)
+ postcss-normalize-url: 6.0.2(postcss@8.4.31)
+ postcss-normalize-whitespace: 6.0.2(postcss@8.4.31)
+ postcss-ordered-values: 6.0.2(postcss@8.4.31)
+ postcss-reduce-initial: 6.1.0(postcss@8.4.31)
+ postcss-reduce-transforms: 6.0.2(postcss@8.4.31)
+ postcss-svgo: 6.0.3(postcss@8.4.31)
+ postcss-unique-selectors: 6.0.4(postcss@8.4.31)
+ dev: false
+
+ /cssnano-utils@4.0.2(postcss@8.4.31):
+ resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ dev: false
+
+ /cssnano@6.1.2(postcss@8.4.31):
+ resolution: {integrity: sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ cssnano-preset-default: 6.1.2(postcss@8.4.31)
+ lilconfig: 3.1.2
+ postcss: 8.4.31
+ dev: false
+
+ /csso@5.0.5:
+ resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+ dependencies:
+ css-tree: 2.2.1
+ dev: false
+
+ /csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ /cytoscape-cose-bilkent@4.1.0(cytoscape@3.30.3):
+ resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==}
+ peerDependencies:
+ cytoscape: ^3.2.0
+ dependencies:
+ cose-base: 1.0.3
+ cytoscape: 3.30.3
+ dev: false
+
+ /cytoscape@3.30.3:
+ resolution: {integrity: sha512-HncJ9gGJbVtw7YXtIs3+6YAFSSiKsom0amWc33Z7QbylbY2JGMrA0yz4EwrdTScZxnwclXeEZHzO5pxoy0ZE4g==}
+ engines: {node: '>=0.10'}
+ dev: false
+
+ /d3-array@2.12.1:
+ resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==}
+ dependencies:
+ internmap: 1.0.1
+ dev: false
+
+ /d3-array@3.2.4:
+ resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==}
+ engines: {node: '>=12'}
+ dependencies:
+ internmap: 2.0.3
+ dev: false
+
+ /d3-axis@3.0.0:
+ resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-brush@3.0.0:
+ resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-transition: 3.0.1(d3-selection@3.0.0)
+ dev: false
+
+ /d3-chord@3.0.1:
+ resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-path: 3.1.0
+ dev: false
+
+ /d3-color@3.1.0:
+ resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-contour@4.0.2:
+ resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-array: 3.2.4
+ dev: false
+
+ /d3-delaunay@6.0.4:
+ resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==}
+ engines: {node: '>=12'}
+ dependencies:
+ delaunator: 5.0.1
+ dev: false
+
+ /d3-dispatch@3.0.1:
+ resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-drag@3.0.0:
+ resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-selection: 3.0.0
+ dev: false
+
+ /d3-dsv@3.0.1:
+ resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==}
+ engines: {node: '>=12'}
+ hasBin: true
+ dependencies:
+ commander: 7.2.0
+ iconv-lite: 0.6.3
+ rw: 1.3.3
+ dev: false
+
+ /d3-ease@3.0.1:
+ resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-fetch@3.0.1:
+ resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-dsv: 3.0.1
+ dev: false
+
+ /d3-force@3.0.0:
+ resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-quadtree: 3.0.1
+ d3-timer: 3.0.1
+ dev: false
+
+ /d3-format@3.1.0:
+ resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-geo@3.1.1:
+ resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-array: 3.2.4
+ dev: false
+
+ /d3-hierarchy@3.1.2:
+ resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-interpolate@3.0.1:
+ resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-color: 3.1.0
+ dev: false
+
+ /d3-path@1.0.9:
+ resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==}
+ dev: false
+
+ /d3-path@3.1.0:
+ resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-polygon@3.0.1:
+ resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-quadtree@3.0.1:
+ resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-random@3.0.1:
+ resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-sankey@0.12.3:
+ resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==}
+ dependencies:
+ d3-array: 2.12.1
+ d3-shape: 1.3.7
+ dev: false
+
+ /d3-scale-chromatic@3.1.0:
+ resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-color: 3.1.0
+ d3-interpolate: 3.0.1
+ dev: false
+
+ /d3-scale@4.0.2:
+ resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-array: 3.2.4
+ d3-format: 3.1.0
+ d3-interpolate: 3.0.1
+ d3-time: 3.1.0
+ d3-time-format: 4.1.0
+ dev: false
+
+ /d3-selection@3.0.0:
+ resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-shape@1.3.7:
+ resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==}
+ dependencies:
+ d3-path: 1.0.9
+ dev: false
+
+ /d3-shape@3.2.0:
+ resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-path: 3.1.0
+ dev: false
+
+ /d3-time-format@4.1.0:
+ resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-time: 3.1.0
+ dev: false
+
+ /d3-time@3.1.0:
+ resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-array: 3.2.4
+ dev: false
+
+ /d3-timer@3.0.1:
+ resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /d3-transition@3.0.1(d3-selection@3.0.0):
+ resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ d3-selection: 2 - 3
+ dependencies:
+ d3-color: 3.1.0
+ d3-dispatch: 3.0.1
+ d3-ease: 3.0.1
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-timer: 3.0.1
+ dev: false
+
+ /d3-zoom@3.0.0:
+ resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-interpolate: 3.0.1
+ d3-selection: 3.0.0
+ d3-transition: 3.0.1(d3-selection@3.0.0)
+ dev: false
+
+ /d3@7.9.0:
+ resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==}
+ engines: {node: '>=12'}
+ dependencies:
+ d3-array: 3.2.4
+ d3-axis: 3.0.0
+ d3-brush: 3.0.0
+ d3-chord: 3.0.1
+ d3-color: 3.1.0
+ d3-contour: 4.0.2
+ d3-delaunay: 6.0.4
+ d3-dispatch: 3.0.1
+ d3-drag: 3.0.0
+ d3-dsv: 3.0.1
+ d3-ease: 3.0.1
+ d3-fetch: 3.0.1
+ d3-force: 3.0.0
+ d3-format: 3.1.0
+ d3-geo: 3.1.1
+ d3-hierarchy: 3.1.2
+ d3-interpolate: 3.0.1
+ d3-path: 3.1.0
+ d3-polygon: 3.0.1
+ d3-quadtree: 3.0.1
+ d3-random: 3.0.1
+ d3-scale: 4.0.2
+ d3-scale-chromatic: 3.1.0
+ d3-selection: 3.0.0
+ d3-shape: 3.2.0
+ d3-time: 3.1.0
+ d3-time-format: 4.1.0
+ d3-timer: 3.0.1
+ d3-transition: 3.0.1(d3-selection@3.0.0)
+ d3-zoom: 3.0.0
+ dev: false
+
+ /dagre-d3-es@7.0.10:
+ resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==}
+ dependencies:
+ d3: 7.9.0
+ lodash-es: 4.17.21
+ dev: false
+
+ /data-uri-to-buffer@4.0.1:
+ resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
+ engines: {node: '>= 12'}
+ dev: false
+
+ /data-view-buffer@1.0.1:
+ resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+ dev: false
+
+ /data-view-byte-length@1.0.1:
+ resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+ dev: false
+
+ /data-view-byte-offset@1.0.0:
+ resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+ dev: false
+
+ /dayjs@1.11.13:
+ resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+ dev: false
+
+ /debounce@1.2.1:
+ resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
+ dev: false
+
+ /debug@2.6.9:
+ resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.0.0
+
+ /debug@4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+
+ /debug@4.3.7:
+ resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.3
+
+ /decamelize@1.2.0:
+ resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /decamelize@6.0.0:
+ resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /decko@1.2.0:
+ resolution: {integrity: sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ==}
+ dev: false
+
+ /decode-named-character-reference@1.0.2:
+ resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
+ dependencies:
+ character-entities: 2.0.2
+
+ /decode-uri-component@0.4.1:
+ resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==}
+ engines: {node: '>=14.16'}
+ dev: false
+
+ /decompress-response@6.0.0:
+ resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ mimic-response: 3.1.0
+
+ /deep-eql@4.1.4:
+ resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==}
+ engines: {node: '>=6'}
+ dependencies:
+ type-detect: 4.1.0
+ dev: true
+
+ /deep-extend@0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+ dev: false
+
+ /deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ dev: false
+
+ /deepmerge-ts@5.1.0:
+ resolution: {integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==}
+ engines: {node: '>=16.0.0'}
+ dev: true
+
+ /deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /default-gateway@6.0.3:
+ resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==}
+ engines: {node: '>= 10'}
+ dependencies:
+ execa: 5.1.1
+ dev: false
+
+ /defaults@1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+ dependencies:
+ clone: 1.0.4
+ dev: false
+
+ /defer-to-connect@2.0.1:
+ resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
+ engines: {node: '>=10'}
+
+ /define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ gopd: 1.0.1
+ dev: false
+
+ /define-lazy-prop@2.0.0:
+ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
+ dev: false
+
+ /defined@1.0.1:
+ resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==}
+ dev: false
+
+ /del@6.1.1:
+ resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==}
+ engines: {node: '>=10'}
+ dependencies:
+ globby: 11.1.0
+ graceful-fs: 4.2.11
+ is-glob: 4.0.3
+ is-path-cwd: 2.2.0
+ is-path-inside: 3.0.3
+ p-map: 4.0.0
+ rimraf: 3.0.2
+ slash: 3.0.0
+ dev: false
+
+ /delaunator@5.0.1:
+ resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==}
+ dependencies:
+ robust-predicates: 3.0.2
+ dev: false
+
+ /delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ /depd@1.1.2:
+ resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /depd@2.0.0:
+ resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ /des.js@1.1.0:
+ resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==}
+ dependencies:
+ inherits: 2.0.4
+ minimalistic-assert: 1.0.1
+ dev: false
+
+ /destroy@1.2.0:
+ resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+ engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+ dev: false
+
+ /detect-node@2.1.0:
+ resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
+ dev: false
+
+ /detect-port-alt@1.1.6:
+ resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==}
+ engines: {node: '>= 4.2.1'}
+ hasBin: true
+ dependencies:
+ address: 1.2.2
+ debug: 2.6.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /detect-port@1.6.1:
+ resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==}
+ engines: {node: '>= 4.0.0'}
+ hasBin: true
+ dependencies:
+ address: 1.2.2
+ debug: 4.3.7
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /detective@5.2.1:
+ resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==}
+ engines: {node: '>=0.8.0'}
+ hasBin: true
+ dependencies:
+ acorn-node: 1.8.2
+ defined: 1.0.1
+ minimist: 1.2.8
+ dev: false
+
+ /devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+ dependencies:
+ dequal: 2.0.3
+
+ /devtools-protocol@0.0.1120988:
+ resolution: {integrity: sha512-39fCpE3Z78IaIPChJsP6Lhmkbf4dWXOmzLk/KFTdRkNk/0JymRIfUynDVRndV9HoDz8PyalK1UH21ST/ivwW5Q==}
+ dev: true
+
+ /devtools-protocol@0.0.1170846:
+ resolution: {integrity: sha512-GFZiHgvL4JW7+8hIMQgwYNUaIRRCsqfXd11ZbOTdu2VzDeu0Le4l1c3u4FFRWCSvMg82OFip9k/sYyz4M/PJIA==}
+ dev: true
+
+ /devtools@8.13.13(typescript@5.6.3):
+ resolution: {integrity: sha512-PpxaBAzocgc1lcW3aWnqjapEaDaTFqroyD5ux2SatiIps+UHGzxbY4upSeD0rHEiP8MfR6uBo+3Rc4gqo0zi5A==}
+ engines: {node: ^16.13 || >=18}
+ dependencies:
+ '@types/node': 20.17.6
+ '@wdio/config': 8.13.13
+ '@wdio/logger': 8.11.0
+ '@wdio/protocols': 8.11.0
+ '@wdio/types': 8.10.4
+ '@wdio/utils': 8.13.13
+ chrome-launcher: 0.15.2
+ edge-paths: 3.0.5
+ import-meta-resolve: 3.1.1
+ puppeteer-core: 20.3.0(typescript@5.6.3)
+ query-selector-shadow-dom: 1.0.1
+ ua-parser-js: 1.0.39
+ uuid: 9.0.1
+ which: 3.0.1
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - supports-color
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /didyoumean@1.2.2:
+ resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+ dev: false
+
+ /diff-sequences@29.6.3:
+ resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dev: true
+
+ /diff@5.2.0:
+ resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
+ engines: {node: '>=0.3.1'}
+ dev: false
+
+ /diffie-hellman@5.0.3:
+ resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==}
+ dependencies:
+ bn.js: 4.12.1
+ miller-rabin: 4.0.1
+ randombytes: 2.1.0
+ dev: false
+
+ /dijkstrajs@1.0.3:
+ resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==}
+ dev: false
+
+ /dir-glob@3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-type: 4.0.0
+ dev: false
+
+ /discontinuous-range@1.0.0:
+ resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==}
+ dev: false
+
+ /dlv@1.1.3:
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+ dev: false
+
+ /dns-packet@5.6.1:
+ resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==}
+ engines: {node: '>=6'}
+ dependencies:
+ '@leichtgewicht/ip-codec': 2.0.5
+ dev: false
+
+ /docusaurus-plugin-redoc@2.1.1(@docusaurus/utils@3.5.2)(core-js@3.39.0)(enzyme@3.11.0)(mobx@6.13.5)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.13):
+ resolution: {integrity: sha512-gf9HbFAKPZu17rbx+3C6vIpfMMTuvUFG8rRKeuHro1B5wUutBSjE5/VjB1owVGjIJQ74OgVKJvgczqUjhcQcjQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@docusaurus/utils': ^3.0.0
+ dependencies:
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ '@redocly/openapi-core': 1.16.0
+ redoc: 2.1.5(core-js@3.39.0)(enzyme@3.11.0)(mobx@6.13.5)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.13)
+ transitivePeerDependencies:
+ - core-js
+ - encoding
+ - enzyme
+ - mobx
+ - react
+ - react-dom
+ - react-native
+ - styled-components
+ - supports-color
+ dev: false
+
+ /docusaurus-plugin-remote-content@4.0.0(@docusaurus/core@3.5.2):
+ resolution: {integrity: sha512-e+gBmNdgOwA+7u6O2kk/u1w4ET23j8OIF6OiOWV6EoKHJJ/w/8U5smkHNlrQC3hQOltxE2NRC1jbsG7wfS+d3w==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@docusaurus/core': 2.x || 3.x
+ dependencies:
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ axios: 1.7.4(debug@4.3.4)
+ picocolors: 1.1.1
+ pretty-ms: 7.0.1
+ rimraf: 5.0.5
+ transitivePeerDependencies:
+ - debug
+ dev: false
+
+ /docusaurus-tailwindcss@0.1.0(@docusaurus/core@3.5.2):
+ resolution: {integrity: sha512-Vz2bDMhRUwp4+iro+JlRM9kaOJ2Wjk3ZZYl1C9yydSx1iuTSgXS0beA1v/7cXyBV5VrIN5ZGwvRXev9IheWU7A==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@docusaurus/core': ^2.0.0-alpha.0
+ dependencies:
+ '@docusaurus/core': 3.5.2(@docusaurus/types@3.5.2)(@mdx-js/react@3.0.1)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ autoprefixer: 10.3.4(postcss@8.4.31)
+ postcss: 8.4.31
+ tailwindcss: 2.2.15(autoprefixer@10.3.4)(postcss@8.4.31)
+ transitivePeerDependencies:
+ - ts-node
+ dev: false
+
+ /docusaurus-theme-redoc@2.1.1(@docusaurus/theme-common@3.5.2)(core-js@3.39.0)(enzyme@3.11.0)(react-dom@18.2.0)(react@18.2.0)(webpack@5.96.1):
+ resolution: {integrity: sha512-a9yuYyGVhj7NgBYiqJyjLEkJg/yTdsqg9Rn/cG8YXMIFwxIpn4tanIplUqwisK2PS81ZxOv7SfSgvGm/FSi/wA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@docusaurus/theme-common': ^3.0.0
+ webpack: ^5.0.0
+ dependencies:
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.6.1)(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@redocly/openapi-core': 1.16.0
+ clsx: 1.2.1
+ lodash: 4.17.21
+ mobx: 6.13.5
+ redoc: 2.1.5(core-js@3.39.0)(enzyme@3.11.0)(mobx@6.13.5)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.13)
+ styled-components: 6.1.13(react-dom@18.2.0)(react@18.2.0)
+ webpack: 5.96.1
+ transitivePeerDependencies:
+ - core-js
+ - encoding
+ - enzyme
+ - react
+ - react-dom
+ - react-native
+ - supports-color
+ dev: false
+
+ /dom-converter@0.2.0:
+ resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==}
+ dependencies:
+ utila: 0.4.0
+ dev: false
+
+ /dom-serializer@1.4.1:
+ resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+ entities: 2.2.0
+ dev: false
+
+ /dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+ dev: false
+
+ /domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+ dev: false
+
+ /domexception@1.0.1:
+ resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==}
+ deprecated: Use your platform's native DOMException instead
+ dependencies:
+ webidl-conversions: 4.0.2
+ dev: true
+
+ /domhandler@4.3.1:
+ resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
+ engines: {node: '>= 4'}
+ dependencies:
+ domelementtype: 2.3.0
+ dev: false
+
+ /domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+ dependencies:
+ domelementtype: 2.3.0
+ dev: false
+
+ /dompurify@3.1.6:
+ resolution: {integrity: sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==}
+ dev: false
+
+ /dompurify@3.2.0:
+ resolution: {integrity: sha512-AMdOzK44oFWqHEi0wpOqix/fUNY707OmoeFDnbi3Q5I8uOpy21ufUA5cDJPr0bosxrflOVD/H2DMSvuGKJGfmQ==}
+ dev: false
+
+ /domutils@2.8.0:
+ resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
+ dependencies:
+ dom-serializer: 1.4.1
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+ dev: false
+
+ /domutils@3.1.0:
+ resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==}
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ dev: false
+
+ /dot-case@3.0.4:
+ resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+ dev: false
+
+ /dot-prop@6.0.1:
+ resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==}
+ engines: {node: '>=10'}
+ dependencies:
+ is-obj: 2.0.0
+ dev: false
+
+ /dotenv@16.3.1:
+ resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /duplexer@0.1.2:
+ resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
+
+ /eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+ /ecdsa-sig-formatter@1.0.11:
+ resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: false
+
+ /eciesjs@0.4.5:
+ resolution: {integrity: sha512-2zSRIygO48LpdS95Rwt9ryIkJNO37IdbkjRsnYyAn7gx7e4WPBNimnk6jGNdx2QQYr/VJRPnSVdwQpO5bycYZw==}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ '@noble/ciphers': 0.3.0
+ '@noble/curves': 1.4.2
+ '@noble/hashes': 1.5.0
+ dev: false
+
+ /ed25519-keygen@0.4.11:
+ resolution: {integrity: sha512-UKxebk/eoW/0yy6BcyCkgAvN2/VzwVXiMVHgKNYBMX6T0fJRAE3WWvH2inyuBvMIJaOqlkc3utylUvL8yW6SOg==}
+ deprecated: 'Switch to micro-key-producer: the package has been merged into it'
+ dependencies:
+ '@noble/curves': 1.3.0
+ '@noble/hashes': 1.3.3
+ '@scure/base': 1.1.9
+ micro-packed: 0.5.3
+ dev: false
+
+ /edge-paths@3.0.5:
+ resolution: {integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ '@types/which': 2.0.2
+ which: 2.0.2
+ dev: true
+
+ /ee-first@1.1.1:
+ resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+ dev: false
+
+ /electron-to-chromium@1.5.58:
+ resolution: {integrity: sha512-al2l4r+24ZFL7WzyPTlyD0fC33LLzvxqLCwurtBibVPghRGO9hSTl+tis8t1kD7biPiH/en4U0I7o/nQbYeoVA==}
+
+ /elkjs@0.9.3:
+ resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==}
+ dev: false
+
+ /elliptic@6.5.7:
+ resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==}
+ dependencies:
+ bn.js: 4.12.1
+ brorand: 1.1.0
+ hash.js: 1.1.7
+ hmac-drbg: 1.0.1
+ inherits: 2.0.4
+ minimalistic-assert: 1.0.1
+ minimalistic-crypto-utils: 1.0.1
+ dev: false
+
+ /emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ /emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ /emojilib@2.4.0:
+ resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==}
+ dev: false
+
+ /emojis-list@3.0.0:
+ resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
+ engines: {node: '>= 4'}
+ dev: false
+
+ /emoticon@4.1.0:
+ resolution: {integrity: sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==}
+ dev: false
+
+ /encodeurl@1.0.2:
+ resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /encoding-sniffer@0.2.0:
+ resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==}
+ dependencies:
+ iconv-lite: 0.6.3
+ whatwg-encoding: 3.1.1
+ dev: false
+
+ /end-of-stream@1.4.4:
+ resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+ dependencies:
+ once: 1.4.0
+ dev: true
+
+ /enhanced-resolve@5.17.1:
+ resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.2.1
+
+ /enquire.js@2.1.6:
+ resolution: {integrity: sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==}
+ dev: false
+
+ /entities@2.2.0:
+ resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
+ dev: false
+
+ /entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+ dev: false
+
+ /enzyme-shallow-equal@1.0.7:
+ resolution: {integrity: sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg==}
+ dependencies:
+ hasown: 2.0.2
+ object-is: 1.1.6
+ dev: false
+
+ /enzyme@3.11.0:
+ resolution: {integrity: sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==}
+ dependencies:
+ array.prototype.flat: 1.3.2
+ cheerio: 1.0.0
+ enzyme-shallow-equal: 1.0.7
+ function.prototype.name: 1.1.6
+ has: 1.0.4
+ html-element-map: 1.3.1
+ is-boolean-object: 1.1.2
+ is-callable: 1.2.7
+ is-number-object: 1.0.7
+ is-regex: 1.1.4
+ is-string: 1.0.7
+ is-subset: 0.1.1
+ lodash.escape: 4.0.1
+ lodash.isequal: 4.5.0
+ object-inspect: 1.13.3
+ object-is: 1.1.6
+ object.assign: 4.1.5
+ object.entries: 1.1.8
+ object.values: 1.2.0
+ raf: 3.4.1
+ rst-selector-parser: 2.2.3
+ string.prototype.trim: 1.2.9
+ dev: false
+
+ /err-code@3.0.1:
+ resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==}
+ dev: false
+
+ /error-ex@1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+ dependencies:
+ is-arrayish: 0.2.1
+
+ /es-abstract@1.23.4:
+ resolution: {integrity: sha512-HR1gxH5OaiN7XH7uiWH0RLw0RcFySiSoW1ctxmD1ahTw3uGBtkmm/ng0tDU1OtYx5OK6EOL5Y6O21cDflG3Jcg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ array-buffer-byte-length: 1.0.1
+ arraybuffer.prototype.slice: 1.0.3
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
+ data-view-buffer: 1.0.1
+ data-view-byte-length: 1.0.1
+ data-view-byte-offset: 1.0.0
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ es-set-tostringtag: 2.0.3
+ es-to-primitive: 1.2.1
+ function.prototype.name: 1.1.6
+ get-intrinsic: 1.2.4
+ get-symbol-description: 1.0.2
+ globalthis: 1.0.4
+ gopd: 1.0.1
+ has-property-descriptors: 1.0.2
+ has-proto: 1.0.3
+ has-symbols: 1.0.3
+ hasown: 2.0.2
+ internal-slot: 1.0.7
+ is-array-buffer: 3.0.4
+ is-callable: 1.2.7
+ is-data-view: 1.0.1
+ is-negative-zero: 2.0.3
+ is-regex: 1.1.4
+ is-shared-array-buffer: 1.0.3
+ is-string: 1.0.7
+ is-typed-array: 1.1.13
+ is-weakref: 1.0.2
+ object-inspect: 1.13.3
+ object-keys: 1.1.1
+ object.assign: 4.1.5
+ regexp.prototype.flags: 1.5.3
+ safe-array-concat: 1.1.2
+ safe-regex-test: 1.0.3
+ string.prototype.trim: 1.2.9
+ string.prototype.trimend: 1.0.8
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.2
+ typed-array-byte-length: 1.0.1
+ typed-array-byte-offset: 1.0.2
+ typed-array-length: 1.0.6
+ unbox-primitive: 1.0.2
+ which-typed-array: 1.1.15
+ dev: false
+
+ /es-array-method-boxes-properly@1.0.0:
+ resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==}
+ dev: false
+
+ /es-define-property@1.0.0:
+ resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.2.4
+ dev: false
+
+ /es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+ dev: false
+
+ /es-module-lexer@1.5.4:
+ resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
+
+ /es-object-atoms@1.0.0:
+ resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ dev: false
+
+ /es-set-tostringtag@2.0.3:
+ resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.2.4
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+ dev: false
+
+ /es-shim-unscopables@1.0.2:
+ resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
+ dependencies:
+ hasown: 2.0.2
+ dev: false
+
+ /es-to-primitive@1.2.1:
+ resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.0.5
+ is-symbol: 1.0.4
+ dev: false
+
+ /es6-promise@3.3.1:
+ resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
+ dev: false
+
+ /esast-util-from-estree@2.0.0:
+ resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ devlop: 1.1.0
+ estree-util-visit: 2.0.0
+ unist-util-position-from-estree: 2.0.0
+
+ /esast-util-from-js@2.0.1:
+ resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ acorn: 8.14.0
+ esast-util-from-estree: 2.0.0
+ vfile-message: 4.0.2
+
+ /esbuild-android-64@0.14.54:
+ resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-android-arm64@0.14.54:
+ resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-darwin-64@0.14.54:
+ resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-darwin-arm64@0.14.54:
+ resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-freebsd-64@0.14.54:
+ resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-freebsd-arm64@0.14.54:
+ resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-32@0.14.54:
+ resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-64@0.14.54:
+ resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-arm64@0.14.54:
+ resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-arm@0.14.54:
+ resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-mips64le@0.14.54:
+ resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-ppc64le@0.14.54:
+ resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-riscv64@0.14.54:
+ resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-s390x@0.14.54:
+ resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-netbsd-64@0.14.54:
+ resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-openbsd-64@0.14.54:
+ resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-sunos-64@0.14.54:
+ resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-windows-32@0.14.54:
+ resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-windows-64@0.14.54:
+ resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-windows-arm64@0.14.54:
+ resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild@0.14.54:
+ resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/linux-loong64': 0.14.54
+ esbuild-android-64: 0.14.54
+ esbuild-android-arm64: 0.14.54
+ esbuild-darwin-64: 0.14.54
+ esbuild-darwin-arm64: 0.14.54
+ esbuild-freebsd-64: 0.14.54
+ esbuild-freebsd-arm64: 0.14.54
+ esbuild-linux-32: 0.14.54
+ esbuild-linux-64: 0.14.54
+ esbuild-linux-arm: 0.14.54
+ esbuild-linux-arm64: 0.14.54
+ esbuild-linux-mips64le: 0.14.54
+ esbuild-linux-ppc64le: 0.14.54
+ esbuild-linux-riscv64: 0.14.54
+ esbuild-linux-s390x: 0.14.54
+ esbuild-netbsd-64: 0.14.54
+ esbuild-openbsd-64: 0.14.54
+ esbuild-sunos-64: 0.14.54
+ esbuild-windows-32: 0.14.54
+ esbuild-windows-64: 0.14.54
+ esbuild-windows-arm64: 0.14.54
+ dev: true
+
+ /esbuild@0.19.12:
+ resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.19.12
+ '@esbuild/android-arm': 0.19.12
+ '@esbuild/android-arm64': 0.19.12
+ '@esbuild/android-x64': 0.19.12
+ '@esbuild/darwin-arm64': 0.19.12
+ '@esbuild/darwin-x64': 0.19.12
+ '@esbuild/freebsd-arm64': 0.19.12
+ '@esbuild/freebsd-x64': 0.19.12
+ '@esbuild/linux-arm': 0.19.12
+ '@esbuild/linux-arm64': 0.19.12
+ '@esbuild/linux-ia32': 0.19.12
+ '@esbuild/linux-loong64': 0.19.12
+ '@esbuild/linux-mips64el': 0.19.12
+ '@esbuild/linux-ppc64': 0.19.12
+ '@esbuild/linux-riscv64': 0.19.12
+ '@esbuild/linux-s390x': 0.19.12
+ '@esbuild/linux-x64': 0.19.12
+ '@esbuild/netbsd-x64': 0.19.12
+ '@esbuild/openbsd-x64': 0.19.12
+ '@esbuild/sunos-x64': 0.19.12
+ '@esbuild/win32-arm64': 0.19.12
+ '@esbuild/win32-ia32': 0.19.12
+ '@esbuild/win32-x64': 0.19.12
+ dev: true
+
+ /escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ /escape-goat@4.0.0:
+ resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /escape-html@1.0.3:
+ resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+ dev: false
+
+ /escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+ dev: false
+
+ /escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ /escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /escodegen@1.14.3:
+ resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==}
+ engines: {node: '>=4.0'}
+ hasBin: true
+ dependencies:
+ esprima: 4.0.1
+ estraverse: 4.3.0
+ esutils: 2.0.3
+ optionator: 0.8.3
+ optionalDependencies:
+ source-map: 0.6.1
+ dev: false
+
+ /eslint-scope@5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+
+ /esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: false
+
+ /esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+ dependencies:
+ estraverse: 5.3.0
+
+ /estraverse@4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+
+ /estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ /estree-util-attach-comments@3.0.0:
+ resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==}
+ dependencies:
+ '@types/estree': 1.0.6
+
+ /estree-util-build-jsx@3.0.1:
+ resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-walker: 3.0.3
+
+ /estree-util-is-identifier-name@3.0.0:
+ resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
+
+ /estree-util-scope@1.0.0:
+ resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==}
+ dependencies:
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+
+ /estree-util-to-js@2.0.0:
+ resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ astring: 1.9.0
+ source-map: 0.7.4
+
+ /estree-util-value-to-estree@3.2.1:
+ resolution: {integrity: sha512-Vt2UOjyPbNQQgT5eJh+K5aATti0OjCIAGc9SgMdOFYbohuifsWclR74l0iZTJwePMgWYdX1hlVS+dedH9XV8kw==}
+ dependencies:
+ '@types/estree': 1.0.6
+ dev: false
+
+ /estree-util-visit@2.0.0:
+ resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/unist': 3.0.3
+
+ /estree-walker@1.0.1:
+ resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==}
+ dev: true
+
+ /estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+ dependencies:
+ '@types/estree': 1.0.6
+
+ /esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /eta@2.2.0:
+ resolution: {integrity: sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==}
+ engines: {node: '>=6.0.0'}
+ dev: false
+
+ /etag@1.8.1:
+ resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /eval@0.1.8:
+ resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ '@types/node': 22.9.0
+ require-like: 0.1.2
+ dev: false
+
+ /event-stream@3.3.4:
+ resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==}
+ dependencies:
+ duplexer: 0.1.2
+ from: 0.1.7
+ map-stream: 0.1.0
+ pause-stream: 0.0.11
+ split: 0.3.3
+ stream-combiner: 0.0.4
+ through: 2.3.8
+ dev: true
+
+ /event-target-shim@5.0.1:
+ resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /eventemitter3@4.0.7:
+ resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+ dev: false
+
+ /eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+ dev: false
+
+ /events@3.3.0:
+ resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+ engines: {node: '>=0.8.x'}
+
+ /evp_bytestokey@1.0.3:
+ resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
+ dependencies:
+ md5.js: 1.3.5
+ safe-buffer: 5.2.1
+ dev: false
+
+ /execa@5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+ dependencies:
+ cross-spawn: 7.0.5
+ get-stream: 6.0.1
+ human-signals: 2.1.0
+ is-stream: 2.0.1
+ merge-stream: 2.0.0
+ npm-run-path: 4.0.1
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ strip-final-newline: 2.0.0
+
+ /exenv@1.2.2:
+ resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==}
+ dev: false
+
+ /express@4.18.2:
+ resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==}
+ engines: {node: '>= 0.10.0'}
+ dependencies:
+ accepts: 1.3.8
+ array-flatten: 1.1.1
+ body-parser: 1.20.1
+ content-disposition: 0.5.4
+ content-type: 1.0.5
+ cookie: 0.5.0
+ cookie-signature: 1.0.6
+ debug: 2.6.9
+ depd: 2.0.0
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 1.2.0
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ merge-descriptors: 1.0.1
+ methods: 1.1.2
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ path-to-regexp: 0.1.7
+ proxy-addr: 2.0.7
+ qs: 6.11.0
+ range-parser: 1.2.1
+ safe-buffer: 5.2.1
+ send: 0.18.0
+ serve-static: 1.15.0
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ type-is: 1.6.18
+ utils-merge: 1.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /express@4.19.2:
+ resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==}
+ engines: {node: '>= 0.10.0'}
+ dependencies:
+ accepts: 1.3.8
+ array-flatten: 1.1.1
+ body-parser: 1.20.2
+ content-disposition: 0.5.4
+ content-type: 1.0.5
+ cookie: 0.6.0
+ cookie-signature: 1.0.6
+ debug: 2.6.9
+ depd: 2.0.0
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 1.2.0
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ merge-descriptors: 1.0.1
+ methods: 1.1.2
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ path-to-regexp: 0.1.7
+ proxy-addr: 2.0.7
+ qs: 6.11.0
+ range-parser: 1.2.1
+ safe-buffer: 5.2.1
+ send: 0.18.0
+ serve-static: 1.15.0
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ type-is: 1.6.18
+ utils-merge: 1.0.1
+ vary: 1.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /extend-shallow@2.0.1:
+ resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extendable: 0.1.1
+ dev: false
+
+ /extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+ /external-editor@3.1.0:
+ resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+ engines: {node: '>=4'}
+ dependencies:
+ chardet: 0.7.0
+ iconv-lite: 0.4.24
+ tmp: 0.0.33
+ dev: false
+
+ /extract-zip@2.0.1:
+ resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
+ engines: {node: '>= 10.17.0'}
+ hasBin: true
+ dependencies:
+ debug: 4.3.4
+ get-stream: 5.2.0
+ yauzl: 2.10.0
+ optionalDependencies:
+ '@types/yauzl': 2.10.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /fake-indexeddb@4.0.2:
+ resolution: {integrity: sha512-SdTwEhnakbgazc7W3WUXOJfGmhH0YfG4d+dRPOFoYDRTL6U5t8tvrmkf2W/C3W1jk2ylV7Wrnj44RASqpX/lEw==}
+ dependencies:
+ realistic-structured-clone: 3.0.0
+ dev: true
+
+ /fast-deep-equal@2.0.1:
+ resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==}
+ dev: true
+
+ /fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ /fast-glob@3.3.2:
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+ dev: false
+
+ /fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ /fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ dev: false
+
+ /fast-safe-stringify@2.1.1:
+ resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
+ dev: false
+
+ /fast-uri@3.0.3:
+ resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==}
+ dev: false
+
+ /fast-xml-parser@4.2.5:
+ resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==}
+ hasBin: true
+ dependencies:
+ strnum: 1.0.5
+ dev: false
+
+ /fastq@1.17.1:
+ resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+ dependencies:
+ reusify: 1.0.4
+ dev: false
+
+ /fault@2.0.1:
+ resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==}
+ dependencies:
+ format: 0.2.2
+ dev: false
+
+ /faye-websocket@0.11.4:
+ resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==}
+ engines: {node: '>=0.8.0'}
+ dependencies:
+ websocket-driver: 0.7.4
+ dev: false
+
+ /fd-slicer@1.1.0:
+ resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
+ dependencies:
+ pend: 1.2.0
+ dev: true
+
+ /feed@4.2.2:
+ resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==}
+ engines: {node: '>=0.4.0'}
+ dependencies:
+ xml-js: 1.6.11
+ dev: false
+
+ /fetch-blob@3.2.0:
+ resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
+ engines: {node: ^12.20 || >= 14.13}
+ dependencies:
+ node-domexception: 1.0.0
+ web-streams-polyfill: 3.3.3
+ dev: false
+
+ /figures@3.2.0:
+ resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
+ engines: {node: '>=8'}
+ dependencies:
+ escape-string-regexp: 1.0.5
+ dev: false
+
+ /file-loader@6.2.0(webpack@5.96.1):
+ resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==}
+ engines: {node: '>= 10.13.0'}
+ peerDependencies:
+ webpack: ^4.0.0 || ^5.0.0
+ dependencies:
+ loader-utils: 2.0.4
+ schema-utils: 3.3.0
+ webpack: 5.96.1
+ dev: false
+
+ /filesize@8.0.7:
+ resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==}
+ engines: {node: '>= 0.4.0'}
+ dev: false
+
+ /fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+ dev: false
+
+ /filter-obj@5.1.0:
+ resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==}
+ engines: {node: '>=14.16'}
+ dev: false
+
+ /finalhandler@1.2.0:
+ resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ on-finished: 2.4.1
+ parseurl: 1.3.3
+ statuses: 2.0.1
+ unpipe: 1.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /find-cache-dir@4.0.0:
+ resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ common-path-prefix: 3.0.0
+ pkg-dir: 7.0.0
+ dev: false
+
+ /find-up@3.0.0:
+ resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==}
+ engines: {node: '>=6'}
+ dependencies:
+ locate-path: 3.0.0
+ dev: false
+
+ /find-up@4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+ dev: false
+
+ /find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+ dev: false
+
+ /find-up@6.3.0:
+ resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ locate-path: 7.2.0
+ path-exists: 5.0.0
+
+ /flat@5.0.2:
+ resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
+ hasBin: true
+
+ /follow-redirects@1.15.9(debug@4.3.4):
+ resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+ dependencies:
+ debug: 4.3.4
+
+ /font-awesome@4.7.0:
+ resolution: {integrity: sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg==}
+ engines: {node: '>=0.10.3'}
+ dev: false
+
+ /for-each@0.3.3:
+ resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+ dependencies:
+ is-callable: 1.2.7
+ dev: false
+
+ /foreach@2.0.6:
+ resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==}
+ dev: false
+
+ /foreground-child@3.3.0:
+ resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
+ engines: {node: '>=14'}
+ dependencies:
+ cross-spawn: 7.0.5
+ signal-exit: 4.1.0
+
+ /fork-ts-checker-webpack-plugin@6.5.3(typescript@5.6.3)(webpack@5.96.1):
+ resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==}
+ engines: {node: '>=10', yarn: '>=1.0.0'}
+ peerDependencies:
+ eslint: '>= 6'
+ typescript: '>= 2.7'
+ vue-template-compiler: '*'
+ webpack: '>= 4'
+ peerDependenciesMeta:
+ eslint:
+ optional: true
+ vue-template-compiler:
+ optional: true
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@types/json-schema': 7.0.15
+ chalk: 4.1.2
+ chokidar: 3.6.0
+ cosmiconfig: 6.0.0
+ deepmerge: 4.3.1
+ fs-extra: 9.1.0
+ glob: 7.2.3
+ memfs: 3.5.3
+ minimatch: 3.1.2
+ schema-utils: 2.7.0
+ semver: 7.6.3
+ tapable: 1.1.3
+ typescript: 5.6.3
+ webpack: 5.96.1
+ dev: false
+
+ /form-data-encoder@2.1.4:
+ resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==}
+ engines: {node: '>= 14.17'}
+
+ /form-data@4.0.1:
+ resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
+ engines: {node: '>= 6'}
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+
+ /format@0.2.2:
+ resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==}
+ engines: {node: '>=0.4.x'}
+ dev: false
+
+ /formdata-polyfill@4.0.10:
+ resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
+ engines: {node: '>=12.20.0'}
+ dependencies:
+ fetch-blob: 3.2.0
+ dev: false
+
+ /forwarded@0.2.0:
+ resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /fraction.js@4.3.7:
+ resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+ dev: false
+
+ /fresh@0.5.2:
+ resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /from@0.1.7:
+ resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==}
+ dev: true
+
+ /fs-constants@1.0.0:
+ resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
+ dev: true
+
+ /fs-extra@10.1.0:
+ resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+ dev: false
+
+ /fs-extra@11.2.0:
+ resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
+ engines: {node: '>=14.14'}
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+ dev: false
+
+ /fs-extra@9.1.0:
+ resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ at-least-node: 1.0.0
+ graceful-fs: 4.2.11
+ jsonfile: 6.1.0
+ universalify: 2.0.1
+ dev: false
+
+ /fs-monkey@1.0.6:
+ resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==}
+ dev: false
+
+ /fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ /fsevents@2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ optional: true
+
+ /function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ /function.prototype.name@1.1.6:
+ resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.4
+ functions-have-names: 1.2.3
+ dev: false
+
+ /functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+ dev: false
+
+ /gaxios@6.7.1:
+ resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==}
+ engines: {node: '>=14'}
+ dependencies:
+ extend: 3.0.2
+ https-proxy-agent: 7.0.5
+ is-stream: 2.0.1
+ node-fetch: 2.7.0
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
+ /gcp-metadata@6.1.0:
+ resolution: {integrity: sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==}
+ engines: {node: '>=14'}
+ dependencies:
+ gaxios: 6.7.1
+ json-bigint: 1.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
+ /gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ /get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ /get-func-name@2.0.2:
+ resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
+ dev: true
+
+ /get-intrinsic@1.2.4:
+ resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ has-proto: 1.0.3
+ has-symbols: 1.0.3
+ hasown: 2.0.2
+ dev: false
+
+ /get-own-enumerable-property-symbols@3.0.2:
+ resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==}
+ dev: false
+
+ /get-stream@5.2.0:
+ resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
+ engines: {node: '>=8'}
+ dependencies:
+ pump: 3.0.2
+ dev: true
+
+ /get-stream@6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+
+ /get-symbol-description@1.0.2:
+ resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ dev: false
+
+ /github-slugger@1.5.0:
+ resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==}
+ dev: false
+
+ /glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: false
+
+ /glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: false
+
+ /glob-to-regexp@0.4.1:
+ resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+
+ /glob@10.3.10:
+ resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+ dependencies:
+ foreground-child: 3.3.0
+ jackspeak: 2.3.6
+ minimatch: 9.0.5
+ minipass: 7.1.2
+ path-scurry: 1.11.1
+
+ /glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ /global-dirs@3.0.1:
+ resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ini: 2.0.0
+ dev: false
+
+ /global-modules@2.0.0:
+ resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==}
+ engines: {node: '>=6'}
+ dependencies:
+ global-prefix: 3.0.0
+ dev: false
+
+ /global-prefix@3.0.0:
+ resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==}
+ engines: {node: '>=6'}
+ dependencies:
+ ini: 1.3.8
+ kind-of: 6.0.3
+ which: 1.3.1
+ dev: false
+
+ /globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
+ /globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-properties: 1.2.1
+ gopd: 1.0.1
+ dev: false
+
+ /globby@11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+ dependencies:
+ array-union: 2.1.0
+ dir-glob: 3.0.1
+ fast-glob: 3.3.2
+ ignore: 5.3.2
+ merge2: 1.4.1
+ slash: 3.0.0
+ dev: false
+
+ /globby@13.2.2:
+ resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ dir-glob: 3.0.1
+ fast-glob: 3.3.2
+ ignore: 5.3.2
+ merge2: 1.4.1
+ slash: 4.0.0
+ dev: false
+
+ /google-auth-library@9.14.2:
+ resolution: {integrity: sha512-R+FRIfk1GBo3RdlRYWPdwk8nmtVUOn6+BkDomAC46KoU8kzXzE1HLmOasSCbWUByMMAGkknVF0G5kQ69Vj7dlA==}
+ engines: {node: '>=14'}
+ dependencies:
+ base64-js: 1.5.1
+ ecdsa-sig-formatter: 1.0.11
+ gaxios: 6.7.1
+ gcp-metadata: 6.1.0
+ gtoken: 7.1.0
+ jws: 4.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
+ /googleapis-common@7.2.0:
+ resolution: {integrity: sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ extend: 3.0.2
+ gaxios: 6.7.1
+ google-auth-library: 9.14.2
+ qs: 6.13.0
+ url-template: 2.0.8
+ uuid: 9.0.1
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
+ /googleapis@128.0.0:
+ resolution: {integrity: sha512-+sLtVYNazcxaSD84N6rihVX4QiGoqRdnlz2SwmQQkadF31XonDfy4ufk3maMg27+FiySrH0rd7V8p+YJG6cknA==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ google-auth-library: 9.14.2
+ googleapis-common: 7.2.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
+ /gopd@1.0.1:
+ resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+ dependencies:
+ get-intrinsic: 1.2.4
+ dev: false
+
+ /got@12.6.1:
+ resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ '@sindresorhus/is': 5.6.0
+ '@szmarczak/http-timer': 5.0.1
+ cacheable-lookup: 7.0.0
+ cacheable-request: 10.2.14
+ decompress-response: 6.0.0
+ form-data-encoder: 2.1.4
+ get-stream: 6.0.1
+ http2-wrapper: 2.2.1
+ lowercase-keys: 3.0.0
+ p-cancelable: 3.0.0
+ responselike: 3.0.0
+
+ /graceful-fs@4.2.10:
+ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
+ dev: false
+
+ /graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ /grapheme-splitter@1.0.4:
+ resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
+ dev: true
+
+ /graphql@16.9.0:
+ resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==}
+ engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0}
+ dev: false
+
+ /gray-matter@4.0.3:
+ resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
+ engines: {node: '>=6.0'}
+ dependencies:
+ js-yaml: 3.14.1
+ kind-of: 6.0.3
+ section-matter: 1.0.0
+ strip-bom-string: 1.0.0
+ dev: false
+
+ /gtoken@7.1.0:
+ resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ gaxios: 6.7.1
+ jws: 4.0.0
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
+ /gzip-size@6.0.0:
+ resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ duplexer: 0.1.2
+ dev: false
+
+ /hamt-sharding@3.0.6:
+ resolution: {integrity: sha512-nZeamxfymIWLpVcAN0CRrb7uVq3hCOGj9IcL6NMA6VVCVWqj+h9Jo/SmaWuS92AEDf1thmHsM5D5c70hM3j2Tg==}
+ dependencies:
+ sparse-array: 1.3.2
+ uint8arrays: 5.1.0
+ dev: false
+
+ /handle-thing@2.0.1:
+ resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==}
+ dev: false
+
+ /has-bigints@1.0.2:
+ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+ dev: false
+
+ /has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ /has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+ dependencies:
+ es-define-property: 1.0.0
+ dev: false
+
+ /has-proto@1.0.3:
+ resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
+ engines: {node: '>= 0.4'}
+ dev: false
+
+ /has-symbols@1.0.3:
+ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+ engines: {node: '>= 0.4'}
+ dev: false
+
+ /has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+ dev: false
+
+ /has-yarn@3.0.0:
+ resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: false
+
+ /has@1.0.4:
+ resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==}
+ engines: {node: '>= 0.4.0'}
+ dev: false
+
+ /hash-base@3.0.4:
+ resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==}
+ engines: {node: '>=4'}
+ dependencies:
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+ dev: false
+
+ /hash-base@3.1.0:
+ resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==}
+ engines: {node: '>=4'}
+ dependencies:
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ safe-buffer: 5.2.1
+ dev: false
+
+ /hash.js@1.1.7:
+ resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
+ dependencies:
+ inherits: 2.0.4
+ minimalistic-assert: 1.0.1
+ dev: false
+
+ /hashlru@2.3.0:
+ resolution: {integrity: sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==}
+ dev: false
+
+ /hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ function-bind: 1.1.2
+
+ /hast-util-from-parse5@8.0.1:
+ resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==}
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ hastscript: 8.0.0
+ property-information: 6.5.0
+ vfile: 6.0.3
+ vfile-location: 5.0.3
+ web-namespaces: 2.0.1
+ dev: false
+
+ /hast-util-parse-selector@4.0.0:
+ resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
+ dependencies:
+ '@types/hast': 3.0.4
+ dev: false
+
+ /hast-util-raw@9.1.0:
+ resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==}
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ '@ungap/structured-clone': 1.2.0
+ hast-util-from-parse5: 8.0.1
+ hast-util-to-parse5: 8.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.0
+ parse5: 7.2.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+ dev: false
+
+ /hast-util-to-estree@3.1.0:
+ resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==}
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-attach-comments: 3.0.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.1.3
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ style-to-object: 0.4.4
+ unist-util-position: 5.0.0
+ zwitch: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+
+ /hast-util-to-jsx-runtime@2.3.2:
+ resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==}
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.1.3
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ style-to-object: 1.0.8
+ unist-util-position: 5.0.0
+ vfile-message: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ /hast-util-to-parse5@8.0.0:
+ resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==}
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+ dev: false
+
+ /hast-util-whitespace@2.0.1:
+ resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==}
+ dev: false
+
+ /hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+ dependencies:
+ '@types/hast': 3.0.4
+
+ /hastscript@8.0.0:
+ resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==}
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 4.0.0
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ dev: false
+
+ /he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+ dev: false
+
+ /headers-polyfill@4.0.3:
+ resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==}
+ dev: false
+
+ /hex-color-regex@1.1.0:
+ resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==}
+ dev: false
+
+ /history@4.10.1:
+ resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==}
+ dependencies:
+ '@babel/runtime': 7.26.0
+ loose-envify: 1.4.0
+ resolve-pathname: 3.0.0
+ tiny-invariant: 1.3.3
+ tiny-warning: 1.0.3
+ value-equal: 1.0.1
+ dev: false
+
+ /hmac-drbg@1.0.1:
+ resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==}
+ dependencies:
+ hash.js: 1.1.7
+ minimalistic-assert: 1.0.1
+ minimalistic-crypto-utils: 1.0.1
+ dev: false
+
+ /hoist-non-react-statics@3.3.2:
+ resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+ dependencies:
+ react-is: 16.13.1
+ dev: false
+
+ /hosted-git-info@4.1.0:
+ resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
+ engines: {node: '>=10'}
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
+ /hpack.js@2.1.6:
+ resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==}
+ dependencies:
+ inherits: 2.0.4
+ obuf: 1.1.2
+ readable-stream: 2.3.8
+ wbuf: 1.7.3
+ dev: false
+
+ /hsl-regex@1.0.0:
+ resolution: {integrity: sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==}
+ dev: false
+
+ /hsla-regex@1.0.0:
+ resolution: {integrity: sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==}
+ dev: false
+
+ /html-element-map@1.3.1:
+ resolution: {integrity: sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==}
+ dependencies:
+ array.prototype.filter: 1.0.4
+ call-bind: 1.0.7
+ dev: false
+
+ /html-entities@2.5.2:
+ resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==}
+ dev: false
+
+ /html-escaper@2.0.2:
+ resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+
+ /html-minifier-terser@6.1.0:
+ resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==}
+ engines: {node: '>=12'}
+ hasBin: true
+ dependencies:
+ camel-case: 4.1.2
+ clean-css: 5.3.3
+ commander: 8.3.0
+ he: 1.2.0
+ param-case: 3.0.4
+ relateurl: 0.2.7
+ terser: 5.36.0
+ dev: false
+
+ /html-minifier-terser@7.2.0:
+ resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==}
+ engines: {node: ^14.13.1 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ camel-case: 4.1.2
+ clean-css: 5.3.3
+ commander: 10.0.1
+ entities: 4.5.0
+ param-case: 3.0.4
+ relateurl: 0.2.7
+ terser: 5.36.0
+ dev: false
+
+ /html-tags@3.3.1:
+ resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+ dev: false
+
+ /html-webpack-plugin@5.6.3(webpack@5.96.1):
+ resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==}
+ engines: {node: '>=10.13.0'}
+ peerDependencies:
+ '@rspack/core': 0.x || 1.x
+ webpack: ^5.20.0
+ peerDependenciesMeta:
+ '@rspack/core':
+ optional: true
+ webpack:
+ optional: true
+ dependencies:
+ '@types/html-minifier-terser': 6.1.0
+ html-minifier-terser: 6.1.0
+ lodash: 4.17.21
+ pretty-error: 4.0.0
+ tapable: 2.2.1
+ webpack: 5.96.1
+ dev: false
+
+ /htmlparser2@6.1.0:
+ resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==}
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 4.3.1
+ domutils: 2.8.0
+ entities: 2.2.0
+ dev: false
+
+ /htmlparser2@8.0.2:
+ resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ entities: 4.5.0
+ dev: false
+
+ /htmlparser2@9.1.0:
+ resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==}
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ domutils: 3.1.0
+ entities: 4.5.0
+ dev: false
+
+ /http-cache-semantics@4.1.1:
+ resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
+
+ /http-deceiver@1.2.7:
+ resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==}
+ dev: false
+
+ /http-errors@1.6.3:
+ resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ depd: 1.1.2
+ inherits: 2.0.3
+ setprototypeof: 1.1.0
+ statuses: 1.5.0
+ dev: false
+
+ /http-errors@2.0.0:
+ resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ toidentifier: 1.0.1
+ dev: false
+
+ /http-parser-js@0.5.8:
+ resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==}
+ dev: false
+
+ /http-proxy-agent@5.0.0:
+ resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
+ engines: {node: '>= 6'}
+ dependencies:
+ '@tootallnate/once': 2.0.0
+ agent-base: 6.0.2
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /http-proxy-middleware@2.0.7(@types/express@4.17.21):
+ resolution: {integrity: sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ '@types/express': ^4.17.13
+ peerDependenciesMeta:
+ '@types/express':
+ optional: true
+ dependencies:
+ '@types/express': 4.17.21
+ '@types/http-proxy': 1.17.15
+ http-proxy: 1.18.1
+ is-glob: 4.0.3
+ is-plain-obj: 3.0.0
+ micromatch: 4.0.8
+ transitivePeerDependencies:
+ - debug
+ dev: false
+
+ /http-proxy@1.18.1:
+ resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ eventemitter3: 4.0.7
+ follow-redirects: 1.15.9(debug@4.3.4)
+ requires-port: 1.0.0
+ transitivePeerDependencies:
+ - debug
+ dev: false
+
+ /http2-client@1.3.5:
+ resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==}
+ dev: false
+
+ /http2-wrapper@2.2.1:
+ resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==}
+ engines: {node: '>=10.19.0'}
+ dependencies:
+ quick-lru: 5.1.1
+ resolve-alpn: 1.2.1
+
+ /https-proxy-agent@5.0.1:
+ resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
+ engines: {node: '>= 6'}
+ dependencies:
+ agent-base: 6.0.2
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /https-proxy-agent@7.0.5:
+ resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
+ engines: {node: '>= 14'}
+ dependencies:
+ agent-base: 7.1.1
+ debug: 4.3.7
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /human-signals@2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+
+ /husky@8.0.3:
+ resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dev: true
+
+ /iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: false
+
+ /iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: false
+
+ /icss-utils@5.1.0(postcss@8.4.31):
+ resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ dev: false
+
+ /ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ /ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+ dev: false
+
+ /image-size@1.1.1:
+ resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==}
+ engines: {node: '>=16.x'}
+ hasBin: true
+ dependencies:
+ queue: 6.0.2
+ dev: false
+
+ /immer@9.0.21:
+ resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==}
+ dev: false
+
+ /import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+ dev: false
+
+ /import-lazy@4.0.0:
+ resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /import-meta-resolve@3.1.1:
+ resolution: {integrity: sha512-qeywsE/KC3w9Fd2ORrRDUw6nS/nLwZpXgfrOc2IILvZYnCaEMd+D56Vfg9k4G29gIeVi3XKql1RQatME8iYsiw==}
+ dev: true
+
+ /imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+ dev: false
+
+ /indent-string@4.0.0:
+ resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /infima@0.2.0-alpha.44:
+ resolution: {integrity: sha512-tuRkUSO/lB3rEhLJk25atwAjgLuzq070+pOW8XcvpHky/YbENnRRdPd85IBkyeTgttmOy5ah+yHYsK1HhUd4lQ==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ /inherits@2.0.3:
+ resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==}
+ dev: false
+
+ /inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ /ini@1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+ dev: false
+
+ /ini@2.0.0:
+ resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /inline-style-parser@0.1.1:
+ resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==}
+
+ /inline-style-parser@0.2.4:
+ resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==}
+
+ /inquirer@8.2.6:
+ resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==}
+ engines: {node: '>=12.0.0'}
+ dependencies:
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-width: 3.0.0
+ external-editor: 3.1.0
+ figures: 3.2.0
+ lodash: 4.17.21
+ mute-stream: 0.0.8
+ ora: 5.4.1
+ run-async: 2.4.1
+ rxjs: 7.8.1
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ through: 2.3.8
+ wrap-ansi: 6.2.0
+ dev: false
+
+ /interface-blockstore@5.2.3:
+ resolution: {integrity: sha512-15cN+ZFdcVXdXo6I/SrSzFDsuJyDTyEI52XuvXQlR/G5fe3cK8p0tvVjfu5diRQH1XqNgmJEdMPixyt0xgjtvQ==}
+ engines: {node: '>=16.0.0', npm: '>=7.0.0'}
+ dependencies:
+ interface-store: 5.1.2
+ multiformats: 11.0.2
+ dev: false
+
+ /interface-store@5.1.2:
+ resolution: {integrity: sha512-q2sLoqC+UdaWnjwGyghsH0jwqqVk226lsG207e3QwPB8sAZYmYIWUnJwJH3JjFNNRV9e6CUTmm+gDO0Xg4KRiw==}
+ engines: {node: '>=16.0.0', npm: '>=7.0.0'}
+ dev: false
+
+ /internal-slot@1.0.7:
+ resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.0.6
+ dev: false
+
+ /internmap@1.0.1:
+ resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==}
+ dev: false
+
+ /internmap@2.0.3:
+ resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /interpret@1.4.0:
+ resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==}
+ engines: {node: '>= 0.10'}
+ dev: false
+
+ /invariant@2.2.4:
+ resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
+ dependencies:
+ loose-envify: 1.4.0
+
+ /ipaddr.js@1.9.1:
+ resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+ engines: {node: '>= 0.10'}
+ dev: false
+
+ /ipaddr.js@2.2.0:
+ resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==}
+ engines: {node: '>= 10'}
+ dev: false
+
+ /ipfs-unixfs-exporter@13.1.5:
+ resolution: {integrity: sha512-O5aMawsHoe4DaYk5FFil2EPrNOaU3pkHC6qUR5JMnW7es93W3b/RjJoO7AyDL1rpb+M3K0oRu86Yc5wLNQQ8jg==}
+ engines: {node: '>=16.0.0', npm: '>=7.0.0'}
+ dependencies:
+ '@ipld/dag-cbor': 9.0.3
+ '@ipld/dag-pb': 4.1.3
+ '@multiformats/murmur3': 2.1.8
+ err-code: 3.0.1
+ hamt-sharding: 3.0.6
+ interface-blockstore: 5.2.3
+ ipfs-unixfs: 11.2.0
+ it-filter: 3.1.1
+ it-last: 3.0.6
+ it-map: 3.1.1
+ it-parallel: 3.0.8
+ it-pipe: 3.0.1
+ it-pushable: 3.2.3
+ multiformats: 11.0.2
+ p-queue: 7.4.1
+ progress-events: 1.0.1
+ uint8arrays: 4.0.10
+ dev: false
+
+ /ipfs-unixfs-importer@15.1.5:
+ resolution: {integrity: sha512-TXaOI0M5KNpq2+qLw8AIYd0Lnc0gWTKCBqUd9eErBUwaP3Fna4qauF+JX9Rj2UrwaOvG/1xbF8Vm+92eOcKWMA==}
+ engines: {node: '>=16.0.0', npm: '>=7.0.0'}
+ dependencies:
+ '@ipld/dag-pb': 4.1.3
+ '@multiformats/murmur3': 2.1.8
+ err-code: 3.0.1
+ hamt-sharding: 3.0.6
+ interface-blockstore: 5.2.3
+ interface-store: 5.1.2
+ ipfs-unixfs: 11.2.0
+ it-all: 3.0.6
+ it-batch: 3.0.6
+ it-first: 3.0.6
+ it-parallel-batch: 3.0.6
+ multiformats: 11.0.2
+ progress-events: 1.0.1
+ rabin-wasm: 0.1.5
+ uint8arraylist: 2.4.8
+ uint8arrays: 4.0.10
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
+ /ipfs-unixfs@11.2.0:
+ resolution: {integrity: sha512-J8FN1qM5nfrDo8sQKQwfj0+brTg1uBfZK2vY9hxci33lcl3BFrsELS9+1+4q/8tO1ASKfxZO8W3Pi2O4sVX2Lg==}
+ dependencies:
+ protons-runtime: 5.5.0
+ uint8arraylist: 2.4.8
+ dev: false
+
+ /is-alphabetical@2.0.1:
+ resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
+
+ /is-alphanumerical@2.0.1:
+ resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
+ dependencies:
+ is-alphabetical: 2.0.1
+ is-decimal: 2.0.1
+
+ /is-array-buffer@3.0.4:
+ resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
+ dev: false
+
+ /is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+ /is-arrayish@0.3.2:
+ resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
+ dev: false
+
+ /is-bigint@1.0.4:
+ resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+ dependencies:
+ has-bigints: 1.0.2
+ dev: false
+
+ /is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+ dependencies:
+ binary-extensions: 2.3.0
+ dev: false
+
+ /is-boolean-object@1.1.2:
+ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
+ dev: false
+
+ /is-buffer@2.0.5:
+ resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+ dev: false
+
+ /is-ci@3.0.1:
+ resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==}
+ hasBin: true
+ dependencies:
+ ci-info: 3.9.0
+ dev: false
+
+ /is-color-stop@1.1.0:
+ resolution: {integrity: sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==}
+ dependencies:
+ css-color-names: 0.0.4
+ hex-color-regex: 1.1.0
+ hsl-regex: 1.0.0
+ hsla-regex: 1.0.0
+ rgb-regex: 1.0.1
+ rgba-regex: 1.0.0
+ dev: false
+
+ /is-core-module@2.15.1:
+ resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ hasown: 2.0.2
+
+ /is-data-view@1.0.1:
+ resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-typed-array: 1.1.13
+ dev: false
+
+ /is-date-object@1.0.5:
+ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.2
+ dev: false
+
+ /is-decimal@2.0.1:
+ resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
+
+ /is-docker@2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ /is-extendable@0.1.1:
+ resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ /is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+ dev: false
+
+ /is-hexadecimal@2.0.1:
+ resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
+
+ /is-installed-globally@0.4.0:
+ resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ global-dirs: 3.0.1
+ is-path-inside: 3.0.3
+ dev: false
+
+ /is-interactive@1.0.0:
+ resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+ engines: {node: '>= 0.4'}
+ dev: false
+
+ /is-node-process@1.2.0:
+ resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==}
+ dev: false
+
+ /is-npm@6.0.0:
+ resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: false
+
+ /is-number-object@1.0.7:
+ resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.2
+ dev: false
+
+ /is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+ dev: false
+
+ /is-obj@1.0.1:
+ resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /is-obj@2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /is-path-cwd@2.2.0:
+ resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /is-path-inside@3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /is-plain-obj@3.0.0:
+ resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+
+ /is-plain-object@2.0.4:
+ resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ isobject: 3.0.1
+
+ /is-regex@1.1.4:
+ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
+ dev: false
+
+ /is-regexp@1.0.0:
+ resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /is-root@2.1.0:
+ resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /is-shared-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ dev: false
+
+ /is-stream@2.0.1:
+ resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+ engines: {node: '>=8'}
+
+ /is-string@1.0.7:
+ resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.2
+ dev: false
+
+ /is-subset@0.1.1:
+ resolution: {integrity: sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==}
+ dev: false
+
+ /is-symbol@1.0.4:
+ resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+ dev: false
+
+ /is-typed-array@1.1.13:
+ resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ which-typed-array: 1.1.15
+ dev: false
+
+ /is-typedarray@1.0.0:
+ resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
+ dev: false
+
+ /is-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /is-weakref@1.0.2:
+ resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+ dependencies:
+ call-bind: 1.0.7
+ dev: false
+
+ /is-wsl@2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-docker: 2.2.1
+
+ /is-yarn-global@0.4.1:
+ resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /isarray@0.0.1:
+ resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
+ dev: false
+
+ /isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+ /isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+ dev: false
+
+ /isbinaryfile@5.0.4:
+ resolution: {integrity: sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==}
+ engines: {node: '>= 18.0.0'}
+ dev: false
+
+ /isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ /isobject@3.0.1:
+ resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+ engines: {node: '>=0.10.0'}
+
+ /isomorphic-ws@5.0.0(ws@8.18.0):
+ resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==}
+ peerDependencies:
+ ws: '*'
+ dependencies:
+ ws: 8.18.0
+ dev: false
+
+ /istanbul-lib-coverage@3.2.2:
+ resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /istanbul-lib-instrument@6.0.3:
+ resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/parser': 7.26.2
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-coverage: 3.2.2
+ semver: 7.6.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /istanbul-lib-report@3.0.1:
+ resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
+ engines: {node: '>=10'}
+ dependencies:
+ istanbul-lib-coverage: 3.2.2
+ make-dir: 4.0.0
+ supports-color: 7.2.0
+ dev: true
+
+ /istanbul-lib-source-maps@4.0.1:
+ resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
+ engines: {node: '>=10'}
+ dependencies:
+ debug: 4.3.7
+ istanbul-lib-coverage: 3.2.2
+ source-map: 0.6.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /istanbul-reports@3.1.7:
+ resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
+ engines: {node: '>=8'}
+ dependencies:
+ html-escaper: 2.0.2
+ istanbul-lib-report: 3.0.1
+ dev: true
+
+ /it-all@3.0.6:
+ resolution: {integrity: sha512-HXZWbxCgQZJfrv5rXvaVeaayXED8nTKx9tj9fpBhmcUJcedVZshMMMqTj0RG2+scGypb9Ut1zd1ifbf3lA8L+Q==}
+ dev: false
+
+ /it-batch@3.0.6:
+ resolution: {integrity: sha512-pQAAlSvJ4aV6xM/6LRvkPdKSKXxS4my2fGzNUxJyAQ8ccFdxPmK1bUuF5OoeUDkcdrbs8jtsmc4DypCMrGY6sg==}
+ dev: false
+
+ /it-filter@3.1.1:
+ resolution: {integrity: sha512-TOXmVuaSkxlLp2hXKoMTra0WMZMKVFxE3vSsbIA+PbADNCBAHhjJ/lM31vBOUTddHMO34Ku++vU8T9PLlBxQtg==}
+ dependencies:
+ it-peekable: 3.0.5
+ dev: false
+
+ /it-first@3.0.6:
+ resolution: {integrity: sha512-ExIewyK9kXKNAplg2GMeWfgjUcfC1FnUXz/RPfAvIXby+w7U4b3//5Lic0NV03gXT8O/isj5Nmp6KiY0d45pIQ==}
+ dev: false
+
+ /it-last@3.0.6:
+ resolution: {integrity: sha512-M4/get95O85u2vWvWQinF8SJUc/RPC5bWTveBTYXvlP2q5TF9Y+QhT3nz+CRCyS2YEc66VJkyl/da6WrJ0wKhw==}
+ dev: false
+
+ /it-map@3.1.1:
+ resolution: {integrity: sha512-9bCSwKD1yN1wCOgJ9UOl+46NQtdatosPWzxxUk2NdTLwRPXLh+L7iwCC9QKsbgM60RQxT/nH8bKMqm3H/o8IHQ==}
+ dependencies:
+ it-peekable: 3.0.5
+ dev: false
+
+ /it-merge@3.0.5:
+ resolution: {integrity: sha512-2l7+mPf85pyRF5pqi0dKcA54E5Jm/2FyY5GsOaN51Ta0ipC7YZ3szuAsH8wOoB6eKY4XsU4k2X+mzPmFBMayEA==}
+ dependencies:
+ it-pushable: 3.2.3
+ dev: false
+
+ /it-parallel-batch@3.0.6:
+ resolution: {integrity: sha512-3wgiQGvMMHy65OXScrtrtmY+bJSF7P6St1AP+BU+SK83fEr8NNk/MrmJKrtB1+MahYX2a8I+pOGKDj8qVtuV0Q==}
+ dependencies:
+ it-batch: 3.0.6
+ dev: false
+
+ /it-parallel@3.0.8:
+ resolution: {integrity: sha512-URLhs6eG4Hdr4OdvgBBPDzOjBeSSmI+Kqex2rv/aAyYClME26RYHirLVhZsZP5M+ZP6M34iRlXk8Wlqtezuqpg==}
+ dependencies:
+ p-defer: 4.0.1
+ dev: false
+
+ /it-peekable@3.0.5:
+ resolution: {integrity: sha512-JWQOGMt6rKiPcY30zUVMR4g6YxkpueTwHVE7CMs/aGqCf4OydM6w+7ZM3PvmO1e0TocjuR4aL8xyZWR46cTqCQ==}
+ dev: false
+
+ /it-pipe@3.0.1:
+ resolution: {integrity: sha512-sIoNrQl1qSRg2seYSBH/3QxWhJFn9PKYvOf/bHdtCBF0bnghey44VyASsWzn5dAx0DCDDABq1hZIuzKmtBZmKA==}
+ engines: {node: '>=16.0.0', npm: '>=7.0.0'}
+ dependencies:
+ it-merge: 3.0.5
+ it-pushable: 3.2.3
+ it-stream-types: 2.0.2
+ dev: false
+
+ /it-pushable@3.2.3:
+ resolution: {integrity: sha512-gzYnXYK8Y5t5b/BnJUr7glfQLO4U5vyb05gPx/TyTw+4Bv1zM9gFk4YsOrnulWefMewlphCjKkakFvj1y99Tcg==}
+ dependencies:
+ p-defer: 4.0.1
+ dev: false
+
+ /it-stream-types@2.0.2:
+ resolution: {integrity: sha512-Rz/DEZ6Byn/r9+/SBCuJhpPATDF9D+dz5pbgSUyBsCDtza6wtNATrz/jz1gDyNanC3XdLboriHnOC925bZRBww==}
+ dev: false
+
+ /jackspeak@2.3.6:
+ resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==}
+ engines: {node: '>=14'}
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+
+ /jest-util@29.7.0:
+ resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 22.9.0
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ graceful-fs: 4.2.11
+ picomatch: 2.3.1
+ dev: false
+
+ /jest-worker@27.5.1:
+ resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
+ engines: {node: '>= 10.13.0'}
+ dependencies:
+ '@types/node': 22.9.0
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+
+ /jest-worker@29.7.0:
+ resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@types/node': 22.9.0
+ jest-util: 29.7.0
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+ dev: false
+
+ /jiti@1.21.6:
+ resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
+ hasBin: true
+ dev: false
+
+ /joi@17.13.3:
+ resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==}
+ dependencies:
+ '@hapi/hoek': 9.3.0
+ '@hapi/topo': 5.1.0
+ '@sideway/address': 4.1.5
+ '@sideway/formula': 3.0.1
+ '@sideway/pinpoint': 2.0.0
+
+ /jquery@3.7.1:
+ resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==}
+ dev: false
+
+ /js-base64@3.7.7:
+ resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==}
+ dev: false
+
+ /js-levenshtein@1.1.6:
+ resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ /js-yaml@3.14.1:
+ resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+ hasBin: true
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+ dev: false
+
+ /js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+ dependencies:
+ argparse: 2.0.1
+ dev: false
+
+ /jsbi@4.3.0:
+ resolution: {integrity: sha512-SnZNcinB4RIcnEyZqFPdGPVgrg2AcnykiBy0sHVJQKHYeaLUvi3Exj+iaPpLnFVkDPZIV4U0yvgC9/R4uEAZ9g==}
+ dev: false
+
+ /jsesc@3.0.2:
+ resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ /json-bigint@1.0.0:
+ resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==}
+ dependencies:
+ bignumber.js: 9.1.2
+ dev: false
+
+ /json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ /json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+ /json-pointer@0.6.2:
+ resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==}
+ dependencies:
+ foreach: 2.0.6
+ dev: false
+
+ /json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ /json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+ dev: false
+
+ /json2mq@0.2.0:
+ resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==}
+ dependencies:
+ string-convert: 0.2.1
+ dev: false
+
+ /json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ /jsonfile@6.1.0:
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+ dev: false
+
+ /jsonschema@1.4.1:
+ resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==}
+ dev: false
+
+ /jwa@2.0.0:
+ resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==}
+ dependencies:
+ buffer-equal-constant-time: 1.0.1
+ ecdsa-sig-formatter: 1.0.11
+ safe-buffer: 5.2.1
+ dev: false
+
+ /jws@4.0.0:
+ resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==}
+ dependencies:
+ jwa: 2.0.0
+ safe-buffer: 5.2.1
+ dev: false
+
+ /jwt-decode@3.1.2:
+ resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==}
+ dev: false
+
+ /katex@0.16.11:
+ resolution: {integrity: sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ==}
+ hasBin: true
+ dependencies:
+ commander: 8.3.0
+ dev: false
+
+ /keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+ dependencies:
+ json-buffer: 3.0.1
+
+ /khroma@2.1.0:
+ resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==}
+ dev: false
+
+ /kind-of@6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+ engines: {node: '>=0.10.0'}
+
+ /kleur@3.0.3:
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /kleur@4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /ky@0.33.3:
+ resolution: {integrity: sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==}
+ engines: {node: '>=14.16'}
+ dev: true
+
+ /latest-version@7.0.0:
+ resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ package-json: 8.1.1
+ dev: false
+
+ /launch-editor@2.9.1:
+ resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==}
+ dependencies:
+ picocolors: 1.1.1
+ shell-quote: 1.8.1
+ dev: false
+
+ /layerr@2.1.0:
+ resolution: {integrity: sha512-xDD9suWxfBYeXgqffRVH/Wqh+mqZrQcqPRn0I0ijl7iJQ7vu8gMGPt1Qop59pEW/jaIDNUN7+PX1Qk40+vuflg==}
+ dev: false
+
+ /layout-base@1.0.2:
+ resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==}
+ dev: false
+
+ /lazy-ass@1.6.0:
+ resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==}
+ engines: {node: '> 0.8'}
+ dev: true
+
+ /lazystream@1.0.1:
+ resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==}
+ engines: {node: '>= 0.6.3'}
+ dependencies:
+ readable-stream: 2.3.8
+ dev: true
+
+ /level-supports@4.0.1:
+ resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /level-transcoder@1.0.1:
+ resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==}
+ engines: {node: '>=12'}
+ dependencies:
+ buffer: 6.0.3
+ module-error: 1.0.2
+ dev: false
+
+ /level@8.0.0:
+ resolution: {integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ browser-level: 1.0.1
+ classic-level: 1.4.1
+ dev: false
+
+ /level@8.0.1:
+ resolution: {integrity: sha512-oPBGkheysuw7DmzFQYyFe8NAia5jFLAgEnkgWnK3OXAuJr8qFT+xBQIwokAZPME2bhPFzS8hlYcL16m8UZrtwQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ abstract-level: 1.0.4
+ browser-level: 1.0.1
+ classic-level: 1.4.1
+ dev: false
+
+ /leven@3.1.0:
+ resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /levn@0.3.0:
+ resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.1.2
+ type-check: 0.3.2
+ dev: false
+
+ /lighthouse-logger@1.4.2:
+ resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==}
+ dependencies:
+ debug: 2.6.9
+ marky: 1.2.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /lilconfig@2.1.0:
+ resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /lilconfig@3.1.2:
+ resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==}
+ engines: {node: '>=14'}
+ dev: false
+
+ /lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ /load-script@1.0.0:
+ resolution: {integrity: sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==}
+ dev: false
+
+ /loader-runner@4.3.0:
+ resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
+ engines: {node: '>=6.11.5'}
+
+ /loader-utils@2.0.4:
+ resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==}
+ engines: {node: '>=8.9.0'}
+ dependencies:
+ big.js: 5.2.2
+ emojis-list: 3.0.0
+ json5: 2.2.3
+ dev: false
+
+ /loader-utils@3.3.1:
+ resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==}
+ engines: {node: '>= 12.13.0'}
+ dev: false
+
+ /local-pkg@0.4.3:
+ resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
+ engines: {node: '>=14'}
+ dev: true
+
+ /locate-path@3.0.0:
+ resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-locate: 3.0.0
+ path-exists: 3.0.0
+ dev: false
+
+ /locate-path@5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-locate: 4.1.0
+ dev: false
+
+ /locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-locate: 5.0.0
+ dev: false
+
+ /locate-path@7.2.0:
+ resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ p-locate: 6.0.0
+
+ /lodash-es@4.17.21:
+ resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+ dev: false
+
+ /lodash.castarray@4.4.0:
+ resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==}
+ dev: false
+
+ /lodash.clonedeep@4.5.0:
+ resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
+ dev: true
+
+ /lodash.debounce@4.0.8:
+ resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+ dev: false
+
+ /lodash.defaults@4.2.0:
+ resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
+ dev: true
+
+ /lodash.difference@4.5.0:
+ resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==}
+ dev: true
+
+ /lodash.escape@4.0.1:
+ resolution: {integrity: sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==}
+ dev: false
+
+ /lodash.flatten@4.4.0:
+ resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==}
+ dev: true
+
+ /lodash.flattendeep@4.4.0:
+ resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==}
+ dev: false
+
+ /lodash.isequal@4.5.0:
+ resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+ dev: false
+
+ /lodash.isplainobject@4.0.6:
+ resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+
+ /lodash.memoize@4.1.2:
+ resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
+ dev: false
+
+ /lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ dev: false
+
+ /lodash.topath@4.5.2:
+ resolution: {integrity: sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==}
+ dev: false
+
+ /lodash.union@4.6.0:
+ resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==}
+ dev: true
+
+ /lodash.uniq@4.5.0:
+ resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
+ dev: false
+
+ /lodash.zip@4.2.0:
+ resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==}
+ dev: true
+
+ /lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ /log-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+ dev: false
+
+ /loglevel-plugin-prefix@0.8.4:
+ resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==}
+ dev: true
+
+ /loglevel@1.9.2:
+ resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==}
+ engines: {node: '>= 0.6.0'}
+ dev: true
+
+ /longest-streak@3.1.0:
+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+
+ /loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+ dependencies:
+ js-tokens: 4.0.0
+
+ /loupe@2.3.7:
+ resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
+ dependencies:
+ get-func-name: 2.0.2
+ dev: true
+
+ /lower-case@2.0.2:
+ resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /lowercase-keys@3.0.0:
+ resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ /lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+ /lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+ dependencies:
+ yallist: 3.1.1
+
+ /lru-cache@6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+ dependencies:
+ yallist: 4.0.0
+ dev: true
+
+ /lru-cache@9.1.2:
+ resolution: {integrity: sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==}
+ engines: {node: 14 || >=16.14}
+ dev: false
+
+ /lunr@2.3.9:
+ resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==}
+ dev: false
+
+ /magic-string@0.27.0:
+ resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.0
+ dev: false
+
+ /magic-string@0.30.12:
+ resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==}
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.0
+ dev: true
+
+ /make-dir@4.0.0:
+ resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
+ engines: {node: '>=10'}
+ dependencies:
+ semver: 7.6.3
+ dev: true
+
+ /map-stream@0.1.0:
+ resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==}
+ dev: true
+
+ /mark.js@8.11.1:
+ resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==}
+ dev: false
+
+ /markdown-extensions@2.0.0:
+ resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==}
+ engines: {node: '>=16'}
+
+ /markdown-table@2.0.0:
+ resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==}
+ dependencies:
+ repeat-string: 1.6.1
+ dev: false
+
+ /markdown-table@3.0.4:
+ resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
+ dev: false
+
+ /marked@4.3.0:
+ resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==}
+ engines: {node: '>= 12'}
+ hasBin: true
+ dev: false
+
+ /marky@1.2.5:
+ resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==}
+ dev: true
+
+ /md5.js@1.3.5:
+ resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
+ dependencies:
+ hash-base: 3.1.0
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+ dev: false
+
+ /mdast-util-definitions@5.1.2:
+ resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ '@types/unist': 2.0.11
+ unist-util-visit: 4.1.2
+ dev: false
+
+ /mdast-util-directive@3.0.0:
+ resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ parse-entities: 4.0.1
+ stringify-entities: 4.0.4
+ unist-util-visit-parents: 6.0.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-find-and-replace@3.0.1:
+ resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ escape-string-regexp: 5.0.0
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
+ dev: false
+
+ /mdast-util-from-markdown@1.3.1:
+ resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ '@types/unist': 2.0.11
+ decode-named-character-reference: 1.0.2
+ mdast-util-to-string: 3.2.0
+ micromark: 3.2.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-decode-string: 1.1.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ unist-util-stringify-position: 3.0.3
+ uvu: 0.5.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-from-markdown@2.0.2:
+ resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ mdast-util-to-string: 4.0.0
+ micromark: 4.0.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-decode-string: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ unist-util-stringify-position: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /mdast-util-frontmatter@2.0.1:
+ resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ escape-string-regexp: 5.0.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ micromark-extension-frontmatter: 2.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-gfm-autolink-literal@2.0.1:
+ resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-find-and-replace: 3.0.1
+ micromark-util-character: 2.1.1
+ dev: false
+
+ /mdast-util-gfm-footnote@2.0.0:
+ resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ micromark-util-normalize-identifier: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-gfm-strikethrough@2.0.0:
+ resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-gfm-table@2.0.0:
+ resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ markdown-table: 3.0.4
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-gfm-task-list-item@2.0.0:
+ resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-gfm@3.0.0:
+ resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==}
+ dependencies:
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-gfm-autolink-literal: 2.0.1
+ mdast-util-gfm-footnote: 2.0.0
+ mdast-util-gfm-strikethrough: 2.0.0
+ mdast-util-gfm-table: 2.0.0
+ mdast-util-gfm-task-list-item: 2.0.0
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /mdast-util-mdx-expression@2.0.1:
+ resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ /mdast-util-mdx-jsx@3.1.3:
+ resolution: {integrity: sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ parse-entities: 4.0.1
+ stringify-entities: 4.0.4
+ unist-util-stringify-position: 4.0.0
+ vfile-message: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ /mdast-util-mdx@3.0.0:
+ resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==}
+ dependencies:
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.1.3
+ mdast-util-mdxjs-esm: 2.0.1
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ /mdast-util-mdxjs-esm@2.0.1:
+ resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ /mdast-util-phrasing@4.1.0:
+ resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ unist-util-is: 6.0.0
+
+ /mdast-util-to-hast@12.3.0:
+ resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==}
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/mdast': 3.0.15
+ mdast-util-definitions: 5.1.2
+ micromark-util-sanitize-uri: 1.2.0
+ trim-lines: 3.0.1
+ unist-util-generated: 2.0.1
+ unist-util-position: 4.0.4
+ unist-util-visit: 4.1.2
+ dev: false
+
+ /mdast-util-to-hast@13.2.0:
+ resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.2.0
+ devlop: 1.1.0
+ micromark-util-sanitize-uri: 2.0.1
+ trim-lines: 3.0.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+
+ /mdast-util-to-markdown@2.1.2:
+ resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ longest-streak: 3.1.0
+ mdast-util-phrasing: 4.1.0
+ mdast-util-to-string: 4.0.0
+ micromark-util-classify-character: 2.0.1
+ micromark-util-decode-string: 2.0.1
+ unist-util-visit: 5.0.0
+ zwitch: 2.0.4
+
+ /mdast-util-to-string@3.2.0:
+ resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ dev: false
+
+ /mdast-util-to-string@4.0.0:
+ resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
+ dependencies:
+ '@types/mdast': 4.0.4
+
+ /mdn-data@2.0.28:
+ resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
+ dev: false
+
+ /mdn-data@2.0.30:
+ resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
+ dev: false
+
+ /media-typer@0.3.0:
+ resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /memfs@3.5.3:
+ resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==}
+ engines: {node: '>= 4.0.0'}
+ dependencies:
+ fs-monkey: 1.0.6
+ dev: false
+
+ /memoize-one@5.2.1:
+ resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==}
+ dev: false
+
+ /merge-descriptors@1.0.1:
+ resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
+ dev: false
+
+ /merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+ /merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+ dev: false
+
+ /mermaid@10.9.3:
+ resolution: {integrity: sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==}
+ dependencies:
+ '@braintree/sanitize-url': 6.0.4
+ '@types/d3-scale': 4.0.8
+ '@types/d3-scale-chromatic': 3.0.3
+ cytoscape: 3.30.3
+ cytoscape-cose-bilkent: 4.1.0(cytoscape@3.30.3)
+ d3: 7.9.0
+ d3-sankey: 0.12.3
+ dagre-d3-es: 7.0.10
+ dayjs: 1.11.13
+ dompurify: 3.1.6
+ elkjs: 0.9.3
+ katex: 0.16.11
+ khroma: 2.1.0
+ lodash-es: 4.17.21
+ mdast-util-from-markdown: 1.3.1
+ non-layered-tidy-tree-layout: 2.0.2
+ stylis: 4.3.4
+ ts-dedent: 2.2.0
+ uuid: 9.0.1
+ web-worker: 1.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /methods@1.1.2:
+ resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /micro-packed@0.5.3:
+ resolution: {integrity: sha512-zWRoH+qUb/ZMp9gVZhexvRGCENDM5HEQF4sflqpdilUHWK2/zKR7/MT8GBctnTwbhNJwy1iuk5q6+TYP7/twYA==}
+ dependencies:
+ '@scure/base': 1.1.9
+ dev: false
+
+ /micromark-core-commonmark@1.1.0:
+ resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==}
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ micromark-factory-destination: 1.1.0
+ micromark-factory-label: 1.1.0
+ micromark-factory-space: 1.1.0
+ micromark-factory-title: 1.1.0
+ micromark-factory-whitespace: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-chunked: 1.1.0
+ micromark-util-classify-character: 1.1.0
+ micromark-util-html-tag-name: 1.2.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-resolve-all: 1.1.0
+ micromark-util-subtokenize: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ dev: false
+
+ /micromark-core-commonmark@2.0.2:
+ resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==}
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ micromark-factory-destination: 2.0.1
+ micromark-factory-label: 2.0.1
+ micromark-factory-space: 2.0.1
+ micromark-factory-title: 2.0.1
+ micromark-factory-whitespace: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-html-tag-name: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-subtokenize: 2.0.2
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ /micromark-extension-directive@3.0.2:
+ resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==}
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-factory-whitespace: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ parse-entities: 4.0.1
+ dev: false
+
+ /micromark-extension-frontmatter@2.0.0:
+ resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==}
+ dependencies:
+ fault: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ dev: false
+
+ /micromark-extension-gfm-autolink-literal@2.1.0:
+ resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ dev: false
+
+ /micromark-extension-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
+ dependencies:
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.2
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ dev: false
+
+ /micromark-extension-gfm-strikethrough@2.1.0:
+ resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ dev: false
+
+ /micromark-extension-gfm-table@2.1.0:
+ resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==}
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ dev: false
+
+ /micromark-extension-gfm-tagfilter@2.0.0:
+ resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
+ dependencies:
+ micromark-util-types: 2.0.1
+ dev: false
+
+ /micromark-extension-gfm-task-list-item@2.1.0:
+ resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ dev: false
+
+ /micromark-extension-gfm@3.0.0:
+ resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+ dependencies:
+ micromark-extension-gfm-autolink-literal: 2.1.0
+ micromark-extension-gfm-footnote: 2.1.0
+ micromark-extension-gfm-strikethrough: 2.1.0
+ micromark-extension-gfm-table: 2.1.0
+ micromark-extension-gfm-tagfilter: 2.0.0
+ micromark-extension-gfm-task-list-item: 2.1.0
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-types: 2.0.1
+ dev: false
+
+ /micromark-extension-mdx-expression@3.0.0:
+ resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==}
+ dependencies:
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+ micromark-factory-mdx-expression: 2.0.2
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.2
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ /micromark-extension-mdx-jsx@3.0.1:
+ resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==}
+ dependencies:
+ '@types/acorn': 4.0.6
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ micromark-factory-mdx-expression: 2.0.2
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.2
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ vfile-message: 4.0.2
+
+ /micromark-extension-mdx-md@2.0.0:
+ resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==}
+ dependencies:
+ micromark-util-types: 2.0.1
+
+ /micromark-extension-mdxjs-esm@3.0.0:
+ resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==}
+ dependencies:
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.2
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.2
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.2
+
+ /micromark-extension-mdxjs@3.0.0:
+ resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==}
+ dependencies:
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ micromark-extension-mdx-expression: 3.0.0
+ micromark-extension-mdx-jsx: 3.0.1
+ micromark-extension-mdx-md: 2.0.0
+ micromark-extension-mdxjs-esm: 3.0.0
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-types: 2.0.1
+
+ /micromark-factory-destination@1.1.0:
+ resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-factory-destination@2.0.1:
+ resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ /micromark-factory-label@1.1.0:
+ resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ dev: false
+
+ /micromark-factory-label@2.0.1:
+ resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ /micromark-factory-mdx-expression@2.0.2:
+ resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==}
+ dependencies:
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.2
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.2
+
+ /micromark-factory-space@1.1.0:
+ resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-factory-space@2.0.1:
+ resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-types: 2.0.1
+
+ /micromark-factory-title@1.1.0:
+ resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==}
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-factory-title@2.0.1:
+ resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==}
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ /micromark-factory-whitespace@1.1.0:
+ resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==}
+ dependencies:
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-factory-whitespace@2.0.1:
+ resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==}
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ /micromark-util-character@1.2.0:
+ resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==}
+ dependencies:
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-util-character@2.1.1:
+ resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
+ dependencies:
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ /micromark-util-chunked@1.1.0:
+ resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==}
+ dependencies:
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /micromark-util-chunked@2.0.1:
+ resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==}
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ /micromark-util-classify-character@1.1.0:
+ resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-util-classify-character@2.0.1:
+ resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==}
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ /micromark-util-combine-extensions@1.1.0:
+ resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==}
+ dependencies:
+ micromark-util-chunked: 1.1.0
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-util-combine-extensions@2.0.1:
+ resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==}
+ dependencies:
+ micromark-util-chunked: 2.0.1
+ micromark-util-types: 2.0.1
+
+ /micromark-util-decode-numeric-character-reference@1.1.0:
+ resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==}
+ dependencies:
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /micromark-util-decode-numeric-character-reference@2.0.2:
+ resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==}
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ /micromark-util-decode-string@1.1.0:
+ resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==}
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ micromark-util-character: 1.2.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /micromark-util-decode-string@2.0.1:
+ resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==}
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ micromark-util-character: 2.1.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-symbol: 2.0.1
+
+ /micromark-util-encode@1.1.0:
+ resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==}
+ dev: false
+
+ /micromark-util-encode@2.0.1:
+ resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
+
+ /micromark-util-events-to-acorn@2.0.2:
+ resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==}
+ dependencies:
+ '@types/acorn': 4.0.6
+ '@types/estree': 1.0.6
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ estree-util-visit: 2.0.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ vfile-message: 4.0.2
+
+ /micromark-util-html-tag-name@1.2.0:
+ resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==}
+ dev: false
+
+ /micromark-util-html-tag-name@2.0.1:
+ resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
+
+ /micromark-util-normalize-identifier@1.1.0:
+ resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==}
+ dependencies:
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /micromark-util-normalize-identifier@2.0.1:
+ resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==}
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ /micromark-util-resolve-all@1.1.0:
+ resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==}
+ dependencies:
+ micromark-util-types: 1.1.0
+ dev: false
+
+ /micromark-util-resolve-all@2.0.1:
+ resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==}
+ dependencies:
+ micromark-util-types: 2.0.1
+
+ /micromark-util-sanitize-uri@1.2.0:
+ resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==}
+ dependencies:
+ micromark-util-character: 1.2.0
+ micromark-util-encode: 1.1.0
+ micromark-util-symbol: 1.1.0
+ dev: false
+
+ /micromark-util-sanitize-uri@2.0.1:
+ resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-encode: 2.0.1
+ micromark-util-symbol: 2.0.1
+
+ /micromark-util-subtokenize@1.1.0:
+ resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==}
+ dependencies:
+ micromark-util-chunked: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ dev: false
+
+ /micromark-util-subtokenize@2.0.2:
+ resolution: {integrity: sha512-xKxhkB62vwHUuuxHe9Xqty3UaAsizV2YKq5OV344u3hFBbf8zIYrhYOWhAQb94MtMPkjTOzzjJ/hid9/dR5vFA==}
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ /micromark-util-symbol@1.1.0:
+ resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==}
+ dev: false
+
+ /micromark-util-symbol@2.0.1:
+ resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
+
+ /micromark-util-types@1.1.0:
+ resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==}
+ dev: false
+
+ /micromark-util-types@2.0.1:
+ resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==}
+
+ /micromark@3.2.0:
+ resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==}
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.3.7
+ decode-named-character-reference: 1.0.2
+ micromark-core-commonmark: 1.1.0
+ micromark-factory-space: 1.1.0
+ micromark-util-character: 1.2.0
+ micromark-util-chunked: 1.1.0
+ micromark-util-combine-extensions: 1.1.0
+ micromark-util-decode-numeric-character-reference: 1.1.0
+ micromark-util-encode: 1.1.0
+ micromark-util-normalize-identifier: 1.1.0
+ micromark-util-resolve-all: 1.1.0
+ micromark-util-sanitize-uri: 1.2.0
+ micromark-util-subtokenize: 1.1.0
+ micromark-util-symbol: 1.1.0
+ micromark-util-types: 1.1.0
+ uvu: 0.5.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /micromark@4.0.1:
+ resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==}
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.3.7
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.2
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-encode: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-subtokenize: 2.0.2
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ /micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+ dev: false
+
+ /miller-rabin@4.0.1:
+ resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==}
+ hasBin: true
+ dependencies:
+ bn.js: 4.12.1
+ brorand: 1.1.0
+ dev: false
+
+ /mime-db@1.33.0:
+ resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ /mime-db@1.53.0:
+ resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /mime-types@2.1.18:
+ resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.33.0
+ dev: false
+
+ /mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ mime-db: 1.52.0
+
+ /mime@1.6.0:
+ resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: false
+
+ /mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+
+ /mimic-response@3.1.0:
+ resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
+ engines: {node: '>=10'}
+
+ /mimic-response@4.0.0:
+ resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ /mini-css-extract-plugin@2.9.2(webpack@5.96.1):
+ resolution: {integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==}
+ engines: {node: '>= 12.13.0'}
+ peerDependencies:
+ webpack: ^5.0.0
+ dependencies:
+ schema-utils: 4.2.0
+ tapable: 2.2.1
+ webpack: 5.96.1
+ dev: false
+
+ /minimalistic-assert@1.0.1:
+ resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
+ dev: false
+
+ /minimalistic-crypto-utils@1.0.1:
+ resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==}
+ dev: false
+
+ /minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ dependencies:
+ brace-expansion: 1.1.11
+
+ /minimatch@5.1.6:
+ resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
+ engines: {node: '>=10'}
+ dependencies:
+ brace-expansion: 2.0.1
+
+ /minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dependencies:
+ brace-expansion: 2.0.1
+
+ /minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ /minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ /mitt@3.0.0:
+ resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==}
+ dev: true
+
+ /mkdirp-classic@0.5.3:
+ resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
+ dev: true
+
+ /mlly@1.7.3:
+ resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==}
+ dependencies:
+ acorn: 8.14.0
+ pathe: 1.1.2
+ pkg-types: 1.2.1
+ ufo: 1.5.4
+ dev: true
+
+ /mobx-react-lite@4.0.7(mobx@6.13.5)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-RjwdseshK9Mg8On5tyJZHtGD+J78ZnCnRaxeQDSiciKVQDUbfZcXhmld0VMxAwvcTnPEHZySGGewm467Fcpreg==}
+ peerDependencies:
+ mobx: ^6.9.0
+ react: ^16.8.0 || ^17 || ^18
+ react-dom: '*'
+ react-native: '*'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+ react-native:
+ optional: true
+ dependencies:
+ mobx: 6.13.5
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ use-sync-external-store: 1.2.2(react@18.2.0)
+ dev: false
+
+ /mobx-react@9.1.1(mobx@6.13.5)(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-gVV7AdSrAAxqXOJ2bAbGa5TkPqvITSzaPiiEkzpW4rRsMhSec7C2NBCJYILADHKp2tzOAIETGRsIY0UaCV5aEw==}
+ peerDependencies:
+ mobx: ^6.9.0
+ react: ^16.8.0 || ^17 || ^18
+ react-dom: '*'
+ react-native: '*'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
+ react-native:
+ optional: true
+ dependencies:
+ mobx: 6.13.5
+ mobx-react-lite: 4.0.7(mobx@6.13.5)(react-dom@18.2.0)(react@18.2.0)
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ dev: false
+
+ /mobx@6.13.5:
+ resolution: {integrity: sha512-/HTWzW2s8J1Gqt+WmUj5Y0mddZk+LInejADc79NJadrWla3rHzmRHki/mnEUH1AvOmbNTZ1BRbKxr8DSgfdjMA==}
+ dev: false
+
+ /modern-node-polyfills@0.1.3(rollup@2.79.2):
+ resolution: {integrity: sha512-/4dB85Sdkt9MjWwtpKnsNTYhh0+fqjFC4ZEgDP4B0e6kyzbGUnX4NDxTUCaVwRLVF9gcEDcRQjol8pn05B3TUQ==}
+ dependencies:
+ '@jspm/core': 2.0.0-beta.24
+ '@rollup/pluginutils': 3.1.0(rollup@2.79.2)
+ esbuild: 0.14.54
+ local-pkg: 0.4.3
+ transitivePeerDependencies:
+ - rollup
+ dev: true
+
+ /modern-normalize@1.1.0:
+ resolution: {integrity: sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /module-error@1.0.2:
+ resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /moo@0.5.2:
+ resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==}
+ dev: false
+
+ /mri@1.2.0:
+ resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /mrmime@2.0.0:
+ resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
+ engines: {node: '>=10'}
+
+ /ms@2.0.0:
+ resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+ /ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+ /ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ /msw@2.1.7(typescript@5.6.3):
+ resolution: {integrity: sha512-yTIYqEMqDSrdbVMrfmqP6rTKQsnIbglTvVmAHDWwNegyXPXRcV+RjsaFEqubRS266gwWCDLm9YdOkWSKLdDvJQ==}
+ engines: {node: '>=18'}
+ hasBin: true
+ requiresBuild: true
+ peerDependencies:
+ typescript: '>= 4.7.x <= 5.3.x'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@bundled-es-modules/cookie': 2.0.1
+ '@bundled-es-modules/statuses': 1.0.1
+ '@mswjs/cookies': 1.1.1
+ '@mswjs/interceptors': 0.25.16
+ '@open-draft/until': 2.1.0
+ '@types/cookie': 0.6.0
+ '@types/statuses': 2.0.5
+ chalk: 4.1.2
+ chokidar: 3.6.0
+ graphql: 16.9.0
+ headers-polyfill: 4.0.3
+ inquirer: 8.2.6
+ is-node-process: 1.2.0
+ outvariant: 1.4.3
+ path-to-regexp: 6.3.0
+ strict-event-emitter: 0.5.1
+ type-fest: 4.26.1
+ typescript: 5.6.3
+ yargs: 17.7.2
+ dev: false
+
+ /multicast-dns@7.2.5:
+ resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==}
+ hasBin: true
+ dependencies:
+ dns-packet: 5.6.1
+ thunky: 1.1.0
+ dev: false
+
+ /multiformats@11.0.2:
+ resolution: {integrity: sha512-b5mYMkOkARIuVZCpvijFj9a6m5wMVLC7cf/jIPd5D/ARDOfLC5+IFkbgDXQgcU2goIsTD/O9NY4DI/Mt4OGvlg==}
+ engines: {node: '>=16.0.0', npm: '>=7.0.0'}
+ dev: false
+
+ /multiformats@12.1.3:
+ resolution: {integrity: sha512-eajQ/ZH7qXZQR2AgtfpmSMizQzmyYVmCql7pdhldPuYQi4atACekbJaQplk6dWyIi10jCaFnd6pqvcEFXjbaJw==}
+ engines: {node: '>=16.0.0', npm: '>=7.0.0'}
+ dev: false
+
+ /multiformats@13.1.0:
+ resolution: {integrity: sha512-HzdtdBwxsIkzpeXzhQ5mAhhuxcHbjEHH+JQoxt7hG/2HGFjjwyolLo7hbaexcnhoEuV4e0TNJ8kkpMjiEYY4VQ==}
+ dev: false
+
+ /multiformats@13.3.1:
+ resolution: {integrity: sha512-QxowxTNwJ3r5RMctoGA5p13w5RbRT2QDkoM+yFlqfLiioBp78nhDjnRLvmSBI9+KAqN4VdgOVWM9c0CHd86m3g==}
+ dev: false
+
+ /multiformats@9.9.0:
+ resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==}
+ dev: false
+
+ /murmurhash3js-revisited@3.0.0:
+ resolution: {integrity: sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g==}
+ engines: {node: '>=8.0.0'}
+ dev: false
+
+ /mute-stream@0.0.8:
+ resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
+ dev: false
+
+ /nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ /napi-macros@2.2.2:
+ resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==}
+ dev: false
+
+ /nearley@2.20.1:
+ resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==}
+ hasBin: true
+ dependencies:
+ commander: 2.20.3
+ moo: 0.5.2
+ railroad-diagrams: 1.0.0
+ randexp: 0.4.6
+ dev: false
+
+ /negotiator@0.6.3:
+ resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /negotiator@0.6.4:
+ resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /neo-async@2.6.2:
+ resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+ /no-case@3.0.4:
+ resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+ dependencies:
+ lower-case: 2.0.2
+ tslib: 2.8.1
+ dev: false
+
+ /node-domexception@1.0.0:
+ resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
+ engines: {node: '>=10.5.0'}
+ dev: false
+
+ /node-emoji@1.11.0:
+ resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==}
+ dependencies:
+ lodash: 4.17.21
+ dev: false
+
+ /node-emoji@2.1.3:
+ resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==}
+ engines: {node: '>=18'}
+ dependencies:
+ '@sindresorhus/is': 4.6.0
+ char-regex: 1.0.2
+ emojilib: 2.4.0
+ skin-tone: 2.0.0
+ dev: false
+
+ /node-fetch-h2@2.3.0:
+ resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==}
+ engines: {node: 4.x || >=6.0.0}
+ dependencies:
+ http2-client: 1.3.5
+ dev: false
+
+ /node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+ dependencies:
+ whatwg-url: 5.0.0
+
+ /node-fetch@3.3.2:
+ resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ data-uri-to-buffer: 4.0.1
+ fetch-blob: 3.2.0
+ formdata-polyfill: 4.0.10
+ dev: false
+
+ /node-forge@1.3.1:
+ resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
+ engines: {node: '>= 6.13.0'}
+ dev: false
+
+ /node-gyp-build@4.8.3:
+ resolution: {integrity: sha512-EMS95CMJzdoSKoIiXo8pxKoL8DYxwIZXYlLmgPb8KUv794abpnLK6ynsCAWNliOjREKruYKdzbh76HHYUHX7nw==}
+ hasBin: true
+ dev: false
+
+ /node-readfiles@0.2.0:
+ resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==}
+ dependencies:
+ es6-promise: 3.3.1
+ dev: false
+
+ /node-releases@2.0.18:
+ resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
+
+ /non-layered-tidy-tree-layout@2.0.2:
+ resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==}
+ dev: false
+
+ /normalize-package-data@3.0.3:
+ resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==}
+ engines: {node: '>=10'}
+ dependencies:
+ hosted-git-info: 4.1.0
+ is-core-module: 2.15.1
+ semver: 7.6.3
+ validate-npm-package-license: 3.0.4
+ dev: true
+
+ /normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ /normalize-range@0.1.2:
+ resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /normalize-url@8.0.1:
+ resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==}
+ engines: {node: '>=14.16'}
+
+ /npm-run-path@4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-key: 3.1.1
+
+ /nprogress@0.2.0:
+ resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
+ dev: false
+
+ /nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+ dependencies:
+ boolbase: 1.0.0
+ dev: false
+
+ /null-loader@4.0.1(webpack@5.96.1):
+ resolution: {integrity: sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==}
+ engines: {node: '>= 10.13.0'}
+ peerDependencies:
+ webpack: ^4.0.0 || ^5.0.0
+ dependencies:
+ loader-utils: 2.0.4
+ schema-utils: 3.3.0
+ webpack: 5.96.1
+ dev: false
+
+ /oas-kit-common@1.0.8:
+ resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==}
+ dependencies:
+ fast-safe-stringify: 2.1.1
+ dev: false
+
+ /oas-linter@3.2.2:
+ resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==}
+ dependencies:
+ '@exodus/schemasafe': 1.3.0
+ should: 13.2.3
+ yaml: 1.10.2
+ dev: false
+
+ /oas-resolver@2.5.6:
+ resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==}
+ hasBin: true
+ dependencies:
+ node-fetch-h2: 2.3.0
+ oas-kit-common: 1.0.8
+ reftools: 1.1.9
+ yaml: 1.10.2
+ yargs: 17.7.2
+ dev: false
+
+ /oas-schema-walker@1.1.5:
+ resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==}
+ dev: false
+
+ /oas-validator@5.0.8:
+ resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==}
+ dependencies:
+ call-me-maybe: 1.0.2
+ oas-kit-common: 1.0.8
+ oas-linter: 3.2.2
+ oas-resolver: 2.5.6
+ oas-schema-walker: 1.1.5
+ reftools: 1.1.9
+ should: 13.2.3
+ yaml: 1.10.2
+ dev: false
+
+ /object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ /object-hash@2.2.0:
+ resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==}
+ engines: {node: '>= 6'}
+ dev: false
+
+ /object-hash@3.0.0:
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+ engines: {node: '>= 6'}
+ dev: false
+
+ /object-inspect@1.13.3:
+ resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==}
+ engines: {node: '>= 0.4'}
+ dev: false
+
+ /object-is@1.1.6:
+ resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ dev: false
+
+ /object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+ dev: false
+
+ /object.assign@4.1.5:
+ resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ has-symbols: 1.0.3
+ object-keys: 1.1.1
+ dev: false
+
+ /object.entries@1.1.8:
+ resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: false
+
+ /object.values@1.2.0:
+ resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: false
+
+ /obuf@1.1.2:
+ resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
+ dev: false
+
+ /on-finished@2.4.1:
+ resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ ee-first: 1.1.1
+ dev: false
+
+ /on-headers@1.0.2:
+ resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ dependencies:
+ wrappy: 1.0.2
+
+ /onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+ dependencies:
+ mimic-fn: 2.1.0
+
+ /open@8.4.2:
+ resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ define-lazy-prop: 2.0.0
+ is-docker: 2.2.1
+ is-wsl: 2.2.0
+ dev: false
+
+ /openapi-sampler@1.5.1:
+ resolution: {integrity: sha512-tIWIrZUKNAsbqf3bd9U1oH6JEXo8LNYuDlXw26By67EygpjT+ArFnsxxyTMjFWRfbqo5ozkvgSQDK69Gd8CddA==}
+ dependencies:
+ '@types/json-schema': 7.0.15
+ json-pointer: 0.6.2
+ dev: false
+
+ /opener@1.5.2:
+ resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
+ hasBin: true
+ dev: false
+
+ /optionator@0.8.3:
+ resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.3.0
+ prelude-ls: 1.1.2
+ type-check: 0.3.2
+ word-wrap: 1.2.5
+ dev: false
+
+ /ora@5.4.1:
+ resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ bl: 4.1.0
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-spinners: 2.9.2
+ is-interactive: 1.0.0
+ is-unicode-supported: 0.1.0
+ log-symbols: 4.1.0
+ strip-ansi: 6.0.1
+ wcwidth: 1.0.1
+ dev: false
+
+ /os-tmpdir@1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /outvariant@1.4.3:
+ resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==}
+ dev: false
+
+ /p-cancelable@3.0.0:
+ resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==}
+ engines: {node: '>=12.20'}
+
+ /p-defer@4.0.1:
+ resolution: {integrity: sha512-Mr5KC5efvAK5VUptYEIopP1bakB85k2IWXaRC0rsh1uwn1L6M0LVml8OIQ4Gudg4oyZakf7FmeRLkMMtZW1i5A==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-try: 2.2.0
+ dev: false
+
+ /p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ yocto-queue: 0.1.0
+ dev: false
+
+ /p-limit@4.0.0:
+ resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ yocto-queue: 1.1.1
+
+ /p-locate@3.0.0:
+ resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-limit: 2.3.0
+ dev: false
+
+ /p-locate@4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-limit: 2.3.0
+ dev: false
+
+ /p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-limit: 3.1.0
+ dev: false
+
+ /p-locate@6.0.0:
+ resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ p-limit: 4.0.0
+
+ /p-map@4.0.0:
+ resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ aggregate-error: 3.1.0
+ dev: false
+
+ /p-queue@7.4.1:
+ resolution: {integrity: sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==}
+ engines: {node: '>=12'}
+ dependencies:
+ eventemitter3: 5.0.1
+ p-timeout: 5.1.0
+ dev: false
+
+ /p-retry@4.6.2:
+ resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@types/retry': 0.12.0
+ retry: 0.13.1
+ dev: false
+
+ /p-timeout@5.1.0:
+ resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /package-json@8.1.1:
+ resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ got: 12.6.1
+ registry-auth-token: 5.0.2
+ registry-url: 6.0.1
+ semver: 7.6.3
+ dev: false
+
+ /pako@2.1.0:
+ resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==}
+ dev: false
+
+ /param-case@3.0.4:
+ resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.8.1
+ dev: false
+
+ /parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+ dependencies:
+ callsites: 3.1.0
+ dev: false
+
+ /parse-asn1@5.1.7:
+ resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==}
+ engines: {node: '>= 0.10'}
+ dependencies:
+ asn1.js: 4.10.1
+ browserify-aes: 1.2.0
+ evp_bytestokey: 1.0.3
+ hash-base: 3.0.4
+ pbkdf2: 3.1.2
+ safe-buffer: 5.2.1
+ dev: false
+
+ /parse-entities@4.0.1:
+ resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==}
+ dependencies:
+ '@types/unist': 2.0.11
+ character-entities: 2.0.2
+ character-entities-legacy: 3.0.0
+ character-reference-invalid: 2.0.1
+ decode-named-character-reference: 1.0.2
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+ is-hexadecimal: 2.0.1
+
+ /parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ error-ex: 1.3.2
+ json-parse-even-better-errors: 2.3.1
+ lines-and-columns: 1.2.4
+
+ /parse-ms@2.1.0:
+ resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /parse-numeric-range@1.3.0:
+ resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==}
+ dev: false
+
+ /parse5-htmlparser2-tree-adapter@7.1.0:
+ resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==}
+ dependencies:
+ domhandler: 5.0.3
+ parse5: 7.2.1
+ dev: false
+
+ /parse5-parser-stream@7.1.2:
+ resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==}
+ dependencies:
+ parse5: 7.2.1
+ dev: false
+
+ /parse5@7.2.1:
+ resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==}
+ dependencies:
+ entities: 4.5.0
+ dev: false
+
+ /parseurl@1.3.3:
+ resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /pascal-case@3.1.2:
+ resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+ dev: false
+
+ /path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+ dev: false
+
+ /path-exists@3.0.0:
+ resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /path-exists@5.0.0:
+ resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ /path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ /path-is-inside@1.0.2:
+ resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==}
+ dev: false
+
+ /path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ /path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ dev: false
+
+ /path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
+ dependencies:
+ lru-cache: 10.4.3
+ minipass: 7.1.2
+
+ /path-to-regexp@0.1.7:
+ resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
+ dev: false
+
+ /path-to-regexp@1.9.0:
+ resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==}
+ dependencies:
+ isarray: 0.0.1
+ dev: false
+
+ /path-to-regexp@3.3.0:
+ resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==}
+ dev: false
+
+ /path-to-regexp@6.3.0:
+ resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
+ dev: false
+
+ /path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /pathe@1.1.2:
+ resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+ dev: true
+
+ /pathval@1.1.1:
+ resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
+ dev: true
+
+ /pause-stream@0.0.11:
+ resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==}
+ dependencies:
+ through: 2.3.8
+ dev: true
+
+ /pbkdf2@3.1.2:
+ resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==}
+ engines: {node: '>=0.12'}
+ dependencies:
+ create-hash: 1.2.0
+ create-hmac: 1.1.7
+ ripemd160: 2.0.2
+ safe-buffer: 5.2.1
+ sha.js: 2.4.11
+ dev: false
+
+ /pend@1.2.0:
+ resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
+ dev: true
+
+ /perfect-scrollbar@1.5.6:
+ resolution: {integrity: sha512-rixgxw3SxyJbCaSpo1n35A/fwI1r2rdwMKOTCg/AcG+xOEyZcE8UHVjpZMFCVImzsFoCZeJTT+M/rdEIQYO2nw==}
+ dev: false
+
+ /performance-now@2.1.0:
+ resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
+ dev: false
+
+ /picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ /picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ /pify@2.3.0:
+ resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /pkg-dir@7.0.0:
+ resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ find-up: 6.3.0
+ dev: false
+
+ /pkg-types@1.2.1:
+ resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==}
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.7.3
+ pathe: 1.1.2
+ dev: true
+
+ /pkg-up@3.1.0:
+ resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==}
+ engines: {node: '>=8'}
+ dependencies:
+ find-up: 3.0.0
+ dev: false
+
+ /playwright-core@1.39.0:
+ resolution: {integrity: sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==}
+ engines: {node: '>=16'}
+ hasBin: true
+ dev: true
+
+ /playwright@1.39.0:
+ resolution: {integrity: sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==}
+ engines: {node: '>=16'}
+ hasBin: true
+ dependencies:
+ playwright-core: 1.39.0
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /pluralize@8.0.0:
+ resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /pngjs@5.0.0:
+ resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==}
+ engines: {node: '>=10.13.0'}
+ dev: false
+
+ /polished@4.3.1:
+ resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@babel/runtime': 7.26.0
+ dev: false
+
+ /possible-typed-array-names@1.0.0:
+ resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
+ engines: {node: '>= 0.4'}
+ dev: false
+
+ /postcss-calc@9.0.1(postcss@8.4.31):
+ resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-selector-parser: 6.1.2
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-colormin@6.1.0(postcss@8.4.31):
+ resolution: {integrity: sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ browserslist: 4.24.2
+ caniuse-api: 3.0.0
+ colord: 2.9.3
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-convert-values@6.1.0(postcss@8.4.31):
+ resolution: {integrity: sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ browserslist: 4.24.2
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-discard-comments@6.0.2(postcss@8.4.31):
+ resolution: {integrity: sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ dev: false
+
+ /postcss-discard-duplicates@6.0.3(postcss@8.4.31):
+ resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ dev: false
+
+ /postcss-discard-empty@6.0.3(postcss@8.4.31):
+ resolution: {integrity: sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ dev: false
+
+ /postcss-discard-overridden@6.0.2(postcss@8.4.31):
+ resolution: {integrity: sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ dev: false
+
+ /postcss-discard-unused@6.0.5(postcss@8.4.31):
+ resolution: {integrity: sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-selector-parser: 6.1.2
+ dev: false
+
+ /postcss-import@14.1.0(postcss@8.4.31):
+ resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ read-cache: 1.0.0
+ resolve: 1.22.8
+ dev: false
+
+ /postcss-js@3.0.3:
+ resolution: {integrity: sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==}
+ engines: {node: '>=10.0'}
+ dependencies:
+ camelcase-css: 2.0.1
+ postcss: 8.4.31
+ dev: false
+
+ /postcss-js@4.0.1(postcss@8.4.31):
+ resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
+ engines: {node: ^12 || ^14 || >= 16}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ camelcase-css: 2.0.1
+ postcss: 8.4.31
+ dev: false
+
+ /postcss-load-config@3.1.4(postcss@8.4.31):
+ resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==}
+ engines: {node: '>= 10'}
+ peerDependencies:
+ postcss: 8.4.31
+ ts-node: '>=9.0.0'
+ peerDependenciesMeta:
+ postcss:
+ optional: true
+ ts-node:
+ optional: true
+ dependencies:
+ lilconfig: 2.1.0
+ postcss: 8.4.31
+ yaml: 1.10.2
+ dev: false
+
+ /postcss-loader@7.3.4(postcss@8.4.31)(typescript@5.6.3)(webpack@5.96.1):
+ resolution: {integrity: sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==}
+ engines: {node: '>= 14.15.0'}
+ peerDependencies:
+ postcss: 8.4.31
+ webpack: ^5.0.0
+ dependencies:
+ cosmiconfig: 8.3.6(typescript@5.6.3)
+ jiti: 1.21.6
+ postcss: 8.4.31
+ semver: 7.6.3
+ webpack: 5.96.1
+ transitivePeerDependencies:
+ - typescript
+ dev: false
+
+ /postcss-merge-idents@6.0.3(postcss@8.4.31):
+ resolution: {integrity: sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ cssnano-utils: 4.0.2(postcss@8.4.31)
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-merge-longhand@6.0.5(postcss@8.4.31):
+ resolution: {integrity: sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ stylehacks: 6.1.1(postcss@8.4.31)
+ dev: false
+
+ /postcss-merge-rules@6.1.1(postcss@8.4.31):
+ resolution: {integrity: sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ browserslist: 4.24.2
+ caniuse-api: 3.0.0
+ cssnano-utils: 4.0.2(postcss@8.4.31)
+ postcss: 8.4.31
+ postcss-selector-parser: 6.1.2
+ dev: false
+
+ /postcss-minify-font-values@6.1.0(postcss@8.4.31):
+ resolution: {integrity: sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-minify-gradients@6.0.3(postcss@8.4.31):
+ resolution: {integrity: sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ colord: 2.9.3
+ cssnano-utils: 4.0.2(postcss@8.4.31)
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-minify-params@6.1.0(postcss@8.4.31):
+ resolution: {integrity: sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ browserslist: 4.24.2
+ cssnano-utils: 4.0.2(postcss@8.4.31)
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-minify-selectors@6.0.4(postcss@8.4.31):
+ resolution: {integrity: sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-selector-parser: 6.1.2
+ dev: false
+
+ /postcss-modules-extract-imports@3.1.0(postcss@8.4.31):
+ resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ dev: false
+
+ /postcss-modules-local-by-default@4.1.0(postcss@8.4.31):
+ resolution: {integrity: sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ icss-utils: 5.1.0(postcss@8.4.31)
+ postcss: 8.4.31
+ postcss-selector-parser: 7.0.0
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-modules-scope@3.2.1(postcss@8.4.31):
+ resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-selector-parser: 7.0.0
+ dev: false
+
+ /postcss-modules-values@4.0.0(postcss@8.4.31):
+ resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==}
+ engines: {node: ^10 || ^12 || >= 14}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ icss-utils: 5.1.0(postcss@8.4.31)
+ postcss: 8.4.31
+ dev: false
+
+ /postcss-nested@5.0.6(postcss@8.4.31):
+ resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-selector-parser: 6.1.2
+ dev: false
+
+ /postcss-nested@6.0.0(postcss@8.4.31):
+ resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-selector-parser: 6.1.2
+ dev: false
+
+ /postcss-normalize-charset@6.0.2(postcss@8.4.31):
+ resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ dev: false
+
+ /postcss-normalize-display-values@6.0.2(postcss@8.4.31):
+ resolution: {integrity: sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-normalize-positions@6.0.2(postcss@8.4.31):
+ resolution: {integrity: sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-normalize-repeat-style@6.0.2(postcss@8.4.31):
+ resolution: {integrity: sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-normalize-string@6.0.2(postcss@8.4.31):
+ resolution: {integrity: sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-normalize-timing-functions@6.0.2(postcss@8.4.31):
+ resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-normalize-unicode@6.1.0(postcss@8.4.31):
+ resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ browserslist: 4.24.2
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-normalize-url@6.0.2(postcss@8.4.31):
+ resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-normalize-whitespace@6.0.2(postcss@8.4.31):
+ resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-ordered-values@6.0.2(postcss@8.4.31):
+ resolution: {integrity: sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ cssnano-utils: 4.0.2(postcss@8.4.31)
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-reduce-idents@6.0.3(postcss@8.4.31):
+ resolution: {integrity: sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-reduce-initial@6.1.0(postcss@8.4.31):
+ resolution: {integrity: sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ browserslist: 4.24.2
+ caniuse-api: 3.0.0
+ postcss: 8.4.31
+ dev: false
+
+ /postcss-reduce-transforms@6.0.2(postcss@8.4.31):
+ resolution: {integrity: sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ dev: false
+
+ /postcss-selector-parser@6.0.10:
+ resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
+ engines: {node: '>=4'}
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+ dev: false
+
+ /postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+ engines: {node: '>=4'}
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+ dev: false
+
+ /postcss-selector-parser@7.0.0:
+ resolution: {integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+ dev: false
+
+ /postcss-sort-media-queries@5.2.0(postcss@8.4.31):
+ resolution: {integrity: sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ sort-css-media-queries: 2.2.0
+ dev: false
+
+ /postcss-svgo@6.0.3(postcss@8.4.31):
+ resolution: {integrity: sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==}
+ engines: {node: ^14 || ^16 || >= 18}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-value-parser: 4.2.0
+ svgo: 3.3.2
+ dev: false
+
+ /postcss-unique-selectors@6.0.4(postcss@8.4.31):
+ resolution: {integrity: sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ postcss-selector-parser: 6.1.2
+ dev: false
+
+ /postcss-value-parser@3.3.1:
+ resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==}
+ dev: false
+
+ /postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+ dev: false
+
+ /postcss-zindex@6.0.2(postcss@8.4.31):
+ resolution: {integrity: sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ postcss: 8.4.31
+ dev: false
+
+ /postcss@8.4.31:
+ resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ /prelude-ls@1.1.2:
+ resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==}
+ engines: {node: '>= 0.8.0'}
+ dev: false
+
+ /pretty-error@4.0.0:
+ resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==}
+ dependencies:
+ lodash: 4.17.21
+ renderkid: 3.0.0
+ dev: false
+
+ /pretty-format@29.7.0:
+ resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/schemas': 29.6.3
+ ansi-styles: 5.2.0
+ react-is: 18.3.1
+ dev: true
+
+ /pretty-hrtime@1.0.3:
+ resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /pretty-ms@7.0.1:
+ resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ parse-ms: 2.1.0
+ dev: false
+
+ /pretty-time@1.1.0:
+ resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /prism-react-renderer@2.3.1(react@18.2.0):
+ resolution: {integrity: sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==}
+ peerDependencies:
+ react: '>=16.0.0'
+ dependencies:
+ '@types/prismjs': 1.26.5
+ clsx: 2.1.1
+ react: 18.2.0
+ dev: false
+
+ /prismjs@1.29.0:
+ resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+
+ /process@0.11.10:
+ resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+ engines: {node: '>= 0.6.0'}
+ dev: false
+
+ /progress-events@1.0.1:
+ resolution: {integrity: sha512-MOzLIwhpt64KIVN64h1MwdKWiyKFNc/S6BoYKPIVUHFg0/eIEyBulhWCgn678v/4c0ri3FdGuzXymNCv02MUIw==}
+ dev: false
+
+ /progress@2.0.3:
+ resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
+ /prompts@2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
+ dependencies:
+ kleur: 3.0.3
+ sisteransi: 1.0.5
+ dev: false
+
+ /prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+
+ /property-information@6.5.0:
+ resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
+
+ /proto-list@1.2.4:
+ resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
+ dev: false
+
+ /protons-runtime@5.5.0:
+ resolution: {integrity: sha512-EsALjF9QsrEk6gbCx3lmfHxVN0ah7nG3cY7GySD4xf4g8cr7g543zB88Foh897Sr1RQJ9yDCUsoT1i1H/cVUFA==}
+ dependencies:
+ uint8-varint: 2.0.4
+ uint8arraylist: 2.4.8
+ uint8arrays: 5.1.0
+ dev: false
+
+ /proxy-addr@2.0.7:
+ resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+ engines: {node: '>= 0.10'}
+ dependencies:
+ forwarded: 0.2.0
+ ipaddr.js: 1.9.1
+ dev: false
+
+ /proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+ /ps-tree@1.2.0:
+ resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==}
+ engines: {node: '>= 0.10'}
+ hasBin: true
+ dependencies:
+ event-stream: 3.3.4
+ dev: true
+
+ /public-encrypt@4.0.3:
+ resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==}
+ dependencies:
+ bn.js: 4.12.1
+ browserify-rsa: 4.1.1
+ create-hash: 1.2.0
+ parse-asn1: 5.1.7
+ randombytes: 2.1.0
+ safe-buffer: 5.2.1
+ dev: false
+
+ /pump@3.0.2:
+ resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==}
+ dependencies:
+ end-of-stream: 1.4.4
+ once: 1.4.0
+ dev: true
+
+ /punycode@1.4.1:
+ resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
+ dev: false
+
+ /punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ /pupa@3.1.0:
+ resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==}
+ engines: {node: '>=12.20'}
+ dependencies:
+ escape-goat: 4.0.0
+ dev: false
+
+ /puppeteer-core@20.3.0(typescript@5.6.3):
+ resolution: {integrity: sha512-264pBrIui5bO6NJeOcbJrLa0OCwmA4+WK00JMrLIKTfRiqe2gx8KWTzLsjyw/bizErp3TKS7vt/I0i5fTC+mAw==}
+ engines: {node: '>=16.0.0'}
+ peerDependencies:
+ typescript: '>= 4.7.4'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@puppeteer/browsers': 1.3.0(typescript@5.6.3)
+ chromium-bidi: 0.4.9(devtools-protocol@0.0.1120988)
+ cross-fetch: 3.1.6
+ debug: 4.3.4
+ devtools-protocol: 0.0.1120988
+ typescript: 5.6.3
+ ws: 8.13.0
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - supports-color
+ - utf-8-validate
+ dev: true
+
+ /purgecss@4.1.3:
+ resolution: {integrity: sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw==}
+ hasBin: true
+ dependencies:
+ commander: 8.3.0
+ glob: 7.2.3
+ postcss: 8.4.31
+ postcss-selector-parser: 6.1.2
+ dev: false
+
+ /qrcode@1.5.4:
+ resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ dependencies:
+ dijkstrajs: 1.0.3
+ pngjs: 5.0.0
+ yargs: 15.4.1
+ dev: false
+
+ /qs@6.11.0:
+ resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
+ engines: {node: '>=0.6'}
+ dependencies:
+ side-channel: 1.0.6
+ dev: false
+
+ /qs@6.13.0:
+ resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
+ engines: {node: '>=0.6'}
+ dependencies:
+ side-channel: 1.0.6
+ dev: false
+
+ /query-selector-shadow-dom@1.0.1:
+ resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==}
+ dev: true
+
+ /query-string@8.2.0:
+ resolution: {integrity: sha512-tUZIw8J0CawM5wyGBiDOAp7ObdRQh4uBor/fUR9ZjmbZVvw95OD9If4w3MQxr99rg0DJZ/9CIORcpEqU5hQG7g==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ decode-uri-component: 0.4.1
+ filter-obj: 5.1.0
+ split-on-first: 3.0.0
+ dev: false
+
+ /queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ dev: false
+
+ /queue@6.0.2:
+ resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==}
+ dependencies:
+ inherits: 2.0.4
+ dev: false
+
+ /quick-lru@5.1.1:
+ resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
+ engines: {node: '>=10'}
+
+ /rabin-wasm@0.1.5:
+ resolution: {integrity: sha512-uWgQTo7pim1Rnj5TuWcCewRDTf0PEFTSlaUjWP4eY9EbLV9em08v89oCz/WO+wRxpYuO36XEHp4wgYQnAgOHzA==}
+ hasBin: true
+ dependencies:
+ '@assemblyscript/loader': 0.9.4
+ bl: 5.1.0
+ debug: 4.3.7
+ minimist: 1.2.8
+ node-fetch: 2.7.0
+ readable-stream: 3.6.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: false
+
+ /raf@3.4.1:
+ resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==}
+ dependencies:
+ performance-now: 2.1.0
+ dev: false
+
+ /railroad-diagrams@1.0.0:
+ resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==}
+ dev: false
+
+ /randexp@0.4.6:
+ resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==}
+ engines: {node: '>=0.12'}
+ dependencies:
+ discontinuous-range: 1.0.0
+ ret: 0.1.15
+ dev: false
+
+ /randombytes@2.1.0:
+ resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+ dependencies:
+ safe-buffer: 5.2.1
+
+ /randomfill@1.0.4:
+ resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==}
+ dependencies:
+ randombytes: 2.1.0
+ safe-buffer: 5.2.1
+ dev: false
+
+ /range-parser@1.2.0:
+ resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /range-parser@1.2.1:
+ resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /raw-body@2.5.1:
+ resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+ dev: false
+
+ /raw-body@2.5.2:
+ resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
+ engines: {node: '>= 0.8'}
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+ dev: false
+
+ /raw-loader@4.0.2(webpack@5.96.1):
+ resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==}
+ engines: {node: '>= 10.13.0'}
+ peerDependencies:
+ webpack: ^4.0.0 || ^5.0.0
+ dependencies:
+ loader-utils: 2.0.4
+ schema-utils: 3.3.0
+ webpack: 5.96.1
+ dev: false
+
+ /rc@1.2.8:
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+ hasBin: true
+ dependencies:
+ deep-extend: 0.6.0
+ ini: 1.3.8
+ minimist: 1.2.8
+ strip-json-comments: 2.0.1
+ dev: false
+
+ /react-confetti@6.1.0(react@18.2.0):
+ resolution: {integrity: sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==}
+ engines: {node: '>=10.18'}
+ peerDependencies:
+ react: ^16.3.0 || ^17.0.1 || ^18.0.0
+ dependencies:
+ react: 18.2.0
+ tween-functions: 1.2.0
+ dev: false
+
+ /react-dev-utils@12.0.1(typescript@5.6.3)(webpack@5.96.1):
+ resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=2.7'
+ webpack: '>=4'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ address: 1.2.2
+ browserslist: 4.24.2
+ chalk: 4.1.2
+ cross-spawn: 7.0.5
+ detect-port-alt: 1.1.6
+ escape-string-regexp: 4.0.0
+ filesize: 8.0.7
+ find-up: 5.0.0
+ fork-ts-checker-webpack-plugin: 6.5.3(typescript@5.6.3)(webpack@5.96.1)
+ global-modules: 2.0.0
+ globby: 11.1.0
+ gzip-size: 6.0.0
+ immer: 9.0.21
+ is-root: 2.1.0
+ loader-utils: 3.3.1
+ open: 8.4.2
+ pkg-up: 3.1.0
+ prompts: 2.4.2
+ react-error-overlay: 6.0.11
+ recursive-readdir: 2.2.3
+ shell-quote: 1.8.1
+ strip-ansi: 6.0.1
+ text-table: 0.2.0
+ typescript: 5.6.3
+ webpack: 5.96.1
+ transitivePeerDependencies:
+ - eslint
+ - supports-color
+ - vue-template-compiler
+ dev: false
+
+ /react-dom@18.2.0(react@18.2.0):
+ resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
+ peerDependencies:
+ react: ^18.2.0
+ dependencies:
+ loose-envify: 1.4.0
+ react: 18.2.0
+ scheduler: 0.23.2
+
+ /react-error-overlay@6.0.11:
+ resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==}
+ dev: false
+
+ /react-fast-compare@3.2.2:
+ resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==}
+
+ /react-fontawesome@1.7.1(react@18.2.0):
+ resolution: {integrity: sha512-kottReWW1I9Uupub6A5YX4VK7qfpFnEjAcm5zB4Aepst7iofONT27GJYdTcRsj7q5uQu9PXBL7GsxAFKANNUVg==}
+ engines: {node: '>=0.10.0'}
+ peerDependencies:
+ react: '>=0.12.0'
+ dependencies:
+ prop-types: 15.8.1
+ react: 18.2.0
+ dev: false
+
+ /react-helmet-async@1.3.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==}
+ peerDependencies:
+ react: ^16.6.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ '@babel/runtime': 7.26.0
+ invariant: 2.2.4
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-fast-compare: 3.2.2
+ shallowequal: 1.1.0
+
+ /react-helmet-async@2.0.5(react@18.2.0):
+ resolution: {integrity: sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg==}
+ peerDependencies:
+ react: ^16.6.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ invariant: 2.2.4
+ react: 18.2.0
+ react-fast-compare: 3.2.2
+ shallowequal: 1.1.0
+
+ /react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+ /react-is@18.3.1:
+ resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+
+ /react-json-view-lite@1.5.0(react@18.2.0):
+ resolution: {integrity: sha512-nWqA1E4jKPklL2jvHWs6s+7Na0qNgw9HCP6xehdQJeg6nPBTFZgGwyko9Q0oj+jQWKTTVRS30u0toM5wiuL3iw==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ react: ^16.13.1 || ^17.0.0 || ^18.0.0
+ dependencies:
+ react: 18.2.0
+ dev: false
+
+ /react-lifecycles-compat@3.0.4:
+ resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==}
+ dev: false
+
+ /react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0)(webpack@5.96.1):
+ resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==}
+ engines: {node: '>=10.13.0'}
+ peerDependencies:
+ react-loadable: '*'
+ webpack: '>=4.41.1 || 5.x'
+ dependencies:
+ '@babel/runtime': 7.26.0
+ react-loadable: /@docusaurus/react-loadable@6.0.0(react@18.2.0)
+ webpack: 5.96.1
+ dev: false
+
+ /react-markdown@8.0.7(@types/react@18.3.12)(react@18.2.0):
+ resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==}
+ peerDependencies:
+ '@types/react': '>=16'
+ react: '>=16'
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/prop-types': 15.7.13
+ '@types/react': 18.3.12
+ '@types/unist': 2.0.11
+ comma-separated-tokens: 2.0.3
+ hast-util-whitespace: 2.0.1
+ prop-types: 15.8.1
+ property-information: 6.5.0
+ react: 18.2.0
+ react-is: 18.3.1
+ remark-parse: 10.0.2
+ remark-rehype: 10.1.0
+ space-separated-tokens: 2.0.2
+ style-to-object: 0.4.4
+ unified: 10.1.2
+ unist-util-visit: 4.1.2
+ vfile: 5.3.7
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /react-modal@3.16.1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==}
+ engines: {node: '>=8'}
+ peerDependencies:
+ react: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18
+ react-dom: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18
+ dependencies:
+ exenv: 1.2.2
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-lifecycles-compat: 3.0.4
+ warning: 4.0.3
+ dev: false
+
+ /react-player@2.11.2(react@18.2.0):
+ resolution: {integrity: sha512-V5bf3g6lIpOjfKPUw18Og+qfizmlv6PQfJojlFiGpkfn/e21w5U4nSXE8vSIrFkfllgCrLM35nNGR1/jYQ8KIw==}
+ peerDependencies:
+ react: '>=16.6.0'
+ dependencies:
+ deepmerge: 4.3.1
+ load-script: 1.0.0
+ memoize-one: 5.2.1
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-fast-compare: 3.2.2
+ dev: false
+
+ /react-qr-reader@3.0.0-beta-1(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-5HeFH9x/BlziRYQYGK2AeWS9WiKYZtGGMs9DXy3bcySTX3C9UJL9EwcPnWw8vlf7JP4FcrAlr1SnZ5nsWLQGyw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0
+ react-dom: ^16.8.0 || ^17.0.0
+ dependencies:
+ '@zxing/browser': 0.0.7(@zxing/library@0.18.6)
+ '@zxing/library': 0.18.6
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ rollup: 2.79.2
+ dev: false
+
+ /react-router-config@5.1.1(react-router@5.3.4)(react@18.2.0):
+ resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==}
+ peerDependencies:
+ react: '>=15'
+ react-router: '>=5'
+ dependencies:
+ '@babel/runtime': 7.26.0
+ react: 18.2.0
+ react-router: 5.3.4(react@18.2.0)
+ dev: false
+
+ /react-router-dom@5.3.4(react@18.2.0):
+ resolution: {integrity: sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==}
+ peerDependencies:
+ react: '>=15'
+ dependencies:
+ '@babel/runtime': 7.26.0
+ history: 4.10.1
+ loose-envify: 1.4.0
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-router: 5.3.4(react@18.2.0)
+ tiny-invariant: 1.3.3
+ tiny-warning: 1.0.3
+ dev: false
+
+ /react-router@5.3.4(react@18.2.0):
+ resolution: {integrity: sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==}
+ peerDependencies:
+ react: '>=15'
+ dependencies:
+ '@babel/runtime': 7.26.0
+ history: 4.10.1
+ hoist-non-react-statics: 3.3.2
+ loose-envify: 1.4.0
+ path-to-regexp: 1.9.0
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-is: 16.13.1
+ tiny-invariant: 1.3.3
+ tiny-warning: 1.0.3
+ dev: false
+
+ /react-shallow-renderer@16.15.0(react@18.2.0):
+ resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==}
+ peerDependencies:
+ react: ^16.0.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ object-assign: 4.1.1
+ react: 18.2.0
+ react-is: 18.3.1
+ dev: false
+
+ /react-slick@0.29.0(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-TGdOKE+ZkJHHeC4aaoH85m8RnFyWqdqRfAGkhd6dirmATXMZWAxOpTLmw2Ll/jPTQ3eEG7ercFr/sbzdeYCJXA==}
+ peerDependencies:
+ react: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0
+ react-dom: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ classnames: 2.5.1
+ enquire.js: 2.1.6
+ json2mq: 0.2.0
+ lodash.debounce: 4.0.8
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ resize-observer-polyfill: 1.5.1
+ dev: false
+
+ /react-tabs@6.0.2(react@18.2.0):
+ resolution: {integrity: sha512-aQXTKolnM28k3KguGDBSAbJvcowOQr23A+CUJdzJtOSDOtTwzEaJA+1U4KwhNL9+Obe+jFS7geuvA7ICQPXOnQ==}
+ peerDependencies:
+ react: ^18.0.0
+ dependencies:
+ clsx: 2.1.1
+ prop-types: 15.8.1
+ react: 18.2.0
+ dev: false
+
+ /react18-json-view@0.2.8(react@18.2.0):
+ resolution: {integrity: sha512-uJlcf5PEDaba6yTqfcDAcMSYECZ15SLcpP94mLFTa/+fa1kZANjERqKzS7YxxsrGP4+jDxt6sIaglR0PbQcKPw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ dependencies:
+ react: 18.2.0
+ dev: false
+
+ /react@18.2.0:
+ resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ loose-envify: 1.4.0
+
+ /read-cache@1.0.0:
+ resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+ dependencies:
+ pify: 2.3.0
+ dev: false
+
+ /read-pkg-up@9.1.0:
+ resolution: {integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ find-up: 6.3.0
+ read-pkg: 7.1.0
+ type-fest: 2.19.0
+ dev: true
+
+ /read-pkg@7.1.0:
+ resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==}
+ engines: {node: '>=12.20'}
+ dependencies:
+ '@types/normalize-package-data': 2.4.4
+ normalize-package-data: 3.0.3
+ parse-json: 5.2.0
+ type-fest: 2.19.0
+ dev: true
+
+ /readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+ dependencies:
+ core-util-is: 1.0.3
+ inherits: 2.0.4
+ isarray: 1.0.0
+ process-nextick-args: 2.0.1
+ safe-buffer: 5.1.2
+ string_decoder: 1.1.1
+ util-deprecate: 1.0.2
+
+ /readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ /readable-stream@4.4.2:
+ resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ abort-controller: 3.0.0
+ buffer: 6.0.3
+ events: 3.3.0
+ process: 0.11.10
+ string_decoder: 1.3.0
+ dev: false
+
+ /readable-stream@4.5.2:
+ resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ abort-controller: 3.0.0
+ buffer: 6.0.3
+ events: 3.3.0
+ process: 0.11.10
+ string_decoder: 1.3.0
+ dev: false
+
+ /readable-web-to-node-stream@3.0.2:
+ resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==}
+ engines: {node: '>=8'}
+ dependencies:
+ readable-stream: 3.6.2
+ dev: false
+
+ /readdir-glob@1.1.3:
+ resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==}
+ dependencies:
+ minimatch: 5.1.6
+ dev: true
+
+ /readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ picomatch: 2.3.1
+ dev: false
+
+ /reading-time@1.5.0:
+ resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==}
+ dev: false
+
+ /realistic-structured-clone@3.0.0:
+ resolution: {integrity: sha512-rOjh4nuWkAqf9PWu6JVpOWD4ndI+JHfgiZeMmujYcPi+fvILUu7g6l26TC1K5aBIp34nV+jE1cDO75EKOfHC5Q==}
+ dependencies:
+ domexception: 1.0.1
+ typeson: 6.1.0
+ typeson-registry: 1.0.0-alpha.39
+ dev: true
+
+ /rechoir@0.6.2:
+ resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==}
+ engines: {node: '>= 0.10'}
+ dependencies:
+ resolve: 1.22.8
+ dev: false
+
+ /recma-build-jsx@1.0.0:
+ resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==}
+ dependencies:
+ '@types/estree': 1.0.6
+ estree-util-build-jsx: 3.0.1
+ vfile: 6.0.3
+
+ /recma-jsx@1.0.0(acorn@8.14.0):
+ resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==}
+ dependencies:
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ estree-util-to-js: 2.0.0
+ recma-parse: 1.0.0
+ recma-stringify: 1.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - acorn
+
+ /recma-parse@1.0.0:
+ resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==}
+ dependencies:
+ '@types/estree': 1.0.6
+ esast-util-from-js: 2.0.1
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ /recma-stringify@1.0.0:
+ resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==}
+ dependencies:
+ '@types/estree': 1.0.6
+ estree-util-to-js: 2.0.0
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ /recursive-readdir@2.2.3:
+ resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ minimatch: 3.1.2
+ dev: false
+
+ /redoc@2.1.5(core-js@3.39.0)(enzyme@3.11.0)(mobx@6.13.5)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.13):
+ resolution: {integrity: sha512-POSbVg+7WLf+/5/c6GWLxL7+9t2D+1WlZdLN0a6qaCQc+ih3XYzteRBkXEN5kjrYrRNjdspfxTZkDLN5WV3Tzg==}
+ engines: {node: '>=6.9', npm: '>=3.0.0'}
+ peerDependencies:
+ core-js: ^3.1.4
+ mobx: ^6.0.4
+ react: ^16.8.4 || ^17.0.0 || ^18.0.0
+ react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0
+ styled-components: ^4.1.1 || ^5.1.1 || ^6.0.5
+ dependencies:
+ '@cfaester/enzyme-adapter-react-18': 0.8.0(enzyme@3.11.0)(react-dom@18.2.0)(react@18.2.0)
+ '@redocly/openapi-core': 1.16.0
+ classnames: 2.5.1
+ core-js: 3.39.0
+ decko: 1.2.0
+ dompurify: 3.2.0
+ eventemitter3: 5.0.1
+ json-pointer: 0.6.2
+ lunr: 2.3.9
+ mark.js: 8.11.1
+ marked: 4.3.0
+ mobx: 6.13.5
+ mobx-react: 9.1.1(mobx@6.13.5)(react-dom@18.2.0)(react@18.2.0)
+ openapi-sampler: 1.5.1
+ path-browserify: 1.0.1
+ perfect-scrollbar: 1.5.6
+ polished: 4.3.1
+ prismjs: 1.29.0
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ react-tabs: 6.0.2(react@18.2.0)
+ slugify: 1.4.7
+ stickyfill: 1.1.1
+ styled-components: 6.1.13(react-dom@18.2.0)(react@18.2.0)
+ swagger2openapi: 7.0.8
+ url-template: 2.0.8
+ transitivePeerDependencies:
+ - encoding
+ - enzyme
+ - react-native
+ - supports-color
+ dev: false
+
+ /redocusaurus@2.1.1(@docusaurus/theme-common@3.5.2)(@docusaurus/utils@3.5.2)(core-js@3.39.0)(enzyme@3.11.0)(mobx@6.13.5)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.13)(webpack@5.96.1):
+ resolution: {integrity: sha512-uaiuSsty0TcYuibabEw72DzN5JL6eF9KTIR5dL61qP7smFwIY8THEsNogzKTfcKCb6MJ8ug4vohrnrANn3K3cg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ '@docusaurus/theme-common': ^3.0.0
+ '@docusaurus/utils': ^3.0.0
+ dependencies:
+ '@docusaurus/theme-common': 3.5.2(@docusaurus/plugin-content-docs@3.6.1)(@docusaurus/types@3.5.2)(acorn@8.14.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.6.3)
+ '@docusaurus/utils': 3.5.2(@docusaurus/types@3.5.2)(typescript@5.6.3)
+ docusaurus-plugin-redoc: 2.1.1(@docusaurus/utils@3.5.2)(core-js@3.39.0)(enzyme@3.11.0)(mobx@6.13.5)(react-dom@18.2.0)(react@18.2.0)(styled-components@6.1.13)
+ docusaurus-theme-redoc: 2.1.1(@docusaurus/theme-common@3.5.2)(core-js@3.39.0)(enzyme@3.11.0)(react-dom@18.2.0)(react@18.2.0)(webpack@5.96.1)
+ transitivePeerDependencies:
+ - core-js
+ - encoding
+ - enzyme
+ - mobx
+ - react
+ - react-dom
+ - react-native
+ - styled-components
+ - supports-color
+ - webpack
+ dev: false
+
+ /reduce-css-calc@2.1.8:
+ resolution: {integrity: sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==}
+ dependencies:
+ css-unit-converter: 1.1.2
+ postcss-value-parser: 3.3.1
+ dev: false
+
+ /reftools@1.1.9:
+ resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==}
+ dev: false
+
+ /regenerate-unicode-properties@10.2.0:
+ resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==}
+ engines: {node: '>=4'}
+ dependencies:
+ regenerate: 1.4.2
+ dev: false
+
+ /regenerate@1.4.2:
+ resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
+ dev: false
+
+ /regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+ /regenerator-transform@0.15.2:
+ resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
+ dependencies:
+ '@babel/runtime': 7.26.0
+ dev: false
+
+ /regexp-to-ast@0.5.0:
+ resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==}
+ dev: false
+
+ /regexp.prototype.flags@1.5.3:
+ resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-errors: 1.3.0
+ set-function-name: 2.0.2
+ dev: false
+
+ /regexpu-core@6.1.1:
+ resolution: {integrity: sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==}
+ engines: {node: '>=4'}
+ dependencies:
+ regenerate: 1.4.2
+ regenerate-unicode-properties: 10.2.0
+ regjsgen: 0.8.0
+ regjsparser: 0.11.2
+ unicode-match-property-ecmascript: 2.0.0
+ unicode-match-property-value-ecmascript: 2.2.0
+ dev: false
+
+ /registry-auth-token@5.0.2:
+ resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==}
+ engines: {node: '>=14'}
+ dependencies:
+ '@pnpm/npm-conf': 2.3.1
+ dev: false
+
+ /registry-url@6.0.1:
+ resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==}
+ engines: {node: '>=12'}
+ dependencies:
+ rc: 1.2.8
+ dev: false
+
+ /regjsgen@0.8.0:
+ resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==}
+ dev: false
+
+ /regjsparser@0.11.2:
+ resolution: {integrity: sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==}
+ hasBin: true
+ dependencies:
+ jsesc: 3.0.2
+ dev: false
+
+ /rehype-raw@7.0.0:
+ resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==}
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-raw: 9.1.0
+ vfile: 6.0.3
+ dev: false
+
+ /rehype-recma@1.0.0:
+ resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==}
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/hast': 3.0.4
+ hast-util-to-estree: 3.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /relateurl@0.2.7:
+ resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
+ engines: {node: '>= 0.10'}
+ dev: false
+
+ /remark-directive@3.0.0:
+ resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-directive: 3.0.0
+ micromark-extension-directive: 3.0.2
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /remark-emoji@4.0.1:
+ resolution: {integrity: sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ '@types/mdast': 4.0.4
+ emoticon: 4.1.0
+ mdast-util-find-and-replace: 3.0.1
+ node-emoji: 2.1.3
+ unified: 11.0.5
+ dev: false
+
+ /remark-frontmatter@5.0.0:
+ resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-frontmatter: 2.0.1
+ micromark-extension-frontmatter: 2.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /remark-gfm@4.0.0:
+ resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-gfm: 3.0.0
+ micromark-extension-gfm: 3.0.0
+ remark-parse: 11.0.0
+ remark-stringify: 11.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /remark-mdx@3.1.0:
+ resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==}
+ dependencies:
+ mdast-util-mdx: 3.0.0
+ micromark-extension-mdxjs: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /remark-parse@10.0.2:
+ resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==}
+ dependencies:
+ '@types/mdast': 3.0.15
+ mdast-util-from-markdown: 1.3.1
+ unified: 10.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /remark-parse@11.0.0:
+ resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.2
+ micromark-util-types: 2.0.1
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ /remark-rehype@10.1.0:
+ resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==}
+ dependencies:
+ '@types/hast': 2.3.10
+ '@types/mdast': 3.0.15
+ mdast-util-to-hast: 12.3.0
+ unified: 10.1.2
+ dev: false
+
+ /remark-rehype@11.1.1:
+ resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==}
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ mdast-util-to-hast: 13.2.0
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ /remark-stringify@11.0.0:
+ resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-to-markdown: 2.1.2
+ unified: 11.0.5
+ dev: false
+
+ /renderkid@3.0.0:
+ resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==}
+ dependencies:
+ css-select: 4.3.0
+ dom-converter: 0.2.0
+ htmlparser2: 6.1.0
+ lodash: 4.17.21
+ strip-ansi: 6.0.1
+ dev: false
+
+ /repeat-string@1.6.1:
+ resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
+ engines: {node: '>=0.10'}
+ dev: false
+
+ /require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ /require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /require-like@0.1.2:
+ resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==}
+ dev: false
+
+ /require-main-filename@2.0.0:
+ resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
+ dev: false
+
+ /requires-port@1.0.0:
+ resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+ dev: false
+
+ /resize-observer-polyfill@1.5.1:
+ resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
+ dev: false
+
+ /resolve-alpn@1.2.1:
+ resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
+
+ /resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /resolve-pathname@3.0.0:
+ resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==}
+ dev: false
+
+ /resolve@1.22.8:
+ resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.15.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: false
+
+ /responselike@3.0.0:
+ resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ lowercase-keys: 3.0.0
+
+ /resq@1.11.0:
+ resolution: {integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==}
+ dependencies:
+ fast-deep-equal: 2.0.1
+ dev: true
+
+ /restore-cursor@3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ dev: false
+
+ /ret@0.1.15:
+ resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
+ engines: {node: '>=0.12'}
+ dev: false
+
+ /retry@0.13.1:
+ resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
+ engines: {node: '>= 4'}
+ dev: false
+
+ /reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ dev: false
+
+ /rgb-regex@1.0.1:
+ resolution: {integrity: sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==}
+ dev: false
+
+ /rgb2hex@0.2.5:
+ resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==}
+ dev: true
+
+ /rgba-regex@1.0.0:
+ resolution: {integrity: sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==}
+ dev: false
+
+ /rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ deprecated: Rimraf versions prior to v4 are no longer supported
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: false
+
+ /rimraf@5.0.5:
+ resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==}
+ engines: {node: '>=14'}
+ hasBin: true
+ dependencies:
+ glob: 10.3.10
+
+ /ripemd160@2.0.2:
+ resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
+ dependencies:
+ hash-base: 3.1.0
+ inherits: 2.0.4
+ dev: false
+
+ /robust-predicates@3.0.2:
+ resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==}
+ dev: false
+
+ /rollup@2.79.2:
+ resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ /rollup@4.26.0:
+ resolution: {integrity: sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+ dependencies:
+ '@types/estree': 1.0.6
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.26.0
+ '@rollup/rollup-android-arm64': 4.26.0
+ '@rollup/rollup-darwin-arm64': 4.26.0
+ '@rollup/rollup-darwin-x64': 4.26.0
+ '@rollup/rollup-freebsd-arm64': 4.26.0
+ '@rollup/rollup-freebsd-x64': 4.26.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.26.0
+ '@rollup/rollup-linux-arm-musleabihf': 4.26.0
+ '@rollup/rollup-linux-arm64-gnu': 4.26.0
+ '@rollup/rollup-linux-arm64-musl': 4.26.0
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.26.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.26.0
+ '@rollup/rollup-linux-s390x-gnu': 4.26.0
+ '@rollup/rollup-linux-x64-gnu': 4.26.0
+ '@rollup/rollup-linux-x64-musl': 4.26.0
+ '@rollup/rollup-win32-arm64-msvc': 4.26.0
+ '@rollup/rollup-win32-ia32-msvc': 4.26.0
+ '@rollup/rollup-win32-x64-msvc': 4.26.0
+ fsevents: 2.3.3
+ dev: true
+
+ /rst-selector-parser@2.2.3:
+ resolution: {integrity: sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==}
+ dependencies:
+ lodash.flattendeep: 4.4.0
+ nearley: 2.20.1
+ dev: false
+
+ /rtl-detect@1.1.2:
+ resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==}
+ dev: false
+
+ /rtlcss@4.3.0:
+ resolution: {integrity: sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==}
+ engines: {node: '>=12.0.0'}
+ hasBin: true
+ dependencies:
+ escalade: 3.2.0
+ picocolors: 1.1.1
+ postcss: 8.4.31
+ strip-json-comments: 3.1.1
+ dev: false
+
+ /run-async@2.4.1:
+ resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==}
+ engines: {node: '>=0.12.0'}
+ dev: false
+
+ /run-parallel-limit@1.1.0:
+ resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==}
+ dependencies:
+ queue-microtask: 1.2.3
+ dev: false
+
+ /run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+ dev: false
+
+ /rw@1.3.3:
+ resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==}
+ dev: false
+
+ /rxjs@7.8.1:
+ resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+ dependencies:
+ tslib: 2.8.1
+
+ /sade@1.8.1:
+ resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
+ engines: {node: '>=6'}
+ dependencies:
+ mri: 1.2.0
+ dev: false
+
+ /safe-array-concat@1.1.2:
+ resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
+ engines: {node: '>=0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
+ has-symbols: 1.0.3
+ isarray: 2.0.5
+ dev: false
+
+ /safe-buffer@5.1.2:
+ resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+
+ /safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ /safe-regex-test@1.0.3:
+ resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-regex: 1.1.4
+ dev: false
+
+ /safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ dev: false
+
+ /sax@1.4.1:
+ resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
+ dev: false
+
+ /scheduler@0.23.2:
+ resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+ dependencies:
+ loose-envify: 1.4.0
+
+ /schema-utils@2.7.0:
+ resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==}
+ engines: {node: '>= 8.9.0'}
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 6.12.6
+ ajv-keywords: 3.5.2(ajv@6.12.6)
+ dev: false
+
+ /schema-utils@3.3.0:
+ resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
+ engines: {node: '>= 10.13.0'}
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 6.12.6
+ ajv-keywords: 3.5.2(ajv@6.12.6)
+
+ /schema-utils@4.2.0:
+ resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==}
+ engines: {node: '>= 12.13.0'}
+ dependencies:
+ '@types/json-schema': 7.0.15
+ ajv: 8.17.1
+ ajv-formats: 2.1.1(ajv@8.17.1)
+ ajv-keywords: 5.1.0(ajv@8.17.1)
+ dev: false
+
+ /search-insights@2.17.2:
+ resolution: {integrity: sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==}
+ dev: false
+
+ /section-matter@1.0.0:
+ resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
+ engines: {node: '>=4'}
+ dependencies:
+ extend-shallow: 2.0.1
+ kind-of: 6.0.3
+ dev: false
+
+ /select-hose@2.0.0:
+ resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==}
+ dev: false
+
+ /selfsigned@2.4.1:
+ resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@types/node-forge': 1.3.11
+ node-forge: 1.3.1
+ dev: false
+
+ /semver-diff@4.0.0:
+ resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==}
+ engines: {node: '>=12'}
+ dependencies:
+ semver: 7.6.3
+ dev: false
+
+ /semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ /semver@7.6.3:
+ resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ /send@0.18.0:
+ resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 0.5.2
+ http-errors: 2.0.0
+ mime: 1.6.0
+ ms: 2.1.3
+ on-finished: 2.4.1
+ range-parser: 1.2.1
+ statuses: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /serialize-error@8.1.0:
+ resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ type-fest: 0.20.2
+ dev: true
+
+ /serialize-javascript@6.0.2:
+ resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==}
+ dependencies:
+ randombytes: 2.1.0
+
+ /serve-handler@6.1.6:
+ resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==}
+ dependencies:
+ bytes: 3.0.0
+ content-disposition: 0.5.2
+ mime-types: 2.1.18
+ minimatch: 3.1.2
+ path-is-inside: 1.0.2
+ path-to-regexp: 3.3.0
+ range-parser: 1.2.0
+ dev: false
+
+ /serve-index@1.9.1:
+ resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ accepts: 1.3.8
+ batch: 0.6.1
+ debug: 2.6.9
+ escape-html: 1.0.3
+ http-errors: 1.6.3
+ mime-types: 2.1.35
+ parseurl: 1.3.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /serve-static@1.15.0:
+ resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 0.18.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /set-blocking@2.0.0:
+ resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+ dev: false
+
+ /set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.4
+ gopd: 1.0.1
+ has-property-descriptors: 1.0.2
+ dev: false
+
+ /set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+ dev: false
+
+ /setprototypeof@1.1.0:
+ resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==}
+ dev: false
+
+ /setprototypeof@1.2.0:
+ resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+ dev: false
+
+ /sha.js@2.4.11:
+ resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==}
+ hasBin: true
+ dependencies:
+ inherits: 2.0.4
+ safe-buffer: 5.2.1
+ dev: false
+
+ /shallow-clone@3.0.1:
+ resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==}
+ engines: {node: '>=8'}
+ dependencies:
+ kind-of: 6.0.3
+
+ /shallowequal@1.1.0:
+ resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
+
+ /shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+ dependencies:
+ shebang-regex: 3.0.0
+
+ /shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ /shell-quote@1.8.1:
+ resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==}
+ dev: false
+
+ /shelljs@0.8.5:
+ resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ interpret: 1.4.0
+ rechoir: 0.6.2
+ dev: false
+
+ /shnip@0.0.3-alpha:
+ resolution: {integrity: sha512-s6JQdjIy47zAliKHTFlmLhygZng1ya00ZvZO3eDsQhVN8rWIz8ipIytdXCqNQPXcN3XhIsxOVOZMVUol7xM9dg==}
+ hasBin: true
+ dependencies:
+ rimraf: 5.0.5
+ dev: false
+
+ /should-equal@2.0.0:
+ resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==}
+ dependencies:
+ should-type: 1.4.0
+ dev: false
+
+ /should-format@3.0.3:
+ resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==}
+ dependencies:
+ should-type: 1.4.0
+ should-type-adaptors: 1.1.0
+ dev: false
+
+ /should-type-adaptors@1.1.0:
+ resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==}
+ dependencies:
+ should-type: 1.4.0
+ should-util: 1.0.1
+ dev: false
+
+ /should-type@1.4.0:
+ resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==}
+ dev: false
+
+ /should-util@1.0.1:
+ resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==}
+ dev: false
+
+ /should@13.2.3:
+ resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==}
+ dependencies:
+ should-equal: 2.0.0
+ should-format: 3.0.3
+ should-type: 1.4.0
+ should-type-adaptors: 1.1.0
+ should-util: 1.0.1
+ dev: false
+
+ /side-channel@1.0.6:
+ resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ object-inspect: 1.13.3
+ dev: false
+
+ /siginfo@2.0.0:
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+ dev: true
+
+ /signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+ /signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ /simple-swizzle@0.2.2:
+ resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
+ dependencies:
+ is-arrayish: 0.3.2
+ dev: false
+
+ /sirv@2.0.4:
+ resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==}
+ engines: {node: '>= 10'}
+ dependencies:
+ '@polka/url': 1.0.0-next.28
+ mrmime: 2.0.0
+ totalist: 3.0.1
+
+ /sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+ dev: false
+
+ /sitemap@7.1.2:
+ resolution: {integrity: sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==}
+ engines: {node: '>=12.0.0', npm: '>=5.6.0'}
+ hasBin: true
+ dependencies:
+ '@types/node': 17.0.45
+ '@types/sax': 1.2.7
+ arg: 5.0.2
+ sax: 1.4.1
+ dev: false
+
+ /skin-tone@2.0.0:
+ resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==}
+ engines: {node: '>=8'}
+ dependencies:
+ unicode-emoji-modifier-base: 1.0.0
+ dev: false
+
+ /slash@3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /slash@4.0.0:
+ resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /slick-carousel@1.8.1(jquery@3.7.1):
+ resolution: {integrity: sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==}
+ peerDependencies:
+ jquery: '>=1.8.0'
+ dependencies:
+ jquery: 3.7.1
+ dev: false
+
+ /slugify@1.4.7:
+ resolution: {integrity: sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg==}
+ engines: {node: '>=8.0.0'}
+ dev: false
+
+ /snake-case@3.0.4:
+ resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.8.1
+ dev: false
+
+ /sockjs@0.3.24:
+ resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==}
+ dependencies:
+ faye-websocket: 0.11.4
+ uuid: 8.3.2
+ websocket-driver: 0.7.4
+ dev: false
+
+ /sort-css-media-queries@2.2.0:
+ resolution: {integrity: sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==}
+ engines: {node: '>= 6.3.0'}
+ dev: false
+
+ /source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ /source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ /source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ /source-map@0.7.4:
+ resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+ engines: {node: '>= 8'}
+
+ /space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
+ /sparse-array@1.3.2:
+ resolution: {integrity: sha512-ZT711fePGn3+kQyLuv1fpd3rNSkNF8vd5Kv2D+qnOANeyKs3fx6bUMGWRPvgTTcYV64QMqZKZwcuaQSP3AZ0tg==}
+ dev: false
+
+ /spdx-correct@3.2.0:
+ resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+ dependencies:
+ spdx-expression-parse: 3.0.1
+ spdx-license-ids: 3.0.20
+ dev: true
+
+ /spdx-exceptions@2.5.0:
+ resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
+ dev: true
+
+ /spdx-expression-parse@3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+ dependencies:
+ spdx-exceptions: 2.5.0
+ spdx-license-ids: 3.0.20
+ dev: true
+
+ /spdx-license-ids@3.0.20:
+ resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==}
+ dev: true
+
+ /spdy-transport@3.0.0:
+ resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==}
+ dependencies:
+ debug: 4.3.7
+ detect-node: 2.1.0
+ hpack.js: 2.1.6
+ obuf: 1.1.2
+ readable-stream: 3.6.2
+ wbuf: 1.7.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /spdy@4.0.2:
+ resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ debug: 4.3.7
+ handle-thing: 2.0.1
+ http-deceiver: 1.2.7
+ select-hose: 2.0.0
+ spdy-transport: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /split-on-first@3.0.0:
+ resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /split@0.3.3:
+ resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==}
+ dependencies:
+ through: 2.3.8
+ dev: true
+
+ /sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+ dev: false
+
+ /srcset@4.0.0:
+ resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /stackback@0.0.2:
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+ dev: true
+
+ /start-server-and-test@2.0.3:
+ resolution: {integrity: sha512-QsVObjfjFZKJE6CS6bSKNwWZCKBG6975/jKRPPGFfFh+yOQglSeGXiNWjzgQNXdphcBI9nXbyso9tPfX4YAUhg==}
+ engines: {node: '>=16'}
+ hasBin: true
+ dependencies:
+ arg: 5.0.2
+ bluebird: 3.7.2
+ check-more-types: 2.24.0
+ debug: 4.3.4
+ execa: 5.1.1
+ lazy-ass: 1.6.0
+ ps-tree: 1.2.0
+ wait-on: 7.2.0(debug@4.3.4)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /static-eval@2.0.2:
+ resolution: {integrity: sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==}
+ dependencies:
+ escodegen: 1.14.3
+ dev: false
+
+ /statuses@1.5.0:
+ resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /statuses@2.0.1:
+ resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /std-env@3.8.0:
+ resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==}
+
+ /stickyfill@1.1.1:
+ resolution: {integrity: sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA==}
+ dev: false
+
+ /stream-browserify@3.0.0:
+ resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==}
+ dependencies:
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ dev: false
+
+ /stream-combiner@0.0.4:
+ resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==}
+ dependencies:
+ duplexer: 0.1.2
+ dev: true
+
+ /strict-event-emitter@0.5.1:
+ resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==}
+ dev: false
+
+ /string-convert@0.2.1:
+ resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==}
+ dev: false
+
+ /string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ /string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.1.0
+
+ /string.prototype.matchall@4.0.11:
+ resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.4
+ es-errors: 1.3.0
+ es-object-atoms: 1.0.0
+ get-intrinsic: 1.2.4
+ gopd: 1.0.1
+ has-symbols: 1.0.3
+ internal-slot: 1.0.7
+ regexp.prototype.flags: 1.5.3
+ set-function-name: 2.0.2
+ side-channel: 1.0.6
+ dev: false
+
+ /string.prototype.trim@1.2.9:
+ resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.4
+ es-object-atoms: 1.0.0
+ dev: false
+
+ /string.prototype.trimend@1.0.8:
+ resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: false
+
+ /string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: false
+
+ /string_decoder@1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+ dependencies:
+ safe-buffer: 5.1.2
+
+ /string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+ dependencies:
+ safe-buffer: 5.2.1
+
+ /stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+ dependencies:
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
+
+ /stringify-object@3.3.0:
+ resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==}
+ engines: {node: '>=4'}
+ dependencies:
+ get-own-enumerable-property-symbols: 3.0.2
+ is-obj: 1.0.1
+ is-regexp: 1.0.0
+ dev: false
+
+ /strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-regex: 5.0.1
+
+ /strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-regex: 6.1.0
+
+ /strip-bom-string@1.0.0:
+ resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /strip-final-newline@2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+
+ /strip-json-comments@2.0.1:
+ resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+ dev: false
+
+ /strip-literal@1.3.0:
+ resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==}
+ dependencies:
+ acorn: 8.14.0
+ dev: true
+
+ /strnum@1.0.5:
+ resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
+ dev: false
+
+ /style-to-object@0.4.4:
+ resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==}
+ dependencies:
+ inline-style-parser: 0.1.1
+
+ /style-to-object@1.0.8:
+ resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==}
+ dependencies:
+ inline-style-parser: 0.2.4
+
+ /styled-components@6.1.13(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==}
+ engines: {node: '>= 16'}
+ peerDependencies:
+ react: '>= 16.8.0'
+ react-dom: '>= 16.8.0'
+ dependencies:
+ '@emotion/is-prop-valid': 1.2.2
+ '@emotion/unitless': 0.8.1
+ '@types/stylis': 4.2.5
+ css-to-react-native: 3.2.0
+ csstype: 3.1.3
+ postcss: 8.4.31
+ react: 18.2.0
+ react-dom: 18.2.0(react@18.2.0)
+ shallowequal: 1.1.0
+ stylis: 4.3.2
+ tslib: 2.6.2
+ dev: false
+
+ /stylehacks@6.1.1(postcss@8.4.31):
+ resolution: {integrity: sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==}
+ engines: {node: ^14 || ^16 || >=18.0}
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ browserslist: 4.24.2
+ postcss: 8.4.31
+ postcss-selector-parser: 6.1.2
+ dev: false
+
+ /stylis@4.3.2:
+ resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==}
+ dev: false
+
+ /stylis@4.3.4:
+ resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==}
+ dev: false
+
+ /supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+
+ /supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ has-flag: 4.0.0
+
+ /supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+ dev: false
+
+ /svg-parser@2.0.4:
+ resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
+ dev: false
+
+ /svgo@3.3.2:
+ resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+ dependencies:
+ '@trysound/sax': 0.2.0
+ commander: 7.2.0
+ css-select: 5.1.0
+ css-tree: 2.3.1
+ css-what: 6.1.0
+ csso: 5.0.5
+ picocolors: 1.1.1
+ dev: false
+
+ /swagger2openapi@7.0.8:
+ resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==}
+ hasBin: true
+ dependencies:
+ call-me-maybe: 1.0.2
+ node-fetch: 2.7.0
+ node-fetch-h2: 2.3.0
+ node-readfiles: 0.2.0
+ oas-kit-common: 1.0.8
+ oas-resolver: 2.5.6
+ oas-schema-walker: 1.1.5
+ oas-validator: 5.0.8
+ reftools: 1.1.9
+ yaml: 1.10.2
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - encoding
+ dev: false
+
+ /tailwind-component-classes@2.0.4(tailwindcss@3.2.7):
+ resolution: {integrity: sha512-7ZNg3erY4PK+VotawQm2QMAIZmCSP+noze6QTePZ1F9AVNoC9LvkBgyuf1XkHXx5mndbYo0F1ycMg9oCHIp5yw==}
+ peerDependencies:
+ tailwindcss: ^1.0 || ^2.0
+ dependencies:
+ tailwind-merge: 0.9.0
+ tailwindcss: 3.2.7(postcss@8.4.31)
+ dev: false
+
+ /tailwind-merge@0.9.0:
+ resolution: {integrity: sha512-nHI0CoAAais8+0lwIiDposkhmdr4ejRVZxJH8bzZFbB7d6/jkciyl9lgHmkNpCJ0MMYi4Xg8JjHXZX7/67g3Tw==}
+ dependencies:
+ hashlru: 2.3.0
+ dev: false
+
+ /tailwindcss@2.2.15(autoprefixer@10.3.4)(postcss@8.4.31):
+ resolution: {integrity: sha512-WgV41xTMbnSoTNMNnJvShQZ+8GmY86DmXTrCgnsveNZJdlybfwCItV8kAqjYmU49YiFr+ofzmT1JlAKajBZboQ==}
+ engines: {node: '>=12.13.0'}
+ hasBin: true
+ peerDependencies:
+ autoprefixer: ^10.0.2
+ postcss: 8.4.31
+ dependencies:
+ arg: 5.0.2
+ autoprefixer: 10.3.4(postcss@8.4.31)
+ bytes: 3.1.2
+ chalk: 4.1.2
+ chokidar: 3.6.0
+ color: 4.2.3
+ cosmiconfig: 7.1.0
+ detective: 5.2.1
+ didyoumean: 1.2.2
+ dlv: 1.1.3
+ fast-glob: 3.3.2
+ fs-extra: 10.1.0
+ glob-parent: 6.0.2
+ html-tags: 3.3.1
+ is-color-stop: 1.1.0
+ is-glob: 4.0.3
+ lodash: 4.17.21
+ lodash.topath: 4.5.2
+ modern-normalize: 1.1.0
+ node-emoji: 1.11.0
+ normalize-path: 3.0.0
+ object-hash: 2.2.0
+ postcss: 8.4.31
+ postcss-js: 3.0.3
+ postcss-load-config: 3.1.4(postcss@8.4.31)
+ postcss-nested: 5.0.6(postcss@8.4.31)
+ postcss-selector-parser: 6.1.2
+ postcss-value-parser: 4.2.0
+ pretty-hrtime: 1.0.3
+ purgecss: 4.1.3
+ quick-lru: 5.1.1
+ reduce-css-calc: 2.1.8
+ resolve: 1.22.8
+ tmp: 0.2.3
+ transitivePeerDependencies:
+ - ts-node
+ dev: false
+
+ /tailwindcss@3.2.7(postcss@8.4.31):
+ resolution: {integrity: sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==}
+ engines: {node: '>=12.13.0'}
+ hasBin: true
+ peerDependencies:
+ postcss: 8.4.31
+ dependencies:
+ arg: 5.0.2
+ chokidar: 3.6.0
+ color-name: 1.1.4
+ detective: 5.2.1
+ didyoumean: 1.2.2
+ dlv: 1.1.3
+ fast-glob: 3.3.2
+ glob-parent: 6.0.2
+ is-glob: 4.0.3
+ lilconfig: 2.1.0
+ micromatch: 4.0.8
+ normalize-path: 3.0.0
+ object-hash: 3.0.0
+ picocolors: 1.1.1
+ postcss: 8.4.31
+ postcss-import: 14.1.0(postcss@8.4.31)
+ postcss-js: 4.0.1(postcss@8.4.31)
+ postcss-load-config: 3.1.4(postcss@8.4.31)
+ postcss-nested: 6.0.0(postcss@8.4.31)
+ postcss-selector-parser: 6.1.2
+ postcss-value-parser: 4.2.0
+ quick-lru: 5.1.1
+ resolve: 1.22.8
+ transitivePeerDependencies:
+ - ts-node
+ dev: false
+
+ /tapable@1.1.3:
+ resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==}
+ engines: {node: '>=6'}
+ dev: false
+
+ /tapable@2.2.1:
+ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+ engines: {node: '>=6'}
+
+ /tar-fs@2.1.1:
+ resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==}
+ dependencies:
+ chownr: 1.1.4
+ mkdirp-classic: 0.5.3
+ pump: 3.0.2
+ tar-stream: 2.2.0
+ dev: true
+
+ /tar-stream@2.2.0:
+ resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
+ engines: {node: '>=6'}
+ dependencies:
+ bl: 4.1.0
+ end-of-stream: 1.4.4
+ fs-constants: 1.0.0
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ dev: true
+
+ /terser-webpack-plugin@5.3.10(webpack@5.96.1):
+ resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==}
+ engines: {node: '>= 10.13.0'}
+ peerDependencies:
+ '@swc/core': '*'
+ esbuild: '*'
+ uglify-js: '*'
+ webpack: ^5.1.0
+ peerDependenciesMeta:
+ '@swc/core':
+ optional: true
+ esbuild:
+ optional: true
+ uglify-js:
+ optional: true
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ jest-worker: 27.5.1
+ schema-utils: 3.3.0
+ serialize-javascript: 6.0.2
+ terser: 5.36.0
+ webpack: 5.96.1
+
+ /terser@5.36.0:
+ resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ '@jridgewell/source-map': 0.3.6
+ acorn: 8.14.0
+ commander: 2.20.3
+ source-map-support: 0.5.21
+
+ /test-exclude@6.0.0:
+ resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@istanbuljs/schema': 0.1.3
+ glob: 7.2.3
+ minimatch: 3.1.2
+ dev: true
+
+ /text-table@0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ dev: false
+
+ /through@2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+
+ /thunky@1.1.0:
+ resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==}
+ dev: false
+
+ /tiny-invariant@1.3.3:
+ resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
+ dev: false
+
+ /tiny-warning@1.0.3:
+ resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
+ dev: false
+
+ /tinybench@2.9.0:
+ resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+ dev: true
+
+ /tinypool@0.7.0:
+ resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==}
+ engines: {node: '>=14.0.0'}
+ dev: true
+
+ /tinyspy@2.2.1:
+ resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==}
+ engines: {node: '>=14.0.0'}
+ dev: true
+
+ /tmp@0.0.33:
+ resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+ engines: {node: '>=0.6.0'}
+ dependencies:
+ os-tmpdir: 1.0.2
+ dev: false
+
+ /tmp@0.2.3:
+ resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==}
+ engines: {node: '>=14.14'}
+ dev: false
+
+ /to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+ dev: false
+
+ /toidentifier@1.0.1:
+ resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+ engines: {node: '>=0.6'}
+ dev: false
+
+ /totalist@3.0.1:
+ resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
+ engines: {node: '>=6'}
+
+ /tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
+ /tr46@2.1.0:
+ resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==}
+ engines: {node: '>=8'}
+ dependencies:
+ punycode: 2.3.1
+ dev: true
+
+ /trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
+ /trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+
+ /ts-custom-error@3.3.1:
+ resolution: {integrity: sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==}
+ engines: {node: '>=14.0.0'}
+ dev: false
+
+ /ts-dedent@2.2.0:
+ resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==}
+ engines: {node: '>=6.10'}
+ dev: false
+
+ /tslib@2.6.2:
+ resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+ dev: false
+
+ /tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ /tween-functions@1.2.0:
+ resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==}
+ dev: false
+
+ /type-check@0.3.2:
+ resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.1.2
+ dev: false
+
+ /type-detect@4.1.0:
+ resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /type-fest@0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /type-fest@0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /type-fest@1.4.0:
+ resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /type-fest@2.19.0:
+ resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
+ engines: {node: '>=12.20'}
+
+ /type-fest@4.26.1:
+ resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==}
+ engines: {node: '>=16'}
+ dev: false
+
+ /type-is@1.6.18:
+ resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+ engines: {node: '>= 0.6'}
+ dependencies:
+ media-typer: 0.3.0
+ mime-types: 2.1.35
+ dev: false
+
+ /typed-array-buffer@1.0.2:
+ resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-typed-array: 1.1.13
+ dev: false
+
+ /typed-array-byte-length@1.0.1:
+ resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
+ dev: false
+
+ /typed-array-byte-offset@1.0.2:
+ resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
+ dev: false
+
+ /typed-array-length@1.0.6:
+ resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-proto: 1.0.3
+ is-typed-array: 1.1.13
+ possible-typed-array-names: 1.0.0
+ dev: false
+
+ /typedarray-to-buffer@3.1.5:
+ resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
+ dependencies:
+ is-typedarray: 1.0.0
+ dev: false
+
+ /typeid-js@0.3.0:
+ resolution: {integrity: sha512-A1EmvIWG6xwYRfHuYUjPltHqteZ1EiDG+HOmbIYXeHUVztmnGrPIfU9KIK1QC30x59ko0r4JsMlwzsALCyiB3Q==}
+ dependencies:
+ uuidv7: 0.4.4
+ dev: false
+
+ /typescript@5.6.3:
+ resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ /typeson-registry@1.0.0-alpha.39:
+ resolution: {integrity: sha512-NeGDEquhw+yfwNhguLPcZ9Oj0fzbADiX4R0WxvoY8nGhy98IbzQy1sezjoEFWOywOboj/DWehI+/aUlRVrJnnw==}
+ engines: {node: '>=10.0.0'}
+ dependencies:
+ base64-arraybuffer-es6: 0.7.0
+ typeson: 6.1.0
+ whatwg-url: 8.7.0
+ dev: true
+
+ /typeson@6.1.0:
+ resolution: {integrity: sha512-6FTtyGr8ldU0pfbvW/eOZrEtEkczHRUtduBnA90Jh9kMPCiFNnXIon3vF41N0S4tV1HHQt4Hk1j4srpESziCaA==}
+ engines: {node: '>=0.1.14'}
+ dev: true
+
+ /ua-parser-js@1.0.39:
+ resolution: {integrity: sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw==}
+ hasBin: true
+ dev: true
+
+ /ufo@1.5.4:
+ resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
+ dev: true
+
+ /uint8-util@2.2.5:
+ resolution: {integrity: sha512-/QxVQD7CttWpVUKVPz9znO+3Dd4BdTSnFQ7pv/4drVhC9m4BaL2LFHTkJn6EsYoxT79VDq/2Gg8L0H22PrzyMw==}
+ dependencies:
+ base64-arraybuffer: 1.0.2
+ dev: false
+
+ /uint8-varint@2.0.4:
+ resolution: {integrity: sha512-FwpTa7ZGA/f/EssWAb5/YV6pHgVF1fViKdW8cWaEarjB8t7NyofSWBdOTyFPaGuUG4gx3v1O3PQ8etsiOs3lcw==}
+ dependencies:
+ uint8arraylist: 2.4.8
+ uint8arrays: 5.1.0
+ dev: false
+
+ /uint8arraylist@2.4.8:
+ resolution: {integrity: sha512-vc1PlGOzglLF0eae1M8mLRTBivsvrGsdmJ5RbK3e+QRvRLOZfZhQROTwH/OfyF3+ZVUg9/8hE8bmKP2CvP9quQ==}
+ dependencies:
+ uint8arrays: 5.1.0
+ dev: false
+
+ /uint8arrays@3.1.1:
+ resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==}
+ dependencies:
+ multiformats: 9.9.0
+ dev: false
+
+ /uint8arrays@4.0.10:
+ resolution: {integrity: sha512-AnJNUGGDJAgFw/eWu/Xb9zrVKEGlwJJCaeInlf3BkecE/zcTobk5YXYIPNQJO1q5Hh1QZrQQHf0JvcHqz2hqoA==}
+ dependencies:
+ multiformats: 12.1.3
+ dev: false
+
+ /uint8arrays@5.1.0:
+ resolution: {integrity: sha512-vA6nFepEmlSKkMBnLBaUMVvAC4G3CTmO58C12y4sq6WPDOR7mOFYOi7GlrQ4djeSbP6JG9Pv9tJDM97PedRSww==}
+ dependencies:
+ multiformats: 13.3.1
+ dev: false
+
+ /ulidx@2.1.0:
+ resolution: {integrity: sha512-DlMi97oP9HASI3kLCjBlOhAG1SoisUrEqC2PJ7itiFbq9q5Zo0JejupXeu2Gke99W62epNzA4MFNToNiq8A5LA==}
+ engines: {node: '>=16'}
+ dependencies:
+ layerr: 2.1.0
+ dev: false
+
+ /unbox-primitive@1.0.2:
+ resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+ dependencies:
+ call-bind: 1.0.7
+ has-bigints: 1.0.2
+ has-symbols: 1.0.3
+ which-boxed-primitive: 1.0.2
+ dev: false
+
+ /unbzip2-stream@1.4.3:
+ resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==}
+ dependencies:
+ buffer: 5.7.1
+ through: 2.3.8
+ dev: true
+
+ /undici-types@6.19.8:
+ resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
+
+ /undici@6.21.0:
+ resolution: {integrity: sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==}
+ engines: {node: '>=18.17'}
+ dev: false
+
+ /unicode-canonical-property-names-ecmascript@2.0.1:
+ resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /unicode-emoji-modifier-base@1.0.0:
+ resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /unicode-match-property-ecmascript@2.0.0:
+ resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
+ engines: {node: '>=4'}
+ dependencies:
+ unicode-canonical-property-names-ecmascript: 2.0.1
+ unicode-property-aliases-ecmascript: 2.1.0
+ dev: false
+
+ /unicode-match-property-value-ecmascript@2.2.0:
+ resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /unicode-property-aliases-ecmascript@2.1.0:
+ resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==}
+ engines: {node: '>=4'}
+ dev: false
+
+ /unified@10.1.2:
+ resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==}
+ dependencies:
+ '@types/unist': 2.0.11
+ bail: 2.0.2
+ extend: 3.0.2
+ is-buffer: 2.0.5
+ is-plain-obj: 4.1.0
+ trough: 2.2.0
+ vfile: 5.3.7
+ dev: false
+
+ /unified@11.0.5:
+ resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
+ dependencies:
+ '@types/unist': 3.0.3
+ bail: 2.0.2
+ devlop: 1.1.0
+ extend: 3.0.2
+ is-plain-obj: 4.1.0
+ trough: 2.2.0
+ vfile: 6.0.3
+
+ /unique-string@3.0.0:
+ resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ crypto-random-string: 4.0.0
+ dev: false
+
+ /unist-util-generated@2.0.1:
+ resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==}
+ dev: false
+
+ /unist-util-is@5.2.1:
+ resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==}
+ dependencies:
+ '@types/unist': 2.0.11
+ dev: false
+
+ /unist-util-is@6.0.0:
+ resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
+ dependencies:
+ '@types/unist': 3.0.3
+
+ /unist-util-position-from-estree@2.0.0:
+ resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==}
+ dependencies:
+ '@types/unist': 3.0.3
+
+ /unist-util-position@4.0.4:
+ resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==}
+ dependencies:
+ '@types/unist': 2.0.11
+ dev: false
+
+ /unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+ dependencies:
+ '@types/unist': 3.0.3
+
+ /unist-util-stringify-position@3.0.3:
+ resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==}
+ dependencies:
+ '@types/unist': 2.0.11
+ dev: false
+
+ /unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+ dependencies:
+ '@types/unist': 3.0.3
+
+ /unist-util-visit-parents@5.1.3:
+ resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==}
+ dependencies:
+ '@types/unist': 2.0.11
+ unist-util-is: 5.2.1
+ dev: false
+
+ /unist-util-visit-parents@6.0.1:
+ resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==}
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+
+ /unist-util-visit@4.1.2:
+ resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==}
+ dependencies:
+ '@types/unist': 2.0.11
+ unist-util-is: 5.2.1
+ unist-util-visit-parents: 5.1.3
+ dev: false
+
+ /unist-util-visit@5.0.0:
+ resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
+
+ /universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+ dev: false
+
+ /unpipe@1.0.0:
+ resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /update-browserslist-db@1.1.1(browserslist@4.24.2):
+ resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+ dependencies:
+ browserslist: 4.24.2
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ /update-notifier@6.0.2:
+ resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ boxen: 7.1.1
+ chalk: 5.3.0
+ configstore: 6.0.0
+ has-yarn: 3.0.0
+ import-lazy: 4.0.0
+ is-ci: 3.0.1
+ is-installed-globally: 0.4.0
+ is-npm: 6.0.0
+ is-yarn-global: 0.4.1
+ latest-version: 7.0.0
+ pupa: 3.1.0
+ semver: 7.6.3
+ semver-diff: 4.0.0
+ xdg-basedir: 5.1.0
+ dev: false
+
+ /uri-js-replace@1.0.1:
+ resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==}
+ dev: false
+
+ /uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ dependencies:
+ punycode: 2.3.1
+
+ /url-loader@4.1.1(file-loader@6.2.0)(webpack@5.96.1):
+ resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==}
+ engines: {node: '>= 10.13.0'}
+ peerDependencies:
+ file-loader: '*'
+ webpack: ^4.0.0 || ^5.0.0
+ peerDependenciesMeta:
+ file-loader:
+ optional: true
+ dependencies:
+ file-loader: 6.2.0(webpack@5.96.1)
+ loader-utils: 2.0.4
+ mime-types: 2.1.35
+ schema-utils: 3.3.0
+ webpack: 5.96.1
+ dev: false
+
+ /url-template@2.0.8:
+ resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==}
+ dev: false
+
+ /url@0.11.4:
+ resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ punycode: 1.4.1
+ qs: 6.13.0
+ dev: false
+
+ /use-sync-external-store@1.2.2(react@18.2.0):
+ resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ dependencies:
+ react: 18.2.0
+ dev: false
+
+ /utf8-codec@1.0.0:
+ resolution: {integrity: sha512-S/QSLezp3qvG4ld5PUfXiH7mCFxLKjSVZRFkB3DOjgwHuJPFDkInAXc/anf7BAbHt/D38ozDzL+QMZ6/7gsI6w==}
+ dev: false
+
+ /util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ /utila@0.4.0:
+ resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==}
+ dev: false
+
+ /utility-types@3.11.0:
+ resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==}
+ engines: {node: '>= 4'}
+
+ /utils-merge@1.0.1:
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+ engines: {node: '>= 0.4.0'}
+ dev: false
+
+ /uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+ dev: false
+
+ /uuid@9.0.1:
+ resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
+ hasBin: true
+
+ /uuidv7@0.4.4:
+ resolution: {integrity: sha512-jjRGChg03uGp9f6wQYSO8qXkweJwRbA5WRuEQE8xLIiehIzIIi23qZSzsyvZPCPoFqkeLtZuz7Plt1LGukAInA==}
+ hasBin: true
+ dev: false
+
+ /uvu@0.5.6:
+ resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dependencies:
+ dequal: 2.0.3
+ diff: 5.2.0
+ kleur: 4.1.5
+ sade: 1.8.1
+ dev: false
+
+ /validate-npm-package-license@3.0.4:
+ resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+ dependencies:
+ spdx-correct: 3.2.0
+ spdx-expression-parse: 3.0.1
+ dev: true
+
+ /value-equal@1.0.1:
+ resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==}
+ dev: false
+
+ /varint@6.0.0:
+ resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==}
+ dev: false
+
+ /vary@1.1.2:
+ resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+ engines: {node: '>= 0.8'}
+ dev: false
+
+ /vfile-location@5.0.3:
+ resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile: 6.0.3
+ dev: false
+
+ /vfile-message@3.1.4:
+ resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==}
+ dependencies:
+ '@types/unist': 2.0.11
+ unist-util-stringify-position: 3.0.3
+ dev: false
+
+ /vfile-message@4.0.2:
+ resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-stringify-position: 4.0.0
+
+ /vfile@5.3.7:
+ resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==}
+ dependencies:
+ '@types/unist': 2.0.11
+ is-buffer: 2.0.5
+ unist-util-stringify-position: 3.0.3
+ vfile-message: 3.1.4
+ dev: false
+
+ /vfile@6.0.3:
+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile-message: 4.0.2
+
+ /vite-node@0.34.1(@types/node@22.9.0):
+ resolution: {integrity: sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==}
+ engines: {node: '>=v14.18.0'}
+ hasBin: true
+ dependencies:
+ cac: 6.7.14
+ debug: 4.3.7
+ mlly: 1.7.3
+ pathe: 1.1.2
+ picocolors: 1.1.1
+ vite: 5.1.4(@types/node@22.9.0)
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ dev: true
+
+ /vite@5.1.4(@types/node@22.9.0):
+ resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || >=20.0.0
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ '@types/node': 22.9.0
+ esbuild: 0.19.12
+ postcss: 8.4.31
+ rollup: 4.26.0
+ optionalDependencies:
+ fsevents: 2.3.3
+ dev: true
+
+ /vitest@0.34.1(@vitest/browser@0.34.1)(playwright@1.39.0)(webdriverio@8.13.13):
+ resolution: {integrity: sha512-G1PzuBEq9A75XSU88yO5G4vPT20UovbC/2osB2KEuV/FisSIIsw7m5y2xMdB7RsAGHAfg2lPmp2qKr3KWliVlQ==}
+ engines: {node: '>=v14.18.0'}
+ hasBin: true
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@vitest/browser': '*'
+ '@vitest/ui': '*'
+ happy-dom: '*'
+ jsdom: '*'
+ playwright: '*'
+ safaridriver: '*'
+ webdriverio: '*'
+ peerDependenciesMeta:
+ '@edge-runtime/vm':
+ optional: true
+ '@vitest/browser':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+ playwright:
+ optional: true
+ safaridriver:
+ optional: true
+ webdriverio:
+ optional: true
+ dependencies:
+ '@types/chai': 4.3.20
+ '@types/chai-subset': 1.3.5
+ '@types/node': 22.9.0
+ '@vitest/browser': 0.34.1(rollup@2.79.2)(vitest@0.34.1)
+ '@vitest/expect': 0.34.1
+ '@vitest/runner': 0.34.1
+ '@vitest/snapshot': 0.34.1
+ '@vitest/spy': 0.34.1
+ '@vitest/utils': 0.34.1
+ acorn: 8.14.0
+ acorn-walk: 8.3.4
+ cac: 6.7.14
+ chai: 4.5.0
+ debug: 4.3.7
+ local-pkg: 0.4.3
+ magic-string: 0.30.12
+ pathe: 1.1.2
+ picocolors: 1.1.1
+ playwright: 1.39.0
+ std-env: 3.8.0
+ strip-literal: 1.3.0
+ tinybench: 2.9.0
+ tinypool: 0.7.0
+ vite: 5.1.4(@types/node@22.9.0)
+ vite-node: 0.34.1(@types/node@22.9.0)
+ webdriverio: 8.13.13(typescript@5.6.3)
+ why-is-node-running: 2.3.0
+ transitivePeerDependencies:
+ - less
+ - lightningcss
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ dev: true
+
+ /wait-on@7.2.0(debug@4.3.4):
+ resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==}
+ engines: {node: '>=12.0.0'}
+ hasBin: true
+ dependencies:
+ axios: 1.7.4(debug@4.3.4)
+ joi: 17.13.3
+ lodash: 4.17.21
+ minimist: 1.2.8
+ rxjs: 7.8.1
+ transitivePeerDependencies:
+ - debug
+ dev: true
+
+ /warning@4.0.3:
+ resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==}
+ dependencies:
+ loose-envify: 1.4.0
+ dev: false
+
+ /watchpack@2.4.2:
+ resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+
+ /wbuf@1.7.3:
+ resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==}
+ dependencies:
+ minimalistic-assert: 1.0.1
+ dev: false
+
+ /wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+ dependencies:
+ defaults: 1.0.4
+ dev: false
+
+ /web-namespaces@2.0.1:
+ resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+ dev: false
+
+ /web-streams-polyfill@3.3.3:
+ resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
+ engines: {node: '>= 8'}
+ dev: false
+
+ /web-worker@1.3.0:
+ resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==}
+ dev: false
+
+ /webdriver@8.13.13:
+ resolution: {integrity: sha512-CEwOWSQFV2/xj59fO9DOC4FCy49DpsTf7uyDHFH3v0w90bmiq2Fjq2sGrlJNF6U0YiWHRVWQQqCLUav3M/rqOg==}
+ engines: {node: ^16.13 || >=18}
+ dependencies:
+ '@types/node': 20.17.6
+ '@types/ws': 8.5.13
+ '@wdio/config': 8.13.13
+ '@wdio/logger': 8.11.0
+ '@wdio/protocols': 8.11.0
+ '@wdio/types': 8.10.4
+ '@wdio/utils': 8.13.13
+ deepmerge-ts: 5.1.0
+ got: 12.6.1
+ ky: 0.33.3
+ ws: 8.18.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: true
+
+ /webdriverio@8.13.13(typescript@5.6.3):
+ resolution: {integrity: sha512-loHJH8NQ7tyaeeUmhS//Ic2BNRQdXKEAzZogP48irsxeXhCClo5RuQUnnNVb+MQs8zSd5eKFhZQRofKmSSP30g==}
+ engines: {node: ^16.13 || >=18}
+ dependencies:
+ '@types/node': 20.17.6
+ '@wdio/config': 8.13.13
+ '@wdio/logger': 8.11.0
+ '@wdio/protocols': 8.11.0
+ '@wdio/repl': 8.10.1
+ '@wdio/types': 8.10.4
+ '@wdio/utils': 8.13.13
+ archiver: 5.3.2
+ aria-query: 5.3.2
+ css-shorthand-properties: 1.1.2
+ css-value: 0.0.1
+ devtools: 8.13.13(typescript@5.6.3)
+ devtools-protocol: 0.0.1170846
+ grapheme-splitter: 1.0.4
+ import-meta-resolve: 3.1.1
+ is-plain-obj: 4.1.0
+ lodash.clonedeep: 4.5.0
+ lodash.zip: 4.2.0
+ minimatch: 9.0.5
+ puppeteer-core: 20.3.0(typescript@5.6.3)
+ query-selector-shadow-dom: 1.0.1
+ resq: 1.11.0
+ rgb2hex: 0.2.5
+ serialize-error: 8.1.0
+ webdriver: 8.13.13
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - supports-color
+ - typescript
+ - utf-8-validate
+ dev: true
+
+ /webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+ /webidl-conversions@4.0.2:
+ resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
+ dev: true
+
+ /webidl-conversions@6.1.0:
+ resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==}
+ engines: {node: '>=10.4'}
+ dev: true
+
+ /webpack-bundle-analyzer@4.10.2:
+ resolution: {integrity: sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==}
+ engines: {node: '>= 10.13.0'}
+ hasBin: true
+ dependencies:
+ '@discoveryjs/json-ext': 0.5.7
+ acorn: 8.14.0
+ acorn-walk: 8.3.4
+ commander: 7.2.0
+ debounce: 1.2.1
+ escape-string-regexp: 4.0.0
+ gzip-size: 6.0.0
+ html-escaper: 2.0.2
+ opener: 1.5.2
+ picocolors: 1.1.1
+ sirv: 2.0.4
+ ws: 7.5.10
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: false
+
+ /webpack-dev-middleware@5.3.4(webpack@5.96.1):
+ resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==}
+ engines: {node: '>= 12.13.0'}
+ peerDependencies:
+ webpack: ^4.0.0 || ^5.0.0
+ dependencies:
+ colorette: 2.0.20
+ memfs: 3.5.3
+ mime-types: 2.1.35
+ range-parser: 1.2.1
+ schema-utils: 4.2.0
+ webpack: 5.96.1
+ dev: false
+
+ /webpack-dev-server@4.15.2(webpack@5.96.1):
+ resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==}
+ engines: {node: '>= 12.13.0'}
+ hasBin: true
+ peerDependencies:
+ webpack: ^4.37.0 || ^5.0.0
+ webpack-cli: '*'
+ peerDependenciesMeta:
+ webpack:
+ optional: true
+ webpack-cli:
+ optional: true
+ dependencies:
+ '@types/bonjour': 3.5.13
+ '@types/connect-history-api-fallback': 1.5.4
+ '@types/express': 4.17.21
+ '@types/serve-index': 1.9.4
+ '@types/serve-static': 1.15.7
+ '@types/sockjs': 0.3.36
+ '@types/ws': 8.5.13
+ ansi-html-community: 0.0.8
+ bonjour-service: 1.2.1
+ chokidar: 3.6.0
+ colorette: 2.0.20
+ compression: 1.7.5
+ connect-history-api-fallback: 2.0.0
+ default-gateway: 6.0.3
+ express: 4.18.2
+ graceful-fs: 4.2.11
+ html-entities: 2.5.2
+ http-proxy-middleware: 2.0.7(@types/express@4.17.21)
+ ipaddr.js: 2.2.0
+ launch-editor: 2.9.1
+ open: 8.4.2
+ p-retry: 4.6.2
+ rimraf: 3.0.2
+ schema-utils: 4.2.0
+ selfsigned: 2.4.1
+ serve-index: 1.9.1
+ sockjs: 0.3.24
+ spdy: 4.0.2
+ webpack: 5.96.1
+ webpack-dev-middleware: 5.3.4(webpack@5.96.1)
+ ws: 8.18.0
+ transitivePeerDependencies:
+ - bufferutil
+ - debug
+ - supports-color
+ - utf-8-validate
+ dev: false
+
+ /webpack-merge@5.10.0:
+ resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==}
+ engines: {node: '>=10.0.0'}
+ dependencies:
+ clone-deep: 4.0.1
+ flat: 5.0.2
+ wildcard: 2.0.1
+
+ /webpack-merge@6.0.1:
+ resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ clone-deep: 4.0.1
+ flat: 5.0.2
+ wildcard: 2.0.1
+ dev: false
+
+ /webpack-sources@3.2.3:
+ resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
+ engines: {node: '>=10.13.0'}
+
+ /webpack@5.96.1:
+ resolution: {integrity: sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ peerDependencies:
+ webpack-cli: '*'
+ peerDependenciesMeta:
+ webpack-cli:
+ optional: true
+ dependencies:
+ '@types/eslint-scope': 3.7.7
+ '@types/estree': 1.0.6
+ '@webassemblyjs/ast': 1.14.1
+ '@webassemblyjs/wasm-edit': 1.14.1
+ '@webassemblyjs/wasm-parser': 1.14.1
+ acorn: 8.14.0
+ browserslist: 4.24.2
+ chrome-trace-event: 1.0.4
+ enhanced-resolve: 5.17.1
+ es-module-lexer: 1.5.4
+ eslint-scope: 5.1.1
+ events: 3.3.0
+ glob-to-regexp: 0.4.1
+ graceful-fs: 4.2.11
+ json-parse-even-better-errors: 2.3.1
+ loader-runner: 4.3.0
+ mime-types: 2.1.35
+ neo-async: 2.6.2
+ schema-utils: 3.3.0
+ tapable: 2.2.1
+ terser-webpack-plugin: 5.3.10(webpack@5.96.1)
+ watchpack: 2.4.2
+ webpack-sources: 3.2.3
+ transitivePeerDependencies:
+ - '@swc/core'
+ - esbuild
+ - uglify-js
+
+ /webpackbar@5.0.2(webpack@5.96.1):
+ resolution: {integrity: sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ webpack: 3 || 4 || 5
+ dependencies:
+ chalk: 4.1.2
+ consola: 2.15.3
+ pretty-time: 1.1.0
+ std-env: 3.8.0
+ webpack: 5.96.1
+ dev: false
+
+ /webpackbar@6.0.1(webpack@5.96.1):
+ resolution: {integrity: sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==}
+ engines: {node: '>=14.21.3'}
+ peerDependencies:
+ webpack: 3 || 4 || 5
+ dependencies:
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ consola: 3.2.3
+ figures: 3.2.0
+ markdown-table: 2.0.0
+ pretty-time: 1.1.0
+ std-env: 3.8.0
+ webpack: 5.96.1
+ wrap-ansi: 7.0.0
+ dev: false
+
+ /websocket-driver@0.7.4:
+ resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==}
+ engines: {node: '>=0.8.0'}
+ dependencies:
+ http-parser-js: 0.5.8
+ safe-buffer: 5.2.1
+ websocket-extensions: 0.1.4
+ dev: false
+
+ /websocket-extensions@0.1.4:
+ resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==}
+ engines: {node: '>=0.8.0'}
+ dev: false
+
+ /whatwg-encoding@3.1.1:
+ resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
+ engines: {node: '>=18'}
+ dependencies:
+ iconv-lite: 0.6.3
+ dev: false
+
+ /whatwg-mimetype@4.0.0:
+ resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
+ engines: {node: '>=18'}
+ dev: false
+
+ /whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+
+ /whatwg-url@8.7.0:
+ resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==}
+ engines: {node: '>=10'}
+ dependencies:
+ lodash: 4.17.21
+ tr46: 2.1.0
+ webidl-conversions: 6.1.0
+ dev: true
+
+ /which-boxed-primitive@1.0.2:
+ resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+ dependencies:
+ is-bigint: 1.0.4
+ is-boolean-object: 1.1.2
+ is-number-object: 1.0.7
+ is-string: 1.0.7
+ is-symbol: 1.0.4
+ dev: false
+
+ /which-module@2.0.1:
+ resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
+ dev: false
+
+ /which-typed-array@1.1.15:
+ resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.7
+ for-each: 0.3.3
+ gopd: 1.0.1
+ has-tostringtag: 1.0.2
+ dev: false
+
+ /which@1.3.1:
+ resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: false
+
+ /which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+
+ /which@3.0.1:
+ resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /why-is-node-running@2.3.0:
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dependencies:
+ siginfo: 2.0.0
+ stackback: 0.0.2
+ dev: true
+
+ /widest-line@4.0.1:
+ resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==}
+ engines: {node: '>=12'}
+ dependencies:
+ string-width: 5.1.2
+ dev: false
+
+ /wildcard@2.0.1:
+ resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==}
+
+ /word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /wrap-ansi@6.2.0:
+ resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: false
+
+ /wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ /wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 5.1.2
+ strip-ansi: 7.1.0
+
+ /wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ /write-file-atomic@3.0.3:
+ resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
+ dependencies:
+ imurmurhash: 0.1.4
+ is-typedarray: 1.0.0
+ signal-exit: 3.0.7
+ typedarray-to-buffer: 3.1.5
+ dev: false
+
+ /ws@7.5.10:
+ resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==}
+ engines: {node: '>=8.3.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: ^5.0.2
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+ dev: false
+
+ /ws@8.13.0:
+ resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+ dev: true
+
+ /ws@8.18.0:
+ resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
+ /xdg-basedir@5.1.0:
+ resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==}
+ engines: {node: '>=12'}
+ dev: false
+
+ /xml-js@1.6.11:
+ resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==}
+ hasBin: true
+ dependencies:
+ sax: 1.4.1
+ dev: false
+
+ /xml2js@0.6.2:
+ resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==}
+ engines: {node: '>=4.0.0'}
+ dependencies:
+ sax: 1.4.1
+ xmlbuilder: 11.0.1
+ dev: false
+
+ /xmlbuilder@11.0.1:
+ resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==}
+ engines: {node: '>=4.0'}
+ dev: false
+
+ /xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+ engines: {node: '>=0.4'}
+ dev: false
+
+ /y18n@4.0.3:
+ resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
+ dev: false
+
+ /y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ /yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ /yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ dev: true
+
+ /yaml-ast-parser@0.0.43:
+ resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==}
+ dev: false
+
+ /yaml@1.10.2:
+ resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+ engines: {node: '>= 6'}
+ dev: false
+
+ /yargs-parser@18.1.3:
+ resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
+ engines: {node: '>=6'}
+ dependencies:
+ camelcase: 5.3.1
+ decamelize: 1.2.0
+ dev: false
+
+ /yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ /yargs@15.4.1:
+ resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
+ engines: {node: '>=8'}
+ dependencies:
+ cliui: 6.0.0
+ decamelize: 1.2.0
+ find-up: 4.1.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ require-main-filename: 2.0.0
+ set-blocking: 2.0.0
+ string-width: 4.2.3
+ which-module: 2.0.1
+ y18n: 4.0.3
+ yargs-parser: 18.1.3
+ dev: false
+
+ /yargs@17.7.1:
+ resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==}
+ engines: {node: '>=12'}
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
+ dev: true
+
+ /yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+ dependencies:
+ cliui: 8.0.1
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 21.1.1
+ dev: false
+
+ /yauzl@2.10.0:
+ resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
+ dependencies:
+ buffer-crc32: 0.2.13
+ fd-slicer: 1.1.0
+ dev: true
+
+ /yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+ dev: false
+
+ /yocto-queue@1.1.1:
+ resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==}
+ engines: {node: '>=12.20'}
+
+ /zip-stream@4.1.1:
+ resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==}
+ engines: {node: '>= 10'}
+ dependencies:
+ archiver-utils: 3.0.4
+ compress-commons: 4.1.2
+ readable-stream: 3.6.2
+ dev: true
+
+ /zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
diff --git a/site/propagateSdkVersions.js b/site/propagateSdkVersions.js
new file mode 100644
index 0000000..64d90b6
--- /dev/null
+++ b/site/propagateSdkVersions.js
@@ -0,0 +1,169 @@
+const fs = require('fs');
+const path = require('path');
+const { promisify } = require('util');
+
+const sdkVersionsPath = path.resolve(__dirname, 'sdk-versions.json');
+const directoriesToUpdate = [
+ __dirname,
+ path.resolve(__dirname, './testsuites'),
+];
+
+// Grab SDK versions from sdk-versions.json
+const getSdkVersions = async () => {
+ try {
+ const content = await fs.promises.readFile(sdkVersionsPath, 'utf8');
+ return JSON.parse(content);
+ } catch (error) {
+ console.error('Error reading sdk-versions.json:', error);
+ throw error;
+ }
+};
+
+// Update package.json dependencies
+const updatePackageJsonDependencies = async (dirPath, sdkVersions) => {
+ const packageJsonPath = path.join(dirPath, 'package.json');
+ if (fs.existsSync(packageJsonPath)) {
+ try {
+ const packageJson = JSON.parse(
+ await fs.promises.readFile(packageJsonPath, 'utf8'),
+ );
+ let updated = false;
+ for (const sdk in sdkVersions.js) {
+ if (packageJson.dependencies && packageJson.dependencies[sdk]) {
+ packageJson.dependencies[sdk] = sdkVersions.js[sdk];
+ updated = true;
+ }
+ if (packageJson.devDependencies && packageJson.devDependencies[sdk]) {
+ packageJson.devDependencies[sdk] = sdkVersions.js[sdk];
+ updated = true;
+ }
+ }
+ if (updated) {
+ await fs.promises.writeFile(
+ packageJsonPath,
+ JSON.stringify(packageJson, null, 2),
+ );
+ console.log(`Updated ${packageJsonPath}`);
+ }
+ } catch (error) {
+ console.error(`Error updating ${packageJsonPath}:`, error);
+ }
+ }
+
+ if (fs.lstatSync(dirPath).isDirectory()) {
+ const entries = await fs.promises.readdir(dirPath, { withFileTypes: true });
+ for (const dirent of entries) {
+ if (dirent.name === 'node_modules') continue;
+ const fullPath = path.join(dirPath, dirent.name);
+ if (dirent.isDirectory()) {
+ await updatePackageJsonDependencies(fullPath, sdkVersions);
+ }
+ }
+ }
+};
+
+const updatePomXmlVersion = async (filePath, sdkVersions) => {
+ try {
+ const pomContent = await fs.promises.readFile(filePath, 'utf8');
+ let updatedPomContent = pomContent;
+
+ Object.entries(sdkVersions.jvm).forEach(([artifactId, version]) => {
+ const versionTagRegex = new RegExp(
+ `()(.*?)(<\/version.xyz.block.${artifactId}>)`,
+ 'g',
+ );
+ if (versionTagRegex.test(pomContent)) {
+ console.log(
+ `Found matches for ${artifactId}, updating to version ${version}.`,
+ );
+ } else {
+ console.log(`No matches found for ${artifactId}.`);
+ }
+ updatedPomContent = updatedPomContent.replace(
+ versionTagRegex,
+ `$1${version}$3`,
+ );
+ });
+
+ if (updatedPomContent !== pomContent) {
+ await fs.promises.writeFile(filePath, updatedPomContent);
+ }
+ } catch (error) {
+ console.error(`Failed to update ${filePath}:`, error);
+ }
+};
+
+const findAndUpdatePomFiles = async (dirPath, sdkVersions) => {
+ const entries = await fs.promises.readdir(dirPath, { withFileTypes: true });
+ for (const dirent of entries) {
+ if (dirent.name === 'node_modules') continue;
+
+ const fullPath = path.join(dirPath, dirent.name);
+ if (dirent.isDirectory()) {
+ await findAndUpdatePomFiles(fullPath, sdkVersions);
+ } else if (dirent.name === 'pom.xml') {
+ await updatePomXmlVersion(fullPath, sdkVersions);
+ }
+ }
+};
+
+// Function to update Package.swift dependencies
+const updatePackageSwiftDependencies = async (dirPath, sdkVersions) => {
+ const packageSwiftPath = path.join(dirPath, 'Package.swift');
+
+ try {
+ const packageSwiftContent = await fs.promises.readFile(
+ packageSwiftPath,
+ 'utf8',
+ );
+ let updatedPackageSwiftContent = packageSwiftContent;
+
+ Object.keys(sdkVersions.swift).forEach((dependency) => {
+ const { url, branch } = sdkVersions.swift[dependency];
+ const regex = new RegExp(
+ `\\.package\\(url: "${url}", branch: ".*?"\\)`,
+ 'g',
+ );
+ updatedPackageSwiftContent = updatedPackageSwiftContent.replace(
+ regex,
+ `.package(url: "${url}", branch: "${branch}")`,
+ );
+ });
+
+ await fs.promises.writeFile(packageSwiftPath, updatedPackageSwiftContent);
+ } catch (error) {
+ console.error(`Failed to update Package.swift in ${dirPath}:`, error);
+ }
+};
+
+// Function to recursively find and update Package.swift files
+const findAndUpdatePackageSwift = async (dirPath, sdkVersions) => {
+ const entries = await fs.promises.readdir(dirPath, { withFileTypes: true });
+ for (const dirent of entries) {
+ if (dirent.name === 'node_modules') continue;
+
+ const fullPath = path.join(dirPath, dirent.name);
+ if (dirent.isDirectory()) {
+ await findAndUpdatePackageSwift(fullPath, sdkVersions);
+ } else if (dirent.name === 'Package.swift') {
+ await updatePackageSwiftDependencies(dirPath, sdkVersions);
+ }
+ }
+};
+
+// Main function to initiate the version propagation process
+const propagateVersions = async () => {
+ try {
+ const sdkVersions = await getSdkVersions();
+
+ for (const dirPath of directoriesToUpdate) {
+ await updatePackageJsonDependencies(dirPath, sdkVersions);
+ await findAndUpdatePomFiles(dirPath, sdkVersions);
+ await findAndUpdatePackageSwift(dirPath, sdkVersions);
+ }
+ } catch (error) {
+ console.error('Failed to propagate versions:', error);
+ }
+};
+
+propagateVersions();
diff --git a/site/sdk-versions.json b/site/sdk-versions.json
new file mode 100644
index 0000000..4cde8d0
--- /dev/null
+++ b/site/sdk-versions.json
@@ -0,0 +1,30 @@
+{
+ "js": {
+ "@tbdex/http-client": "1.1.0",
+ "@tbdex/http-server": "1.1.0",
+ "@tbdex/protocol": "1.1.0",
+ "@web5/api": "0.12.0",
+ "@web5/credentials": "1.1.1",
+ "@web5/crypto": "1.0.5",
+ "@web5/crypto-aws-kms": "1.0.5",
+ "@web5/dids": "1.1.5",
+ "@web5/identity-agent": "0.6.4"
+ },
+ "jvm": {
+ "tbdex": "2.0.1",
+ "web5-credentials": "2.0.1",
+ "web5-dids": "2.0.1",
+ "web5-crypto": "2.0.0",
+ "web5-keymanager-aws": "2.0.0"
+ },
+ "swift": {
+ "Web5": {
+ "url": "https://github.com/TBD54566975/web5-swift.git",
+ "exact": "1.0.0"
+ },
+ "tbDex": {
+ "url": "https://github.com/TBD54566975/tbdex-swift.git",
+ "exact": "1.0.0"
+ }
+ }
+}
\ No newline at end of file
diff --git a/site/shnip.config.cjs b/site/shnip.config.cjs
new file mode 100644
index 0000000..695dea4
--- /dev/null
+++ b/site/shnip.config.cjs
@@ -0,0 +1,17 @@
+module.exports = {
+ rootDirectory: './testsuites',
+ snippetOutputDirectory: './snippets',
+ fileExtensions: ['.js', '.ts', '.kt', '.gradle', '.xml', '.bash', '.swift'],
+ exclude: [
+ 'pfiOverviewReadOfferingsJs',
+ 'pfiOverviewWriteJs',
+ 'pfiOverviewWriteOfferingsJs',
+ ],
+ snippetTags: {
+ start: ':snippet-start:',
+ end: ':snippet-end:',
+ prependStart: ':prepend-start:',
+ prependEnd: ':snippet-end:',
+ },
+ outputDirectoryStructure: 'byLanguage',
+};
diff --git a/site/sidebars.js b/site/sidebars.js
new file mode 100644
index 0000000..ef1bd11
--- /dev/null
+++ b/site/sidebars.js
@@ -0,0 +1,33 @@
+/**
+ * Creating a sidebar enables you to:
+ - create an ordered group of docs
+ - render a sidebar for each doc of that group
+ - provide next/previous navigation
+
+ The sidebars can be generated from the filesystem, or explicitly defined here.
+
+ Create as many sidebars as you want.
+ */
+
+// @ts-check
+
+/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
+const sidebars = {
+ // By default, Docusaurus generates a sidebar from the docs folder structure
+ tutorialSidebar: [{ type: 'autogenerated', dirName: '.' }],
+
+ // But you can create a sidebar manually
+ /*
+ tutorialSidebar: [
+ 'intro',
+ 'hello',
+ {
+ type: 'category',
+ label: 'Tutorial',
+ items: ['tutorial-basics/create-a-document'],
+ },
+ ],
+ */
+};
+
+module.exports = sidebars;
diff --git a/site/src/components/Actors.jsx b/site/src/components/Actors.jsx
new file mode 100644
index 0000000..95ce2e8
--- /dev/null
+++ b/site/src/components/Actors.jsx
@@ -0,0 +1,117 @@
+import React from 'react';
+import Divider from './Divider';
+
+const Actors = ({ content }) => {
+ return (
+
+
+ {content.title}
+
+
+
+
+
+ {!content.isWeb5 ? (
+
+ ) : null}
+
+ {content.actors[0].title}
+
+
+
+ {content.actors[0].description}
+
+
+
+
+
+ {!content.isWeb5 ? (
+
+ ) : null}
+
+ {content.actors[1].title}
+
+
+
+ {content.actors[1].description}
+
+
+
+
+
+ {!content.isWeb5 ? (
+
+ ) : null}
+
+ {content.actors[2].title}
+
+
+
+ {content.actors[2].description}
+
+
+
+ {content.isWeb5 ? (
+ <>
+
+
+
+
+
+
+
+
+
+ {/*
*/}
+ >
+ ) : (
+
+ )}
+
+
+ );
+};
+
+export default Actors;
diff --git a/site/src/components/ApiCard.jsx b/site/src/components/ApiCard.jsx
new file mode 100644
index 0000000..1a98a99
--- /dev/null
+++ b/site/src/components/ApiCard.jsx
@@ -0,0 +1,55 @@
+/* eslint-disable react/prop-types */
+import React from 'react';
+import Link from '@docusaurus/Link';
+
+function ApiCard({ name, description, links }) {
+ const renderLinkImages = (links) => {
+ return links.map(link => {
+ const key = Object.keys(link)[0];
+ const url = link[key];
+ let imgSrc;
+ let shouldOpenInNewTab = url.includes('http') ? '_blank' : '_self';
+
+ switch (key) {
+ case 'js':
+ imgSrc = "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/javascript/javascript-original.svg";
+ break;
+ case 'kt':
+ imgSrc = "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/kotlin/kotlin-original.svg";
+ break;
+ case 'swift':
+ imgSrc = "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/swift/swift-original.svg";
+ break;
+ case 'dart':
+ imgSrc = "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/dart/dart-original.svg";
+ break;
+ case 'go':
+ imgSrc = "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/go/go-original.svg";
+ break;
+ default:
+ imgSrc = '';
+ }
+
+ return (
+
+
+
+ );
+ });
+ };
+
+ return (
+
+
+
{name}
+ {description &&
{description}
}
+
+
+ {renderLinkImages(links)}
+
+
+ );
+}
+
+
+export default ApiCard;
diff --git a/site/src/components/ApiDetails.jsx b/site/src/components/ApiDetails.jsx
new file mode 100644
index 0000000..f092383
--- /dev/null
+++ b/site/src/components/ApiDetails.jsx
@@ -0,0 +1,49 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+
+const ApiDetails = ({ details }) => {
+ return (
+
+ {details.map((detail, index) => (
+
+
+ {detail.data.field}
+ {detail.data.type ? (
+ <>
+
+
+ {detail.data.type}
+
+ >
+ ) : null}
+ {detail.data.isOptional ? (
+ <>
+
+ optional
+ >
+ ) : null}
+
+
+ {detail.data.isObject ? (
+ <>
+
+ Show parameters
+
+ {detail.data.value}
+
+ >
+ ) : (
+ <>{detail.data.value}>
+ )}
+
+
+ ))}
+
+ );
+};
+
+ApiDetails.propTypes = {
+ details: PropTypes.array.isRequired,
+};
+
+export default ApiDetails;
diff --git a/site/src/components/Audio.jsx b/site/src/components/Audio.jsx
new file mode 100644
index 0000000..78a9566
--- /dev/null
+++ b/site/src/components/Audio.jsx
@@ -0,0 +1,41 @@
+import React from 'react';
+import ReactPlayer from 'react-player';
+import PropTypes from 'prop-types';
+
+const Audio = ({ url }) => {
+ return (
+
+ );
+};
+
+Audio.propTypes = {
+ /**
+ * video source
+ */
+ url: PropTypes.string.isRequired,
+};
+export default Audio;
diff --git a/site/src/components/Biography.jsx b/site/src/components/Biography.jsx
new file mode 100644
index 0000000..56268b6
--- /dev/null
+++ b/site/src/components/Biography.jsx
@@ -0,0 +1,45 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+
+const Biography = ({
+ imageUrl,
+ headline,
+ description,
+ growToFit,
+ twitterLink,
+}) => {
+ return (
+
+
+
+
+
+
+
{description}
+
+
+ );
+};
+
+Biography.PropTypes = {
+ imageUrl: PropTypes.string.isRequired,
+ headline: PropTypes.string.isRequired,
+ description: PropTypes.string.isRequired,
+ twitterLink: PropTypes.string,
+};
+
+export default Biography;
diff --git a/site/src/components/BiographyList.jsx b/site/src/components/BiographyList.jsx
new file mode 100644
index 0000000..0df3349
--- /dev/null
+++ b/site/src/components/BiographyList.jsx
@@ -0,0 +1,51 @@
+import React from 'react';
+import Biography from './Biography';
+import PropTypes from 'prop-types';
+import { useEffect, useState } from 'react';
+const BiographyList = ({ title, biographies, growToFit }) => {
+ const [classGrowToFit, setClassGrowToFit] = useState('');
+
+ useEffect(() => {
+ if (growToFit) {
+ setClassGrowToFit(
+ 'grid grid-cols-2 tablet:grid-cols-[repeat(auto-fit,minmax(22rem,1fr))]',
+ );
+ } else {
+ setClassGrowToFit('grid grid-cols-1 tablet:grid-cols-2');
+ }
+ }, [growToFit]);
+
+ return (
+
+
+ {title}
+
+
+ {biographies.map((biography, index) => (
+
+ ))}
+
+
+ );
+};
+
+BiographyList.propTypes = {
+ /**
+ * Title of the component
+ */
+ title: PropTypes.string,
+ /**
+ * Indicates if the cards should grow in width to fit the available space
+ */
+ growToFit: PropTypes.bool,
+ /**
+ * Array of biography objects
+ */
+ biographies: PropTypes.array.isRequired,
+};
+
+BiographyList.defaultProps = {
+ growToFit: true,
+};
+
+export default BiographyList;
diff --git a/site/src/components/BreadcrumbTab.jsx b/site/src/components/BreadcrumbTab.jsx
new file mode 100644
index 0000000..80162bc
--- /dev/null
+++ b/site/src/components/BreadcrumbTab.jsx
@@ -0,0 +1,55 @@
+import React, { useState } from 'react';
+import CodeSnippet from '@site/src/components/CodeSnippet';
+
+const BreadcrumbTab = ({ snippetMappings, dependencies }) => {
+ const [activeTab, setActiveTab] = useState(snippetMappings ? Object.keys(snippetMappings)[0] : dependencies[0].props.language);
+
+ const handleTabClick = (tab) => {
+ setActiveTab(tab === activeTab ? null : tab);
+ };
+
+ return (
+
+
+ {(snippetMappings ? Object.keys(snippetMappings) : dependencies.map(dep => dep.props.language)).map(title => (
+
handleTabClick(title)}
+ className={`breadcrumbTab ${activeTab === title ? 'active' : ''}`}
+ style={{
+ padding: '2px 15px',
+ margin: '10px',
+ borderRadius: '20px',
+ cursor: 'pointer',
+ backgroundColor: activeTab === title ? '#ffec19' : '#333333',
+ color: activeTab === title ? '#000' : '#fff',
+ border: '1px solid #ffec19',
+ fontSize: '0.9em',
+ textTransform: 'capitalize'
+ }}
+ >
+ {title}
+
+ ))}
+
+
+ {activeTab && dependencies && dependencies.map(dep => {
+ return (
+
+ {dep}
+
+ )
+ })}
+ {activeTab && snippetMappings && (
+
+ )}
+
+
+ );
+};
+
+export default BreadcrumbTab;
diff --git a/site/src/components/Button.jsx b/site/src/components/Button.jsx
new file mode 100644
index 0000000..cda1d41
--- /dev/null
+++ b/site/src/components/Button.jsx
@@ -0,0 +1,94 @@
+import PropTypes from 'prop-types';
+import React, { useEffect, useState } from 'react';
+
+const Button = ({
+ label,
+ url,
+ className,
+ isExternalLink,
+ colorDarkMode,
+ imageURL,
+ title,
+ onClick,
+}) => {
+ const [classesDarkMode, setClassesDarkMode] = useState('');
+ useEffect(() => {
+ if (colorDarkMode === 'cyan') {
+ setClassesDarkMode(
+ 'dark:shadow-button-sh-cyan dark:border-accent-cyan dark:hover:shadow-button-sh-hv-cyan dark:text-accent-cyan',
+ );
+ }
+ if (colorDarkMode === 'yellow') {
+ setClassesDarkMode(
+ 'dark:shadow-button-sh-yellow dark:border-primary-yellow dark:hover:shadow-button-sh-hv-yellow dark:text-primary-yellow',
+ );
+ }
+ if (colorDarkMode === 'purple') {
+ setClassesDarkMode(
+ 'dark:shadow-button-sh-purple dark:border-accent-purple dark:hover:shadow-button-sh-hv-purple dark:text-accent-purple',
+ );
+ }
+ }, [colorDarkMode]);
+
+ let cssClasses = `w-[fit-content] px-[1.375rem] mb-2 mr-2 button-text border-solid pt-[12px] pb-[14px] border-2 hover:translate-x-[4px] hover:translate-y-[4px] ${
+ className ? className : ''
+ }`;
+
+ cssClasses +=
+ 'bg-primary-yellow dark:bg-transparent text-primary-black shadow-button-sh border-primary-black hover:shadow-button-sh-hv ' +
+ classesDarkMode;
+
+ const linkContent = imageURL ? (
+
+
+
+
{label}
+
+
+ ) : (
+ {label}
+ );
+
+ const link = isExternalLink ? (
+
+ {linkContent}
+
+ ) : (
+
+ {linkContent}
+
+ );
+
+ return link;
+};
+
+Button.propTypes = {
+ label: PropTypes.string.isRequired,
+ url: PropTypes.string.isRequired,
+ title: PropTypes.string,
+ className: PropTypes.string,
+ imageURL: PropTypes.string,
+ isExternalLink: PropTypes.bool,
+ colorDarkMode: PropTypes.string,
+ onClick: PropTypes.func,
+};
+
+Button.defaultProps = {
+ isExternalLink: false,
+ colorDarkMode: 'cyan',
+};
+
+export default Button;
diff --git a/site/src/components/ButtonGroup.jsx b/site/src/components/ButtonGroup.jsx
new file mode 100644
index 0000000..2ddbdc6
--- /dev/null
+++ b/site/src/components/ButtonGroup.jsx
@@ -0,0 +1,29 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import Button from './Button';
+
+const ButtonGroup = ({ buttons, className, invertDarkMode }) => {
+ return (
+
+ {buttons.map((button) => (
+
+
+
+ ))}
+
+ );
+};
+
+ButtonGroup.propTypes = {
+ /**
+ * Text content
+ */
+ buttons: PropTypes.array.isRequired,
+ className: PropTypes.string,
+ invertDarkMode: PropTypes.bool,
+};
+
+export default ButtonGroup;
diff --git a/site/src/components/Calendar.jsx b/site/src/components/Calendar.jsx
new file mode 100644
index 0000000..ab540b5
--- /dev/null
+++ b/site/src/components/Calendar.jsx
@@ -0,0 +1,501 @@
+import React, { useState, useEffect } from 'react';
+import Modal from 'react-modal';
+
+Modal.setAppElement('#__docusaurus');
+
+// modal styling
+const customStyles = {
+ content: {
+ width: 'auto',
+ maxWidth: '800px',
+ height: 'auto',
+ backgroundColor: '#202124',
+ border: '1px solid #5F6368',
+ borderRadius: '8px',
+ top: '50%',
+ left: '50%',
+ right: 'auto',
+ bottom: 'auto',
+ marginRight: '-50%',
+ transform: 'translate(-50%, -50%)',
+ overflow: 'hidden',
+ overflowY: 'auto',
+ maxHeight: '80vh',
+ zIndex: '1000',
+ padding: '20px 40px',
+ color: '#FFFFFF',
+ fontSize: '16px',
+ fontFamily: 'Arial, sans-serif',
+ boxSizing: 'border-box',
+ },
+ overlay: {
+ backgroundColor: 'rgba(0, 0, 0, 0.85)',
+ zIndex: '999',
+ },
+ closeButton: {
+ position: 'absolute',
+ top: '10px',
+ right: '10px',
+ background: 'transparent',
+ border: 'none',
+ color: '#9c1cfc',
+ fontSize: '1.5em',
+ cursor: 'pointer',
+ },
+};
+
+const eventTypes = [
+ { label: '✨ All Events', value: 'all' },
+ { label: '👀 Show & Tells', value: '#ShowTell' },
+ { label: '🏢 Office Hours', value: '#OfficeHours' },
+ { label: '💡 Workshops', value: '#Workshop' },
+ { label: '🎮 Live Streams', value: '#LiveStreams' },
+ { label: '🎤 Conferences/Talks', value: '#ConferenceTalk' },
+];
+
+// generate google link
+const createGoogleCalendarLink = (event) => {
+ const startTime = new Date(event.start)
+ .toISOString()
+ .replace(/-|:|\.\d\d\d/g, '');
+ const endTime = new Date(event.end)
+ .toISOString()
+ .replace(/-|:|\.\d\d\d/g, '');
+ const details = encodeURIComponent(
+ event.description || 'No details provided.',
+ );
+ const location = encodeURIComponent(
+ event.location || 'No location provided.',
+ );
+ const text = encodeURIComponent(event.summary || 'No title');
+
+ return `https://calendar.google.com/calendar/render?action=TEMPLATE&text=${text}&dates=${startTime}/${endTime}&details=${details}&location=${location}`;
+};
+
+const CalendarComponent = () => {
+ const [unfilteredEvents, setUnfilteredEvents] = useState([]);
+ const [events, setEvents] = useState([]);
+ const [groupedEvents, setGroupedEvents] = useState({});
+ const [currentMonth, setCurrentMonth] = useState(new Date());
+ const [modalIsOpen, setIsOpen] = useState(false);
+ const [selectedEvent, setSelectedEvent] = useState(null);
+ const [selectedTypes, setSelectedTypes] = useState(new Set(['all']));
+ const [hasFilteredEvents, setHasFilteredEvents] = useState(true);
+ const [modalStyle, setModalStyle] = useState(customStyles);
+
+ useEffect(() => {
+ function applyCustomStyles() {
+ const newStyles = { ...modalStyle };
+ if (window.innerWidth < 768) {
+ newStyles.content = {
+ ...newStyles.content,
+ width: '90%',
+ padding: '10px',
+ };
+ } else {
+ newStyles.content = {
+ ...newStyles.content,
+ width: 'auto',
+ padding: '20px 40px',
+ };
+ }
+ setModalStyle(newStyles);
+ }
+ applyCustomStyles();
+ window.addEventListener('resize', applyCustomStyles);
+
+ return () => {
+ window.removeEventListener('resize', applyCustomStyles);
+ };
+ }, []);
+
+ const handleTypeChange = (event) => {
+ const type = event.target.value;
+ setSelectedTypes((prevSelectedTypes) => {
+ const newSelectedTypes = new Set(prevSelectedTypes);
+
+ if (type === 'all') {
+ newSelectedTypes.clear();
+ newSelectedTypes.add('all');
+ } else {
+ newSelectedTypes.delete('all');
+ if (newSelectedTypes.has(type)) {
+ newSelectedTypes.delete(type);
+ } else {
+ newSelectedTypes.add(type);
+ }
+ if (newSelectedTypes.size === 0) {
+ newSelectedTypes.add('all');
+ }
+ }
+ filterEventsByType(events, newSelectedTypes);
+ return newSelectedTypes;
+ });
+ };
+
+ const filterEventsByType = (allEvents, selectedTypes) => {
+ let filteredEvents;
+ if (selectedTypes.has('all') || selectedTypes.size === 0) {
+ filteredEvents = allEvents;
+ } else {
+ filteredEvents = allEvents.filter((event) =>
+ Array.from(selectedTypes).some(
+ (type) => event.description && event.description.includes(type),
+ ),
+ );
+ }
+ groupEventsByDate(filteredEvents);
+ setHasFilteredEvents(filteredEvents.length > 0);
+ };
+
+ useEffect(() => {
+ filterEventsByType(events, selectedTypes);
+ }, [selectedTypes, events]);
+
+ const filterAndGroupEvents = (allEvents, newCurrentMonth) => {
+ const startOfMonth = new Date(
+ newCurrentMonth.getFullYear(),
+ newCurrentMonth.getMonth(),
+ 1,
+ );
+ const endOfMonth = new Date(
+ newCurrentMonth.getFullYear(),
+ newCurrentMonth.getMonth() + 1,
+ 0,
+ );
+
+ const monthEvents = allEvents.filter((event) => {
+ const eventStartDate = new Date(event.start);
+ return eventStartDate >= startOfMonth && eventStartDate <= endOfMonth;
+ });
+
+ setEvents(monthEvents);
+ groupEventsByDate(monthEvents);
+ };
+
+ useEffect(() => {
+ const fetchEvents = async () => {
+ try {
+ const allEventsRes = await fetch(
+ `https://developer-tbd-website-calendar-service.tbddev.org/events`,
+ );
+ const allEvents = await allEventsRes.json();
+ setUnfilteredEvents(allEvents);
+ filterAndGroupEvents(allEvents, currentMonth);
+ } catch (error) {
+ console.error('Error fetching events:', error);
+ }
+ };
+
+ fetchEvents();
+ }, []);
+
+ useEffect(() => {
+ filterAndGroupEvents(unfilteredEvents, currentMonth);
+ }, [currentMonth, unfilteredEvents]);
+
+ const formatEventDateTime = (event) => {
+ if (!event) {
+ return { date: '', time: '' };
+ }
+ return {
+ date: new Date(event.start).toLocaleDateString('en-US', {
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric',
+ }),
+ time: `${new Date(event.start)
+ .toLocaleTimeString([], {
+ hour: 'numeric',
+ minute: '2-digit',
+ hour12: true,
+ })
+ .replace(/^0+/, '')} - ${new Date(event.end)
+ .toLocaleTimeString([], {
+ hour: 'numeric',
+ minute: '2-digit',
+ hour12: true,
+ })
+ .replace(/^0+/, '')}`,
+ };
+ };
+
+ const groupEventsByDate = (events) => {
+ const grouped = events.reduce((acc, event) => {
+ const date = new Date(event.start).toDateString();
+ if (!acc[date]) {
+ acc[date] = [];
+ }
+ acc[date].push(event);
+ return acc;
+ }, {});
+
+ setGroupedEvents(grouped);
+ };
+
+ const navigateMonth = (offset) => {
+ const newMonth = new Date(
+ currentMonth.getFullYear(),
+ currentMonth.getMonth() + offset,
+ 1,
+ );
+ setCurrentMonth(newMonth);
+ };
+
+ const openModal = (event) => {
+ setSelectedEvent(event);
+ setIsOpen(true);
+ };
+ const closeModal = () => {
+ setSelectedEvent(null);
+ setIsOpen(false);
+ };
+
+ // event card styling
+ const eventCardStyles = {
+ nav: {
+ display: 'flex',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ padding: '5px 0',
+ },
+ navButton: {
+ padding: '5px 10px',
+ cursor: 'pointer',
+ border: '1px solid #ccc',
+ borderRadius: '4px',
+ background: '#f0f0f0',
+ color: '#333',
+ fontSize: '16px',
+ fontWeight: 'bold',
+ outline: 'none',
+ margin: '0 1px',
+ },
+ eventListContainer: {
+ maxHeight: '600px',
+ overflowY: 'auto',
+ padding: '10px',
+ borderRadius: '8px',
+ cursor: 'pointer',
+ backgroundColor: '#1C1C1C',
+ },
+ card: {
+ border: '.5px solid #28e6ee',
+ padding: '25px',
+ margin: '10px 5px',
+ borderRadius: '8px',
+ },
+ date: {
+ fontWeight: 'bold',
+ fontSize: '22px',
+ fontstyle: 'italic',
+ color: 'cyan',
+ },
+ summary: {
+ fontSize: '20px',
+ color: '#ffec18',
+ padding: '5px',
+ },
+ time: {
+ fontWeight: 'bold',
+ marginLeft: '10px',
+ color: 'light gray',
+ },
+ link: {
+ textDecoration: 'none',
+ color: '#5d768b',
+ },
+ section: {
+ padding: '5px',
+ borderRadius: '8px',
+ margin: '25px 0',
+ },
+ };
+
+ return (
+
+
+
navigateMonth(-1)}
+ aria-label="Previous Month"
+ >
+
+
+
+ {' '}
+ {currentMonth.toLocaleString('default', {
+ month: 'long',
+ year: 'numeric',
+ })}
+
+
navigateMonth(1)}
+ aria-label="Next Month"
+ >
+
+
+
+
+ {/* Event type filter*/}
+
+
+ {/* event section */}
+
+ {hasFilteredEvents ? (
+ Object.keys(groupedEvents).map((date) => (
+
+
+ {new Date(date).toLocaleDateString('en-US', {
+ weekday: 'long',
+ month: 'long',
+ day: 'numeric',
+ })}
+
+ {groupedEvents[date].map((event, index) => (
+
openModal(event)}
+ >
+
{event.summary}
+
+ {formatEventDateTime(event).time}
+
+
{
+ e.stopPropagation();
+ window.open(createGoogleCalendarLink(event), '_blank');
+ }}
+ style={{
+ display: 'inline-block',
+ background: 'linear-gradient(to bottom, #111, #000)',
+ color: '#5d768b',
+ padding: '10px 20px',
+ borderRadius: '5px',
+ border: 'none',
+ textDecoration: 'none',
+ fontSize: '16px',
+ cursor: 'pointer',
+ transition: 'transform 0.2s, box-shadow 0.2s',
+ boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.5)',
+ marginTop: '15px',
+ fontWeight: 'bold',
+ }}
+ onMouseOver={(e) => {
+ e.currentTarget.style.transform = 'translateY(-2px)';
+ e.currentTarget.style.boxShadow = '2px 4px 7px #2ce2ea';
+ }}
+ onMouseOut={(e) => {
+ e.currentTarget.style.transform = 'translateY(0)';
+ e.currentTarget.style.boxShadow =
+ '2px 2px 5px rgba(0, 0, 0, 0.5)';
+ }}
+ >
+ 🗓️ Add to Calendar
+
+
+ ))}
+
+ ))
+ ) : (
+
+ )}
+
+
+
+ {selectedEvent ? (
+ <>
+
+ ×
+
+
+ {selectedEvent.summary}
+ {formatEventDateTime(selectedEvent).dateTime}
+
+ >
+ ) : (
+ Loading...
+ )}
+ {
+ e.stopPropagation();
+ window.open(createGoogleCalendarLink(selectedEvent), '_blank');
+ }}
+ style={{
+ display: 'inline-block',
+ background: 'linear-gradient(to bottom, #111, #000)',
+ color: '#5d768b',
+ padding: '10px 20px',
+ borderRadius: '5px',
+ border: 'none',
+ textDecoration: 'none',
+ fontSize: '16px',
+ cursor: 'pointer',
+ transition: 'transform 0.2s, box-shadow 0.2s',
+ boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.5)',
+ marginTop: '15px',
+ fontWeight: 'bold',
+ }}
+ onMouseOver={(e) => {
+ e.currentTarget.style.transform = 'translateY(-2px)';
+ e.currentTarget.style.boxShadow = '2px 4px 7px #2ce2ea';
+ }}
+ onMouseOut={(e) => {
+ e.currentTarget.style.transform = 'translateY(0)';
+ e.currentTarget.style.boxShadow = '2px 2px 5px rgba(0, 0, 0, 0.5)';
+ }}
+ >
+ 🗓️ Add to Calendar
+
+
+
+ );
+};
+
+export default CalendarComponent;
diff --git a/site/src/components/Card.jsx b/site/src/components/Card.jsx
new file mode 100644
index 0000000..220be58
--- /dev/null
+++ b/site/src/components/Card.jsx
@@ -0,0 +1,15 @@
+/* eslint-disable react/prop-types */
+import React from 'react';
+
+function Card({ children, className }) {
+ return (
+
+
+ {children}
+
+ );
+}
+
+export default Card;
diff --git a/site/src/components/ChatGPTSearch.jsx b/site/src/components/ChatGPTSearch.jsx
new file mode 100644
index 0000000..d572a96
--- /dev/null
+++ b/site/src/components/ChatGPTSearch.jsx
@@ -0,0 +1,170 @@
+import React, { useState, useEffect } from 'react';
+import ReactMarkdown from 'react-markdown';
+import "../css/search.css";
+
+const ChatSearch = () => {
+ const [isOpen, setIsOpen] = useState(false);
+ const [data, setData] = useState('.. and press ENTER to ask a question on web5, how to write code and more.');
+ const [query, setQuery] = useState('');
+ const [placeholder, setPlaceholder] = useState("Type your question here.");
+ let eventSource = null;
+
+ const placeholders = [
+ "how do I add web5 to my nodejs app?",
+ "what is a web5 protocol and how do I use them",
+ "show me how to build a todo app in web5",
+ "How do I use web5 with a CDN?",
+ // Add more placeholders here
+ ];
+
+ // Effect for setting isOpen on URL hash
+ useEffect(() => {
+ function checkHash() {
+ setIsOpen(window.location.hash === '#ask');
+ }
+
+ // Check the hash on component mount
+ checkHash();
+
+ // Listen for hash changes
+ window.addEventListener('hashchange', checkHash);
+
+ // Cleanup: remove the event listener on unmount
+ return () => {
+ window.removeEventListener('hashchange', checkHash);
+ };
+ }, []);
+
+
+ const handleClose = () => {
+ setIsOpen(false);
+ window.location.hash = ""; // remove #search from the URL when manually closing the panel
+ }
+
+ useEffect(() => {
+
+ if(query) {
+ // Initialize EventSource with your server endpoint
+ eventSource = new EventSource(`https://chatgpt.tbddev.org/ask_chat?query=${encodeURIComponent(query)}`);
+ //eventSource = new EventSource(`http://localhost:5003/ask_chat?query=${encodeURIComponent(query)}`);
+
+ // The message event is fired when a message comes from the server
+ eventSource.onmessage = (event) => {
+ // Append new data to the existing data
+ // replace event.data instances of |CR| with \n
+ let d = event.data.replaceAll("|CR|", "\n");
+ setData((prevData) => prevData == "Asking... 🚀"? d : prevData + d);
+
+ };
+
+ // The error event is fired when there is an error with the connection
+ eventSource.onerror = (error) => {
+ console.error('EventSource failed:', error);
+ eventSource.close();
+ };
+
+ // Cleanup on unmount: close the connection
+ return () => eventSource && eventSource.close();
+ }
+
+
+ const placeholderInterval = setInterval(() => {
+ setPlaceholder(placeholders[Math.floor(Math.random() * placeholders.length)]);
+ }, 5000); // Change every 5 seconds
+
+ return () => clearInterval(placeholderInterval); // Cleanup on unmount
+ }, [query]);
+
+ const handleKeyUp = (event) => {
+ if (event.key === 'Enter') {
+ setData('Asking... 🚀');
+ setIsOpen(true);
+ setQuery(event.target.value);
+ } else {
+ event.target.rows = 1;
+ event.target.rows = ((event.target.scrollHeight - event.target.clientHeight) / 24) + 1;
+ }
+ }
+
+ const handleKeyDown = (event) => {
+ if (event.key === 'Enter') {
+ event.preventDefault();
+ }
+ }
+
+
+ function CodeBlock(props) {
+ return (
+
+
+ {props.value}
+
+
+ );
+ }
+
+ return (
+
+
+
+
+ Close
+
+
+
Ask Me Anything:
+
+
+
+ );
+};
+
+
+function padNewlines(data) {
+ let inCodeBlock = false;
+ let processedData = '';
+ const lines = data.split('\n');
+
+ for(let i = 0; i < lines.length; i++) {
+ const line = lines[i];
+
+ // Check for code block start or end
+ if(line.trim().startsWith('```')) {
+ inCodeBlock = !inCodeBlock;
+ }
+
+ // If not in a code block and the next line is not empty or a code block start, add an extra newline
+ if (!inCodeBlock && i < lines.length - 1 && !lines[i + 1].trim().startsWith('```')) {
+ if (lines[i + 1].trim() !== '') {
+ // Case for single newline
+ processedData += line + '\n\n';
+ } else if (i < lines.length - 2 && lines[i + 2].trim() !== '' && !lines[i + 2].trim().startsWith('```')) {
+ // Case for double newline
+ processedData += line + '\n\n\n\n';
+ i++; // skip the next newline
+ } else {
+ processedData += line + '\n';
+ }
+ } else {
+ processedData += line + '\n';
+ }
+ }
+
+ return processedData;
+}
+
+
+
+export default ChatSearch;
diff --git a/site/src/components/CodeSnippet.jsx b/site/src/components/CodeSnippet.jsx
new file mode 100644
index 0000000..6cba97e
--- /dev/null
+++ b/site/src/components/CodeSnippet.jsx
@@ -0,0 +1,92 @@
+import React, { useState, useEffect } from 'react';
+import CodeBlock from '@theme/CodeBlock';
+import codeSnippets from '../../src/util/code-snippets-map.json'; // Import for old system
+
+// Define the language map for the new system
+const languageExtensionMap = {
+ javascript: 'js',
+ kotlin: 'kt',
+ swift: 'swift',
+ bash: 'bash',
+ dart: 'dart',
+ go: 'go',
+ gradle: 'gradle',
+ xml: 'xml',
+};
+
+const CodeSnippet = ({
+ functionName, // old system
+ snippetName, // new system
+ importString,
+ snippet, // Direct snippet content for the old system
+ language = 'javascript',
+ title,
+}) => {
+ const [newSnippetContent, setNewSnippetContent] = useState('');
+ const [error, setError] = useState('');
+
+ useEffect(() => {
+ // PLEASE LEAVE THE BELOW CODE HERE, WILL BE LOOKING INTO THIS IN THE FUTURE - Nick
+ // const cache = {};
+
+ // function importAll(r) {
+ // r.keys().forEach((key) => (cache[key] = r(key)));
+ // }
+
+ // importAll(require.context('../../snippets', true, /\.js$/));
+
+ if (snippetName) {
+ setError('');
+
+ // Dynamically determine the directory based on the language
+ const languageDir = languageExtensionMap[language] || language;
+
+ try {
+ // Use require.context to dynamically load the snippet for the new system
+ const context = require.context(
+ '../../snippets/',
+ true,
+ /\.snippet\.js$/,
+ );
+ const snippetPath = `./${languageDir}/${snippetName}.snippet.js`;
+ const snippetModule = context(snippetPath);
+ setNewSnippetContent(snippetModule.default);
+ } catch (err) {
+ console.error(
+ `Failed to load snippet: ${snippetName} for language: ${language}`,
+ err,
+ );
+ setError(
+ `Code snippet "${snippetName}" not found for language "${language}".`,
+ );
+ }
+ }
+ }, [snippetName, language]);
+
+ let finalSnippet;
+
+ // Check if using old system
+ if (functionName) {
+ const oldSnippet = codeSnippets[functionName];
+ if (!oldSnippet) {
+ return Error: Code snippet not found for {functionName}.
;
+ }
+ finalSnippet = importString
+ ? `${importString}\n\n${oldSnippet}`
+ : oldSnippet;
+ } else if (newSnippetContent) {
+ // Using new system
+ finalSnippet = newSnippetContent;
+ } else if (!snippetName && !snippet) {
+ // No valid snippet found
+ return null;
+ }
+
+ return (
+
+ {finalSnippet || snippet}
+
+ );
+};
+
+export default CodeSnippet;
diff --git a/site/src/components/Community.jsx b/site/src/components/Community.jsx
new file mode 100644
index 0000000..e7541fe
--- /dev/null
+++ b/site/src/components/Community.jsx
@@ -0,0 +1,60 @@
+import React from 'react';
+import Link from '@docusaurus/Link';
+import Button from './Button';
+
+function CommunityCard({ icon, title, CTA, buttonUrl, buttonText }) {
+ return (
+
+
+
+
+
+
+ );
+}
+
+function Community() {
+ return (
+
+
Join the Community
+
Connect with us everywhere.
+
+
+
+
+
+
+
+ );
+}
+
+export default Community;
diff --git a/site/src/components/CommunityCard.jsx b/site/src/components/CommunityCard.jsx
new file mode 100644
index 0000000..0de8e9b
--- /dev/null
+++ b/site/src/components/CommunityCard.jsx
@@ -0,0 +1,20 @@
+import React from 'react'
+import Button from './Button'
+
+function CommunityCard({ icon, title, CTA, buttonUrl, buttonText }) {
+ return (
+
+
+
+
+
+
+ );
+ }
+
+ export default CommunityCard;
\ No newline at end of file
diff --git a/site/src/components/CommunitySection.jsx b/site/src/components/CommunitySection.jsx
new file mode 100644
index 0000000..aede05c
--- /dev/null
+++ b/site/src/components/CommunitySection.jsx
@@ -0,0 +1,8 @@
+import React from 'react';
+import Card from './Card';
+
+function CommunitySection() {
+ return
;
+}
+
+export default CommunitySection;
diff --git a/site/src/components/ConferenceCommunitySection.jsx b/site/src/components/ConferenceCommunitySection.jsx
new file mode 100644
index 0000000..5bf82e9
--- /dev/null
+++ b/site/src/components/ConferenceCommunitySection.jsx
@@ -0,0 +1,52 @@
+import React from 'react';
+import Link from '@docusaurus/Link';
+import Button from './Button';
+
+function CommunityCard({ icon, title, CTA, buttonUrl, buttonText }) {
+ return (
+
+
+
+
+
+
+ );
+}
+
+function ConferenceCommunity() {
+ return (
+
+
+ );
+}
+
+export default ConferenceCommunity;
diff --git a/site/src/components/ConferenceScheduleSection.jsx b/site/src/components/ConferenceScheduleSection.jsx
new file mode 100644
index 0000000..a32245c
--- /dev/null
+++ b/site/src/components/ConferenceScheduleSection.jsx
@@ -0,0 +1,60 @@
+import React from 'react';
+import Link from '@docusaurus/Link';
+
+function ScheduleCard({ image, DateTime, EventName, EventDetails,ExtraDetails }) {
+ return (
+
+
+
+
+
+
+
{DateTime}
+
{EventName}
+
{EventDetails}
+
{ExtraDetails}
+
+
+
+ );
+}
+
+function ConferenceSchedule() {
+ return (
+
+ );
+}
+
+export default ConferenceSchedule;
diff --git a/site/src/components/Dependencies.jsx b/site/src/components/Dependencies.jsx
new file mode 100644
index 0000000..a7faad6
--- /dev/null
+++ b/site/src/components/Dependencies.jsx
@@ -0,0 +1,66 @@
+import React from 'react';
+import Dependency from './Dependency';
+import LanguageTabBar from './language/LanguageTabBar';
+import LanguageSwitchBlock from './language/LanguageSwitchBlock';
+import BreadcrumbTab from './BreadcrumbTab';
+
+const languageMap = {
+ kotlin: 'Kotlin',
+ javascript: 'JavaScript',
+ gradle: 'Kotlin',
+ maven: 'Kotlin',
+ swift: 'Swift',
+};
+
+function Dependencies({ languageDependencies }) {
+ const mavenDependencies =
+ languageDependencies.find(({ language }) => language === 'maven')
+ ?.dependencies || [];
+ const gradleDependencies =
+ languageDependencies.find(({ language }) => language === 'gradle')
+ ?.dependencies || [];
+
+ return (
+ <>
+
+
+ {languageDependencies.map(({ language, dependencies }) => {
+ if (language === 'maven' || language === 'gradle') {
+ return (
+
+
+
+ );
+ } else {
+ return (
+
+
+
+ );
+ }
+ })}
+
+ >
+ );
+}
+
+function KotlinDependencies({ mavenDependencies, gradleDependencies }) {
+ const kotlinDependencies = [
+ ,
+ ,
+ ];
+ return ;
+}
+
+export default Dependencies;
diff --git a/site/src/components/Dependency.jsx b/site/src/components/Dependency.jsx
new file mode 100644
index 0000000..4ed2ea7
--- /dev/null
+++ b/site/src/components/Dependency.jsx
@@ -0,0 +1,184 @@
+// src/components/PackageJson.js
+import React from 'react';
+import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
+import CodeBlock from '@theme/CodeBlock';
+import BreadcrumbTab from '@site/src/components/BreadcrumbTab';
+
+function GradleDependencies({ dependencies, sdks }) {
+ const repositoriesBlock = `repositories {
+ mavenCentral()
+ maven {
+ name = "tbd-oss-thirdparty"
+ url = uri("https://blockxyz.jfrog.io/artifactory/tbd-oss-thirdparty-maven2/")
+ mavenContent {
+ releasesOnly()
+ }
+ }`;
+
+ const dependenciesBlock = dependencies
+ .map((dep) => {
+ const version = sdks[dep];
+ if (version) {
+ return ` implementation("xyz.block:${dep}:${version}")`;
+ } else {
+ return ` implementation("${dep}")`;
+ }
+ })
+ .join('\n');
+
+ const gradleDependenciesBlock = `dependencies {\n${dependenciesBlock}\n}`;
+ const gradleString = `${repositoriesBlock}\n${gradleDependenciesBlock}`;
+
+ return {gradleString} ;
+}
+
+function MavenDependencies({ dependencies, sdks }) {
+ const repositoriesBlock = `
+
+ tbd-oss-thirdparty
+ tbd-oss-thirdparty
+
+ true
+
+
+ false
+
+ https://blockxyz.jfrog.io/artifactory/tbd-oss-thirdparty-maven2/
+
+ `;
+
+ const dependenciesBlock = dependencies
+ .map((dep) => {
+ let [groupId, artifactId, version] = dep.split(':');
+ if (!version) {
+ // Handle the case where the version isn't part of the split
+ version = sdks[dep];
+ groupId = 'xyz.block';
+ artifactId = dep;
+ }
+ return `
+
+ ${groupId}
+ ${artifactId}
+ ${version}
+ `;
+ })
+ .join('');
+
+ const mavenString = `${repositoriesBlock} \n${dependenciesBlock} `;
+
+ return {mavenString} ;
+}
+
+function SwiftDependencies({ dependencies, sdkVersions }) {
+ const swiftImports = dependencies
+ .map((dep, index) => {
+ const packageInfo = sdkVersions.swift[dep];
+ if (!packageInfo) {
+ console.error(`Package "${dep}" not found in sdkVersions.swift`);
+ return null;
+ }
+ const { url, branch } = packageInfo;
+ return ` .package(url: "${url}", branch: "${branch}")`;
+ })
+ .filter(Boolean)
+ .join(',\n');
+
+ const swiftDependenciesString = `dependencies: [\n${swiftImports}\n]`;
+
+ return {swiftDependenciesString} ;
+}
+
+// Function to render npm install commands
+function InstallCommands({ dependencies, sdkVersions }) {
+ const commandString = dependencies
+ .map((dep) => {
+ const normalizedDep = dep.startsWith('@') ? dep : `@${dep}`;
+ const version = sdkVersions[normalizedDep];
+ if (version) {
+ return `npm install ${normalizedDep}@${version}`;
+ } else {
+ return `npm install ${normalizedDep}`;
+ }
+ })
+ .join('\n');
+
+ return {commandString} ;
+}
+
+// Function to render JavaScript package.json
+function PackageJson({ sdkVersions, dependencies }) {
+ const requiredDependencies = Object.entries(dependencies).reduce(
+ (acc, [dep, depName]) => {
+ const depVersion = sdkVersions.js[depName];
+ acc[depName] = depVersion;
+ return acc;
+ },
+ { type: 'module' },
+ );
+
+ const jsonString = JSON.stringify(requiredDependencies, null, 2);
+ return {jsonString} ;
+}
+
+function JvmDependencies({ dependencies, sdks, language }) {
+ if (language === 'gradle') {
+ return ;
+ }
+
+ if (language === 'maven') {
+ return ;
+ }
+}
+
+// Main Dependencies component
+function Dependency({ language, dependencies, display = 'install' }) {
+ const {
+ siteConfig: { customFields },
+ } = useDocusaurusContext();
+
+ const { SDK_VERSIONS } = customFields;
+
+ switch (display) {
+ case 'install':
+ switch (language) {
+ case 'javascript':
+ return (
+
+ );
+ case 'gradle':
+ case 'maven':
+ return (
+
+ );
+ case 'swift':
+ return (
+
+ );
+ default:
+ return null; // Handle unsupported languages
+ }
+ default:
+ }
+
+ switch (language) {
+ case 'javascript':
+ return (
+
+ );
+ default:
+ return null;
+ }
+}
+
+export default Dependency;
diff --git a/site/src/components/DetailsSummary.jsx b/site/src/components/DetailsSummary.jsx
new file mode 100644
index 0000000..6032ec2
--- /dev/null
+++ b/site/src/components/DetailsSummary.jsx
@@ -0,0 +1,84 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { useState, useEffect } from 'react';
+import { useCallback } from 'react';
+const DetailsSummary = ({ details, summary }) => {
+ const arrayDetails = details.toString().split(/\r?\n/);
+ const [isOpen, setIsOpen] = useState(false);
+
+ const [scrollPosition, setScrollPosition] = useState(0);
+ const handleScroll = useCallback(() => {
+ const position = window.scrollY;
+ setScrollPosition(position);
+ }, []);
+ useEffect(() => {
+ window.addEventListener('scroll', handleScroll);
+
+ return () => {
+ window.removeEventListener('scroll', handleScroll);
+ };
+ }, []);
+ useEffect(() => {
+ if (isOpen) {
+ window.scroll(0, scrollPosition);
+ }
+ }, [isOpen]);
+
+ const clickHandler = () => {
+ setIsOpen((prevValue) => !prevValue);
+ };
+ return (
+
+ {summary}
+
+
+
+
+ {isOpen ? (
+
View Less
+ ) : (
+
View More
+ )}
+
+
+
+
+
+ {arrayDetails.map((paragraph, index) => (
+
+ {paragraph}
+
+ ))}
+
+
+
+ );
+};
+
+DetailsSummary.propTypes = {
+ /**
+ * Text content
+ */
+ details: PropTypes.string.isRequired,
+ summary: PropTypes.string,
+};
+
+export default DetailsSummary;
diff --git a/site/src/components/Divider.jsx b/site/src/components/Divider.jsx
new file mode 100644
index 0000000..89256fc
--- /dev/null
+++ b/site/src/components/Divider.jsx
@@ -0,0 +1,29 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+export default function Divider({ type }) {
+ let classes;
+
+ if (type === 'slash') {
+ classes = 'bg-slash-dark border-none h-2';
+ } else if (type === 'legal') {
+ classes = 'bg-dotted-legal border-none h-[2px]';
+ } else if (type === 'dotted-small') {
+ classes = 'bg-dotted-small-dark border-none h-[2px]';
+ } else {
+ classes = 'bg-dotted-dark border-none h-[2px]';
+ }
+
+ return (
+
+ );
+}
+Divider.propTypes = {
+ /**
+ * divider type: dotted, slash, legal
+ */
+ type: PropTypes.string.isRequired,
+};
diff --git a/site/src/components/EventCard.jsx b/site/src/components/EventCard.jsx
new file mode 100644
index 0000000..f22ada9
--- /dev/null
+++ b/site/src/components/EventCard.jsx
@@ -0,0 +1,99 @@
+/* eslint-disable react/prop-types */
+/* eslint-disable react/jsx-no-target-blank */
+import React from 'react';
+export default function EventCard({
+ title,
+ dateEvent,
+ timeEvent,
+ locationEvent,
+ locationLink,
+ description,
+ thumbnail,
+ url,
+ type,
+ duration,
+ isExternalLink,
+}) {
+ let icon = null;
+ if (type === 'video') {
+ icon = '/img/video-media-icon.svg';
+ } else if (type === 'audio') {
+ icon = '/img/audio-media-icon.svg';
+ } else if (type === 'article') {
+ icon = '/img/article-media-icon.svg';
+ }
+ const [seconds, minutes, hours] = `${duration}`
+ .split(':')
+ .reverse()
+ .map((el) => parseInt(el));
+ let DurationText = '';
+ if (hours || minutes || seconds) DurationText += ' Duration:';
+ if (hours) DurationText += ` ${hours}h`;
+ if (minutes) DurationText += ` ${minutes}min`;
+ if (seconds) DurationText += ` ${seconds}sec`;
+
+ const linkLabel = `${
+ isExternalLink ? 'Opens in a new tab: ' : ''
+ } ${title}.${DurationText}`;
+
+ return (
+
+ {thumbnail ? (
+
+ ) : null}
+
+
{title}
+
+
+
+
+ {dateEvent} | {timeEvent}
+
+
+
+
+
+
+ );
+}
diff --git a/site/src/components/EventCardList.jsx b/site/src/components/EventCardList.jsx
new file mode 100644
index 0000000..fd6da9c
--- /dev/null
+++ b/site/src/components/EventCardList.jsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import EventCard from './EventCard';
+import PropTypes from 'prop-types';
+import Divider from './Divider';
+const EventCardList = ({ items }) => {
+ const learnList = items.map((item) => {
+ return { ...item.customProps, url: item.href, title: item.label };
+ });
+
+ return (
+
+
+ {learnList.map((learn, index) => (
+
+ ))}
+
+
+ );
+};
+
+EventCardList.propTypes = {
+ items: PropTypes.array.isRequired,
+};
+
+export default EventCardList;
diff --git a/site/src/components/ExploreCard.jsx b/site/src/components/ExploreCard.jsx
new file mode 100644
index 0000000..63c84f8
--- /dev/null
+++ b/site/src/components/ExploreCard.jsx
@@ -0,0 +1,26 @@
+import React, { useState } from 'react';
+
+function ExploreCard({ text, icon, url, imgClass }) {
+ // Create a state variable to control the box shadow
+ const [isHovered, setIsHovered] = useState(false);
+
+ return (
+ setIsHovered(true)} // Set isHovered to true on hover
+ onMouseLeave={() => setIsHovered(false)} // Set isHovered to false on mouse leave
+ >
+ {icon && text && (
+
+ )}
+
+
{text}
+
+
+ );
+}
+
+export default ExploreCard;
diff --git a/site/src/components/ExternalContributors.jsx b/site/src/components/ExternalContributors.jsx
new file mode 100644
index 0000000..215d5f4
--- /dev/null
+++ b/site/src/components/ExternalContributors.jsx
@@ -0,0 +1,154 @@
+import React, { useState, useEffect } from 'react';
+import contentData from '@site/src/externalContributors.json';
+
+export default function ContributorShowcase() {
+ const [filters, setFilters] = useState({
+ video: false,
+ blog: false,
+ social: false,
+ });
+ const [content, setContent] = useState([]);
+
+ useEffect(() => {
+ setContent(contentData);
+ }, []);
+
+ const handleCheckboxChange = (event) => {
+ const { name, checked } = event.target;
+ setFilters((prevFilters) => ({
+ ...prevFilters,
+ [name]: checked,
+ }));
+ };
+
+ const filteredContent = content.filter((item) => {
+ if (!filters.video && !filters.blog && !filters.social) return true;
+ return filters[item.type];
+ });
+
+ return (
+
+
Compelling content is how we introduce and teach developers about the decentralized web (dweb). Whether it's a short video or in-depth blog post breaking down a complex topic, this space is dedicated to your top content on our open source projects, the dweb, and more.
+
Have a contribution you want to share? Head over to GitHub and check out this issue to learn how!
+
+
+
+
+ 🎥 Videos
+
+
+
+ 📝 Blog Posts
+
+
+
+ 📲 Social Media
+
+
+
+
+
+ {filteredContent.map((item, index) => (
+
{
+ e.currentTarget.style.transform = 'translateY(-2px)';
+ e.currentTarget.style.boxShadow = '2px 4px 7px #2ce2ea';
+ e.currentTarget.style.cursor = 'pointer';
+ }}
+ onMouseOut={(e) => {
+ e.currentTarget.style.transform = 'translateY(0)';
+ e.currentTarget.style.boxShadow =
+ '2px 2px 5px rgba(0, 0, 0, 0.5)';
+ }}
+ >
+
+
+ {item.title}
+ By: {item.contributor}
+
+
+ ))}
+
+
+
+ );
+}
+
+const filterContainerStyle = {
+ marginBottom: '20px',
+ display: 'flex',
+ gap: '20px',
+ justifyContent: 'center',
+};
+
+const labelStyle = {
+ display: 'flex',
+ alignItems: 'center',
+};
+
+const checkboxLabelText = {
+ marginLeft: '8px',
+};
+
+const scrollableContainerStyle = {
+ maxHeight: '850px',
+ overflowY: 'auto',
+ padding: '0 20px',
+ marginBottom: '20px',
+};
+
+const containerStyle = {
+ display: 'grid',
+ gridTemplateColumns: 'repeat(auto-fit, minmax(220px, 1fr))',
+ gap: '20px',
+ justifyItems: 'center',
+};
+
+const itemStyle = {
+ textAlign: 'center',
+ maxWidth: '320px',
+ padding: '10px',
+ borderRadius: '8px',
+ transition: 'transform 0.2s, box-shadow 0.2s',
+ boxShadow: '2px 2px 5px rgba(0, 0, 0, 0.5)',
+};
+
+const thumbnailStyle = {
+ width: '100%',
+ height: 'auto',
+ aspectRatio: '16 / 9',
+ objectFit: 'cover',
+};
+
+const titleStyle = {
+ margin: '10px 0 5px',
+ fontSize: '18px',
+ fontWeight: 'bold',
+ color: '#21F1FF',
+};
+
+const contributorStyle = {
+ fontSize: '14px',
+ color: '#FFEC18',
+};
diff --git a/site/src/components/FeedbackWidget.jsx b/site/src/components/FeedbackWidget.jsx
new file mode 100644
index 0000000..ed34183
--- /dev/null
+++ b/site/src/components/FeedbackWidget.jsx
@@ -0,0 +1,39 @@
+import React from 'react';
+import Link from '@docusaurus/Link';
+
+import Card from './Card';
+import FeedbackWidgetRating from './FeedbackWidgetRating';
+import '../css/feedback.css';
+
+function FeedbackWidget() {
+ return (
+
+ );
+}
+
+export default FeedbackWidget;
diff --git a/site/src/components/FeedbackWidgetRating.jsx b/site/src/components/FeedbackWidgetRating.jsx
new file mode 100644
index 0000000..a155adf
--- /dev/null
+++ b/site/src/components/FeedbackWidgetRating.jsx
@@ -0,0 +1,49 @@
+import React from 'react';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+import { faThumbsUp, faThumbsDown } from '@fortawesome/free-solid-svg-icons';
+
+import '../css/feedback.css';
+import { useFeedbackRating } from '../hooks';
+
+function FeedbackWidgetRating() {
+ const { isFeedbackRatingEnabled, userFeedback, submitUserRating } =
+ useFeedbackRating();
+
+ return isFeedbackRatingEnabled ? (
+
+ {userFeedback ? (
+ <>
+ Thank you for your feedback!
+
+ >
+ ) : (
+ <>
+ submitUserRating('like')}
+ />
+ submitUserRating('dislike')}
+ />
+ >
+ )}
+
+ ) : null;
+}
+
+function RatingButton({ label, icon, onClick }) {
+ return (
+
+ {label}
+
+
+ );
+}
+
+export default FeedbackWidgetRating;
diff --git a/site/src/components/Gallery.jsx b/site/src/components/Gallery.jsx
new file mode 100644
index 0000000..724463a
--- /dev/null
+++ b/site/src/components/Gallery.jsx
@@ -0,0 +1,57 @@
+import React, { useState } from 'react';
+import Slider from 'react-slick';
+import 'slick-carousel/slick/slick.css';
+import 'slick-carousel/slick/slick-theme.css';
+
+function Gallery({ images }) {
+ const [hoverIndex, setHoverIndex] = useState(null);
+
+ const settings = {
+ dots: true,
+ infinite: true,
+ speed: 500,
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ };
+
+ const containerStyle = {
+ width: '60%',
+ margin: '0 auto',
+ };
+
+ const imageStyle = {
+ width: '100%',
+ boxShadow: '2px 2px 10px rgba(0, 0, 0, 0.1)',
+ transition: 'transform 0.3s',
+ transform: hoverIndex !== null ? 'scale(1.05)' : 'none',
+ };
+
+ return (
+
+
+ {images.map((image, index) => (
+ setHoverIndex(index)}
+ onMouseOut={() => setHoverIndex(null)}
+ >
+
+ {' '}
+
+
+
+ ))}
+
+
+ );
+}
+
+export default Gallery;
diff --git a/site/src/components/GlitchWrapper.jsx b/site/src/components/GlitchWrapper.jsx
new file mode 100644
index 0000000..0b071a7
--- /dev/null
+++ b/site/src/components/GlitchWrapper.jsx
@@ -0,0 +1,88 @@
+import React from 'react';
+import { useEffect, useState } from 'react';
+import Illustration from './Illustration';
+import { getGlitchMap } from '../util/glitches';
+
+const randomIntNumber = (min, max) => {
+ return Math.floor(Math.random() * (max - min) + min);
+};
+
+// eslint-disable-next-line react/prop-types
+const GlitchWrapper = ({ children }) => {
+ const [glitchMap, setGlitchMap] = useState([]);
+
+ const assignGlitches = () => {
+ const numberGlitches = randomIntNumber(1, 6);
+ let allZones = ['a', 'b', 'c', 'd', 'e', 'f'];
+
+ let zones = [];
+ for (let i = 0; i < numberGlitches; i++) {
+ const indexZone = randomIntNumber(0, allZones.length);
+ zones.push(allZones[indexZone]);
+ allZones = allZones.filter((zone) => zone !== allZones[indexZone]);
+ }
+ const glitchMapTemp = getGlitchMap(zones);
+ setGlitchMap(glitchMapTemp);
+ };
+
+ useEffect(() => {
+ assignGlitches();
+ }, []);
+
+ return (
+
+ {glitchMap.a ? (
+
+ ) : null}
+ {glitchMap.b ? (
+
+ ) : null}
+ {glitchMap.c ? (
+
+ ) : null}
+
+ {children}
+ {glitchMap.d ? (
+
+ ) : null}
+ {glitchMap.e ? (
+
+ ) : null}
+ {glitchMap.f ? (
+
+ ) : null}
+
+ );
+};
+
+export default GlitchWrapper;
diff --git a/site/src/components/HeroCard.jsx b/site/src/components/HeroCard.jsx
new file mode 100644
index 0000000..5764768
--- /dev/null
+++ b/site/src/components/HeroCard.jsx
@@ -0,0 +1,51 @@
+import React from 'react';
+import Button from './Button';
+
+function HeroCard({
+ heroText,
+ bodyText,
+ buttonUrl,
+ buttonText,
+ primary = false,
+ themeColor = 'cyan',
+ imgSrc,
+ imgClass = 'w-32',
+}) {
+ return (
+
+ {imgSrc && (
+
+ )}
+
+
+ {primary ? (
+
+
{heroText}
+ {bodyText}
+
+ ) : (
+
+
{heroText}
+
{bodyText}
+
+ )}
+
+
+
+
+
+ );
+}
+
+export default HeroCard;
diff --git a/site/src/components/HighlightsCard.jsx b/site/src/components/HighlightsCard.jsx
new file mode 100644
index 0000000..1526328
--- /dev/null
+++ b/site/src/components/HighlightsCard.jsx
@@ -0,0 +1,67 @@
+/* eslint-disable react/prop-types */
+/* eslint-disable react/jsx-no-target-blank */
+import React from 'react';
+export default function HighlightsCard({
+ title,
+ thumbnail,
+ url,
+ type,
+ duration,
+ isExternalLink,
+}) {
+ let icon = null;
+ if (type === 'video') {
+ icon = '/img/video-media-icon.svg';
+ } else if (type === 'audio') {
+ icon = '/img/audio-media-icon.svg';
+ } else if (type === 'article') {
+ icon = '/img/article-media-icon.svg';
+ }
+ const [seconds, minutes, hours] = `${duration}`
+ .split(':')
+ .reverse()
+ .map((el) => parseInt(el));
+ let DurationText = '';
+ if (hours || minutes || seconds) DurationText += ' Duration:';
+ if (hours) DurationText += ` ${hours}h`;
+ if (minutes) DurationText += ` ${minutes}min`;
+ if (seconds) DurationText += ` ${seconds}sec`;
+
+ const linkLabel = `${
+ isExternalLink ? 'Opens in a new tab: ' : ''
+ } ${title}.${DurationText}`;
+
+ return (
+
+
+
+
+
+
+
+
+
+ {type !== 'article' ? (
+
+ ) : null}
+
+
+
+
{title}
+
+
+ );
+}
diff --git a/site/src/components/HighlightsCardList.jsx b/site/src/components/HighlightsCardList.jsx
new file mode 100644
index 0000000..763483d
--- /dev/null
+++ b/site/src/components/HighlightsCardList.jsx
@@ -0,0 +1,51 @@
+import React from 'react';
+import { HighlightsCard } from '../HighlightsCard';
+import PropTypes from 'prop-types';
+
+const HighlightsCardList = ({ title, highlights, growToFit }) => {
+ let classGrow =
+ 'grid grid-cols-1 tablet:grid-cols-[repeat(auto-fit,minmax(10rem,1fr))]';
+ if (!growToFit) {
+ classGrow = 'grid grid-cols-1 tablet:grid-cols-[repeat(auto-fit,10rem)]';
+ }
+ return (
+
+ {title ? (
+
{title}
+ ) : null}
+
+ {highlights.map((project, index) => (
+
+
+
+ ))}
+
+
+ );
+};
+
+HighlightsCardList.propTypes = {
+ /**
+ * Title of the component
+ */
+ title: PropTypes.string,
+ /**
+ * Indicates if the cards should grow in width to fit the available space
+ */
+ growToFit: PropTypes.bool,
+ /**
+ * Array of projects
+ */
+ highlights: PropTypes.array.isRequired,
+};
+
+HighlightsCardList.defaultProps = {
+ growToFit: true,
+};
+
+export default HighlightsCardList;
diff --git a/site/src/components/HighlightsEmbed.jsx b/site/src/components/HighlightsEmbed.jsx
new file mode 100644
index 0000000..7938d08
--- /dev/null
+++ b/site/src/components/HighlightsEmbed.jsx
@@ -0,0 +1,15 @@
+/* eslint-disable react/prop-types */
+import React from 'react';
+import Video from './Video';
+const HighlightsEmbed = ({ title, url }) => {
+ return (
+
+ );
+};
+
+export default HighlightsEmbed;
diff --git a/site/src/components/HighlightsEmbedGrid.jsx b/site/src/components/HighlightsEmbedGrid.jsx
new file mode 100644
index 0000000..c9ff37a
--- /dev/null
+++ b/site/src/components/HighlightsEmbedGrid.jsx
@@ -0,0 +1,32 @@
+/* eslint-disable react/prop-types */
+import React from 'react';
+import HighlightsEmbed from './HighlightsEmbed';
+
+const HighlightsEmbedGrid = ({ title, highlights, growToFit }) => {
+ let classGrow =
+ 'grid grid-cols-1 tablet:grid-cols-[repeat(auto-fit,minmax(10rem,1fr))]';
+ if (!growToFit) {
+ classGrow = 'grid grid-cols-1 tablet:grid-cols-[repeat(auto-fit,21rem)]';
+ }
+ return (
+
+ {title ? (
+
{title}
+ ) : null}
+
+ {highlights.map((project, index) => (
+
+
+
+ ))}
+
+
+ );
+};
+
+export default HighlightsEmbedGrid;
diff --git a/site/src/components/HomeList.jsx b/site/src/components/HomeList.jsx
new file mode 100644
index 0000000..e5742c2
--- /dev/null
+++ b/site/src/components/HomeList.jsx
@@ -0,0 +1,40 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import Divider from './Divider';
+import HomeListItem from './HomeListItem';
+
+const HomeList = ({ features, className }) => {
+ return (
+
+ {features.map((feature, index) => (
+
+
+ {index == features.length - 1 ? null : (
+
+ )}
+
+ ))}
+
+ );
+};
+HomeList.propTypes = {
+ /**
+ * list content
+ */
+ features: PropTypes.arrayOf(PropTypes.object),
+ className: PropTypes.string,
+};
+export default HomeList;
diff --git a/site/src/components/HomeListItem.jsx b/site/src/components/HomeListItem.jsx
new file mode 100644
index 0000000..fb53bbf
--- /dev/null
+++ b/site/src/components/HomeListItem.jsx
@@ -0,0 +1,50 @@
+import React from 'react';
+import Button from './Button';
+import PropTypes from 'prop-types';
+
+const HomeListItem = ({ title, description, label, url, className }) => {
+ const Description = description;
+
+ return (
+
+
+
{title}
+
+ {typeof description === 'function' ? (
+
+
+
+ ) : (
+
{description}
+ )}
+
+
+
+
+ );
+};
+HomeListItem.propTypes = {
+ /**
+ * Button contents
+ */
+ label: PropTypes.string.isRequired,
+ /**
+ * Button URL
+ */
+ url: PropTypes.string.isRequired,
+ /**
+ * Title of the component
+ */
+ title: PropTypes.string.isRequired,
+ /**
+ * Text of the component
+ */
+ description: PropTypes.oneOfType([PropTypes.string, PropTypes.func])
+ .isRequired,
+
+ /**
+ * aditional Classes
+ */
+ className: PropTypes.string,
+};
+export default HomeListItem;
diff --git a/site/src/components/HomepageFeatures/index.js b/site/src/components/HomepageFeatures/index.js
new file mode 100644
index 0000000..f639d84
--- /dev/null
+++ b/site/src/components/HomepageFeatures/index.js
@@ -0,0 +1,68 @@
+import React from 'react';
+import clsx from 'clsx';
+import styles from './styles.module.css';
+
+import SvgMountain from '@site/static/img/undraw_docusaurus_mountain.svg';
+import SvgTree from '@site/static/img/undraw_docusaurus_tree.svg';
+import SvgReact from '@site/static/img/undraw_docusaurus_react.svg';
+
+const FeatureList = [
+ {
+ title: 'Easy to Use',
+ Svg: SvgMountain,
+ description: (
+ <>
+ Docusaurus was designed from the ground up to be easily installed and
+ used to get your website up and running quickly.
+ >
+ ),
+ },
+ {
+ title: 'Focus on What Matters',
+ Svg: SvgTree,
+ description: (
+ <>
+ Docusaurus lets you focus on your docs, and we'll do the chores. Go
+ ahead and move your docs into the docs
directory.
+ >
+ ),
+ },
+ {
+ title: 'Powered by React',
+ Svg: SvgReact,
+ description: (
+ <>
+ Extend or customize your website layout by reusing React. Docusaurus can
+ be extended while reusing the same header and footer.
+ >
+ ),
+ },
+];
+
+function Feature({ Svg, title, description }) {
+ return (
+
+
+
+
+
+
{title}
+
{description}
+
+
+ );
+}
+
+export default function HomepageFeatures() {
+ return (
+
+
+
+ {FeatureList.map((props, idx) => (
+
+ ))}
+
+
+
+ );
+}
diff --git a/site/src/components/HomepageFeatures/styles.module.css b/site/src/components/HomepageFeatures/styles.module.css
new file mode 100644
index 0000000..b248eb2
--- /dev/null
+++ b/site/src/components/HomepageFeatures/styles.module.css
@@ -0,0 +1,11 @@
+.features {
+ display: flex;
+ align-items: center;
+ padding: 2rem 0;
+ width: 100%;
+}
+
+.featureSvg {
+ height: 200px;
+ width: 200px;
+}
diff --git a/site/src/components/Illustration.jsx b/site/src/components/Illustration.jsx
new file mode 100644
index 0000000..cd03179
--- /dev/null
+++ b/site/src/components/Illustration.jsx
@@ -0,0 +1,37 @@
+import PropTypes from 'prop-types';
+import React, { useEffect, useState } from 'react';
+// import RandomAccentColor from '../utils/random-accent-color';
+const Illustration = ({
+ img,
+ className,
+ alt,
+ accentClass,
+ imgStyle,
+ ...imageProps
+}) => {
+ return (
+
+
+
+ );
+};
+
+Illustration.propTypes = {
+ /**
+ * Illustration contents
+ */
+ img: PropTypes.string.isRequired,
+ className: PropTypes.string,
+};
+
+Illustration.defaultProps = {
+ img: '/img/dinosaur-illustration.svg',
+ alt: '',
+ imgStyle: null,
+};
+
+export default Illustration;
diff --git a/site/src/components/ImportSrc.jsx b/site/src/components/ImportSrc.jsx
new file mode 100644
index 0000000..27c3fc9
--- /dev/null
+++ b/site/src/components/ImportSrc.jsx
@@ -0,0 +1,25 @@
+import React from 'react';
+import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
+import CodeBlock from '@theme/CodeBlock';
+
+function ImportSrc(site) {
+ const {
+ siteConfig: { customFields },
+ } = useDocusaurusContext();
+
+ if (site.src === "unpkg") {
+ return (
+
+ {`import { Web5 } from 'https://unpkg.com/@web5/api@${customFields.WEB5_VERSION}/dist/browser.js';`}
+
+ );
+ } else {
+ return (
+
+ {`import { Web5 } from 'https://cdn.jsdelivr.net/npm/@web5/api@${customFields.WEB5_VERSION}/dist/browser.mjs'`}
+
+ );
+ }
+}
+
+export default ImportSrc;
diff --git a/site/src/components/KnowledgeCheck.jsx b/site/src/components/KnowledgeCheck.jsx
new file mode 100644
index 0000000..1676c86
--- /dev/null
+++ b/site/src/components/KnowledgeCheck.jsx
@@ -0,0 +1,20 @@
+import React from 'react';
+
+function KnowledgeCheck({ url }) {
+ return (
+
+ );
+}
+
+export default KnowledgeCheck;
diff --git a/site/src/components/LearnCard.jsx b/site/src/components/LearnCard.jsx
new file mode 100644
index 0000000..1589141
--- /dev/null
+++ b/site/src/components/LearnCard.jsx
@@ -0,0 +1,101 @@
+/* eslint-disable react/prop-types */
+/* eslint-disable react/jsx-no-target-blank */
+import React from 'react';
+export default function LearnCard({
+ title,
+ guests,
+ description,
+ thumbnail,
+ url,
+ type,
+ duration,
+ isExternalLink,
+}) {
+ let icon = null;
+ if (type === 'video') {
+ icon = '/img/video-media-icon.svg';
+ } else if (type === 'audio') {
+ icon = '/img/audio-media-icon.svg';
+ } else if (type === 'article') {
+ icon = '/img/article-media-icon.svg';
+ }
+ const [seconds, minutes, hours] = `${duration}`
+ .split(':')
+ .reverse()
+ .map((el) => parseInt(el));
+ let DurationText = '';
+ if (hours || minutes || seconds) DurationText += ' Duration:';
+ if (hours) DurationText += ` ${hours}h`;
+ if (minutes) DurationText += ` ${minutes}min`;
+ if (seconds) DurationText += ` ${seconds}sec`;
+
+ const linkLabel = `${
+ isExternalLink ? 'Opens in a new tab: ' : ''
+ } ${title}.${DurationText}`;
+
+ return (
+
+
+
+
+
+
+
+
+
+ {type !== 'article' ? (
+
+ ) : null}
+
+
+
+
{title}
+
+ {guests ? (
+
+ {guests.length == 1 ? (
+ Guest
+ ) : (
+ Guests
+ )}
+ {guests.join(', ')}
+
+ ) : null}
+ {description ? (
+
+ ) : null}
+
+
+ );
+}
diff --git a/site/src/components/LearnCardList.jsx b/site/src/components/LearnCardList.jsx
new file mode 100644
index 0000000..4152775
--- /dev/null
+++ b/site/src/components/LearnCardList.jsx
@@ -0,0 +1,38 @@
+import React from 'react';
+import LearnCard from './LearnCard';
+import PropTypes from 'prop-types';
+import Divider from './Divider';
+const LearnCardList = ({ items }) => {
+ const learnList = items.map((item) => {
+ return {
+ ...item.customProps,
+ url: item.href,
+ title: item.label,
+ guests: item.customProps.guestslist,
+ };
+ });
+ return (
+
+
+
+ {learnList.map((learn, index) => (
+
+
+ {index == learnList.length - 1 ? null : (
+
+ )}
+
+ ))}
+
+
+
+ );
+};
+
+LearnCardList.propTypes = {
+ items: PropTypes.array.isRequired,
+};
+
+export default LearnCardList;
diff --git a/site/src/components/NewsletterSubscribe.jsx b/site/src/components/NewsletterSubscribe.jsx
new file mode 100644
index 0000000..33fe1cc
--- /dev/null
+++ b/site/src/components/NewsletterSubscribe.jsx
@@ -0,0 +1,12 @@
+import React from 'react';
+
+const NewsletterSubscription = () => {
+ return (
+
+ );
+};
+
+export default NewsletterSubscription;
diff --git a/site/src/components/PackageJson.jsx b/site/src/components/PackageJson.jsx
new file mode 100644
index 0000000..de2ecdb
--- /dev/null
+++ b/site/src/components/PackageJson.jsx
@@ -0,0 +1,22 @@
+// src/components/PackageJson.js
+import React from 'react';
+import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
+import CodeBlock from '@theme/CodeBlock';
+
+function PackageJson() {
+ const {
+ siteConfig: { customFields },
+ } = useDocusaurusContext();
+ const json = {
+ dependencies: {
+ '@web5/api': customFields.WEB5_VERSION,
+ },
+ type: 'module',
+ };
+
+ let jsonString = JSON.stringify(json, null, 2);
+
+ return {jsonString} ;
+}
+
+export default PackageJson;
diff --git a/site/src/components/PfiQuickstartCodeRunner.jsx b/site/src/components/PfiQuickstartCodeRunner.jsx
new file mode 100644
index 0000000..bc4fd49
--- /dev/null
+++ b/site/src/components/PfiQuickstartCodeRunner.jsx
@@ -0,0 +1,105 @@
+import React, { useState, useRef } from 'react';
+import JsonView from 'react18-json-view';
+import '@site/src/css/web5-quickstart.css';
+import 'react18-json-view/src/style.css';
+import { useQuickstartExecutionContext } from '@site/src/components/QuickstartExecutionContext';
+
+// Don't delete. Need this for now due to webpack / docusaurus config
+const importFunction = async (name) => (await import('../../code-snippets/tbdex/pfi-quickstart.js'))[name];
+
+const executeFunctions = {
+ executeDidCreate: () => importFunction('pfiQuickstartGetDid'),
+ executeAddOffering: () => importFunction('pfiQuickstartAddOffering'),
+ executeGetOfferings: () => importFunction('pfiQuickstartGetOfferings'),
+ executeGetExchanges: () => importFunction('pfiQuickstartGetExchanges'),
+ executeGetQuote: () => importFunction('pfiQuickstartGetQuote'),
+ executeGetOrderStatus: () => importFunction('pfiQuickstartGetOrderStatus'),
+ executeGetClose: () => importFunction('pfiQuickstartGetClose')
+};
+
+const PfiQuickstartCodeRunner = ({
+ executeCodeName,
+ viewJsonObj = false,
+ stepIndex,
+ collapseLevel,
+ defaultInputValue,
+ customPlaceholder,
+ autoOpenDetails = true
+}) => {
+ const [output, setOutput] = useState('');
+ const [loading, setLoading] = useState(false);
+ const [inputValue, setInputValue] = useState('');
+ const detailsRef = useRef(null);
+ const { stepsCompleted, markStepCompleted } = useQuickstartExecutionContext();
+
+ const handleRun = async () => {
+ setLoading(true);
+ try {
+ const executeCode = await executeFunctions[executeCodeName]();
+ const result = await executeCode(inputValue.trim() || defaultInputValue);
+ setOutput(result);
+ if (detailsRef.current && autoOpenDetails) {
+ detailsRef.current.open = true;
+ }
+ markStepCompleted(stepIndex);
+ } catch (error) {
+ setOutput(`Error: ${error.message}`);
+ if (detailsRef.current && autoOpenDetails) {
+ detailsRef.current.open = true;
+ }
+ }
+ setLoading(false);
+ };
+
+ const isEnabled = stepsCompleted.includes(stepIndex - 1) || stepIndex === 0;
+
+ return (
+
+
+ {defaultInputValue && (
+
+ setInputValue(e.target.value)}
+ />
+
+ )}
+
+ Run {'>'}
+
+ {loading &&
}
+
+
+
+
+ {viewJsonObj ? (
+ output ? (
+
+ ) : (
+
+
+ {customPlaceholder}
+
+
+ )
+ ) : (
+ output ? (
+ {output}
+ ) : (
+
+
+ {customPlaceholder}
+
+
+ )
+ )}
+
+
+
+
+ );
+};
+
+export default PfiQuickstartCodeRunner;
diff --git a/site/src/components/Pillar.jsx b/site/src/components/Pillar.jsx
new file mode 100644
index 0000000..1b07e09
--- /dev/null
+++ b/site/src/components/Pillar.jsx
@@ -0,0 +1,58 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+
+// eslint-disable-next-line react/prop-types
+const Pillar = ({ img, title, description, alt }) => {
+ const Description = description;
+ return (
+
+
+
+
+
+
+
+
+
+
{title}
+
+ {typeof description === 'function' ? (
+
+
+
+ ) : (
+
{description}
+ )}
+
+
+
+ );
+};
+
+Pillar.propTypes = {
+ /**
+ * Image source
+ */
+ img: PropTypes.string.isRequired,
+ /**
+ * Title of the component
+ */
+ title: PropTypes.string.isRequired,
+ /**
+ * Text of the component
+ */
+ description: PropTypes.oneOfType([PropTypes.string, PropTypes.func])
+ .isRequired,
+
+ /**
+ * Alt text for image
+ */
+ alt: PropTypes.string,
+};
+export default Pillar;
diff --git a/site/src/components/PillarList.jsx b/site/src/components/PillarList.jsx
new file mode 100644
index 0000000..ac41abe
--- /dev/null
+++ b/site/src/components/PillarList.jsx
@@ -0,0 +1,36 @@
+import React from 'react';
+import Pillar from './Pillar';
+import PropTypes from 'prop-types';
+import Divider from './Divider';
+const PillarList = ({ title, pillars }) => {
+ return (
+
+
{title}
+
+ {pillars.map((pillar, index) => (
+
+
+ {index == pillars.length - 1 ? null : (
+
+ )}
+
+ ))}
+
+
+ );
+};
+
+PillarList.propTypes = {
+ /**
+ * Title of the component
+ */
+ title: PropTypes.string.isRequired,
+ /**
+ * x
+ */
+ pillars: PropTypes.array.isRequired,
+};
+
+export default PillarList;
diff --git a/site/src/components/Project.jsx b/site/src/components/Project.jsx
new file mode 100644
index 0000000..4137841
--- /dev/null
+++ b/site/src/components/Project.jsx
@@ -0,0 +1,80 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import Button from './Button';
+
+const Project = ({
+ icon,
+ title,
+ description,
+ textButton,
+ url,
+ isExternalLink,
+}) => {
+ const Description = description;
+ return (
+
+
+
+
+
+
{title}
+
+
+ {typeof description === 'function' ? (
+
+
+
+ ) : (
+
{description}
+ )}
+
+
+ {isExternalLink ? (
+
+ ) : (
+
+ )}
+
+
+ );
+};
+
+Project.propTypes = {
+ /**
+ * Button contents
+ */
+ textButton: PropTypes.string.isRequired,
+ /**
+ * Icon shown on top
+ */
+ icon: PropTypes.string.isRequired,
+ /**
+ * Title of the component
+ */
+ title: PropTypes.string.isRequired,
+ /**
+ * Text of the component
+ */
+ description: PropTypes.oneOfType([PropTypes.string, PropTypes.func])
+ .isRequired,
+ /**
+ * Url for the button to go to
+ */
+ url: PropTypes.string.isRequired,
+
+ /**
+ * Url for the button to go to
+ */
+ isExternalLink: PropTypes.bool,
+};
+Project.defaultProps = {
+ isExternalLink: false,
+};
+
+export default Project;
diff --git a/site/src/components/ProjectList.jsx b/site/src/components/ProjectList.jsx
new file mode 100644
index 0000000..a4d4597
--- /dev/null
+++ b/site/src/components/ProjectList.jsx
@@ -0,0 +1,56 @@
+import React from 'react';
+import Project from './Project';
+import PropTypes from 'prop-types';
+import Divider from './Divider';
+const ProjectList = ({ title, projects, growToFit }) => {
+ let classGrow =
+ 'grid grid-cols-1 tablet:grid-cols-[repeat(auto-fit,minmax(20.75rem,1fr))]';
+ if (!growToFit) {
+ classGrow = 'grid grid-cols-1 tablet:grid-cols-[repeat(auto-fit,20.75rem)]';
+ }
+ return (
+
+ {title ? (
+
{title}
+ ) : null}
+
+ {projects.map((project, index) => (
+
+
+ {index == projects.length - 1 ? null : (
+
+ )}
+
+ ))}
+
+
+ );
+};
+
+ProjectList.propTypes = {
+ /**
+ * Title of the component
+ */
+ title: PropTypes.string,
+ /**
+ * Indicates if the cards should grow in width to fit the available space
+ */
+ growToFit: PropTypes.bool,
+ /**
+ * Array of projects
+ */
+ projects: PropTypes.array.isRequired,
+};
+
+ProjectList.defaultProps = {
+ growToFit: true,
+};
+
+export default ProjectList;
diff --git a/site/src/components/ProjectsDashboard.jsx b/site/src/components/ProjectsDashboard.jsx
new file mode 100644
index 0000000..d53f9b7
--- /dev/null
+++ b/site/src/components/ProjectsDashboard.jsx
@@ -0,0 +1,669 @@
+import React from 'react';
+
+const projects = {
+ '@web5/common': {
+ url: 'https://github.com/TBD54566975/web5-js/tree/main/packages/common',
+ language: 'js',
+ repo: 'web5-js',
+ group: 'web5',
+ packageName: 'common',
+ ciStatus: [
+ {
+ type: 'ghWorkflow',
+ label: 'ci',
+ value: 'tests-ci.yml',
+ },
+ ],
+ license: [
+ { type: 'ghLicense' },
+ { type: 'npmLicense' },
+ ],
+ scan: [
+ {
+ type: 'ghWorkflow',
+ label: 'scan',
+ value: 'security.yml',
+ },
+ { type: 'fossa-license' },
+ { type: 'fossa-security' },
+ ],
+ ossf: [{ type: 'ossf' }],
+ sast: [{ type: 'ghWorkflow', label: 'CodeQL', value: 'codeql.yml' }],
+ tests: [{ type: 'codecov' }, { type: 'vectors' }],
+ release: [
+ { type: 'ghTag', value: '@web5/common@*' },
+ { type: 'npmPkg' },
+ // { label: 'spdx' },
+ // { label: 'cydx' },
+ ],
+ apiDocs: [],
+ },
+ '@web5/credentials': {
+ url: 'https://github.com/TBD54566975/web5-js/tree/main/packages/credentials',
+ language: 'js',
+ repo: 'web5-js',
+ group: 'web5',
+ packageName: 'credentials',
+ ciStatus: [
+ {
+ type: 'ghWorkflow',
+ label: 'ci',
+ value: 'tests-ci.yml',
+ },
+ ],
+ license: [
+ { type: 'ghLicense' },
+ { type: 'npmLicense' },
+ ],
+ scan: [
+ {
+ type: 'ghWorkflow',
+ label: 'scan',
+ value: 'security.yml',
+ },
+ { type: 'fossa-license' },
+ { type: 'fossa-security' },
+ ],
+ ossf: [{ type: 'ossf' }],
+ sast: [{ type: 'ghWorkflow', label: 'CodeQL', value: 'codeql.yml' }],
+ tests: [{ type: 'codecov' }, { type: 'vectors' }],
+ release: [
+ { type: 'ghTag', value: '@web5/credentials@*' },
+ { type: 'npmPkg' },
+ // { label: 'spdx' },
+ // { label: 'cydx' },
+ ],
+ apiDocs: [
+ {
+ type: 'ghWorkflow',
+ label: 'docs ci',
+ value: 'docs-ci.yml',
+ },
+ {
+ type: 'ghWorkflow',
+ label: 'docs publish',
+ value: 'docs-publish.yml',
+ },
+ {
+ value: 'reference docs',
+ href: 'https://tbd54566975.github.io/web5-js/modules/_web5_credentials.html',
+ },
+ ],
+ },
+ '@web5/crypto': {
+ url: 'https://github.com/TBD54566975/web5-js/tree/main/packages/crypto',
+ language: 'js',
+ repo: 'web5-js',
+ group: 'web5',
+ packageName: 'crypto',
+ ciStatus: [
+ {
+ type: 'ghWorkflow',
+ label: 'ci',
+ value: 'tests-ci.yml',
+ },
+ ],
+ license: [
+ { type: 'ghLicense' },
+ { type: 'npmLicense' },
+ ],
+ scan: [
+ {
+ type: 'ghWorkflow',
+ label: 'scan',
+ value: 'security.yml',
+ },
+ { type: 'fossa-license' },
+ { type: 'fossa-security' },
+ ],
+ ossf: [{ type: 'ossf' }],
+ sast: [{ type: 'ghWorkflow', label: 'CodeQL', value: 'codeql.yml' }],
+ tests: [{ type: 'codecov' }, { type: 'vectors' }],
+ release: [
+ { type: 'ghTag', value: '@web5/crypto@*' },
+ { type: 'npmPkg' },
+ // { label: 'spdx' },
+ // { label: 'cydx' },
+ ],
+ apiDocs: [
+ {
+ type: 'ghWorkflow',
+ label: 'docs ci',
+ value: 'docs-ci.yml',
+ },
+ {
+ type: 'ghWorkflow',
+ label: 'docs publish',
+ value: 'docs-publish.yml',
+ },
+ {
+ value: 'reference docs',
+ href: 'https://tbd54566975.github.io/web5-js/modules/_web5_crypto.html',
+ },
+ ],
+ },
+ '@web5/dids': {
+ url: 'https://github.com/TBD54566975/web5-js/tree/main/packages/dids',
+ language: 'js',
+ repo: 'web5-js',
+ group: 'web5',
+ packageName: 'dids',
+ ciStatus: [
+ {
+ type: 'ghWorkflow',
+ label: 'ci',
+ value: 'tests-ci.yml',
+ },
+ ],
+ license: [
+ { type: 'ghLicense' },
+ { type: 'npmLicense' },
+ ],
+ scan: [
+ {
+ type: 'ghWorkflow',
+ label: 'scan',
+ value: 'security.yml',
+ },
+ { type: 'fossa-license' },
+ { type: 'fossa-security' },
+ ],
+ ossf: [{ type: 'ossf' }],
+ sast: [{ type: 'ghWorkflow', label: 'CodeQL', value: 'codeql.yml' }],
+ tests: [{ type: 'codecov' }, { type: 'vectors' }],
+ release: [
+ { type: 'ghTag', value: '@web5/dids@*' },
+ { type: 'npmPkg' },
+ // { label: 'spdx' },
+ // { label: 'cydx' },
+ ],
+ apiDocs: [
+ {
+ type: 'ghWorkflow',
+ label: 'docs ci',
+ value: 'docs-ci.yml',
+ },
+ {
+ type: 'ghWorkflow',
+ label: 'docs publish',
+ value: 'docs-publish.yml',
+ },
+ {
+ value: 'reference docs',
+ href: 'https://tbd54566975.github.io/web5-js/modules/_web5_dids.html',
+ },
+ ],
+ },
+ '@tbdex/protocol': {
+ url: 'https://github.com/TBD54566975/tbdex-js/tree/main/packages/protocol',
+ language: 'js',
+ repo: 'tbdex-js',
+ group: 'tbdex',
+ packageName: 'protocol',
+ ciStatus: [
+ {
+ type: 'ghWorkflow',
+ label: 'ci',
+ value: 'integrity-check.yml',
+ },
+ ],
+ license: [
+ { type: 'ghLicense' },
+ { type: 'npmLicense' },
+ ],
+ scan: [
+ {
+ type: 'ghWorkflow',
+ label: 'scan',
+ value: 'security.yml',
+ },
+ { type: 'fossa-license' },
+ { type: 'fossa-security' },
+ ],
+ ossf: [{ type: 'ossf' }],
+ sast: [{ type: 'ghWorkflow', label: 'CodeQL', value: 'codeql.yml' }],
+ tests: [{ type: 'codecov' }, { type: 'vectors' }],
+ release: [
+ { type: 'ghTag', value: '@tbdex/protocol@*' },
+ { type: 'npmPkg' },
+ // { label: 'spdx' },
+ // { label: 'cydx' },
+ ],
+ apiDocs: [
+ {
+ type: 'ghWorkflow',
+ label: 'docs ci',
+ value: 'docs-ci.yml',
+ },
+ {
+ type: 'ghWorkflow',
+ label: 'docs publish',
+ value: 'docs-publish.yml',
+ },
+ {
+ value: 'reference docs',
+ href: 'https://tbd54566975.github.io/tbdex-js/modules/_tbdex_protocol.html',
+ },
+ ],
+ },
+ '@tbdex/http-client': {
+ url: 'https://github.com/TBD54566975/tbdex-js/tree/main/packages/http-client',
+ language: 'js',
+ repo: 'tbdex-js',
+ group: 'tbdex',
+ packageName: 'http-client',
+ ciStatus: [
+ {
+ type: 'ghWorkflow',
+ label: 'ci',
+ value: 'integrity-check.yml',
+ },
+ ],
+ license: [
+ { type: 'ghLicense' },
+ { type: 'npmLicense' },
+ ],
+ scan: [
+ {
+ type: 'ghWorkflow',
+ label: 'scan',
+ value: 'security.yml',
+ },
+ { type: 'fossa-license' },
+ { type: 'fossa-security' },
+ ],
+ ossf: [{ type: 'ossf' }],
+ sast: [{ type: 'ghWorkflow', label: 'CodeQL', value: 'codeql.yml' }],
+ tests: [{ type: 'codecov' }, { type: 'vectors' }],
+ release: [
+ { type: 'ghTag', value: '@tbdex/http-client@*' },
+ { type: 'npmPkg' },
+ // { label: 'spdx' },
+ // { label: 'cydx' },
+ ],
+ apiDocs: [
+ {
+ type: 'ghWorkflow',
+ label: 'docs ci',
+ value: 'docs-ci.yml',
+ },
+ {
+ type: 'ghWorkflow',
+ label: 'docs publish',
+ value: 'docs-publish.yml',
+ },
+ {
+ value: 'reference docs',
+ href: 'https://tbd54566975.github.io/tbdex-js/modules/_tbdex_http_client.html',
+ },
+ ],
+ },
+ '@tbdex/http-server': {
+ url: 'https://github.com/TBD54566975/tbdex-js/tree/main/packages/http-server',
+ language: 'js',
+ repo: 'tbdex-js',
+ group: 'tbdex',
+ packageName: 'http-server',
+ ciStatus: [
+ {
+ type: 'ghWorkflow',
+ label: 'ci',
+ value: 'integrity-check.yml',
+ },
+ ],
+ license: [
+ { type: 'ghLicense' },
+ { type: 'npmLicense' },
+ ],
+ scan: [
+ {
+ type: 'ghWorkflow',
+ label: 'scan',
+ value: 'security.yml',
+ },
+ { type: 'fossa-license' },
+ { type: 'fossa-security' },
+ ],
+ ossf: [{ type: 'ossf' }],
+ sast: [{ type: 'ghWorkflow', label: 'CodeQL', value: 'codeql.yml' }],
+ tests: [{ type: 'codecov' }, { type: 'vectors' }],
+ release: [
+ { type: 'ghTag', value: '@tbdex/http-server@*' },
+ { type: 'npmPkg' },
+ // { label: 'spdx' },
+ // { label: 'cydx' },
+ ],
+ apiDocs: [
+ {
+ type: 'ghWorkflow',
+ label: 'docs ci',
+ value: 'docs-ci.yml',
+ },
+ {
+ type: 'ghWorkflow',
+ label: 'docs publish',
+ value: 'docs-publish.yml',
+ },
+ {
+ value: 'reference docs',
+ href: 'https://tbd54566975.github.io/tbdex-js/modules/_tbdex_http_server.html',
+ },
+ ],
+ },
+ 'tbdex-kt': {
+ url: 'https://github.com/TBD54566975/tbdex-kt',
+ language: 'kt',
+ repo: 'tbdex-kt',
+ ciStatus: [
+ {
+ type: 'ghWorkflow',
+ label: 'ci',
+ value: 'ci.yml',
+ },
+ ],
+ license: [{ type: 'ghLicense' }],
+ scan: [
+ {
+ type: 'ghWorkflow',
+ label: 'scan',
+ value: 'security.yml',
+ },
+ { type: 'fossa-license' },
+ { type: 'fossa-security' },
+ ],
+ ossf: [{ type: 'ossf' }],
+ sast: [{ type: 'ghWorkflow', label: 'CodeQL', value: 'codeql.yml' }],
+ tests: [{ type: 'codecov' }, { type: 'vectors' }],
+ release: [
+ { type: 'ghTag' },
+ { type: 'mavenCentral', value: 'tbdex' },
+ // { label: 'spdx' },
+ // { label: 'cydx' },
+ ],
+ apiDocs: [
+ {
+ type: 'ghWorkflow',
+ label: 'docs ci',
+ value: 'ci.yml',
+ },
+ {
+ type: 'ghWorkflow',
+ label: 'docs publish',
+ value: 'release.yml',
+ },
+ {
+ value: 'reference docs',
+ href: 'https://tbd54566975.github.io/tbdex-kt/docs',
+ },
+ ],
+ },
+ 'web5-kt': {
+ url: 'https://github.com/TBD54566975/web5-kt',
+ language: 'kt',
+ repo: 'web5-kt',
+ ciStatus: [
+ {
+ type: 'ghWorkflow',
+ label: 'ci',
+ value: 'ci.yml',
+ },
+ ],
+ license: [{ type: 'ghLicense' }],
+ scan: [
+ {
+ type: 'ghWorkflow',
+ label: 'scan',
+ value: 'security.yml',
+ },
+ { type: 'fossa-license' },
+ { type: 'fossa-security' },
+ ],
+ ossf: [{ type: 'ossf' }],
+ sast: [{ type: 'ghWorkflow', label: 'CodeQL', value: 'codeql.yml' }],
+ tests: [{ type: 'codecov' }, { type: 'vectors' }],
+ release: [
+ { type: 'ghTag' },
+ { type: 'mavenCentral', value: 'web5' },
+ // { label: 'spdx' },
+ // { label: 'cydx' },
+ ],
+ apiDocs: [
+ {
+ type: 'ghWorkflow',
+ label: 'docs ci',
+ value: 'ci.yml',
+ },
+ {
+ type: 'ghWorkflow',
+ label: 'docs publish',
+ value: 'release.yml',
+ },
+ {
+ value: 'reference docs',
+ href: 'https://tbd54566975.github.io/web5-kt/docs',
+ },
+ ],
+ },
+ 'web5-swift': {
+ url: 'https://github.com/TBD54566975/web5-swift',
+ language: 'swift',
+ repo: 'web5-swift',
+ ciStatus: [
+ {
+ type: 'ghWorkflow',
+ label: 'ci',
+ value: 'ci.yml',
+ },
+ ],
+ license: [{ type: 'ghLicense' }],
+ scan: [
+ {
+ type: 'ghWorkflow',
+ label: 'scan',
+ value: 'security.yml',
+ },
+ { type: 'fossa-license' },
+ { type: 'fossa-security' },
+ ],
+ ossf: [{ type: 'ossf' }],
+ sast: [{ type: 'ghWorkflow', label: 'CodeQL', value: 'codeql.yml' }],
+ tests: [{ type: 'codecov' }, { type: 'vectors' }],
+ release: [
+ { type: 'ghTag' },
+ // { label: 'spdx' },
+ // { label: 'cydx' },
+ ],
+ apiDocs: [
+ {
+ value: 'reference docs',
+ href: 'https://swiftpackageindex.com/TBD54566975/web5-swift/main/documentation/web5',
+ },
+ ],
+ },
+ 'tbdex-swift': {
+ url: 'https://github.com/TBD54566975/tbdex-swift',
+ language: 'swift',
+ repo: 'tbdex-swift',
+ ciStatus: [
+ {
+ type: 'ghWorkflow',
+ label: 'ci',
+ value: 'ci.yml',
+ },
+ ],
+ license: [{ type: 'ghLicense' }],
+ scan: [
+ {
+ type: 'ghWorkflow',
+ label: 'scan',
+ value: 'security.yml',
+ },
+ { type: 'fossa-license' },
+ { type: 'fossa-security' },
+ ],
+ ossf: [{ type: 'ossf' }],
+ sast: [{ type: 'ghWorkflow', label: 'CodeQL', value: 'codeql.yml' }],
+ tests: [
+ { type: 'codecov' },
+ // { type: 'vectors' }
+ ],
+ release: [
+ { type: 'ghTag' },
+ // { label: 'spdx' },
+ // { label: 'cydx' },
+ ],
+ apiDocs: [
+ {
+ value: 'reference docs',
+ href: 'https://swiftpackageindex.com/TBD54566975/tbdex-swift/main/documentation/tbdex',
+ },
+ ],
+ },
+};
+
+/**
+ * Consolidates the Projects Badges Status in a table
+ */
+function ProjectsDashboard() {
+ return (
+
+
+
+ SDK
+ CI Status
+ License
+ License & Security Scanning
+ OSSF Score
+ SAST/Lint
+ Tests
+ Release
+ API Reference Docs
+
+
+
+ {Object.keys(projects).map((project) => (
+
+ ))}
+
+
+ );
+}
+
+function ProjectItem(item) {
+ return (
+
+
+
+
+
+ {item.ciStatus.map((shield, idx) => (
+
+ ))}
+
+
+ {item.license.map((shield, idx) => (
+
+ ))}
+
+
+ {item.scan.map((shield, idx) => (
+
+ ))}
+
+
+ {item.ossf.map((shield, idx) => (
+
+ ))}
+
+
+ {item.sast.map((shield, idx) => (
+
+ ))}
+
+
+ {item.tests.map((shield, idx) => (
+
+ ))}
+
+
+ {item.release.map((shield, idx) => (
+
+ ))}
+
+
+ {item.apiDocs.map((shield, idx) => (
+
+ ))}
+
+
+ );
+}
+
+function Shield({
+ type = 'badge',
+ label = '',
+ href,
+ value,
+ group,
+ packageName,
+ repo,
+}) {
+ let badgeSrc = `https://img.shields.io/${type}/${label}-${value}-purple?style=flat-square`;
+ if (type === 'ghWorkflow') {
+ badgeSrc = `https://img.shields.io/github/actions/workflow/status/TBD54566975/${repo}/${value}?style=flat-square&branch=main&logo=github&label=${label}&logoColor=FFFFFF`;
+ href = `https://github.com/TBD54566975/${repo}/actions/workflows/${value}`;
+ } else if (type === 'ghLicense') {
+ badgeSrc = `https://img.shields.io/github/license/TBD54566975/${repo}?style=flat-square&logo=github&color=4c1&label=gh`;
+ href = `https://github.com/TBD54566975/${repo}/blob/main/LICENSE`;
+ } else if (type === 'fossa-license') {
+ badgeSrc = `https://app.fossa.com/api/projects/custom%2B588%2Fgithub.com%2FTBD54566975%2F${repo}.svg?type=shield&issueType=license`;
+ href = `https://app.fossa.com/projects/custom%2B588%2Fgithub.com%2FTBD54566975%2F${repo}?ref=badge_shield&issueType=license`;
+ } else if (type === 'fossa-security') {
+ badgeSrc = `https://app.fossa.com/api/projects/custom%2B588%2Fgithub.com%2FTBD54566975%2F${repo}.svg?type=shield&issueType=security`;
+ href = `https://app.fossa.com/projects/custom%2B588%2Fgithub.com%2FTBD54566975%2F${repo}?ref=badge_shield&issueType=security`;
+ } else if (type === 'ossf') {
+ badgeSrc = `https://img.shields.io/ossf-scorecard/github.com/TBD54566975/${repo}?label=ossf&style=flat-square`;
+ href = `https://securityscorecards.dev/viewer/?uri=github.com/TBD54566975/${repo}`;
+ } else if (type === 'codecov') {
+ badgeSrc = `https://img.shields.io/codecov/c/gh/TBD54566975/${repo}/main?label=codecov&style=flat-square&token=YI87CKF1LI`;
+ href = `https://codecov.io/github/TBD54566975/${repo}`;
+ } else if (type === 'ghTag') {
+ badgeSrc = `https://img.shields.io/github/v/release/TBD54566975/${repo}?logo=github&label=tag&style=flat-square&color=4c1`;
+ if(value) {
+ badgeSrc += `&filter=${value}`;
+ }
+ href = `https://github.com/TBD54566975/${repo}/releases`;
+ } else if (type === 'npmLicense') {
+ badgeSrc = `https://img.shields.io/npm/l/@${group}/${packageName}.svg?style=flat-square&logo=npm&logoColor=FFFFFF&&color=4c1&santize=true&label=npm`;
+ href = `https://www.npmjs.com/package/@${group}/${packageName}`;
+ } else if (type === 'npmPkg') {
+ badgeSrc = `https://img.shields.io/npm/v/@${group}/${packageName}.svg?style=flat-square&logo=npm&logoColor=FFFFFF&color=4c1&santize=true`;
+ href = `https://www.npmjs.com/package/@${group}/${packageName}`;
+ } else if (type === 'mavenCentral') {
+ badgeSrc = `https://img.shields.io/maven-central/v/xyz.block/${value}?color=green`
+ href = `https://central.sonatype.com/artifact/xyz.block/${value}`;
+ } else if (type == 'vectors') {
+ badgeSrc = `https://tbd54566975.github.io/sdk-report-runner/${repo}.svg`
+ href = "https://tbd54566975.github.io/sdk-report-runner/"
+ }
+
+ const img = ;
+ return href ? (
+
+ {img}
+
+ ) : (
+ img
+ );
+}
+
+function LanguageIcon({ language }) {
+ return ;
+}
+
+export default ProjectsDashboard;
diff --git a/site/src/components/QuickstartCodeRunner.jsx b/site/src/components/QuickstartCodeRunner.jsx
new file mode 100644
index 0000000..43249d5
--- /dev/null
+++ b/site/src/components/QuickstartCodeRunner.jsx
@@ -0,0 +1,105 @@
+import React, { useState, useRef } from 'react';
+import JsonView from 'react18-json-view';
+import '@site/src/css/web5-quickstart.css';
+import 'react18-json-view/src/style.css';
+import { useQuickstartExecutionContext } from '@site/src/components/QuickstartExecutionContext';
+
+// Don't delete. Need this for now due to webpack / docusaurus config
+const importFunction = async (name) => (await import('../../code-snippets/web5/quickstart.js'))[name];
+
+const executeFunctions = {
+ executeDidCreate: () => importFunction('executeDidCreate'),
+ executeGetBearerDid: () => importFunction('executeGetBearerDid'),
+ executeCreateVc: () => importFunction('executeCreateVc'),
+ executeSignVc: () => importFunction('executeSignVc'),
+ executeWriteVcToDwn: () => importFunction('executeWriteVcToDwn'),
+ executeReadVcFromDwn: () => importFunction('executeReadVcFromDwn'),
+ executeParseVc: () => importFunction('executeParseVc'),
+};
+
+const QuickstartCodeRunner = ({
+ executeCodeName,
+ viewJsonObj = false,
+ stepIndex,
+ collapseLevel,
+ defaultInputValue,
+ customPlaceholder,
+ autoOpenDetails = true
+}) => {
+ const [output, setOutput] = useState('');
+ const [loading, setLoading] = useState(false);
+ const [inputValue, setInputValue] = useState('');
+ const detailsRef = useRef(null);
+ const { stepsCompleted, markStepCompleted } = useQuickstartExecutionContext();
+
+ const handleRun = async () => {
+ setLoading(true);
+ try {
+ const executeCode = await executeFunctions[executeCodeName]();
+ const result = await executeCode(inputValue.trim() || defaultInputValue);
+ setOutput(result);
+ if (detailsRef.current && autoOpenDetails) {
+ detailsRef.current.open = true;
+ }
+ markStepCompleted(stepIndex);
+ } catch (error) {
+ setOutput(`Error: ${error.message}`);
+ if (detailsRef.current && autoOpenDetails) {
+ detailsRef.current.open = true;
+ }
+ }
+ setLoading(false);
+ };
+
+ const isEnabled = stepsCompleted.includes(stepIndex - 1) || stepIndex === 0;
+
+ return (
+
+
+ {defaultInputValue && (
+
+ setInputValue(e.target.value)}
+ />
+
+ )}
+
+ Run {'>'}
+
+ {loading &&
}
+
+
+
+
+ {viewJsonObj ? (
+ output ? (
+
+ ) : (
+
+
+ {customPlaceholder}
+
+
+ )
+ ) : (
+ output ? (
+ {output}
+ ) : (
+
+
+ {customPlaceholder}
+
+
+ )
+ )}
+
+
+
+
+ );
+};
+
+export default QuickstartCodeRunner;
diff --git a/site/src/components/QuickstartExecutionContext.jsx b/site/src/components/QuickstartExecutionContext.jsx
new file mode 100644
index 0000000..fd92da4
--- /dev/null
+++ b/site/src/components/QuickstartExecutionContext.jsx
@@ -0,0 +1,21 @@
+import React, { createContext, useContext, useState } from 'react';
+
+const QuickstartExecutionContext = createContext();
+
+export const QuickstartExecutionProvider = ({ children }) => {
+ const [stepsCompleted, setStepsCompleted] = useState([]);
+
+ const markStepCompleted = (stepIndex) => {
+ setStepsCompleted((prevSteps) => [...prevSteps, stepIndex]);
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useQuickstartExecutionContext = () => {
+ return useContext(QuickstartExecutionContext);
+};
diff --git a/site/src/components/ScriptSrc.jsx b/site/src/components/ScriptSrc.jsx
new file mode 100644
index 0000000..e5bc515
--- /dev/null
+++ b/site/src/components/ScriptSrc.jsx
@@ -0,0 +1,25 @@
+import React from 'react';
+import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
+import CodeBlock from '@theme/CodeBlock';
+
+function ScriptSrc(site) {
+ const {
+ siteConfig: { customFields },
+ } = useDocusaurusContext();
+
+ if (site.src === 'unpkg') {
+ return (
+
+ {``}
+
+ );
+ } else {
+ return (
+
+ {``}
+
+ );
+ }
+}
+
+export default ScriptSrc;
diff --git a/site/src/components/SdkCard.jsx b/site/src/components/SdkCard.jsx
new file mode 100644
index 0000000..9762785
--- /dev/null
+++ b/site/src/components/SdkCard.jsx
@@ -0,0 +1,24 @@
+import React from 'react';
+
+const SdkCard = ({ title, description, links }) => {
+ return (
+
+
{title}
+
{description}
+
+
+ {links.map(({ href, imgSrc, alt, text }) => (
+
+
+
+
+
{text}
+
+ ))}
+
+
+
+ );
+};
+
+export default SdkCard;
diff --git a/site/src/components/SmallSocialButton.jsx b/site/src/components/SmallSocialButton.jsx
new file mode 100644
index 0000000..b62f724
--- /dev/null
+++ b/site/src/components/SmallSocialButton.jsx
@@ -0,0 +1,41 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import Illustration from './Illustration';
+
+const SmallSocialButton = ({ src, url, altText, title, isBlackWhite }) => {
+ return (
+
+
+
+ );
+};
+
+SmallSocialButton.propTypes = {
+ /**
+ * SVG image loaded with import
+ */
+ src: PropTypes.string.isRequired,
+ /**
+ * Url to go to when pressing the button
+ */
+ url: PropTypes.string.isRequired,
+};
+SmallSocialButton.defaultProps = {
+ isBlackWhite: false,
+};
+export default SmallSocialButton;
diff --git a/site/src/components/SwitchIllustration.jsx b/site/src/components/SwitchIllustration.jsx
new file mode 100644
index 0000000..188cbd8
--- /dev/null
+++ b/site/src/components/SwitchIllustration.jsx
@@ -0,0 +1,19 @@
+import React from 'react';
+
+const SwitchIllustration = ({ imgMobile, imgTablet, imgDesktop, altText }) => {
+ return (
+
+ );
+};
+
+export default SwitchIllustration;
diff --git a/site/src/components/TBDBreadcrumbs/BreadCrumbsRoutes.json b/site/src/components/TBDBreadcrumbs/BreadCrumbsRoutes.json
new file mode 100644
index 0000000..1b2dcc2
--- /dev/null
+++ b/site/src/components/TBDBreadcrumbs/BreadCrumbsRoutes.json
@@ -0,0 +1,24 @@
+{
+ "projectroutes": [
+ {
+ "href": "/projects/tbdex",
+ "label": "TBDEX"
+ },
+ {
+ "href": "/projects/web5",
+ "label": "Web5"
+ },
+ {
+ "href": "/projects/dwn-sdk-js/README",
+ "label": "(DWN) SDK"
+ },
+ {
+ "href": "/projects/ssi-service/README",
+ "label": "SSI Service"
+ },
+ {
+ "href": "/projects/ssi-sdk/README",
+ "label": "SSI SDK"
+ }
+ ]
+}
diff --git a/site/src/components/TBDBreadcrumbs/TBDBreadcrumbs.js b/site/src/components/TBDBreadcrumbs/TBDBreadcrumbs.js
new file mode 100644
index 0000000..cebaea4
--- /dev/null
+++ b/site/src/components/TBDBreadcrumbs/TBDBreadcrumbs.js
@@ -0,0 +1,176 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+import React, { useEffect, useState } from 'react';
+import { ThemeClassNames } from '@docusaurus/theme-common';
+import styles from './styles.module.css';
+import clsx from 'clsx';
+import Link from '@docusaurus/Link';
+import useBaseUrl from '@docusaurus/useBaseUrl';
+import { useLocation } from '@docusaurus/router';
+import routes from './BreadCrumbsRoutes.json';
+import Illustration from '@site/src/components/Illustration';
+
+// TODO move to design system folder
+function BreadcrumbsItemLink({ children, href }) {
+ const className = 'breadcrumbs__link breadcrumbs-text';
+ return href ? (
+
+
+ {children}
+
+
+ ) : (
+
+ {children}
+
+ );
+}
+
+// TODO move to design system folder
+function BreadcrumbsItem({ children, active, index }) {
+ return (
+
+ {children}
+
+
+ );
+}
+
+function HomeBreadcrumbItem() {
+ const homeHref = useBaseUrl('/');
+ return (
+
+
+
+
+
+ );
+}
+
+export default function TBDBreadcrumbs() {
+ let location = useLocation();
+ const [breadcrumbs, setBreadcrumbs] = useState([]);
+
+ useEffect(() => {
+ let { state } = location;
+ let from = false;
+
+ if (state && state.from) {
+ from = state.from;
+ }
+
+ if (!from) {
+ return null;
+ }
+
+ let { projectroutes } = routes;
+ let lastRoute = projectroutes.filter((ele) => {
+ return ele.href.includes(from);
+ });
+
+ let currentRoute = projectroutes.filter((ele) => {
+ return ele.href.includes(location.pathname);
+ });
+
+ if (lastRoute.length > 0) {
+ let tempbreadcrumbs = [
+ {
+ href: '/projects',
+ label: 'Projects',
+ },
+ {
+ href: lastRoute[0].href,
+ label: lastRoute[0].label,
+ },
+ ];
+
+ if (currentRoute.length > 0) {
+ tempbreadcrumbs.push({
+ href: currentRoute[0].href,
+ label: currentRoute[0].label,
+ });
+ } else {
+ let label = window?.document?.title ?? '';
+ label = label.replace(' | TBD', '').replace('TBD', '---');
+ tempbreadcrumbs.push({
+ href: location.pathname,
+ label: label ?? '---',
+ });
+ }
+ if (
+ breadcrumbs.length === tempbreadcrumbs.length &&
+ breadcrumbs[breadcrumbs.length - 1].href ===
+ tempbreadcrumbs[tempbreadcrumbs.length - 1].href
+ ) {
+ return;
+ }
+ setBreadcrumbs(tempbreadcrumbs);
+ }
+ }, [breadcrumbs]);
+
+ /* return (
+
+ {from ? from : 'from not defined'}{' '}
+ {lastRoute.length > 0 ? lastRoute[0].label : 'no last route found'}
+
+ ); */
+
+ /*
+ if (!breadcrumbs) {
+ return null;
+ }
+ */
+ return (
+
+
+ {/* { } */}
+ {breadcrumbs.map((item, idx) => (
+
+
+ {item.label}
+
+
+ ))}
+
+
+ );
+}
diff --git a/site/src/components/TBDBreadcrumbs/index.js b/site/src/components/TBDBreadcrumbs/index.js
new file mode 100644
index 0000000..658d64e
--- /dev/null
+++ b/site/src/components/TBDBreadcrumbs/index.js
@@ -0,0 +1 @@
+export { default as TBDBreadcrumbs } from './TBDBreadcrumbs';
diff --git a/site/src/components/TBDBreadcrumbs/styles.module.css b/site/src/components/TBDBreadcrumbs/styles.module.css
new file mode 100644
index 0000000..a400c5d
--- /dev/null
+++ b/site/src/components/TBDBreadcrumbs/styles.module.css
@@ -0,0 +1,11 @@
+/**
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+.breadcrumbsContainer {
+ --ifm-breadcrumb-size-multiplier: 0.8;
+ margin-bottom: 0.8rem;
+}
diff --git a/site/src/components/TbdexSdk.jsx b/site/src/components/TbdexSdk.jsx
new file mode 100644
index 0000000..089a222
--- /dev/null
+++ b/site/src/components/TbdexSdk.jsx
@@ -0,0 +1,80 @@
+import React from 'react';
+import SdkCard from './SdkCard';
+
+const TbdexSdk = () => {
+ return (
+
+ );
+};
+
+export default TbdexSdk;
diff --git a/site/src/components/TextLink.jsx b/site/src/components/TextLink.jsx
new file mode 100644
index 0000000..dbaddc0
--- /dev/null
+++ b/site/src/components/TextLink.jsx
@@ -0,0 +1,24 @@
+/* eslint-disable react/prop-types */
+import React from 'react';
+const TextLink = ({
+ href,
+ text,
+
+ isExternalLink,
+ ...props
+}) => {
+ return (
+ // eslint-disable-next-line react/jsx-no-target-blank
+
+ {text}
+
+ );
+};
+
+export default TextLink;
diff --git a/site/src/components/TextWithTooltip.jsx b/site/src/components/TextWithTooltip.jsx
new file mode 100644
index 0000000..c155d27
--- /dev/null
+++ b/site/src/components/TextWithTooltip.jsx
@@ -0,0 +1,24 @@
+/* eslint-disable react/prop-types */
+import React from 'react';
+import TooltipWrapper from './TooltipWrapper';
+
+const TextWithTooltip = ({ content }) => {
+ return (
+ <>
+ {content.map((item, index) => {
+ if (item.type === 'text') {
+ return {item.data} ;
+ }
+ if (item.type === 'tooltip') {
+ return (
+
+ {item.data.text}
+
+ );
+ }
+ })}
+ >
+ );
+};
+
+export default TextWithTooltip;
diff --git a/site/src/components/Tooltip.jsx b/site/src/components/Tooltip.jsx
new file mode 100644
index 0000000..e5b5f33
--- /dev/null
+++ b/site/src/components/Tooltip.jsx
@@ -0,0 +1,40 @@
+/* eslint-disable react/prop-types */
+import React, { useRef, useEffect, useState } from 'react';
+import { useTooltip } from '@react-aria/tooltip';
+import { mergeProps } from '@react-aria/utils';
+
+export default function Tooltip({ state, parentRef, ...props }) {
+ let { tooltipProps } = useTooltip(props, state);
+ let ref = useRef();
+ const [leftShift, setLeftShift] = useState(0);
+ useEffect(() => {
+ if (state.isOpen) {
+ const offsetParent = parentRef.current.offsetLeft;
+ const windowWidth = window.innerWidth;
+ let sizeTooltip = 430;
+ if (windowWidth < 768) {
+ sizeTooltip = 405;
+ }
+ if (windowWidth < offsetParent + sizeTooltip) {
+ setLeftShift(windowWidth - (offsetParent + sizeTooltip));
+ }
+ }
+ }, [state, parentRef, leftShift]);
+ return (
+
+ {props.children}
+
+ );
+}
diff --git a/site/src/components/TooltipWrapper.jsx b/site/src/components/TooltipWrapper.jsx
new file mode 100644
index 0000000..8e90161
--- /dev/null
+++ b/site/src/components/TooltipWrapper.jsx
@@ -0,0 +1,71 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import Tooltip from './Tooltip';
+import { useTooltipTrigger } from '@react-aria/tooltip';
+import { useTooltipTriggerState } from '@react-stately/tooltip';
+import Illustration from './Illustration';
+
+export default function TooltipWrapper(props) {
+ let state = useTooltipTriggerState(props);
+ let ref = React.useRef();
+ let parentRef = React.useRef();
+ let { triggerProps, tooltipProps } = useTooltipTrigger(props, state, ref);
+ return (
+
+ {
+ state.open(true);
+ }}
+ >
+ {props.trigger}
+
+ {state.isOpen && (
+
+
+
+
+
+
+
{props.trigger}
+
+
+
+
+
+
+
+
+
{props.children}
+
+
+ )}
+
+ );
+}
+
+TooltipWrapper.propTypes = {
+ /**
+ * trigger: Test that onhover reveals the tooltip
+ */
+ trigger: PropTypes.string.isRequired,
+
+ /**
+ * children: Children populate the tooltip and are revealed onhover
+ */
+ children: PropTypes.any.isRequired,
+};
+
+/*
+This is the tool tip content
+*/
diff --git a/site/src/components/TweetEmbed.jsx b/site/src/components/TweetEmbed.jsx
new file mode 100644
index 0000000..ae4ec95
--- /dev/null
+++ b/site/src/components/TweetEmbed.jsx
@@ -0,0 +1,18 @@
+import React, { useEffect } from 'react';
+
+const TweetEmbed = ({ tweetId }) => {
+ useEffect(() => {
+ const script = document.createElement('script');
+ script.src = 'https://platform.twitter.com/widgets.js';
+ script.async = true;
+ document.body.appendChild(script);
+ }, []);
+
+ return (
+
+
+
+ );
+};
+
+export default TweetEmbed;
diff --git a/site/src/components/TwoColumnContainer.jsx b/site/src/components/TwoColumnContainer.jsx
new file mode 100644
index 0000000..bd0b9bc
--- /dev/null
+++ b/site/src/components/TwoColumnContainer.jsx
@@ -0,0 +1,12 @@
+import React from 'react';
+
+// eslint-disable-next-line react/prop-types
+const TwoColumnContainer = ({ children }) => {
+ return (
+
+ {children}
+
+ );
+};
+
+export default TwoColumnContainer;
diff --git a/site/src/components/Version.jsx b/site/src/components/Version.jsx
new file mode 100644
index 0000000..162c95a
--- /dev/null
+++ b/site/src/components/Version.jsx
@@ -0,0 +1,11 @@
+import React from 'react';
+import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
+
+function Version() {
+ const {
+ siteConfig: { customFields },
+ } = useDocusaurusContext();
+ return {customFields.WEB5_VERSION} ;
+}
+
+export default Version;
diff --git a/site/src/components/Video.jsx b/site/src/components/Video.jsx
new file mode 100644
index 0000000..1dd2d38
--- /dev/null
+++ b/site/src/components/Video.jsx
@@ -0,0 +1,46 @@
+/* eslint-disable react/prop-types */
+import React from 'react';
+import ReactPlayer from 'react-player';
+import PropTypes from 'prop-types';
+import DetailsSummary from './DetailsSummary';
+
+const Video = ({ url, description, transcription }) => {
+ return (
+
+
+
+
+
+ {description ? (
+
+ {description}
+
+ ) : null}
+
+ {transcription ? (
+ <>
+ TRANSCRIPTION
+
+
+ >
+ ) : null}
+
+ );
+};
+
+Video.propTypes = {
+ /**
+ * video source
+ */
+ url: PropTypes.string.isRequired,
+ description: PropTypes.string,
+ transcription: PropTypes.object,
+};
+export default Video;
diff --git a/site/src/components/WalletQuickstartCodeRunner.jsx b/site/src/components/WalletQuickstartCodeRunner.jsx
new file mode 100644
index 0000000..a42c9e8
--- /dev/null
+++ b/site/src/components/WalletQuickstartCodeRunner.jsx
@@ -0,0 +1,108 @@
+import React, { useState, useRef } from 'react';
+import JsonView from 'react18-json-view';
+import '@site/src/css/web5-quickstart.css';
+import 'react18-json-view/src/style.css';
+import { useQuickstartExecutionContext } from '@site/src/components/QuickstartExecutionContext';
+
+// Don't delete. Need this for now due to webpack / docusaurus config
+const importFunction = async (name) => (await import('../../code-snippets/tbdex/wallet-quickstart.js'))[name];
+
+const executeFunctions = {
+ executeDidCreate: () => importFunction('quickstartDidCreate'),
+ executeGetOfferings: () => importFunction('quickstartGetOfferings'),
+ executeGetCredentials: () => importFunction('quickstartGetCredentials'),
+ executeCreateRfq: () => importFunction('quickstartCreateRfq'),
+ executeSendRfq: () => importFunction('quickstartSendRfq'),
+ executeApplyForCredential: () => importFunction('quickstartApplyForCredential'),
+ executeProcessQuote: () => importFunction('quickstartProcessQuote'),
+ executeCreateOrder: () => importFunction('quickstartCreateOrder'),
+ executeSendOrder: () => importFunction('quickstartSendOrder'),
+ executeProcessClose: () => importFunction('quickstartProcessClose')
+};
+
+const QuickstartCodeRunner = ({
+ executeCodeName,
+ viewJsonObj = false,
+ stepIndex,
+ collapseLevel,
+ defaultInputValue,
+ customPlaceholder,
+ autoOpenDetails = true
+}) => {
+ const [output, setOutput] = useState('');
+ const [loading, setLoading] = useState(false);
+ const [inputValue, setInputValue] = useState('');
+ const detailsRef = useRef(null);
+ const { stepsCompleted, markStepCompleted } = useQuickstartExecutionContext();
+
+ const handleRun = async () => {
+ setLoading(true);
+ try {
+ const executeCode = await executeFunctions[executeCodeName]();
+ const result = await executeCode(inputValue.trim() || defaultInputValue);
+ setOutput(result);
+ if (detailsRef.current && autoOpenDetails) {
+ detailsRef.current.open = true;
+ }
+ markStepCompleted(stepIndex);
+ } catch (error) {
+ setOutput(`Error: ${error.message}`);
+ if (detailsRef.current && autoOpenDetails) {
+ detailsRef.current.open = true;
+ }
+ }
+ setLoading(false);
+ };
+
+ const isEnabled = stepsCompleted.includes(stepIndex - 1) || stepIndex === 0;
+
+ return (
+
+
+ {defaultInputValue && (
+
+ setInputValue(e.target.value)}
+ />
+
+ )}
+
+ Run {'>'}
+
+ {loading &&
}
+
+
+
+
+ {viewJsonObj ? (
+ output ? (
+
+ ) : (
+
+
+ {customPlaceholder}
+
+
+ )
+ ) : (
+ output ? (
+ {output}
+ ) : (
+
+
+ {customPlaceholder}
+
+
+ )
+ )}
+
+
+
+
+ );
+};
+
+export default QuickstartCodeRunner;
diff --git a/site/src/components/Web5Sdk.jsx b/site/src/components/Web5Sdk.jsx
new file mode 100644
index 0000000..920c7e4
--- /dev/null
+++ b/site/src/components/Web5Sdk.jsx
@@ -0,0 +1,74 @@
+import React from 'react';
+import SdkCard from './SdkCard';
+
+const Web5Sdk = () => {
+ return (
+
+ );
+};
+
+export default Web5Sdk;
diff --git a/site/src/components/language/LanguageContext.jsx b/site/src/components/language/LanguageContext.jsx
new file mode 100644
index 0000000..0e9f0a2
--- /dev/null
+++ b/site/src/components/language/LanguageContext.jsx
@@ -0,0 +1,56 @@
+import React, { createContext, useState, useContext, useEffect } from 'react';
+import { useLocation, useHistory } from '@docusaurus/router';
+import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';
+
+// Create a context
+const LanguageContext = createContext();
+
+// Custom hook for consuming context
+export function useLanguage() {
+ return useContext(LanguageContext);
+}
+
+// Provider component
+export function LanguageProvider({ children }) {
+ //Load language if set
+ const location = useLocation();
+ const queryParams = new URLSearchParams(location.search);
+ let langParam = queryParams.get('lang');
+ if (ExecutionEnvironment.canUseDOM) {
+ langParam = langParam
+ ? queryParams.get('lang')
+ : localStorage.getItem('language');
+ }
+ if(!langParam) langParam = 'JavaScript';
+ const [language, setLanguage] = useState(langParam);
+ const history = useHistory();
+
+ // Read in the language in the url if available
+ useEffect(() => {
+ if (langParam && langParam.length > 0) {
+ setLanguage(langParam);
+ if (ExecutionEnvironment.canUseDOM) {
+ localStorage.setItem('language', langParam);
+ }
+ }
+ }, [queryParams]);
+
+ const updateUrl = (language) => {
+ if (language.length > 0) {
+ history.replace(`?lang=${language}`);
+ }
+ };
+
+ const changeLanguage = (newLanguage) => {
+ setLanguage(newLanguage);
+ if(ExecutionEnvironment.canUseDOM) {
+ localStorage.setItem('language', newLanguage);
+ }
+ };
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/site/src/components/language/LanguageSupport.jsx b/site/src/components/language/LanguageSupport.jsx
new file mode 100644
index 0000000..1588d55
--- /dev/null
+++ b/site/src/components/language/LanguageSupport.jsx
@@ -0,0 +1,20 @@
+import React, { useEffect } from 'react';
+import { useSupportedLanguages } from './SupportedLanguagesContext';
+import { useLanguage } from './LanguageContext';
+
+const LanguageSupport = ({ languages }) => {
+ const languagesArray = languages.split(',').map(function (language) {
+ return language.trim();
+ });
+ const { changeLanguages } = useSupportedLanguages();
+ const { changeLanguage } = useLanguage();
+
+ useEffect(() => {
+ changeLanguages(languagesArray);
+ changeLanguage(languagesArray[0]);
+ }, [languages]);
+
+ return
;
+};
+
+export default LanguageSupport;
diff --git a/site/src/components/language/LanguageSwitchBlock.jsx b/site/src/components/language/LanguageSwitchBlock.jsx
new file mode 100644
index 0000000..c918bf1
--- /dev/null
+++ b/site/src/components/language/LanguageSwitchBlock.jsx
@@ -0,0 +1,20 @@
+// LanguageSwitchBlock.js
+import { useLanguage } from './LanguageContext';
+import React, { Children } from 'react';
+
+const LanguageSwitchBlock = ({ children }) => {
+ const { language } = useLanguage();
+
+ const childArray = Children.toArray(children);
+ var childToRender;
+
+ childArray.forEach((child) => {
+ if (child.props.language === language) {
+ childToRender = child;
+ }
+ });
+
+ return {childToRender}
;
+};
+
+export default LanguageSwitchBlock;
diff --git a/site/src/components/language/LanguageSwitchLink.jsx b/site/src/components/language/LanguageSwitchLink.jsx
new file mode 100644
index 0000000..edebc3a
--- /dev/null
+++ b/site/src/components/language/LanguageSwitchLink.jsx
@@ -0,0 +1,14 @@
+import React from 'react';
+import { useLanguage } from './LanguageContext';
+
+const LanguageSwitchLink = ({ text, links }) => {
+ const { language } = useLanguage();
+ const jsonObj = JSON.parse(links);
+ const href = jsonObj[language] || '#';
+
+ return (
+ {text}
+ );
+};
+
+export default LanguageSwitchLink;
\ No newline at end of file
diff --git a/site/src/components/language/LanguageSwitcher.jsx b/site/src/components/language/LanguageSwitcher.jsx
new file mode 100644
index 0000000..a4efa3a
--- /dev/null
+++ b/site/src/components/language/LanguageSwitcher.jsx
@@ -0,0 +1,35 @@
+import React from 'react';
+import { useLanguage } from './LanguageContext';
+import { useSupportedLanguages } from './SupportedLanguagesContext';
+import LanguageSupport from './LanguageSupport';
+
+const LanguageSwitcher = ({ languages: supportedLanguages }) => {
+ const { changeLanguage, updateUrl } = useLanguage();
+ var currentLanguage = useLanguage().language;
+ const { languages } = useSupportedLanguages();
+
+ const handleLanguageChange = (e) => {
+ const newLanguage = e.target.value;
+ changeLanguage(newLanguage);
+ updateUrl(newLanguage);
+ currentLanguage = newLanguage;
+ }
+
+ if (languages.length === 0) {
+ return null;
+ }
+ return (
+ <>
+
+
+
+ {languages.map((languageOption) =>
+ {languageOption}
+ )}
+
+
+ >
+ );
+};
+
+export default LanguageSwitcher;
\ No newline at end of file
diff --git a/site/src/components/language/LanguageTabBar.jsx b/site/src/components/language/LanguageTabBar.jsx
new file mode 100644
index 0000000..ca26f46
--- /dev/null
+++ b/site/src/components/language/LanguageTabBar.jsx
@@ -0,0 +1,46 @@
+import React from 'react';
+import { useLanguage } from './LanguageContext';
+import { useSupportedLanguages } from './SupportedLanguagesContext';
+import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';
+
+const LanguageTabBar = () => {
+ const { changeLanguage, updateUrl } = useLanguage();
+ var currentLanguage = useLanguage().language;
+ const { languages } = useSupportedLanguages();
+ var activeTab = currentLanguage;
+
+ const setActiveTab = (tab) => {
+ changeLanguage(tab);
+ updateUrl(tab);
+ activeTab = tab;
+ if (ExecutionEnvironment.canUseDOM) {
+ localStorage.setItem('language', tab);
+ }
+ }
+
+ if (!languages.includes(currentLanguage)) {
+ setActiveTab(languages[0]);
+ }
+
+ return (
+
+ {languages.map(tab => (
+
setActiveTab(tab)}
+ style={{
+ padding: '20px',
+ borderBottom: activeTab === tab ? '2px solid yellow' : 'none',
+ borderRadius: '10px 10px 0 0',
+ background: activeTab === tab ? '#282828' : 'none'
+ }}
+ >
+ {tab}
+
+ ))}
+
+
+ );
+};
+
+export default LanguageTabBar;
\ No newline at end of file
diff --git a/site/src/components/language/Shnip.jsx b/site/src/components/language/Shnip.jsx
new file mode 100644
index 0000000..dc51fe8
--- /dev/null
+++ b/site/src/components/language/Shnip.jsx
@@ -0,0 +1,106 @@
+import React from 'react';
+import LanguageSwitchBlock from '@site/src/components/language/LanguageSwitchBlock';
+import LanguageTabBar from '@site/src/components/language/LanguageTabBar';
+import CodeSnippet from '@site/src/components/CodeSnippet';
+import CodeBlock from '@theme/CodeBlock';
+import ReactMarkdown from 'react-markdown';
+import BreadcrumbTab from '@site/src/components/BreadcrumbTab';
+
+const Shnip = ({ snippets, inlineSnippets }) => {
+ // support line breaks for inline code snippets
+ const addLineBreaks = (code, breakLines) => {
+ if (!breakLines || breakLines.length === 0) {
+ return code;
+ }
+
+ const lines = code.split('\n');
+ breakLines.forEach((lineNumber) => {
+ if (lineNumber < lines.length) {
+ lines[lineNumber] += '\n';
+ }
+ });
+
+ return lines.join('\n');
+ };
+
+ return (
+ <>
+
+
+ {snippets &&
+ snippets.map(
+ (
+ {
+ snippetContent,
+ language,
+ title,
+ functionName,
+ snippetName,
+ content,
+ nestedSnippets,
+ codeLanguage,
+ },
+ index,
+ ) => (
+
+ {content && (
+
+ {content}
+
+ )}
+
+ {/* Render Breadcrumbs if there are nestedSnippets */}
+ {nestedSnippets && (
+
+ )}
+
+ {/* Render the CodeSnippet component depending on nestedSnippets presence */}
+ {!nestedSnippets ? (
+
+ ) : (
+
+ )}
+
+ ),
+ )}
+
+ {inlineSnippets &&
+ inlineSnippets.map(
+ (
+ { content, code, language, codeLanguage, breakLineAt, title },
+ index,
+ ) => (
+
+ {content && (
+
+ {content}
+
+ )}
+ {code && (
+
+ {addLineBreaks(code, breakLineAt)}
+
+ )}
+
+ ),
+ )}
+
+ >
+ );
+};
+
+export default Shnip;
diff --git a/site/src/components/language/SupportedLanguagesContext.jsx b/site/src/components/language/SupportedLanguagesContext.jsx
new file mode 100644
index 0000000..50948fa
--- /dev/null
+++ b/site/src/components/language/SupportedLanguagesContext.jsx
@@ -0,0 +1,24 @@
+import React, { createContext, useState, useContext } from 'react';
+
+// Create a context
+const SupportedLanguagesContext = createContext();
+
+// Custom hook for consuming context
+export function useSupportedLanguages() {
+ return useContext(SupportedLanguagesContext);
+}
+
+// Provider component
+export function LanguageOptionsProvider({ children }) {
+ const [languages, setLanguages] = useState(['JavaScript', 'Kotlin','Swift']); // Default languages
+
+ const changeLanguages = (newLanguages) => {
+ setLanguages(newLanguages);
+ };
+
+ return (
+
+ {children}
+
+ );
+}
diff --git a/site/src/components/renderatl/GetVC.jsx b/site/src/components/renderatl/GetVC.jsx
new file mode 100644
index 0000000..f6040e8
--- /dev/null
+++ b/site/src/components/renderatl/GetVC.jsx
@@ -0,0 +1,53 @@
+import React, { Suspense, useEffect, useState } from 'react';
+import { useHistory } from '@docusaurus/router';
+const RenderVcCard = React.lazy(() => import('./RenderVcCard'));
+
+
+const people = [
+ { name: 'Adewale Abati', urlParam: 'ace' },
+ { name: 'Angie Jones', urlParam: 'angie' },
+ { name: 'Daniel Buchner', urlParam: 'daniel' },
+ { name: 'Ebony Louis', urlParam: 'ebony' },
+ { name: 'Kirah Sapong', urlParam: 'kirah' },
+ { name: 'Tania Chakraborty', urlParam: 'tania' },
+];
+
+const GetVC = () => {
+ const [person, setPerson] = useState(null);
+ const history = useHistory();
+
+ useEffect(() => {
+ const params = new URLSearchParams(window.location.search);
+ const metParam = params.get('met');
+
+ if (metParam) {
+ const matchedPerson = people.find(p => p.urlParam === metParam);
+ if (matchedPerson) {
+ setPerson(matchedPerson);
+ } else {
+ console.error('No matching person found for the given URL parameter.');
+ history.push('/wad-scavengerhunt');
+ }
+ } else {
+ console.error('No URL parameter provided.');
+ history.push('/wad-scavengerhunt');
+ }
+ }, []);
+
+ return (
+
}>
+ {person ? (
+ <>
+ You just met {person.name}! 🎉🎉
+ Issuing Verifiable Credential as proof...
+
+ >
+ ) : (
+
+ )}
+
+
+ );
+};
+
+export default GetVC;
\ No newline at end of file
diff --git a/site/src/components/renderatl/ProgressBar.jsx b/site/src/components/renderatl/ProgressBar.jsx
new file mode 100644
index 0000000..bb932be
--- /dev/null
+++ b/site/src/components/renderatl/ProgressBar.jsx
@@ -0,0 +1,21 @@
+const ProgressBar = ({ value, max }) => {
+ const width = Math.min((value / max) * 100, 100);
+
+ return (
+
+
+
+
+ {value} / {max}
+
+
+ );
+ };
+
+ export default ProgressBar;
+
\ No newline at end of file
diff --git a/site/src/components/renderatl/RenderScavengerHunt.jsx b/site/src/components/renderatl/RenderScavengerHunt.jsx
new file mode 100644
index 0000000..43deab2
--- /dev/null
+++ b/site/src/components/renderatl/RenderScavengerHunt.jsx
@@ -0,0 +1,200 @@
+import React, { useEffect, useState, useRef } from 'react';
+import Confetti from 'react-confetti';
+import ProgressBar from './ProgressBar';
+import { QrReader } from 'react-qr-reader';
+import Button from '../Button';
+import { createAndIssueVC } from '../../vcUtils';
+
+const people = [
+ { name: 'Adewale Abati', urlParam: 'ace' },
+ { name: 'Angie Jones', urlParam: 'angie' },
+ { name: 'Daniel Buchner', urlParam: 'daniel' },
+ { name: 'Ebony Louis', urlParam: 'ebony' },
+ { name: 'Kirah Sapong', urlParam: 'kirah' },
+ { name: 'Tania Chakraborty', urlParam: 'tania' },
+];
+
+const RenderScavengerHunt = () => {
+ const [foundPeople, setFoundPeople] = useState([]);
+ const [showConfetti, setShowConfetti] = useState(false);
+ const [scanning, setScanning] = useState(false);
+ const [processing, setProcessing] = useState(false);
+ const debounceTimeoutRef = useRef(null);
+
+ useEffect(() => {
+ const fetchFoundVCs = async () => {
+ const { Web5 } = await import('@web5/api');
+ const { web5, did: userDid } = await Web5.connect();
+ const schema = `https://schema.org/wadScavengerHunt`;
+
+ const response = await web5.dwn.records.query({
+ from: userDid,
+ message: {
+ filter: {
+ schema: schema,
+ dataFormat: 'application/json',
+ },
+ },
+ });
+
+ const availableVCs = [];
+ for (let record of response.records) {
+ const data = await record.data.json();
+ availableVCs.push(data);
+ }
+
+ setFoundPeople(availableVCs);
+
+ if (availableVCs.length >= people.length) {
+ setShowConfetti(true);
+ }
+ };
+
+ fetchFoundVCs();
+ }, []);
+
+ const handleScan = async (result) => {
+ if (result && !processing) {
+ setProcessing(true);
+ const url = new URL(result);
+ const params = url.searchParams;
+ const metParam = params.get('met');
+
+ if (metParam) {
+ try {
+ const personAlreadyFound = foundPeople.some(
+ (person) => person.personUrlParam === metParam,
+ );
+
+ if (!personAlreadyFound) {
+ const vcData = await createAndIssueVC(metParam);
+ const updatedFoundPeople = [
+ ...foundPeople,
+ { personUrlParam: metParam },
+ ];
+ setFoundPeople(updatedFoundPeople);
+
+ if (updatedFoundPeople.length >= people.length) {
+ setShowConfetti(true);
+ }
+ } else {
+ console.log('Person already found:', metParam);
+ }
+ } catch (err) {
+ console.error('Error issuing VC:', err);
+ } finally {
+ setScanning(false);
+ setProcessing(false);
+ }
+ } else {
+ console.error('metParam not found in QR code');
+ setScanning(false);
+ setProcessing(false);
+ }
+ }
+ };
+
+ const handleError = (err) => {
+ console.error('QR Reader Error:', err);
+ setScanning(false);
+ setProcessing(false);
+ };
+
+ const handleScanDebounced = (result) => {
+ clearTimeout(debounceTimeoutRef.current);
+ debounceTimeoutRef.current = setTimeout(() => {
+ handleScan(result);
+ }, 500);
+ };
+
+ return (
+
+ {showConfetti &&
}
+
+ {showConfetti ? (
+
+
Congratulations! 🎉
+
+ You have found everyone! Collect your SWAG!! 🥳
+
+
+ ) : (
+ <>
+
Come Find Us
+
+ Find all 6 members of the TBD team at WeAreDevelopers World
+ Congress! Scan their QR codes to collect all Verifiable
+ Credentials and win a prize! 🎁
+
+
+
+ Learn more about the magic of{' '}
+
+ Verifiable Credentials
+
+ . ✨
+
+
+
+ {
+ setScanning(!scanning);
+ setProcessing(false);
+ }}
+ />
+
+ {scanning && (
+
+ )}
+
+
+ >
+ )}
+
+
+
+ );
+};
+
+export default RenderScavengerHunt;
diff --git a/site/src/components/renderatl/RenderVcCard.jsx b/site/src/components/renderatl/RenderVcCard.jsx
new file mode 100644
index 0000000..cf08c06
--- /dev/null
+++ b/site/src/components/renderatl/RenderVcCard.jsx
@@ -0,0 +1,59 @@
+import React, { useEffect, useState } from 'react';
+import { useHistory } from '@docusaurus/router';
+import { createAndIssueVC } from '../../vcUtils';
+
+const people = [
+ { name: 'Adewale Abati', urlParam: 'ace' },
+ { name: 'Angie Jones', urlParam: 'angie' },
+ { name: 'Daniel Buchner', urlParam: 'daniel' },
+ { name: 'Ebony Louis', urlParam: 'ebony' },
+ { name: 'Kirah Sapong', urlParam: 'kirah' },
+ { name: 'Tania Chakraborty', urlParam: 'tania' },
+];
+
+const RenderVcCard = ({ met }) => {
+ const [vcData, setVcData] = useState(null);
+ const [error, setError] = useState(null);
+ const history = useHistory();
+
+ useEffect(() => {
+ if (typeof window === 'undefined') {
+ return;
+ }
+
+ const createDidAndIssueVc = async () => {
+ try {
+ const vcData = await createAndIssueVC(met);
+ if (vcData) {
+ setVcData({
+ name: people.find(p => p.urlParam === met).name,
+ vcJwt: vcData.vcJwt,
+ image: `/img/${met}VcCard.png`,
+ });
+ history.push('/wad-scavengerhunt');
+ }
+ } catch (err) {
+ setError(err.message);
+ }
+ };
+
+ if (met) {
+ createDidAndIssueVc();
+ }
+ }, [met, history]);
+
+ if (error) {
+ return Error: {error}
;
+ }
+
+ if (!vcData) {
+ return ;
+ }
+
+ return (
+
+
+ );
+};
+
+export default RenderVcCard;
diff --git a/site/src/components/renderatl/ScavengerHunt.jsx b/site/src/components/renderatl/ScavengerHunt.jsx
new file mode 100644
index 0000000..59a16c7
--- /dev/null
+++ b/site/src/components/renderatl/ScavengerHunt.jsx
@@ -0,0 +1,12 @@
+import React, { Suspense } from 'react';
+const RenderScavengerHunt = React.lazy(() => import('./RenderScavengerHunt'));
+
+const ScavengerHunt = () => {
+ return (
+
}>
+
+
+ );
+};
+
+export default ScavengerHunt;
diff --git a/site/src/content/global-meta.js b/site/src/content/global-meta.js
new file mode 100644
index 0000000..067f1ed
--- /dev/null
+++ b/site/src/content/global-meta.js
@@ -0,0 +1,8 @@
+const metacontent = {
+ description:
+ 'We build decentralized platforms, protocols, and tools that empower every individual to own their data and participate in the global economy.',
+ ogimage: 'https://developer.tbd.website/img/tbd_og_meta_image.png',
+ site_name: 'TBD',
+};
+
+export default metacontent;
diff --git a/site/src/content/home/heading.mdx b/site/src/content/home/heading.mdx
new file mode 100644
index 0000000..bf37e29
--- /dev/null
+++ b/site/src/content/home/heading.mdx
@@ -0,0 +1,5 @@
+---
+hide_table_of_contents: true
+---
+
+## We’re building the next generation of a network that is not controlled by a central entity protocols. You’re welcome to join.
diff --git a/site/src/content/home/home.js b/site/src/content/home/home.js
new file mode 100644
index 0000000..5f0528e
--- /dev/null
+++ b/site/src/content/home/home.js
@@ -0,0 +1,47 @@
+import Heading from './heading.mdx';
+import OurApproach from './our-approach.mdx';
+import OurPhilosophy from './our-philosophy.mdx';
+import OurProjects from './our-projects.mdx';
+import OurProtocol from './our-protocol.mdx';
+import tbdexCTA from './tbdex-cta';
+
+
+export const content = {
+ meta: { title: 'Developers | TBD'},
+ tbdexCTA: tbdexCTA,
+ heading: Heading,
+ features: [
+ {
+ title: 'Our Philosophy',
+ description: OurPhilosophy,
+ cta: {
+ label: 'Read More',
+ url: '/open-source',
+ },
+ },
+ {
+ title: 'Our Protocol',
+ description: OurProtocol,
+ cta: {
+ label: 'Learn More',
+ url: '/projects/tbdex',
+ },
+ },
+ {
+ title: 'Our Projects',
+ description: OurProjects,
+ cta: {
+ label: 'Get Involved',
+ url: '/projects',
+ },
+ },
+ {
+ title: 'Our Approach',
+ description: OurApproach,
+ cta: {
+ label: 'View',
+ url: '/projects/web5#components',
+ },
+ },
+ ],
+};
diff --git a/site/src/content/home/our-approach.mdx b/site/src/content/home/our-approach.mdx
new file mode 100644
index 0000000..249cd39
--- /dev/null
+++ b/site/src/content/home/our-approach.mdx
@@ -0,0 +1,6 @@
+---
+hide_table_of_contents: true
+---
+
+Decentralized. the ability to participate in a network without the need for application or approval . trust is established in a decentralized way, for example via decentralized identity and verifiable credentials . This is the paradigm shift evolving the web forward. Discover the concepts behind
+our approach.
diff --git a/site/src/content/home/our-philosophy.mdx b/site/src/content/home/our-philosophy.mdx
new file mode 100644
index 0000000..1ee9ff9
--- /dev/null
+++ b/site/src/content/home/our-philosophy.mdx
@@ -0,0 +1,5 @@
+---
+hide_table_of_contents: true
+---
+
+We’re building open protocols, standards, and libraries. Our projects are open source because we want everyone in the economy to benefit: individuals, businesses, institutions, and government.
diff --git a/site/src/content/home/our-projects.mdx b/site/src/content/home/our-projects.mdx
new file mode 100644
index 0000000..9f6135f
--- /dev/null
+++ b/site/src/content/home/our-projects.mdx
@@ -0,0 +1,7 @@
+---
+hide_table_of_contents: true
+---
+
+import TooltipWrapper from '@site/src/components/TooltipWrapper';
+
+Our projects provide identity created, owned, and controlled by individuals, without reliance on centralized entities , verifiable credentials, and decentralized communication: the building blocks for tbDEX.
diff --git a/site/src/content/home/our-protocol.mdx b/site/src/content/home/our-protocol.mdx
new file mode 100644
index 0000000..34bc05a
--- /dev/null
+++ b/site/src/content/home/our-protocol.mdx
@@ -0,0 +1,5 @@
+---
+hide_table_of_contents: true
+---
+
+The tbDEX protocol is our first system. It facilitates cross-border transactions between parties by enhancing trust and ensuring regulatory compliance, effectively managing inherent risks.
\ No newline at end of file
diff --git a/site/src/content/home/tbdex-cta.js b/site/src/content/home/tbdex-cta.js
new file mode 100644
index 0000000..3b5aefa
--- /dev/null
+++ b/site/src/content/home/tbdex-cta.js
@@ -0,0 +1,46 @@
+import React, { useState } from 'react';
+import HeroCard from '../../components/HeroCard';
+import Divider from '../../components/Divider';
+
+function tbdexCTA() {
+
+ return (
+
+
The future of finance is open.
+
+ What do we mean by open? Well, let's see how many times we can use it in a sentence...
+ We're building open source toolkits that implement open standards and protocols to open up financial access globally.
+ Pretty good, huh? Our SDKs are even better!
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default tbdexCTA;
+
diff --git a/site/src/content/home/web5-cta.js b/site/src/content/home/web5-cta.js
new file mode 100644
index 0000000..d5720e6
--- /dev/null
+++ b/site/src/content/home/web5-cta.js
@@ -0,0 +1,38 @@
+import React, { useState } from 'react';
+import Button from '../../components/Button';
+import Divider from '../../components/Divider';
+
+function Web5CTA() {
+
+ return (
+
+
Web5 is open to build.
+
+ The Web5 tech preview is now ready for developers to start building
+ decentralized applications that return ownership and control over
+ identity and data to individuals.
+
+
+
+
+
+
+
+
Get Started with Web5.js
+
Interactive guides, tutorials, and API docs
+
+
+
+
+
+
+
+
+ );
+}
+
+export default Web5CTA;
+
diff --git a/site/src/content/incubation-projects/incubation-project-index/incubation-project-list.mdx b/site/src/content/incubation-projects/incubation-project-index/incubation-project-list.mdx
new file mode 100644
index 0000000..5639760
--- /dev/null
+++ b/site/src/content/incubation-projects/incubation-project-index/incubation-project-list.mdx
@@ -0,0 +1,3 @@
+import { content } from '@site/src/content/incubation-projects/incubation-project-index/incubation-projects';
+
+
diff --git a/site/src/content/incubation-projects/incubation-project-index/incubation-projects.js b/site/src/content/incubation-projects/incubation-project-index/incubation-projects.js
new file mode 100644
index 0000000..7136424
--- /dev/null
+++ b/site/src/content/incubation-projects/incubation-project-index/incubation-projects.js
@@ -0,0 +1,28 @@
+import ListOfProjects from './incubation-project-list.mdx';
+
+export const content = {
+ meta: {
+ title: 'Incubation Projects | TBD',
+ path: 'incubation-projects',
+ },
+
+ ListOfProjects: ListOfProjects,
+ projects: [
+ {
+ icon: '/img/article-icon.svg',
+ title: 'Credential Selector',
+ description:
+ 'Developers embed the VCS into their application to allow users to select and retrieve Verifiable Credentials (VCs)',
+ textButton: 'View Project',
+ url: 'https://github.com/TBD54566975/incubation-verifiable-credential-selector',
+ },
+ {
+ icon: '/img/article-icon.svg',
+ title: 'tbLEND',
+ description:
+ 'A Web5 protocol that connects the lender and borrower to exchange money securely.',
+ textButton: 'View Project',
+ url: 'https://github.com/TBD54566975/incubation-tblend#web5service',
+ },
+ ],
+};
diff --git a/site/src/content/learn-concepts-detail.js b/site/src/content/learn-concepts-detail.js
new file mode 100644
index 0000000..16856f4
--- /dev/null
+++ b/site/src/content/learn-concepts-detail.js
@@ -0,0 +1,55 @@
+export const content = {
+ meta: {
+ title: 'Learn Detail | TBD',
+ path: 'learn-dc',
+ },
+ title: 'Trust Demystified',
+ url: 'https://vimeo.com/702200087',
+ description:
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit vesti bulum at facilisis quam, et congue tellus...',
+ growToFit: true,
+ biographies: [
+ {
+ imageUrl: '/img/person-example.png',
+ headline: 'Daniel Buchner',
+ description:
+ 'Daniel is a lorem ipsum dolor sit ameta consec tetur adipis cing elit.',
+ },
+ {
+ imageUrl: '/img/person-example.png',
+ headline: 'Kim Hamilton Duffy',
+ description:
+ 'Kim is a lorem ipsum dolor sit ameta consec tetur adipis cing elit.',
+ },
+ {
+ imageUrl: '/img/person-example.png',
+ headline: 'Brooklyn Zelenka',
+ description: 'Brooklyn is a lorem i',
+ },
+ ],
+ highlights: [
+ {
+ title: 'What is TBD',
+ thumbnail: '/img/placeholder-media-image.png',
+ url: 'https://www.youtube.com/watch?v=NpuPm1FsUQk',
+ type: 'video',
+ duration: '9:22',
+ },
+ {
+ title:
+ 'Lorem ipsum et dolor sit ametar consec tetur adipis cing elit ut dolor sit ameta consec tetur',
+ thumbnail: '/img/placeholder-media-image.png',
+ url: 'https://www.youtube.com/watch?v=NpuPm1FsUQk',
+ type: 'video',
+ duration: '9:22',
+ },
+ {
+ title:
+ 'Lorem ipsum et dolor sit ametar consec tetur adipis cing elit ut dolor sit ameta consec tetur',
+ thumbnail: '/img/placeholder-media-image.png',
+ url: 'https://www.youtube.com/watch?v=NpuPm1FsUQk',
+ type: 'video',
+ duration: '9:22',
+ },
+ ],
+};
diff --git a/site/src/content/learn-concepts-example.js b/site/src/content/learn-concepts-example.js
new file mode 100644
index 0000000..a106f7e
--- /dev/null
+++ b/site/src/content/learn-concepts-example.js
@@ -0,0 +1,24 @@
+export const content = {
+ meta: {
+ title: 'Learn Detail | TBD',
+ path: 'learn-dc',
+ },
+ data: {
+ url: 'https://vimeo.com/704183946',
+ transcription: {
+ details:
+ 'Lectus mauris ultrices eros in cursus turpis. Massa sed elementum tempus egestas sed. Nullam non nisi est sit amet facilisis magna etiam tempor. Feugiat vivamus at augue eget arcu dictum varius. Dui vivamus arcu felis bibendum ut tristique et egestas. Viverra maecenas accumsan lacus vel facilisis volutpat est velit egestas. Enim lobortis scelerisque fermentum dui faucibus in ornare. Amet consectetur adipiscing elit duis tristique sollicitudin. Libero volutpat sed cras ornare arcu dui vivamus. Eu tincidunt tortor aliquam nulla. Justo nec ultrices dui sapien eget mi. Sit amet porttitor eget dolor morbi. Facilisis magna etiam tempor orci eu lobortis. Suscipit tellus mauris a diam. Augue interdum velit euismod in pellentesque massa placerat duis. Lacus laoreet non curabitur gravida arcu ac tortor dignissim.\n' +
+ 'Nulla at volutpat diam ut venenatis tellus in metus. Ultrices dui sapien eget mi proin sed libero enim sed. Donec ac odio tempor orci dapibus. Posuere morbi leo urna molestie at elementum. Volutpat commodo sed egestas egestas fringilla phasellus faucibus. Ac orci phasellus egestas tellus rutrum tellus pellentesque eu tincidunt. Proin fermentum leo vel orci porta non pulvinar neque laoreet. Sed velit dignissim sodales ut eu sem. Varius vel pharetra vel turpis nunc eget. Lobortis scelerisque fermentum dui faucibus in. Ullamcorper dignissim cras tincidunt lobortis feugiat. Odio eu feugiat pretium nibh ipsum consequat.\n' +
+ 'Dictum non consectetur a erat. Iaculis at erat pellentesque adipiscing commodo elit at imperdiet dui. Eleifend mi in nulla posuere sollicitudin aliquam ultrices sagittis orci. Sed enim ut sem viverra aliquet eget sit amet. Morbi tristique senectus et netus et. Morbi tincidunt augue interdum velit euismod in pellentesque massa placerat. Id diam vel quam elementum pulvinar. Consequat nisl vel pretium lectus quam id leo. Malesuada pellentesque elit eget gravida cum sociis natoque. Tortor pretium viverra suspendisse potenti nullam ac tortor. Vel facilisis volutpat est velit egestas dui id ornare. Mi sit amet mauris commodo quis imperdiet. Non nisi est sit amet facilisis magna etiam tempor. At varius vel pharetra vel turpis nunc eget. Convallis a cras semper auctor neque.\n' +
+ 'Elit pellentesque habitant morbi tristique senectus. Suspendisse sed nisi lacus sed viverra. Purus gravida quis blandit turpis cursus in hac. Vitae aliquet nec ullamcorper sit amet risus nullam. Sit amet nisl suscipit adipiscing bibendum est ultricies integer quis. Tristique risus nec feugiat in fermentum posuere urna nec tincidunt. Congue eu consequat ac felis. Diam sollicitudin tempor id eu nisl nunc. In est ante in nibh mauris. Ut sem nulla pharetra diam. Habitasse platea dictumst vestibulum rhoncus. Cras ornare arcu dui vivamus arcu felis bibendum ut tristique. Volutpat diam ut venenatis tellus in. Elementum eu facilisis sed odio morbi quis. Nec ullamcorper sit amet risus. Id nibh tortor id aliquet lectus proin. Pharetra convallis posuere morbi leo urna molestie at.\n' +
+ 'Arcu dictum varius duis at consectetur lorem. Dui vivamus arcu felis bibendum ut tristique et. Tellus mauris a diam maecenas sed. Id aliquet risus feugiat in ante. Montes nascetur ridiculus mus mauris vitae ultricies leo. Suspendisse faucibus interdum posuere lorem ipsum dolor. Tincidunt nunc pulvinar sapien et. Habitasse platea dictumst quisque sagittis purus. Ornare arcu odio ut sem nulla pharetra diam. Dolor magna eget est lorem ipsum dolor. Mauris sit amet massa vitae tortor condimentum lacinia quis vel. Lacus vel facilisis volutpat est. Integer eget aliquet nibh praesent tristique magna sit amet purus.\n' +
+ 'Orci porta non pulvinar neque laoreet suspendisse interdum consectetur. Suspendisse in est ante in nibh mauris cursus mattis molestie. Fringilla phasellus faucibus scelerisque eleifend donec pretium. Pellentesque pulvinar pellentesque habitant morbi tristique. Tortor pretium viverra suspendisse potenti nullam ac. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Arcu dictum varius duis at consectetur lorem donec massa sapien. Sit amet massa vitae tortor condimentum lacinia quis vel eros. In massa tempor nec feugiat nisl pretium fusce id. Ut lectus arcu bibendum at varius vel pharetra vel. Nisl condimentum id venenatis a condimentum vitae sapien. Ut pharetra sit amet aliquam id diam maecenas ultricies. In aliquam sem fringilla ut. Mollis aliquam ut porttitor leo a diam. Dignissim diam quis enim lobortis scelerisque fermentum dui. Malesuada bibendum arcu vitae elementum curabitur vitae nunc sed velit. Duis tristique sollicitudin nibh sit amet commodo nulla facilisi nullam. Aliquet eget sit amet tellus cras adipiscing enim eu. Et netus et malesuada fames ac turpis.\n' +
+ 'Dictumst vestibulum rhoncus est pellentesque elit ullamcorper. Ullamcorper eget nulla facilisi etiam dignissim diam quis enim. In hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. In iaculis nunc sed augue lacus viverra. Vitae congue eu consequat ac felis donec et odio pellentesque. A diam sollicitudin tempor id eu. Blandit turpis cursus in hac habitasse platea dictumst. Arcu bibendum at varius vel pharetra vel. Dictum fusce ut placerat orci nulla pellentesque. Faucibus et molestie ac feugiat sed. Enim sit amet venenatis urna cursus eget. Ac tortor dignissim convallis aenean et tortor at risus. Pellentesque adipiscing commodo elit at. Feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Faucibus in ornare quam viverra orci. Laoreet non curabitur gravida arcu.\n' +
+ 'Volutpat est velit egestas dui id ornare arcu odio. Amet porttitor eget dolor morbi non arcu. Sed libero enim sed faucibus. Dui faucibus in ornare quam viverra orci sagittis eu volutpat. Lorem dolor sed viverra ipsum nunc aliquet bibendum enim. Consequat nisl vel pretium lectus quam id leo in. Orci nulla pellentesque dignissim enim sit amet. Vitae elementum curabitur vitae nunc sed velit dignissim sodales ut. Risus commodo viverra maecenas accumsan lacus vel facilisis volutpat est. Nunc sed augue lacus viverra. Pharetra magna ac placerat vestibulum lectus mauris ultrices. Montes nascetur ridiculus mus mauris vitae ultricies. Eget magna fermentum iaculis eu. Egestas egestas fringilla phasellus faucibus scelerisque eleifend. Sed risus ultricies tristique nulla aliquet enim tortor. Duis tristique sollicitudin nibh sit amet commodo. Id nibh tortor id aliquet lectus. Amet mauris commodo quis imperdiet massa. Enim tortor at auctor urna nunc id cursus metus. Dictumst quisque sagittis purus sit amet.\n' +
+ 'Vel quam elementum pulvinar etiam non quam lacus. Tortor condimentum lacinia quis vel eros donec. Proin nibh nisl condimentum id venenatis a condimentum vitae sapien. Pellentesque habitant morbi tristique senectus et. Ante in nibh mauris cursus mattis. Sapien et ligula ullamcorper malesuada. Gravida in fermentum et sollicitudin ac orci phasellus egestas tellus. Sodales ut etiam sit amet. Mauris nunc congue nisi vitae suscipit tellus mauris a diam. Enim eu turpis egestas pretium aenean pharetra magna ac. Massa sed elementum tempus egestas. Eget nunc lobortis mattis aliquam faucibus. Duis at tellus at urna condimentum mattis pellentesque id. Tortor consequat id porta nibh venenatis. Fermentum et sollicitudin ac orci. Libero nunc consequat interdum varius sit.\n' +
+ 'Faucibus pulvinar elementum integer enim neque volutpat ac tincidunt. Massa ultricies mi quis hendrerit dolor magna. Malesuada nunc vel risus commodo viverra. Mauris nunc congue nisi vitae suscipit tellus mauris. Lacus vestibulum sed arcu non odio euismod lacinia at. Enim nunc faucibus a pellentesque sit. Nunc mi ipsum faucibus vitae. Non quam lacus suspendisse faucibus interdum posuere lorem. Nibh cras pulvinar mattis nunc sed blandit libero volutpat sed. Et sollicitudin ac orci phasellus egestas tellus rutrum. Gravida in fermentum et sollicitudin ac. Quis ipsum suspendisse ultrices gravida dictum.\n',
+ summary:
+ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
+ },
+ },
+};
diff --git a/site/src/content/learn-detail.js b/site/src/content/learn-detail.js
new file mode 100644
index 0000000..69cfd45
--- /dev/null
+++ b/site/src/content/learn-detail.js
@@ -0,0 +1,15 @@
+export const content = {
+ meta: {
+ title: 'Learn Detail | TBD',
+ path: 'learn-dc',
+ },
+ title: 'Trust Demystified',
+ url: 'https://vimeo.com/702200087',
+ guests: 'Daniel Buchner, Kim Hamilton Duffy, Brooklyn Zelenka',
+ posted: 'Apr 2022',
+ description:
+ 'A panel discussion on Decentralized Identity (DID) where we talk use cases, benefits, DIDs vs NFTs, and what should and shouldnt go on a blockchain.',
+ details:
+ 'Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem IpsumLorem IpsumLorem IpsumLorem IpsuLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem IpsumLorem Ipsum',
+ summary: 'Transcripted Summary',
+};
diff --git a/site/src/content/open-source/governance/content.mdx b/site/src/content/open-source/governance/content.mdx
new file mode 100644
index 0000000..e28ed2a
--- /dev/null
+++ b/site/src/content/open-source/governance/content.mdx
@@ -0,0 +1,75 @@
+Contributors
+
+ Anyone may be a contributor to TBD projects. Contribution may take the form of:
+
+
+ Asking and answering questions on Discord or GitHub Issues
+ Filing an issue
+ Offering a feature or bug fix via a Pull Request
+ Suggesting documentation improvements
+ ...and more!
+ Anyone with a GitHub account may use the project issue trackers and communications channels. We welcome newcomers, so don't hesitate to say hi!
+
+
+
+
+Maintainers
+
+ Maintainers have write access to GitHub repositories and act as project administrators. They approve and merge pull requests, cut releases, and guide collaboration with the community. They have:
+
+ Commit access to their project's repositories
+ Write access to continuous integration (CI) jobs
+ Both maintainers and non-maintainers may propose changes to source code. The mechanism to propose such a change is a GitHub pull request. Maintainers review and merge (land) pull requests.
+
+ If a maintainer opposes a proposed change, then the change cannot land. The exception is if the Governance Committee (GC) votes to approve the change despite the opposition. Usually, involving the GC is unnecessary.
+
+ Maintainer activities
+
+
+ Helping users and novice contributors
+ Contributing code and documentation changes that improve the project
+ Reviewing and commenting on issues and pull requests
+ Participation in working groups
+ Merging pull requests
+
+
+
+
+Governance Committee
+
+ The TBD Open Source Governance Committee (GC) has final authority over this project, including:
+
+
+
+ Technical direction
+ Project governance and process (including this policy)
+ Contribution policy
+ GitHub repository hosting
+ Conduct guidelines
+ Maintaining the list of maintainers
+
+
+
+ The current GC members are:
+
+
+
+ Ben Boeser, Technical Partnerships Lead, TBD
+ Narissa Flores, Foundational Engineering Security, Block
+ Angie Jones, Head of Developer Relations, TBD
+ Julie Kim, Head of Legal, TBD
+ Nidhi Nahar, Head of Patents and Open Source, Block
+ Andrew Lee Rubinger, Head of Open Source, TBD
+
+
+
+
+ Members are not to be contacted individually. The GC may be reached
+ through tbd-open-source-governance@squareup.com and
+ is an available resource in mediation or
+ for sensitive cases beyond the scope of project maintainers. It operates as a
+ "Self-appointing council or board" as defined by
+ Red Hat: Open Source Governance Models .
+
+
diff --git a/site/src/content/open-source/governance/governance.js b/site/src/content/open-source/governance/governance.js
new file mode 100644
index 0000000..ae2222d
--- /dev/null
+++ b/site/src/content/open-source/governance/governance.js
@@ -0,0 +1,6 @@
+export const content = {
+ meta: {
+ title: 'Governance | TBD',
+ path: 'open-source/governance',
+ }
+};
diff --git a/site/src/content/open-source/governance/heading.mdx b/site/src/content/open-source/governance/heading.mdx
new file mode 100644
index 0000000..140989d
--- /dev/null
+++ b/site/src/content/open-source/governance/heading.mdx
@@ -0,0 +1,3 @@
+
+ Open Source Project Governance
+
diff --git a/site/src/content/open-source/heading.mdx b/site/src/content/open-source/heading.mdx
new file mode 100644
index 0000000..e19c25e
--- /dev/null
+++ b/site/src/content/open-source/heading.mdx
@@ -0,0 +1,19 @@
+
+ Today’s financial systems leave people behind. We build systems for anyone
+ with internet access. And we’re creating it like the web itself: as a public
+ good.
+
+
+
+ Our projects are open source and, where appropriate, built on open standards.
+
+
+
+ Our work is licensed under the
+ Apache License 2.0 , and we welcome you to join
+ us in building the future of finance and{' '}
+
+ a network that is not controlled by a central entity
+ {' '}
+ technology.
+
diff --git a/site/src/content/open-source/incubation/content.mdx b/site/src/content/open-source/incubation/content.mdx
new file mode 100644
index 0000000..137bd9e
--- /dev/null
+++ b/site/src/content/open-source/incubation/content.mdx
@@ -0,0 +1,29 @@
+import { content } from '@site/src/content/open-source/incubation/incubation-program.js';
+
+
+ As stewards of an open source ecosystem, we champion innovation from the community. To
+ encourage new ideas from folks around the world, TBD offers The
+ Open Source Incubation Program.
+
+ TBD Incubation projects are managed by community contributors. They advance the
+ decentralized web and accelerate development and adoption of the Web5 platform.
+ Like all projects in the TBD ecosystem, they follow our Code of Conduct
+ and Governance
+ model, fostering an inclusive community. Incubation projects benefit from
+ TBD’s open source programs including GitHub and our Discord server.
+
+ When projects reach maturity, they may apply to be promoted out of Incubation into a central project.
+
+ Got ideas you’d like to build with us? Propose a project including:
+
+
+ An introduction to you, your organization, and your mission
+ Statement of value to the TBD ecosystem
+ Link to repo and code
+ Description or graphic on user flow
+ Description or graphic on info flow between services
+ If accepted, willingness to sign an Apache Contributor License Agreement
+
+
+
+
diff --git a/site/src/content/open-source/incubation/heading.mdx b/site/src/content/open-source/incubation/heading.mdx
new file mode 100644
index 0000000..fc62885
--- /dev/null
+++ b/site/src/content/open-source/incubation/heading.mdx
@@ -0,0 +1,3 @@
+
+ Open Source Incubation Program
+
diff --git a/site/src/content/open-source/incubation/incubation-program.js b/site/src/content/open-source/incubation/incubation-program.js
new file mode 100644
index 0000000..c12189c
--- /dev/null
+++ b/site/src/content/open-source/incubation/incubation-program.js
@@ -0,0 +1,15 @@
+export const content = {
+ meta: {
+ title: 'Open Source Incubation Program | TBD',
+ path: 'incubation',
+ },
+ buttons: [{
+ type: 'button',
+ data: {
+ label: 'Propose an Incubation Project',
+ url: 'https://github.com/TBD54566975/collaboration/issues/new/choose',
+ isExternalLink: true,
+ imageURL: '/img/external-link-blue-icon.svg',
+ },
+ }]
+};
diff --git a/site/src/content/open-source/open-source.js b/site/src/content/open-source/open-source.js
new file mode 100644
index 0000000..6882708
--- /dev/null
+++ b/site/src/content/open-source/open-source.js
@@ -0,0 +1,81 @@
+import PillarsInclusivity from './pillars-inclusivity.mdx';
+import PillarsTransparency from './pillars-transparency.mdx';
+import PillarsClarity from './pillars-clarity.mdx';
+
+export const content = {
+ meta: {
+ title: 'Open Source | TBD',
+ path: 'opensource',
+ },
+ title: 'Our Pillars',
+ pillars: [
+ {
+ img: '/img/inclusivity-icon.svg',
+ title: 'Inclusivity',
+ alt: '',
+ description: PillarsInclusivity,
+ },
+ {
+ img: '/img/transparency-icon.svg',
+ title: 'Transparency',
+ alt: '',
+ description: PillarsTransparency,
+ },
+ {
+ img: '/img/clarity-icon.svg',
+ title: 'Clarity',
+ alt: '',
+ description: PillarsClarity,
+ },
+ ],
+ buttons: [
+ {
+ type: 'button',
+ data: {
+ label: 'Contributing Guide',
+ url: '/open-source/contributing',
+ isExternalLink: false
+ },
+ },
+ {
+ type: 'button',
+ data: {
+ label: 'Project Governance',
+ url: '/open-source/governance',
+ isExternalLink: false
+ },
+ },
+ {
+ type: 'button',
+ data: {
+ label: 'Code of Conduct',
+ url: '/open-source/code-of-conduct',
+ isExternalLink: false
+ },
+ },
+ {
+ type: 'button',
+ data: {
+ label: 'Incubation Program',
+ url: '/open-source/incubation',
+ isExternalLink: false
+ },
+ },
+ {
+ type: 'button',
+ data: {
+ label: 'Projects Dashboard',
+ url: '/open-source/projects-dashboard',
+ isExternalLink: false
+ },
+ },
+ {
+ type: 'button',
+ data: {
+ label: 'Security Policy',
+ url: '/open-source/security',
+ isExternalLink: false
+ },
+ },
+ ],
+};
diff --git a/site/src/content/open-source/pillars-clarity.mdx b/site/src/content/open-source/pillars-clarity.mdx
new file mode 100644
index 0000000..108b8cc
--- /dev/null
+++ b/site/src/content/open-source/pillars-clarity.mdx
@@ -0,0 +1,5 @@
+---
+hide_table_of_contents: true
+---
+
+Projects need well-defined scope to succeed. They also need accessible, comprehensive documentation, a stellar Getting Started experience, and well-defined expectations. TBD fosters an environment built for contribution without personal intervention. Newcomers should be able to follow the project status on their own without additional explanation.
diff --git a/site/src/content/open-source/pillars-inclusivity.mdx b/site/src/content/open-source/pillars-inclusivity.mdx
new file mode 100644
index 0000000..fa6b21a
--- /dev/null
+++ b/site/src/content/open-source/pillars-inclusivity.mdx
@@ -0,0 +1,7 @@
+---
+hide_table_of_contents: true
+---
+
+Anyone with the capacity to contribute: can. We are proactive in welcoming a diverse contributor base for our code,
+documentation, developer relations, education, and communication efforts. Bad actors will be met with a published governance model and enforced code of conduct. Our users deserve representation in our development communities, and we promote
+varied perspectives and respectful debate.
diff --git a/site/src/content/open-source/pillars-transparency.mdx b/site/src/content/open-source/pillars-transparency.mdx
new file mode 100644
index 0000000..9b6f914
--- /dev/null
+++ b/site/src/content/open-source/pillars-transparency.mdx
@@ -0,0 +1,5 @@
+---
+hide_table_of_contents: true
+---
+
+Decision-making is open by default, with rare exceptions made for security, compliance, personnel, or other sensitive issues. Projects under TBD’s stewardship will conduct design, roadmap, issues, bugs, and code reviews in public. This is critical for accountability and to promote the inclusive environment necessary for project success.
diff --git a/site/src/content/open-source/security.js b/site/src/content/open-source/security.js
new file mode 100644
index 0000000..c72b9cf
--- /dev/null
+++ b/site/src/content/open-source/security.js
@@ -0,0 +1,13 @@
+export const content = {
+
+ buttons: [
+ {
+ type: 'button',
+ data: {
+ label: 'Report Security Vulnerability to security@tbd.email',
+ url: 'mailto:security@tbd.email',
+ isExternalLink: false
+ },
+ },
+ ]
+};
diff --git a/site/src/content/projects/project-index/column-1.mdx b/site/src/content/projects/project-index/column-1.mdx
new file mode 100644
index 0000000..9ba909a
--- /dev/null
+++ b/site/src/content/projects/project-index/column-1.mdx
@@ -0,0 +1,9 @@
+
+ All projects are in early prototyping.
+
+
+
+ New contributors should expect a pace of development consistent with nascent
+ technology: larger commits, frequent refactoring, changing APIs, and
+ incomplete feature sets.
+
diff --git a/site/src/content/projects/project-index/column-2.mdx b/site/src/content/projects/project-index/column-2.mdx
new file mode 100644
index 0000000..5eb5be3
--- /dev/null
+++ b/site/src/content/projects/project-index/column-2.mdx
@@ -0,0 +1,15 @@
+**We believe open source is not a publishing medium.**
+
+These projects are open from the start to welcome your interest, invite discussion, identify early issues, and advise on design.
+
+An early adopter mindset will work well until these projects mature further.
+
+The Discussion Forums and Issue Trackers are likely the best way to get involved now. Our project leads may be able to guide your efforts and incorporate your feedback in ways that will be most meaningful to you and the project's goals.
+
+In particular, we want to ensure the New Contributor Experience is as smooth as possible. You should be able to:
+
+- Understand each project's goals and scope
+- Install prerequisite dependencies
+- Clone and build the project
+- Run the tests
+- Join the conversation in Discussions and Issues
diff --git a/site/src/content/projects/project-index/heading.mdx b/site/src/content/projects/project-index/heading.mdx
new file mode 100644
index 0000000..e69de29
diff --git a/site/src/content/projects/project-index/project-list.mdx b/site/src/content/projects/project-index/project-list.mdx
new file mode 100644
index 0000000..62c1434
--- /dev/null
+++ b/site/src/content/projects/project-index/project-list.mdx
@@ -0,0 +1,3 @@
+import { content } from '@site/src/content/projects/project-index/projects';
+
+
diff --git a/site/src/content/projects/project-index/projects.js b/site/src/content/projects/project-index/projects.js
new file mode 100644
index 0000000..b674d05
--- /dev/null
+++ b/site/src/content/projects/project-index/projects.js
@@ -0,0 +1,34 @@
+import Heading from './heading.mdx';
+import ListOfProjects from './project-list.mdx';
+import Column1 from './column-1.mdx';
+import Column2 from './column-2.mdx';
+
+export const content = {
+ meta: {
+ title: 'Projects | TBD',
+ path: 'projects',
+ },
+ Heading: Heading,
+ ListOfProjects: ListOfProjects,
+ projects: [
+ {
+ icon: '/img/article-icon.svg',
+ title: 'Web5',
+ description:
+ 'Builds a decentralized web that returns control over your data and identity',
+ textButton: 'View Project',
+ url: '/projects/web5',
+ },
+ {
+ icon: '/img/article-icon.svg',
+ title: 'tbDEX',
+ description:
+ 'Connects the world of legacy money to the world of digital money',
+ textButton: 'View Project',
+ url: '/projects/tbdex',
+ },
+ ],
+
+ Column1: Column1,
+ Column2: Column2,
+};
diff --git a/site/src/content/projects/tbdex-protocol.mdx b/site/src/content/projects/tbdex-protocol.mdx
new file mode 100644
index 0000000..75ba524
--- /dev/null
+++ b/site/src/content/projects/tbdex-protocol.mdx
@@ -0,0 +1,5 @@
+---
+hide_table_of_contents: true
+---
+
+An implementation of Decentralized Identity Foundation 's emerging decentralized personal datastore standard
diff --git a/site/src/content/projects/tbdex/data-self-ownership.mdx b/site/src/content/projects/tbdex/data-self-ownership.mdx
new file mode 100644
index 0000000..5c63104
--- /dev/null
+++ b/site/src/content/projects/tbdex/data-self-ownership.mdx
@@ -0,0 +1,10 @@
+---
+hide_table_of_contents: true
+---
+
+Bob holds a digital wallet and has granted it access to his transaction history, credentials, and other relevant preferences that are in his (DWN) decentralized web node . Bob likes his wallet but is tempted to switch to a different one that has a feature
+his current wallet lacks. Bob downloads the new wallet and grants it permission to
+access his transactions, digital currency balances, and dark mode preference from his
+data store. Bob uses both wallets for a week and the data seamlessly syncs across
+the wallets. Bob decides that he prefers his old wallet over the new one. He revokes
+all permissions granted to the new wallet and uninstalls it.
diff --git a/site/src/content/projects/tbdex/heading.mdx b/site/src/content/projects/tbdex/heading.mdx
new file mode 100644
index 0000000..18a276b
--- /dev/null
+++ b/site/src/content/projects/tbdex/heading.mdx
@@ -0,0 +1,49 @@
+# TBDEX: A LIQUIDITY PROTOCOL
+
+## An open financial protocol that can move value anywhere around the world in a more efficient and cost-effective way than what’s possible in traditional financial systems.
+
+The web connected us all. But money and payments have not kept pace.
+
+The legacy payments system is held together with proverbial duct tape that masks fundamental problems: final settlement of payments is slow, expensive, and never quite final. Risks get priced in as expensive account fees – or exclusion from the system itself. This hits the most economically disadvantaged the hardest.
+
+A a network that is not controlled by a central entity and trust is established in a decentralized way, for example via decentralized identity and verifiable credentials system shifts the paradigm to financial access. There are no credit checks or monthly account fees. Open, decentralized, and the ability to participate in a network without the need for application or approval networks let you send money anywhere in the world, near instantly.
+
+tbDEX is a decentralized, permissionless protocol. It opens the door to an approach that gives individuals ownership and control of their digital identities and access to the financial system for all. And because it abstracts away the complexity of decentralization, developers can focus on building great things.
+
+
diff --git a/site/src/content/projects/tbdex/proving-your-identity.mdx b/site/src/content/projects/tbdex/proving-your-identity.mdx
new file mode 100644
index 0000000..75c11dc
--- /dev/null
+++ b/site/src/content/projects/tbdex/proving-your-identity.mdx
@@ -0,0 +1,25 @@
+---
+hide_table_of_contents: true
+---
+
+Alice holds a digital wallet that securely manages all aspects of her identity,
+including her Unique address to personal
+information that may be required for currency exchange with a regulated financial
+institution , credentials, and
+permissions granted for another person or app to view or exchange data with you
+for external apps and entities. Alice uses her wallet to request USD in exchange for
+100 units of digital currency.
+
+Because Alice is Converting digital money to
+legacy money, fiat. from digital currency to fiat, most Participating Financial
+Institutions(PFIs) are required to verify Alice’s identity in order to fulfill
+their regulatory and compliance obligations. PFIs that are interested in fulfilling
+Alice’s request reply with a bid as well as their identity verification requirements
+for fulfillment.
+
+Alice chooses a bid which will need Know Your Customer (KYC)
+information (such as name, address, date of birth). Alice has already provided all
+of the necessary information to another PFI in the past. So, Alice allows her wallet
+to provide a digital certificates
+that make it easy to share information online in a private and secure way issued from the past PFI to the bidding PFI, along with the currency
+to exchange. The PFI verifies the credential and continues with fulfillment.
diff --git a/site/src/content/projects/tbdex/tbdex.js b/site/src/content/projects/tbdex/tbdex.js
new file mode 100644
index 0000000..e7eaecd
--- /dev/null
+++ b/site/src/content/projects/tbdex/tbdex.js
@@ -0,0 +1,65 @@
+/* eslint-disable quotes */
+import Heading from './heading.mdx';
+import ProvingIdentity from './proving-your-identity.mdx';
+export const content = {
+ meta: {
+ title: 'tbDEX | TBD',
+ path: 'projects/tbdex',
+ },
+ Heading: Heading,
+ components: {
+ growToFit: true,
+ title: 'Components',
+ projects: [
+ {
+ icon: '/img/component-icon.svg',
+ title: 'Decentralized Identifiers',
+ description:
+ 'Decentralized Identifiers are a W3C international standard for identifiers created, owned, and controlled by individuals, without reliance on centralized entities',
+ textButton: 'View Component',
+ url: '/',
+ },
+ {
+ icon: '/img/component-icon.svg',
+ title: 'Verifiable Credentials',
+ description:
+ 'Verifiable Credentials are a W3C international standard for verifiable claims.',
+ textButton: 'View Component',
+ url: '/',
+ },
+ ],
+ },
+ actors: {
+ title: 'Actors',
+ actors: [
+ {
+ title: 'Wallets',
+ description:
+ 'wallets act as agents for individuals or institutions by facilitating exchanges with PFIs',
+ },
+ {
+ title: 'Participating Financial Institutions (PFIs)',
+ description:
+ 'entities that offer liquidity services on a tbDEX network',
+ },
+ {
+ title: 'Credential Issuer',
+ description:
+ 'organizations or individuals (by means of their wallet) who serve as a source of verifiable credentials',
+ },
+ ],
+ imgDesktop: '/img/maze.svg',
+ isWeb5: false,
+ },
+ useCases: {
+ title: 'Use Cases',
+ pillars: [
+ {
+ img: '/img/identity-icon.svg',
+ title: 'Proving your identity',
+ alt: '',
+ description: ProvingIdentity,
+ },
+ ],
+ },
+};
diff --git a/site/src/content/projects/web5/heading.mdx b/site/src/content/projects/web5/heading.mdx
new file mode 100644
index 0000000..865cc9c
--- /dev/null
+++ b/site/src/content/projects/web5/heading.mdx
@@ -0,0 +1,50 @@
+import { content } from '@site/src/content/projects/web5/web5.js';
+
+# WEB5: A DECENTRALIZED WEB PLATFORM
+
+## Putting you in control of your data and identity
+
+The web democratized the exchange of information, but it's missing a key layer: identity. We struggle to secure personal data with hundreds of accounts and passwords we can’t remember. On the web today, identity and personal data have become the property of third parties.
+
+Web5 brings identity created, owned, and controlled by individuals, without reliance on centralized entities and data storage to your applications. It lets devs focus on creating delightful user experiences, while returning ownership of data and identity to individuals.
+
+
+
+
diff --git a/site/src/content/projects/web5/web5.js b/site/src/content/projects/web5/web5.js
new file mode 100644
index 0000000..5982a73
--- /dev/null
+++ b/site/src/content/projects/web5/web5.js
@@ -0,0 +1,61 @@
+/* eslint-disable quotes */
+import TBDEXProtocol from '../tbdex-protocol.mdx';
+import Heading from './heading.mdx';
+export const content = {
+ meta: {
+ title: 'Web5 | TBD',
+ path: 'projects/web5',
+ },
+ Heading: Heading,
+ components: {
+ growToFit: true,
+ title: 'Components',
+ projects: [
+ {
+ icon: '/img/component-icon.svg',
+ title: 'Decentralized Identifiers',
+ description:
+ 'Decentralized Identifiers are a W3C international standard for identifiers created, owned, and controlled by individuals, without reliance on centralized entities',
+ textButton: 'View Component',
+ url: '/',
+ isExternalLink: false,
+ },
+ {
+ icon: '/img/component-icon.svg',
+ title: 'Verifiable Credentials',
+ description:
+ 'Verifiable Credentials are a W3C international standard for cryptographically-signed statements made by an issuer about a holder',
+ textButton: 'View Component',
+ url: '/',
+ isExternalLink: false,
+ },
+ {
+ icon: '/img/component-icon.svg',
+ title: 'Decentralized Web Nodes',
+ description: TBDEXProtocol,
+ textButton: 'View Component',
+ url: '/docs/web5/decentralized-web-nodes/what-are-dwns',
+ isExternalLink: false,
+ },
+ ],
+ },
+ useCases: {
+ title: 'Use Cases',
+ pillars: [
+ {
+ img: '/img/data-icon.svg',
+ title: 'Control Your Identity',
+ alt: '',
+ description:
+ 'Alice holds a digital wallet that securely manages her identity, data, and authorizations for external apps and connections. Alice uses her wallet to sign in to a new decentralized social media app. Because Alice has connected to the app with her decentralized identity, she does not need to create a profile, and all the connections, relationships, and posts she creates through the app are stored with her, in her decentralized web node. Now Alice can switch apps whenever she wants, taking her social persona with her.',
+ },
+ {
+ img: '/img/devices-icon.svg',
+ title: 'Own Your Data',
+ alt: '',
+ description:
+ "Bob is a music lover and hates having his personal data locked to a single vendor. It forces him to recreate his playlists and songs over and over again across different music apps. Thankfully there's a way out of this maze of vendor-locked silos: Bob can keep this data in his decentralized web node. This way Bob is able to grant any music app access to his settings and preferences, enabling him to take his personalized music experience wherever he chooses.",
+ },
+ ],
+ },
+};
diff --git a/site/src/content/remote-md.json b/site/src/content/remote-md.json
new file mode 100644
index 0000000..c220e1a
--- /dev/null
+++ b/site/src/content/remote-md.json
@@ -0,0 +1,118 @@
+{
+ "components": {
+ "dwn-sdk-js": {
+ "name": "dwn-sdk-js",
+ "plugin": {
+ "name": "some-content3",
+ "sourceBaseUrl": "https://raw.githubusercontent.com/TBD54566975/dwn-sdk-js/main/",
+ "outDir": "src/pages/projects/dwn-sdk-js"
+ },
+ "files": [
+ {
+ "file": "README.md",
+ "meta": {
+ "title": "Decentralized Web Node | TBD",
+ "path": "projects/dwn-sdk-js/README"
+ },
+ "breadcrumbs": true,
+ "buttons": [
+ {
+ "type": "button",
+ "data": {
+ "label": "Source on GitHub",
+ "url": "https://github.com/TBD54566975/dwn-sdk-js",
+ "isExternalLink": true,
+ "imageURL": "/img/external-link-blue-icon.svg"
+ }
+ },
+ {
+ "type": "button",
+ "data": {
+ "label": "Issues",
+ "url": "https://github.com/TBD54566975/dwn-sdk-js/issues",
+ "isExternalLink": true,
+ "imageURL": "/img/external-link-blue-icon.svg"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "ssi-service": {
+ "name": "ssi-service",
+ "plugin": {
+ "name": "some-content4",
+ "sourceBaseUrl": "https://raw.githubusercontent.com/TBD54566975/ssi-service/main/",
+ "outDir": "src/pages/projects/ssi-service"
+ },
+ "files": [
+ {
+ "file": "README.md",
+ "meta": {
+ "title": "Self-sovereign Identity Service | TBD",
+ "path": "projects/ssi-service/README"
+ },
+ "breadcrumbs": true,
+ "buttons": [
+ {
+ "type": "button",
+ "data": {
+ "label": "Source on GitHub",
+ "url": "https://github.com/TBD54566975/ssi-service",
+ "isExternalLink": true,
+ "imageURL": "/img/external-link-blue-icon.svg"
+ }
+ },
+ {
+ "type": "button",
+ "data": {
+ "label": "Issues",
+ "url": "https://github.com/TBD54566975/ssi-service/issues",
+ "isExternalLink": true,
+ "imageURL": "/img/external-link-blue-icon.svg"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "ssi-sdk": {
+ "name": "ssi-sdk",
+ "plugin": {
+ "name": "some-content5",
+ "sourceBaseUrl": "https://raw.githubusercontent.com/TBD54566975/ssi-sdk/main/",
+ "outDir": "src/pages/projects/ssi-sdk"
+ },
+ "files": [
+ {
+ "file": "README.md",
+ "meta": {
+ "title": "Self-sovereign Identity SDK | TBD",
+ "path": "projects/ssi-sdk/README"
+ },
+ "breadcrumbs": true,
+ "buttons": [
+ {
+ "type": "button",
+ "data": {
+ "label": "Source on GitHub",
+ "url": "https://github.com/TBD54566975/ssi-sdk",
+ "isExternalLink": true,
+ "imageURL": "/img/external-link-blue-icon.svg"
+ }
+ },
+ {
+ "type": "button",
+ "data": {
+ "label": "Issues",
+ "url": "https://github.com/TBD54566975/ssi-sdk/issues",
+ "isExternalLink": true,
+ "imageURL": "/img/external-link-blue-icon.svg"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+}
diff --git a/site/src/contributors.json b/site/src/contributors.json
new file mode 100644
index 0000000..faf481c
--- /dev/null
+++ b/site/src/contributors.json
@@ -0,0 +1,39 @@
+[
+ {
+ "login": "Evans Eburu",
+ "avatar_url": "https://media.licdn.com/dms/image/v2/C5603AQH9wNgj5LwWYA/profile-displayphoto-shrink_800_800/profile-displayphoto-shrink_800_800/0/1601625245312?e=1733961600&v=beta&t=PjjSAaug61IEV_N9ZeGo4oBFQGcuHKVsjnJySFckCOQ",
+ "contributions": ["Community Champion Award"],
+ "description": "You've helped troubleshoot issues for other community members and have shared feedback to make our open source space even more engaging. We're so grateful you're here!"
+ },
+ {
+ "login": "momo4698",
+ "avatar_url": "https://cdn.discordapp.com/embed/avatars/0.png?size=1024",
+ "contributions": ["Culture Contributor Award"],
+ "description": "Your fun chatter brings so much energy to our contests and events, and we love how you keep the vibes positive with your infectious enthusiasm. Thank you for being a contributor and community member!"
+ },
+ {
+ "login": "thebelcoder",
+ "avatar_url": "https://cdn.discordapp.com/embed/avatars/3.png?size=1024",
+ "contributions": ["Trend Setter Award"],
+ "description": "Your unwavering determination and enthusiasm for finding answers is truly inspiring, especially when faced with challenges, and your hard work has paid off. We're proud to have members like you in our community!"
+ },
+ {
+ "login": "0x0x",
+ "avatar_url": "https://cdn.discordapp.com/embed/avatars/4.png?size=1024",
+ "contributions": ["Discord Contributor Award"],
+ "description": "Your support during our live events means the world, and your positive spirit never wavered despite challenges. Thank you for being part of what makes our community amazing!"
+ },
+ {
+ "login": "contsm",
+ "avatar_url": "https://cdn.discordapp.com/embed/avatars/5.png?size=1024",
+ "contributions": ["Feedback Champion Award"],
+ "description": "You approached every challenge with a mindset of learning and growth, which is such an inspiring way to tackle obstacles. Thank you for bringing enthusiasm to our community!"
+ },
+ {
+ "login": "Uliboy",
+ "avatar_url": "https://cdn.discordapp.com/avatars/981084971919872034/66ad8d864f1d6ad3df25ea6f112039f9?size=1024",
+ "contributions": ["Rising Star Award"],
+ "description": "Your openness in sharing your work and enthusiasm for our projects means a lot to us. Your willingness to learn and grow not only helps you but also uplifts our entire community. Thank you for being here!"
+ }
+]
+
diff --git a/site/src/css/api.css b/site/src/css/api.css
new file mode 100644
index 0000000..68a585a
--- /dev/null
+++ b/site/src/css/api.css
@@ -0,0 +1,403 @@
+.pagination-nav {
+ display: none;
+}
+
+html.plugin-docs.plugin-id-api body {
+ background-color: #1c1c1c;
+}
+
+html.plugin-docs.plugin-id-api #__docusaurus {
+ padding: 0 !important;
+}
+
+html.plugin-docs.plugin-id-api .main-wrapper {
+ margin-top: 2rem;
+}
+
+html.plugin-docs.plugin-id-api .navbar {
+ border-bottom: 2px solid var(--color-yellow);
+ height: fit-content;
+ padding-bottom: 0px;
+ padding-left: 0px;
+ padding-right: 0px;
+ padding-top: 0px;
+ background-color: black;
+}
+
+html.plugin-docs.plugin-id-api .navbar__items,
+html.plugin-docs.plugin-id-api .navbar__items--right {
+ align-items: baseline;
+}
+
+html.plugin-docs.plugin-id-api .navbar__item {
+ padding-top: 24px;
+}
+
+html.plugin-docs.plugin-id-api .navbar__logo {
+ margin-bottom: 1.5rem;
+ margin-left: 1.5rem;
+ margin-top: 1.5rem;
+ height: 1.5rem;
+}
+
+html.plugin-docs.plugin-id-api .navbar__link {
+ padding-bottom: 2rem;
+}
+
+html.plugin-docs.plugin-id-api .navbar__link:last-child {
+ padding-right: 0.5rem;
+}
+
+html.plugin-docs.plugin-id-api .navbar__link:active {
+ padding-bottom: 2rem;
+}
+
+html.plugin-docs.plugin-id-api
+ .navbar-sidebar
+ .navbar-sidebar__item:last-child
+ .clean-btn.navbar-sidebar__back::before {
+ display: inline-block;
+ content: url('/static/img/arrow-yellow.svg');
+ position: relative;
+}
+
+html.plugin-docs.plugin-id-api aside .menu__link {
+ color: var(--ifm-menu-color);
+ padding-top: 0rem;
+ padding-bottom: 0rem;
+}
+
+html.plugin-docs.plugin-id-api aside aside .menu__link {
+ padding-left: 0;
+}
+
+html.plugin-docs.plugin-id-api aside aside .menu__link li a {
+ padding-left: 0;
+}
+
+html.plugin-docs.plugin-id-api aside aside .menu__link--active {
+ padding-left: 0;
+}
+
+html.plugin-docs.plugin-id-api .thin-scrollbar {
+ color: white;
+ letter-spacing: 1px;
+ margin-top: 24px;
+}
+
+html.plugin-docs.plugin-id-api
+ aside
+ .sidebar_node_modules-\@docusaurus-theme-classic-lib-next-theme-DocSidebar-Desktop-styles-module {
+ top: auto;
+}
+
+@media (min-width: 997px) {
+ html.plugin-docs.plugin-id-api
+ .menu_node_modules-\@docusaurus-theme-classic-lib-next-theme-DocSidebar-Desktop-Content-styles-module {
+ flex-grow: 1;
+ padding-left: 0rem !important;
+ font-size: large;
+ }
+ html.plugin-docs.plugin-id-api
+ aside.docSidebarContainer_src-layout-DocPage-styles-module,
+ html.plugin-docs.plugin-id-api aside.theme-doc-sidebar-container {
+ margin-right: 1.5rem;
+ }
+}
+/* Article styling */
+
+article .markdown p {
+ font-weight: var(--typography-body-1-d-font-weight);
+ font-size: var(--typography-body-1-d-font-size);
+ line-height: var(--typography-body-1-d-line-height);
+ letter-spacing: 1px;
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+}
+
+article .markdown li {
+ font-weight: var(--typography-body-1-d-font-weight);
+ font-size: var(--typography-body-1-d-font-size);
+ line-height: var(--typography-body-1-d-line-height);
+ letter-spacing: 1px;
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+}
+
+article .markdown blockquote {
+ color: var(--color-yellow);
+ font-style: normal;
+ font-weight: 300;
+}
+
+article .markdown blockquote b {
+ color: white;
+ font-style: normal;
+ font-weight: 800;
+}
+
+article .theme-code-block pre {
+ background: #232323;
+}
+
+article .theme-code-block pre code .token-line span {
+ color: white;
+}
+
+article .markdown p {
+ font-weight: var(--typography-body-1-d-font-weight);
+ font-size: var(--typography-body-1-d-font-size);
+ line-height: var(--typography-body-1-d-line-height);
+ letter-spacing: 1px;
+ font-family: var(--tbd-font-sans);
+}
+
+article .markdown p code {
+ color: white;
+ background-color: gray;
+}
+
+.pagination-nav__sublabel {
+ display: none;
+}
+
+.pagination-nav__label {
+ color: white;
+ letter-spacing: 1px;
+ font-weight: 400;
+ text-decoration: none;
+}
+
+html.plugin-docs.plugin-id-api .thin-scrollbar {
+ color: white;
+ letter-spacing: 1px;
+ margin-top: 24px;
+ top: 124px !important;
+ font-family: var(--tbd-font-sans);
+}
+
+html.plugin-docs.plugin-id-api .thin-scrollbar ul li a {
+ color: white;
+}
+
+html.plugin-docs.plugin-id-api article time {
+ color: white;
+}
+
+html.plugin-docs.plugin-id-api .avatar {
+ color: white;
+}
+
+html.plugin-docs.plugin-id-api .navbar__link {
+ font-size: 18px;
+ padding-bottom: 2rem;
+}
+
+html.plugin-docs.plugin-id-api .navbar__link:hover {
+ border-bottom: 4px solid var(--color-yellow);
+ color: var(--color-yellow);
+ padding-bottom: 2rem;
+}
+
+html.plugin-docs.plugin-id-api .navbar__link--active {
+ border-bottom: 4px solid var(--color-yellow);
+ color: var(--color-yellow);
+ padding-bottom: 2rem;
+}
+
+html.plugin-docs.plugin-id-api .thin-scrollbar ul li a:hover {
+ color: var(--color-yellow);
+}
+
+html.plugin-docs.plugin-id-api
+ .sidebarItemLinkActive_node_modules-\@docusaurus-theme-classic-lib-next-theme-BlogSidebar-styles-module {
+ color: var(--color-yellow);
+}
+
+html.plugin-docs.plugin-id-api article h2 {
+ color: var(--color-yellow);
+ font-size: 24px;
+}
+
+html.plugin-docs.plugin-id-api ul.table-of-contents li a code,
+html.plugin-docs.plugin-id-api ul.table-of-contents li code {
+ background-color: transparent;
+}
+
+html.plugin-docs.plugin-id-api .table-of-contents__link:hover,
+html.plugin-docs.plugin-id-api .table-of-contents__link:hover code,
+html.plugin-docs.plugin-id-api .table-of-contents__link--active,
+html.plugin-docs.plugin-id-api .table-of-contents__link--active code {
+ color: var(--color-yellow);
+ text-decoration: none;
+}
+
+.docs-wrapper #__docusaurus .table-of-contents ul {
+ padding-inline-start: 1rem;
+}
+
+html.plugin-docs.plugin-id-api .table-of-contents a strong {
+ color: white !important;
+}
+
+html.plugin-docs.plugin-id-api .table-of-contents li {
+ list-style: none !important;
+}
+
+html.plugin-docs.plugin-id-api .table-of-contents__link {
+ color: #969696;
+ font-size: 1rem;
+ font-weight: 500;
+ line-height: 1.375rem;
+ text-decoration: none;
+ padding: 0.75rem 0.5rem;
+}
+
+html.plugin-docs.plugin-id-api .table-of-contents__left-border {
+ border-left: 1px solid #343434;
+ padding-left: 1rem;
+}
+
+html.plugin-docs.plugin-id-api .table-of-contents__left-border li {
+ margin-right: 0;
+ margin-left: 0;
+ font-family: var(--tbd-font-mono);
+ letter-spacing: 0;
+}
+
+/* Redocusaurus */
+.redocusaurus {
+ overflow: auto;
+ height: 95vh;
+}
+
+/* Changes */
+.hero-button {
+ z-index: 99999;
+ width: fit-content;
+}
+
+.hero-button a {
+ text-decoration: none;
+ text-transform: uppercase;
+ font-weight: bold;
+}
+
+.theme-card {
+ --color-card: 36, 242, 255;
+ border: 1px solid rgba(var(--color-card), 0.35);
+}
+
+.theme-card .hero-button a > div {
+ background: #fff;
+ color: #000;
+}
+
+article .markdown .theme-card > p {
+ line-height: 1.5;
+ font-size: 100%;
+ margin-bottom: 2rem;
+}
+
+html.plugin-docs.plugin-id-api article .theme-card.primary-theme-card h2,
+html.plugin-docs.plugin-id-api article .theme-card.primary-theme-card p,
+html.plugin-docs.plugin-id-api
+ article
+ .theme-card.primary-theme-card
+ .hero-button
+ a
+ > div {
+ color: #fff;
+}
+
+html.plugin-docs.plugin-id-api article .theme-card h2 {
+ color: rgba(var(--color-card));
+}
+html.plugin-docs.plugin-id-api article .theme-card p {
+ color: #fff;
+}
+
+.theme-card-cyan {
+ --color-card: 36, 242, 255;
+}
+
+.theme-card-yellow {
+ --color-card: 255, 236, 25;
+}
+
+.theme-card-purple {
+ --color-card: 213, 162, 235;
+}
+
+.community-button {
+ text-decoration: none;
+ text-transform: uppercase;
+ font-weight: bold;
+ background-color: #fff !important;
+ color: #000 !important;
+}
+
+.docs-wrapper
+ #__docusaurus
+ aside
+ .theme-doc-sidebar-item-link
+ > .menu__link.menu__link--active,
+.docs-wrapper
+ #__docusaurus
+ aside
+ .menu__list
+ .menu__list-item-collapsible--active
+ .menu__link--sublist.menu__link--active,
+.docs-wrapper
+ #__docusaurus
+ aside
+ .menu__list-item-collapsible--active
+ .menu__link--active {
+ color: var(--color-black) !important;
+}
+
+.docs-wrapper
+ #__docusaurus
+ aside
+ .theme-doc-sidebar-item-link
+ > .menu__link.menu__link--active:hover,
+.docs-wrapper
+ #__docusaurus
+ aside
+ .menu__list
+ .menu__list-item-collapsible:hover
+ .menu__link--sublist.menu__link,
+.docs-wrapper
+ #__docusaurus
+ aside
+ .menu__list-item-collapsible
+ .menu__link--active:hover {
+ color: var(--color-blue) !important;
+ background-color: var(--ifm-menu-color-background-hover);
+}
+
+.api-docs h3{
+ color: #24f2ff;
+ font-size: 1.6rem;
+}
+
+.api-docs h4{
+ font-weight: 100;
+}
+
+.api-docs .shift-object-left{
+ margin-left: calc(-25vw + 50%);
+}
+
+.api-docs .small-label{
+ font-size: 0.75em;
+ font-weight: 500;
+ letter-spacing: 0.1em;
+}
+
+.api-docs .data-type{
+ color:#24f2ff;
+}
+
+.api-docs .optional-field{
+ color:#d5a2eb;
+}
+
diff --git a/site/src/css/custom.css b/site/src/css/custom.css
new file mode 100644
index 0000000..6462508
--- /dev/null
+++ b/site/src/css/custom.css
@@ -0,0 +1,613 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@300;400;500;700;800&family=IBM+Plex+Sans:wght@300;400;500;700;800&display=swap');
+
+@import 'text.css';
+@import 'prose.css';
+@import 'variables.css';
+@import 'layout.css';
+@import 'docs.css';
+@import 'navbar.css';
+@import 'sidebar.css';
+@import 'illustration.css';
+@import 'web5-quickstart.css';
+@import 'api.css';
+
+root {
+ --color-black: #000000;
+ --color-yellow: #ffec19;
+ --color-blue: #24f2ff;
+ --color-purple: #9a1aff;
+ --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-weight: 700;
+ margin-bottom: 1.5rem;
+ color: var(--color-yellow);
+ font-family: 'IBM Plex Mono', monospace;
+}
+
+h1 {
+ font-size: 56px;
+ line-height: 70px;
+}
+h2 {
+ font-size: 2rem;
+}
+
+h3 {
+ font-size: 1.5rem;
+}
+
+a {
+ color: var(--color-blue);
+ text-decoration: underline;
+}
+
+a:hover {
+ text-decoration: none;
+}
+
+button {
+ font-weight: 700;
+}
+
+@layer base {
+ :root {
+ --base: 16px;
+ --baseUnitless: 16;
+ --color-primary-yellow-filter: invert(98%) sepia(34%) saturate(4729%)
+ hue-rotate(335deg) brightness(102%) contrast(107%);
+ --color-primary-cyan-filter: invert(98%) sepia(87%) saturate(4083%)
+ hue-rotate(127deg) brightness(100%) contrast(101%);
+ --color-primary-purple-filter: invert(23%) sepia(98%) saturate(6670%)
+ hue-rotate(273deg) brightness(102%) contrast(103%);
+
+ --max-page-width: 1440px;
+ }
+
+ .copy {
+ @apply text-lg;
+ }
+
+ .h2-caps {
+ @apply uppercase font-heading text-2xl;
+ }
+}
+
+/* For readability concerns, you should choose a lighter palette in dark mode. */
+[data-theme='dark'] {
+ --ifm-color-primary: #ffec19;
+ --ifm-color-primary-dark: #fce700;
+ --ifm-color-primary-darker: #eeda00;
+ --ifm-color-primary-darkest: #c4b400;
+ --ifm-color-primary-light: #ffee35;
+ --ifm-color-primary-lighter: #ffef43;
+ --ifm-color-primary-lightest: #fff36d;
+ --ifm-background-color: #000000;
+ --ifm-navbar-background-color: #000000;
+ --ifm-link-color: var(--color-blue);
+ --ifm-heading-font-family: 'IBM Plex Mono', monospace;
+ --docusaurus-highlighted-code-line-bg: #ffed182e;
+}
+
+[data-theme='dark'] .DocSearch {
+ --docsearch-text-color: var(--ifm-font-color-base);
+ --docsearch-muted-color: var(--ifm-color-secondary-darkest);
+ --docsearch-container-background: rgba(47, 55, 69, 0.7);
+ /* Modal */
+ --docsearch-modal-background: var(--ifm-background-color);
+ /* Search box */
+ --docsearch-searchbox-background: var(--ifm-background-color);
+ --docsearch-searchbox-focus-background: var(--ifm-color-black);
+ /* Hit */
+ --docsearch-hit-color: var(--ifm-font-color-base);
+ --docsearch-hit-active-color: var(--color-primary-cyan-filter);
+ --docsearch-hit-background: var(--ifm-color-emphasis-100);
+ /* Footer */
+ --docsearch-footer-background: var(--ifm-background-surface-color);
+ --docsearch-key-gradient: linear-gradient(
+ -26.5deg,
+ var(--ifm-color-emphasis-200) 0%,
+ var(--ifm-color-emphasis-100) 100%
+ );
+}
+
+[data-theme='dark'] .DocSearch-Hit[aria-selected='true'] a {
+ background-color: var(--ifm-menu-color-background-hover);
+}
+[data-theme='dark'] .DocSearch-Hit[aria-selected='true'] mark {
+ background-color: var(--ifm-menu-color-background-hover);
+ color: var(--ifm-color-primary) !important;
+}
+
+[data-theme='dark']
+ .DocSearch-Hit[aria-selected='true']
+ a
+ .DocSearch-Hit-Container {
+ color: var(--color-blue);
+}
+
+/* Horrible confusing code below */
+.docusaurus-highlight-code-line {
+ background-color: rgba(0, 0, 0, 0.1);
+ display: block;
+ margin: 0 calc(-1 * var(--ifm-pre-padding));
+ padding: 0 var(--ifm-pre-padding);
+}
+
+[data-theme='dark'] .docusaurus-highlight-code-line {
+ background-color: rgba(0, 0, 0, 0.3);
+}
+
+ul.table-of-contents li a code,
+ul.table-of-contents li code {
+ background-color: transparent;
+}
+
+.table-of-contents__link:hover,
+.table-of-contents__link:hover code,
+.table-of-contents__link--active,
+.table-of-contents__link--active code {
+ color: var(--color-yellow);
+ text-decoration: none;
+}
+
+.table-of-contents li {
+ margin: 0.75rem 1.5rem;
+}
+
+.table-of-contents__link {
+ font-size: 0.875rem;
+ font-weight: 500;
+ line-height: 1.375rem;
+}
+
+.pagination-nav__sublabel {
+ display: none;
+}
+.pagination-nav__link {
+ border: none;
+}
+.pagination-nav__label {
+ font-weight: 500;
+ font-size: 1em;
+}
+
+.pagination-nav__item:first-child .pagination-nav__label::before {
+ content: url('/static/img/blue-arrow-left.svg');
+ padding-right: 1em;
+}
+.pagination-nav__item--next .pagination-nav__label::after {
+ content: url('/static/img/blue-arrow-right.svg');
+ padding-left: 0.5rem !important;
+ position: absolute;
+}
+.tocCollapsibleButton_node_modules-\@docusaurus-theme-classic-lib-next-theme-TOCCollapsible-styles-module {
+ padding-left: 0 !important;
+}
+
+main.col.col--7 article.margin-bottom--xl {
+ background-image: url('/static/img/divider-dotted-dark.svg');
+ background-repeat: repeat-x;
+ background-position: bottom;
+ margin-bottom: 4.5rem !important;
+ padding-bottom: 5rem;
+}
+
+article p img {
+ border: 2px solid var(--color-blue);
+}
+@media (max-width: 1024px) {
+ article.margin-bottom--xl {
+ padding-bottom: 3.5rem !important;
+ margin-bottom: 3.125rem !important;
+ }
+}
+
+article header h2 {
+ font-size: var(--typography-h2-d-medium-font-size) !important;
+ line-height: var(--typography-h2-d-medium-line-height) !important;
+ font-weight: var(--typography-h2-d-medium-font-weight) !important;
+ color: var(--color-yellow) !important;
+ text-decoration: none !important;
+}
+
+article header h2 a {
+ color: var(--color-yellow);
+ text-decoration: none;
+}
+
+/* article header .avatar__intro:only-child span::before {
+ content: 'Posted by ';
+} */
+article header .margin-top--md.margin-bottom--sm.row {
+ margin-bottom: 16px !important;
+}
+
+article header .avatar__intro:only-child .avatar__name span,
+article header div time {
+ font-weight: var(--typography-body-2-d-font-weight);
+ font-size: var(--typography-body-2-d-font-size);
+ line-height: var(--typography-body-2-d-line-height);
+}
+article header .avatar__intro:only-child {
+ margin-top: -0.9375rem;
+ margin-bottom: 7px;
+}
+
+article .markdown p {
+ font-weight: var(--typography-body-1-d-font-weight);
+ font-size: var(--typography-body-1-d-font-size);
+ line-height: var(--typography-body-1-d-line-height);
+}
+
+article .markdown h5 {
+ font-weight: var(--typography-body-2-d-font-weight);
+ font-size: var(--typography-body-2-d-font-size);
+ line-height: var(--typography-body-2-d-line-height);
+}
+
+article footer .col {
+ display: flex;
+ flex-direction: column;
+}
+article footer .col b {
+ font-weight: var(--typography-h4-d-font-weight);
+ font-size: var(--typography-h4-d-font-size);
+ line-height: var(--typography-h4-d-line-height);
+ margin-bottom: 0.625rem;
+}
+@media (max-width: 768px) {
+ article footer .col b {
+ margin-bottom: 0.325rem;
+ font-weight: var(--typography-h4-m-font-weight);
+ font-size: var(--typography-h4-m-font-size);
+ line-height: var(--typography-h4-m-line-height);
+ }
+ article .markdown p {
+ font-weight: var(--typography-body-1-m-font-weight);
+ font-size: var(--typography-body-1-m-font-size);
+ line-height: var(--typography-body-1-m-line-height);
+ }
+ article header h2 {
+ font-size: var(--typography-h2-m-medium-font-size) !important;
+ line-height: var(--typography-h2-m-medium-line-height) !important;
+ font-weight: var(--typography-h2-m-medium-font-weight) !important;
+ }
+ article footer .col.text--right.col--3 b {
+ font-weight: var(--typography-links-m-underline-font-weight);
+ font-size: var(--typography-links-m-underline-font-size);
+ line-height: var(--typography-links-m-underline-line-height);
+ color: var(--color-blue);
+ text-decoration-line: var(--typography-links-m-underline-text-decoration);
+ text-underline-offset: 3px;
+ }
+
+ article header .avatar__intro:only-child .avatar__name span,
+ article header div time {
+ font-weight: var(--typography-body-2-m-font-weight);
+ font-size: var(--typography-body-2-m-font-size);
+ line-height: var(--typography-body-2-m-line-height);
+ }
+}
+article footer {
+ flex-direction: column-reverse !important;
+}
+
+article footer .col.text--right.col--3 {
+ text-align: left !important;
+ margin-bottom: 2.25rem;
+ max-width: 100%;
+}
+article footer .col.text--right.col--3 b {
+ font-weight: var(--typography-links-d-underline-font-weight);
+ font-size: var(--typography-links-d-underline-font-size);
+ line-height: var(--typography-links-d-underline-line-height);
+ color: var(--color-blue);
+ text-decoration-line: var(--typography-links-d-underline-text-decoration);
+ text-underline-offset: 3px;
+}
+
+article footer .col.text--right.col--3 b::after {
+ content: url('/static/img/arrow-blue.svg');
+ transform-origin: 50% 50%;
+ display: inline-block;
+ position: relative;
+ top: 2px;
+ left: 7px;
+}
+
+.docusaurus-mt-lg {
+ margin-top: 1.5rem !important;
+}
+article footer .col ul li {
+ margin-right: 1rem !important;
+ margin-bottom: 0rem !important;
+}
+article footer .col ul li a {
+ border: 2px solid var(--color-blue) !important;
+ padding: 0.5rem !important;
+ padding-left: 0.625rem !important;
+ border-radius: 0 !important;
+ font-weight: var(--typography-tags-d-font-weight);
+ font-size: var(--typography-tags-d-font-size);
+ line-height: var(--typography-tags-d-line-height);
+ color: var(--color-blue);
+ border-right: none !important;
+}
+
+article footer .col ul li a::after {
+ content: url('/static/img/dot-icon.svg');
+ position: relative;
+ margin-left: 0.625rem;
+ top: -1px;
+}
+article footer .col ul li::after {
+ content: url('/static/img/tag-front.svg');
+ min-height: 2rem;
+ position: relative;
+ top: 0.7188rem;
+}
+article footer .col ul {
+ margin-left: 0 !important;
+}
+
+/** Blog Detail**/
+main.col.col--7 article {
+ background-image: url('/static/img/divider-dotted-dark.svg');
+ background-repeat: repeat-x;
+ background-position: bottom;
+ margin-bottom: 3rem !important;
+ padding-bottom: 6.5rem;
+}
+
+.col.col--3,
+.col.col--2 {
+ --ifm-col-width: 20% !important;
+}
+main.col.col--7 {
+ --ifm-col-width: 60% !important;
+}
+
+article h1 {
+ font-weight: var(--typography-h1-d-font-weight);
+ font-size: var(--typography-h1-d-font-size);
+ line-height: var(--typography-h1-d-line-height);
+}
+
+@media (max-width: 997px) {
+ .row aside.col.col--3 {
+ display: none;
+ }
+ .row main.col.col--7 {
+ flex: none !important;
+ max-width: 100% !important;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 1024px) {
+ article h1 {
+ font-weight: var(--typography-h1-t-font-weight);
+ font-size: var(--typography-h1-t-font-size) !important;
+ line-height: var(--typography-h1-t-line-height);
+ }
+}
+
+@media (max-width: 767px) {
+ article h1 {
+ font-weight: var(--typography-h1-m-font-weight);
+ font-size: var(--typography-h1-m-font-size) !important;
+ line-height: var(--typography-h1-m-line-height);
+ }
+
+ nav .pagination-nav__link .pagination-nav__label {
+ text-decoration-line: var(--typography-links-m-underline-text-decoration);
+ font-weight: var(--typography-links-m-underline-font-weight);
+ font-size: var(--typography-links-m-underline-font-size);
+ line-height: var(--typography-links-m-underline-line-height);
+ }
+
+ article footer .col ul li a {
+ font-weight: var(--typography-tags-m-font-weight);
+ font-size: var(--typography-tags-m-font-size);
+ line-height: var(--typography-tags-m-line-height);
+ }
+}
+
+article header h1 + .margin-vert--md {
+ margin-top: 1.5rem !important;
+}
+
+article footer .theme-edit-this-page {
+ margin-bottom: 1.5rem;
+}
+
+nav .pagination-nav__link .pagination-nav__label {
+ color: var(--color-blue);
+ text-decoration-line: var(--typography-links-d-underline-text-decoration);
+ text-underline-offset: 3px;
+ font-weight: var(--typography-links-d-underline-font-weight);
+ font-size: var(--typography-links-d-underline-font-size);
+ line-height: var(--typography-links-d-underline-line-height);
+}
+
+nav .pagination-nav__link {
+ padding: 0rem;
+ text-decoration: none !important;
+}
+
+.pagination-nav__item:first-child .pagination-nav__label::before {
+ padding-right: 0.5rem !important;
+}
+
+/* Docs */
+
+aside.col.col--3 nav {
+ color: cyan;
+}
+aside.col.col--3 nav ul li {
+ padding-left: 22px;
+}
+
+aside.col.col--3 nav ul li a {
+ color: cyan !important;
+ text-decoration: none;
+}
+
+aside.col.col--3 nav ul li a:hover {
+ color: cyan !important;
+ background: url(/static/img/arrow-blue-navbar.svg) no-repeat center center;
+ background-attachment: unset;
+ background-position-x: 0em;
+ padding-left: 20px;
+}
+
+ul.breadcrumbs {
+ padding-left: 0;
+}
+
+.breadcrumbs__item:first-child {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.breadcrumbs__item:first-child .breadcrumbs__link {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+.breadcrumbs__item--active .breadcrumbs__link {
+ background: none;
+}
+
+.breadcrumbs__item:last-child .breadcrumbs__link {
+ color: var(--color-yellow);
+}
+
+.breadcrumbs__item:not(:last-child):after {
+ color: var(--color-blue);
+ content: '/';
+ font-size: 1rem;
+ line-height: 1.25rem;
+ background-image: none;
+ opacity: 1;
+ height: auto;
+ width: auto;
+}
+
+footer a {
+ text-decoration: none;
+ font-weight: 500;
+}
+
+footer a {
+ border-bottom: 4px solid transparent;
+}
+
+footer a:hover {
+ border-bottom: 4px solid var(--color-yellow);
+ color: var(--color-yellow);
+}
+footer .hoverLink:hover{
+ border-bottom: 4px solid #000;
+ color: #000;
+}
+.tooltipBorder {
+ border-image-slice: 0 30 30 0 !important;
+ border-image-width: 12px 11px 11px 12px !important;
+ border-image-outset: 0px 12px 12px 0px !important;
+ border-image-repeat: repeat repeat !important;
+ border-image-source: url('/img/tooltip-border.png') !important;
+ border-style: solid !important;
+ border: 1px;
+ width: 384px;
+}
+
+@media (max-width: 768px) {
+ .tooltipBorder {
+ width: 375px;
+ border: none !important;
+ }
+}
+
+.expandable-content {
+ max-height: 0;
+ overflow: hidden;
+ transition: max-height 0.3s ease-in-out;
+}
+
+.expand-btn {
+ transform: scaleY(-1);
+ padding: 0;
+ transition: 0.3s ease-in-out;
+ margin: auto;
+ padding: 1rem;
+}
+
+.expand-btn.expandable-content-expanded {
+ transform: scaleY(1);
+}
+
+.expandable-content-expanded {
+ max-height: 300px; /* Adjust this value based on the actual content height */
+}
+
+.col-span-2 {
+ grid-column: span 2 / span 2;
+}
+
+.wiggle-code-block {
+ animation: wiggle 1s linear;
+}
+
+@keyframes wiggle {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 20% {
+ transform: rotate(-10deg);
+ }
+ 40% {
+ transform: rotate(10deg);
+ }
+ 60% {
+ transform: rotate(-10deg);
+ }
+ 80% {
+ transform: rotate(10deg);
+ }
+ 100% {
+ transform: rotate(0deg);
+ }
+}
+
+ol {
+ list-style: auto;
+ margin: 30px;
+}
+
+.color-yellow{
+ color: var(--color-yellow);
+}
+
+.color-purple{
+ color: var(--color-purple);
+}
+
+.color-blue{
+ color: var(--color-blue);
+}
+
+.aspect-video{
+ aspect-ratio: 16 / 9;
+ width: 100%;
+}
\ No newline at end of file
diff --git a/site/src/css/docs.css b/site/src/css/docs.css
new file mode 100644
index 0000000..2043137
--- /dev/null
+++ b/site/src/css/docs.css
@@ -0,0 +1,943 @@
+/* Navbar and main */
+
+.docs-wrapper #__docusaurus a:not(.table-of-contents__link, .navbar__link) {
+ text-decoration: none;
+ font-weight: 600;
+}
+
+.docs-wrapper .DocSearch-Modal {
+ margin-top: 120px;
+}
+
+.docs-wrapper #__docusaurus {
+ --color-white: #c6c6c6;
+}
+.docs-wrapper #__docusaurus .navbar,
+.docs-wrapper #__docusaurus .main-wrapper {
+ max-width: unset;
+}
+
+.docs-wrapper #__docusaurus .main-wrapper {
+ margin-top: 0;
+}
+
+/* Sidebar */
+.docs-wrapper #__docusaurus aside .menu__list {
+ gap: 0;
+}
+
+.docs-wrapper #__docusaurus aside .menu__list .menu__list-item .menu__link {
+ font-weight: 500;
+ padding-block: 0.75rem;
+ color: var(--color-yellow);
+ text-decoration: none;
+ font-family: var(--tbd-font-mono);
+ letter-spacing: 0;
+}
+
+.docs-wrapper
+ #__docusaurus
+ aside
+ .theme-doc-sidebar-item-link
+ > .menu__link.menu__link--active,
+.docs-wrapper
+ #__docusaurus
+ aside
+ .menu__list
+ .menu__list-item-collapsible--active
+ .menu__link--sublist.menu__link--active,
+.docs-wrapper #__docusaurus aside .menu__list-item-collapsible--active {
+ background-color: var(--color-yellow);
+ color: var(--color-black) !important;
+}
+
+.docs-wrapper
+ #__docusaurus
+ aside
+ .menu__list
+ .menu__list-item-collapsible--active
+ .menu__link--sublist.menu__link--active:hover,
+.docs-wrapper
+ #__docusaurus
+ aside
+ .theme-doc-sidebar-item-category
+ .menu__list-item-collapsible:hover
+ .menu__link--sublist.menu__link--active {
+ color: var(--color-blue) !important;
+}
+
+.docs-wrapper
+ #__docusaurus
+ aside
+ .theme-doc-sidebar-item-category
+ .menu__list-item-collapsible:hover {
+ background-color: var(--ifm-menu-color-background-hover);
+}
+
+.docs-wrapper #__docusaurus aside .menu__list .menu__caret:before {
+ content: url('/img/arrow-blue.svg');
+ background: none;
+}
+
+.docs-wrapper #__docusaurus aside .menu__list .menu__caret:before,
+.docs-wrapper #__docusaurus aside .menu__list .menu__link--sublist-caret:after {
+ filter: brightness(0) var(--color-primary-yellow-filter);
+}
+.docs-wrapper
+ #__docusaurus
+ aside
+ .menu__list
+ .menu__list-item-collapsible--active
+ .menu__caret:before {
+ filter: brightness(0);
+}
+.docs-wrapper
+ #__docusaurus
+ aside
+ .menu__list
+ .menu__list-item-collapsible:hover
+ .menu__caret:before,
+.docs-wrapper
+ #__docusaurus
+ aside
+ .menu__list
+ .menu__link--sublist-caret:hover:after {
+ filter: none;
+}
+
+.docs-wrapper
+ #__docusaurus
+ aside
+ .menu__list
+ .menu__list-item-collapsible:hover
+ .menu__link.menu__link--sublist {
+ color: var(--color-blue);
+}
+
+.docs-wrapper #__docusaurus aside .menu__list .menu__caret:hover {
+ height: auto;
+}
+
+/* Submenu */
+
+.docs-wrapper
+ #__docusaurus
+ aside
+ .menu__list
+ .menu__list-item-collapsible--active
+ ~ .menu__list {
+ margin: 0;
+}
+
+.docs-wrapper #__docusaurus aside .menu__list-item-collapsible ~ .menu__list {
+ padding-left: 0;
+ margin: 0;
+}
+
+.docs-wrapper
+ #__docusaurus
+ aside
+ .theme-doc-sidebar-item-category-level-1
+ .menu__list-item-collapsible
+ ~ .menu__list
+ .menu__link {
+ padding-left: 2.5rem;
+}
+
+.docs-wrapper
+ #__docusaurus
+ aside
+ .theme-doc-sidebar-item-category-level-2
+ .menu__list-item-collapsible
+ ~ .menu__list
+ .menu__link {
+ padding-left: 3rem;
+}
+
+.docs-wrapper
+ #__docusaurus
+ aside
+ .theme-doc-sidebar-item-category-level-3
+ .menu__list-item-collapsible
+ ~ .menu__list
+ .menu__link {
+ padding-left: 3.5rem;
+}
+
+.docs-wrapper #__docusaurus footer {
+ border-top: 1px solid var(--ifm-toc-border-color);
+ padding-left: 1.5rem;
+ padding-right: 1.5rem;
+}
+
+.docs-wrapper #__docusaurus footer > div {
+ overflow-x: hidden;
+}
+
+.docs-wrapper #__docusaurus h1 ~ p,
+.docs-wrapper #__docusaurus h2:not(.theme-card h2, .community-card h2) ~ p,
+.docs-wrapper #__docusaurus h3:not(.theme-card h3, .community-card h3) ~ p,
+.docs-wrapper #__docusaurus p {
+ font-family: var(--tbd-font-mono);
+ letter-spacing: 0;
+ line-height: 1.75rem;
+}
+
+.docs-wrapper
+ #__docusaurus
+ p:not(
+ .docs-section p,
+ .alert p,
+ .figure-container p,
+ .api-card p,
+ .search-widget p
+ ) {
+ font-size: 1.125rem;
+ color: var(--color-white);
+}
+
+.docs-wrapper #__docusaurus article .markdown li {
+ font-family: var(--tbd-font-mono);
+ letter-spacing: 0;
+ color: var(--color-white);
+}
+
+.docs-wrapper #__docusaurus .api-card {
+ border: 2px solid var(--color-yellow);
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ height: 100%;
+}
+
+.docs-wrapper #__docusaurus .api-card p {
+ font-size: 1rem;
+}
+
+.api-card-icon {
+ display: flex;
+ justify-content: start;
+ gap: 20px;
+ padding-top: 20px;
+ vertical-align: bottom;
+}
+
+.api-card-icon img {
+ width: 50px;
+}
+
+.docs-wrapper #__docusaurus h2,
+.docs-wrapper #__docusaurus .primary-theme-card h2 {
+ font-size: 2rem;
+}
+
+.docs-wrapper #__docusaurus .theme-card {
+ border-width: 2px;
+}
+
+.docs-wrapper #__docusaurus .theme-card p:not(.primary-theme-card p) {
+ font-size: 1rem;
+}
+
+.docs-wrapper #__docusaurus .theme-card p {
+ max-width: 70%;
+ font-family: var(--tbd-font-mono);
+ letter-spacing: 0;
+}
+
+.docs-wrapper #__docusaurus .theme-card img {
+ height: fit-content;
+}
+
+.docs-wrapper #__docusaurus .community-card h3 {
+ font-size: 1.25rem;
+ margin-bottom: 12px;
+}
+
+.docs-wrapper #__docusaurus .community-card p {
+ font-size: 1rem;
+}
+
+.docs-wrapper #__docusaurus .explore-card h3 {
+ font-size: 1rem;
+ margin-block: 0;
+}
+
+.docs-wrapper #__docusaurus .theme-admonition.alert {
+ border-radius: 0;
+ margin-bottom: 2rem;
+}
+
+.docs-wrapper #__docusaurus .theme-admonition.alert code,
+.docs-wrapper #__docusaurus code:not(pre code, h4 code) {
+ background: #626262;
+ color: #fff;
+}
+
+.docs-wrapper #__docusaurus h4 > code {
+ background: #383838;
+}
+
+.docs-wrapper #__docusaurus .theme-admonition.alert--info {
+ background: #0b1a1f;
+}
+
+.docs-wrapper #__docusaurus .theme-admonition.alert--secondary {
+ background: #3d3d3d;
+}
+
+.docs-wrapper #__docusaurus .theme-admonition.alert--secondary p,
+.docs-wrapper #__docusaurus .theme-admonition.alert--secondary p:last-child {
+ margin: 0;
+}
+
+.docs-wrapper #__docusaurus .theme-admonition p,
+.docs-wrapper #__docusaurus .theme-admonition li {
+ font-size: 1rem;
+}
+
+.docs-wrapper #__docusaurus .theme-admonition p:last-child {
+ margin-bottom: 1.5rem;
+}
+
+.docs-wrapper
+ #__docusaurus
+ .theme-admonition
+ .admonitionHeading_node_modules-\@docusaurus-theme-classic-lib-theme-Admonition-styles-module {
+ margin-bottom: 1rem;
+}
+
+.docs-wrapper #__docusaurus .theme-admonition h2 {
+ font-size: 1.125rem;
+ color: var(--color-blue);
+ font-weight: 500;
+ margin-bottom: 0.75rem;
+}
+
+.docs-wrapper #__docusaurus .docs-section {
+ margin-block-start: 6rem;
+}
+
+.docs-wrapper #__docusaurus .docs-section code:not(pre code) {
+ background: #424242;
+}
+
+.docs-wrapper #__docusaurus .docs-section h3 {
+ margin-bottom: 1rem;
+}
+
+.docs-wrapper #__docusaurus .docs-section h3:first-of-type {
+ margin-top: 2rem;
+}
+
+.docs-wrapper #__docusaurus .docs-section h3:not(:first-of-type) {
+ margin-top: 4rem;
+}
+
+.docs-wrapper #__docusaurus h4 {
+ font-size: 1.25rem;
+ margin-block-start: 2rem;
+}
+
+.docs-wrapper #__docusaurus .docs-section h3 + p {
+ margin-top: 0.5rem;
+}
+
+.docs-wrapper #__docusaurus .docs-section .theme-code-block pre {
+ margin-top: 0.75rem;
+}
+
+.docs-wrapper #__docusaurus pre code:not(.search-widget pre code) {
+ border: 1px solid #212121;
+ background: #161616;
+ padding: 1.5rem 1rem;
+ line-height: 1.65;
+}
+
+.docs-wrapper #__docusaurus code:not(h4 > code) {
+ font-family: var(--tbd-font-mono);
+ letter-spacing: 0;
+ font-size: 0.9rem;
+}
+
+.docs-wrapper #__docusaurus details.alert--info > summary {
+ color: var(--color-blue);
+ font-weight: 600;
+}
+
+.docs-wrapper #__docusaurus details.alert--info p {
+ font-size: 1rem;
+}
+
+.docs-wrapper #__docusaurus .input-container {
+ margin-block: 1rem;
+}
+
+.docs-wrapper #__docusaurus .input-container label {
+ display: block;
+ font-size: 0.75rem;
+ margin-bottom: 4px;
+}
+
+.docs-wrapper #__docusaurus .input-container input {
+ padding: 0.5rem;
+ border-radius: 4px;
+ border: 1px solid #616161;
+ background: none;
+ width: 100%;
+ max-width: 400px;
+}
+
+.docs-wrapper #__docusaurus .input-container input:disabled {
+ opacity: 0.4;
+}
+
+.docs-wrapper #__docusaurus .sandbox-container progress {
+ width: 32px;
+ height: 32px;
+ border: 4px solid #333333;
+ border-bottom-color: transparent;
+ border-radius: 50%;
+ display: inline-block;
+ box-sizing: border-box;
+ animation: rotation 1s linear infinite;
+ margin-left: 0.5rem;
+}
+
+@keyframes rotation {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+
+.docs-wrapper #__docusaurus .sandbox-container progress::-webkit-progress-bar {
+ background: transparent;
+}
+
+.docs-wrapper #__docusaurus .sandbox-container {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+ margin-bottom: 3rem;
+}
+
+.docs-wrapper #__docusaurus .sandbox-container button {
+ white-space: nowrap;
+}
+
+.docs-wrapper #__docusaurus .sandbox-container button:disabled {
+ cursor: default;
+ border: 2px solid transparent;
+ background: #262626;
+ color: #5a5a5a;
+}
+
+.docs-wrapper #__docusaurus .sandbox-container code,
+.docs-wrapper #__docusaurus .sandbox-container textarea {
+ background: none;
+}
+
+.docs-wrapper #__docusaurus .sandbox-container code .sandbox-placeholder {
+ color: grey;
+}
+
+.docs-wrapper #__docusaurus .sandbox-container textarea {
+ resize: none;
+ font-family: var(--tbd-font-mono);
+ font-size: 0.85rem;
+ line-height: 1.75;
+ color: grey;
+ padding: 1rem;
+}
+
+.docs-wrapper #__docusaurus .sandbox-container .output {
+ flex: 1;
+ border: 1px solid #616161;
+ padding: 1rem;
+ background: #141414;
+ margin: 0;
+ border-radius: 0.25rem;
+}
+
+.docs-wrapper #__docusaurus .figure-container {
+ margin-block: 3rem;
+}
+
+.docs-wrapper #__docusaurus .figure-container p.copy {
+ margin-block: 1rem;
+ font-size: 0.875rem;
+ font-family: var(--tbd-font-mono);
+ letter-spacing: 0;
+}
+
+@media screen and (max-width: 996px) {
+ .docs-wrapper #__docusaurus {
+ padding-inline: 0;
+ }
+
+ .docs-wrapper #__docusaurus .navbar {
+ padding-top: 1.5rem;
+ padding-inline: 1rem;
+ }
+
+ .docs-wrapper #__docusaurus article {
+ padding: 2rem;
+ }
+
+ .docs-wrapper #__docusaurus footer {
+ background: var(--color-black);
+ }
+
+ .docs-wrapper #__docusaurus .theme-card {
+ gap: 0;
+ align-items: end;
+ }
+
+ .docs-wrapper #__docusaurus .theme-card p {
+ max-width: unset;
+ }
+}
+
+@media screen and (min-width: 997px) {
+ .docs-wrapper #__docusaurus {
+ padding: 0;
+ }
+
+ .docs-wrapper #__docusaurus article {
+ padding: 4rem 8vw;
+ }
+
+ .docs-wrapper #__docusaurus .navbar {
+ padding-left: 1.875rem;
+ position: sticky;
+ z-index: 999999;
+ }
+
+ .docs-wrapper
+ #__docusaurus
+ .docSidebarContainer_node_modules-\@docusaurus-theme-classic-lib-theme-DocPage-Layout-Sidebar-styles-module {
+ margin-top: 0;
+ }
+
+ .docs-wrapper
+ #__docusaurus
+ .sidebarViewport_node_modules-\@docusaurus-theme-classic-lib-theme-DocPage-Layout-Sidebar-styles-module {
+ position: sticky;
+ top: 77px;
+ }
+
+ .docs-wrapper
+ #__docusaurus
+ .sidebar_node_modules-\@docusaurus-theme-classic-lib-theme-DocSidebar-Desktop-styles-module {
+ padding-top: 0;
+ }
+}
+
+.pagination-nav {
+ display: none;
+}
+
+html.plugin-docs.plugin-id-default body,
+html.plugin-docs.plugin-id-default .navbar {
+ background-color: #1c1c1c;
+}
+
+html.plugin-docs.plugin-id-default .navbar {
+ border-bottom: 1px solid var(--ifm-toc-border-color);
+ padding: 0;
+}
+
+html.plugin-docs.plugin-id-default .navbar__items,
+html.plugin-docs.plugin-id-default .navbar__items--right {
+ align-items: baseline;
+}
+
+html.plugin-docs.plugin-id-default .navbar__logo {
+ margin-bottom: 1.5rem;
+ height: 1.5rem;
+}
+
+html.plugin-docs.plugin-id-default
+ .navbar-sidebar
+ .navbar-sidebar__item:last-child
+ .clean-btn.navbar-sidebar__back::before {
+ display: inline-block;
+ content: url('/static/img/arrow-yellow.svg');
+ position: relative;
+}
+
+html.plugin-docs.plugin-id-default aside .menu__link {
+ color: var(--ifm-menu-color);
+ padding-top: 0rem;
+ padding-bottom: 0rem;
+}
+
+html.plugin-docs.plugin-id-default aside aside .menu__link {
+ padding-left: 0;
+}
+
+html.plugin-docs.plugin-id-default aside aside .menu__link li a {
+ padding-left: 0;
+}
+
+html.plugin-docs.plugin-id-default aside aside .menu__link--active {
+ padding-left: 0;
+}
+
+html.plugin-docs.plugin-id-default .thin-scrollbar {
+ color: white;
+ letter-spacing: 1px;
+ margin-top: 24px;
+}
+
+html.plugin-docs.plugin-id-default
+ aside
+ .sidebar_node_modules-\@docusaurus-theme-classic-lib-next-theme-DocSidebar-Desktop-styles-module {
+ top: auto;
+}
+
+html.plugin-docs.plugin-id-default .sidebar_RiAD {
+ top: 0 !important;
+}
+
+@media (min-width: 997px) {
+ html.plugin-docs.plugin-id-default
+ .menu_node_modules-\@docusaurus-theme-classic-lib-next-theme-DocSidebar-Desktop-Content-styles-module {
+ flex-grow: 1;
+ padding-left: 0rem !important;
+ font-size: large;
+ }
+ html.plugin-docs.plugin-id-default
+ aside.docSidebarContainer_src-layout-DocPage-styles-module,
+ html.plugin-docs.plugin-id-default aside.theme-doc-sidebar-container {
+ margin-right: 1.5rem;
+ }
+}
+/* Article styling */
+
+article .markdown p {
+ font-weight: var(--typography-body-1-d-font-weight);
+ font-size: var(--typography-body-1-d-font-size);
+ line-height: var(--typography-body-1-d-line-height);
+ letter-spacing: 1px;
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+}
+
+article .markdown li {
+ font-weight: var(--typography-body-1-d-font-weight);
+ font-size: var(--typography-body-1-d-font-size);
+ line-height: var(--typography-body-1-d-line-height);
+ letter-spacing: 1px;
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+}
+
+article .markdown blockquote {
+ color: var(--color-yellow);
+ font-style: normal;
+ font-weight: 300;
+}
+
+article .markdown blockquote b {
+ color: white;
+ font-style: normal;
+ font-weight: 800;
+}
+
+article .theme-code-block pre {
+ background: #232323;
+}
+
+article .theme-code-block pre code .token-line span {
+ color: white;
+}
+
+article .markdown p {
+ font-weight: var(--typography-body-1-d-font-weight);
+ font-size: var(--typography-body-1-d-font-size);
+ line-height: var(--typography-body-1-d-line-height);
+ letter-spacing: 1px;
+ font-family: var(--tbd-font-sans);
+}
+
+article .markdown p code {
+ color: white;
+ background-color: gray;
+}
+
+.pagination-nav__sublabel {
+ display: none;
+}
+
+.pagination-nav__label {
+ color: white;
+ letter-spacing: 1px;
+ font-weight: 400;
+ text-decoration: none;
+}
+
+html.plugin-docs.plugin-id-default .thin-scrollbar {
+ color: white;
+ letter-spacing: 1px;
+ margin-top: 24px;
+ top: 118px;
+ font-family: var(--tbd-font-sans);
+}
+
+html.plugin-docs.plugin-id-default article time {
+ color: white;
+}
+
+html.plugin-docs.plugin-id-default .avatar {
+ color: white;
+}
+
+html.plugin-docs.plugin-id-default .navbar__link {
+ font-size: 18px;
+ padding-block: 1.5rem;
+ border-bottom: 4px solid transparent;
+}
+
+html.plugin-docs.plugin-id-default .navbar__link:hover {
+ border-bottom: 4px solid var(--color-yellow);
+ color: var(--color-yellow);
+}
+
+html.plugin-docs.plugin-id-default .navbar__link--active {
+ border-bottom: 4px solid var(--color-yellow);
+ color: var(--color-yellow);
+}
+
+html.plugin-docs.plugin-id-default .thin-scrollbar ul li a:hover {
+ color: var(--color-yellow);
+}
+
+html.plugin-docs.plugin-id-default
+ .sidebarItemLinkActive_node_modules-\@docusaurus-theme-classic-lib-next-theme-BlogSidebar-styles-module {
+ color: var(--color-yellow);
+}
+
+html.plugin-docs.plugin-id-default article h2 {
+ color: var(--color-yellow);
+ font-size: 24px;
+}
+
+html.plugin-docs.plugin-id-default ul.table-of-contents li a code,
+html.plugin-docs.plugin-id-default ul.table-of-contents li code {
+ background-color: transparent;
+}
+
+html.plugin-docs.plugin-id-default .table-of-contents__link:hover,
+html.plugin-docs.plugin-id-default .table-of-contents__link:hover code,
+html.plugin-docs.plugin-id-default .table-of-contents__link--active,
+html.plugin-docs.plugin-id-default .table-of-contents__link--active code {
+ color: var(--color-yellow);
+ text-decoration: none;
+}
+
+.docs-wrapper #__docusaurus .table-of-contents ul {
+ padding-inline-start: 1rem;
+}
+
+html.plugin-docs.plugin-id-default .table-of-contents a strong {
+ color: white !important;
+}
+
+html.plugin-docs.plugin-id-default .table-of-contents li {
+ list-style: none !important;
+}
+
+html.plugin-docs.plugin-id-default .table-of-contents__link {
+ color: #969696;
+ font-size: 1rem;
+ font-weight: 500;
+ line-height: 1.375rem;
+ text-decoration: none;
+ padding: 0.75rem 0.5rem;
+}
+
+html.plugin-docs.plugin-id-default .table-of-contents__left-border {
+ border-left: 1px solid #343434;
+ padding-left: 1rem;
+}
+
+html.plugin-docs.plugin-id-default .table-of-contents__left-border li {
+ margin-right: 0;
+ margin-left: 0;
+ font-family: var(--tbd-font-mono);
+ letter-spacing: 0;
+}
+
+/* Redocusaurus */
+.redocusaurus {
+ overflow: auto;
+ height: 95vh;
+}
+
+/* Changes */
+.hero-button {
+ z-index: 99999;
+ width: fit-content;
+}
+
+.hero-button a {
+ text-decoration: none;
+ text-transform: uppercase;
+ font-weight: bold;
+}
+
+.theme-card {
+ --color-card: 36, 242, 255;
+ border: 1px solid rgba(var(--color-card), 0.35);
+}
+
+.theme-card .hero-button a > div {
+ background: #fff;
+ color: #000;
+}
+
+article .markdown .theme-card > p {
+ line-height: 1.5;
+ font-size: 100%;
+ margin-bottom: 2rem;
+}
+
+html.plugin-docs.plugin-id-default article .theme-card h3 {
+ color: rgba(var(--color-card));
+}
+html.plugin-docs.plugin-id-default article .theme-card p {
+ color: #fff;
+}
+
+.theme-card-cyan {
+ --color-card: 36, 242, 255;
+}
+
+.theme-card-yellow {
+ --color-card: 255, 236, 25;
+}
+
+.theme-card-purple {
+ --color-card: 183, 43, 255;
+}
+
+.community-button {
+ text-decoration: none;
+ text-transform: uppercase;
+ font-weight: bold;
+ background-color: #fff !important;
+ color: #000 !important;
+}
+
+.tbd-blue-illustration {
+ filter: var(--color-primary-cyan-filter);
+}
+
+.markdown > h3 {
+ font-size: 1.5rem;
+}
+
+.language-switch-header {
+ text-align: right;
+ margin-bottom: 10px;
+}
+
+.language-switcher-select {
+ width: auto;
+ font-size: 16px;
+ color: #000;
+ font-weight: bold;
+ background-color: #ffec19;
+ margin-left: 15px;
+ padding: 5px;
+}
+
+.languageTabs {
+ display: flex;
+ justify-content: flex-start;
+ cursor: pointer;
+ margin: 0;
+}
+.mermaid text {
+ font-weight: bold;
+}
+
+.beat-fade {
+ animation-name: beat-fade;
+ animation-duration: 2s;
+ animation-iteration-count: infinite;
+ animation-timing-function: cubic-bezier(.4,0,.6,1);
+ -webkit-animation-name: beat-fade;
+ -webkit-animation-duration: 2s;
+ -webkit-animation-iteration-count: infinite;
+ -webkit-animation-timing-function: cubic-bezier(.4,0,.6,1);
+}
+@keyframes beat-fade {
+ 0% {
+ transform: scale(1);
+ opacity: 1;
+ }
+ 50% {
+ transform: scale(1.1);
+ opacity: 0.7;
+ }
+ 100% {
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+
+.bounce {
+ -webkit-animation-name: bounce;
+ animation-name: bounce;
+ -webkit-animation-delay: 0s;
+ animation-delay: 0s;
+ -webkit-animation-direction: normal;
+ animation-direction: normal;
+ -webkit-animation-duration: 1s;
+ animation-duration: 1s;
+ -webkit-animation-iteration-count: infinite;
+ animation-iteration-count: infinite;
+ -webkit-animation-timing-function: cubic-bezier(.28,.84,.42,1);
+ animation-timing-function: cubic-bezier(.28,.84,.42,1);
+}
+@keyframes bounce {
+ 0%, 20%, 50%, 80%, 100% {
+ transform: translateY(0);
+ }
+ 40% {
+ transform: translateY(-30px);
+ }
+ 60% {
+ transform: translateY(-15px);
+ }
+}
+
+.flip {
+ -webkit-animation-name: flip;
+ animation-name: flip;
+ -webkit-animation-delay: 0s;
+ animation-delay: 0s;
+ -webkit-animation-direction: normal;
+ animation-direction: normal;
+ -webkit-animation-duration: 1s;
+ animation-duration: 1s;
+ -webkit-animation-iteration-count: 1;
+ animation-iteration-count: 1;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+}
+@keyframes flip {
+ from {
+ transform: rotateY(0deg);
+ }
+ to {
+ transform: rotateY(360deg);
+ }
+}
+
+
+
+
diff --git a/site/src/css/feedback.css b/site/src/css/feedback.css
new file mode 100644
index 0000000..b46a857
--- /dev/null
+++ b/site/src/css/feedback.css
@@ -0,0 +1,135 @@
+.feedback-header {
+ margin-top: 3px;
+}
+
+.rating {
+ display: flex;
+ align-items: center;
+ justify-content: flex-start;
+ width: 100%;
+ margin-top: 5px;
+ padding-top: 5px;
+ margin-bottom: 10px;
+ padding-bottom: 10px;
+ flex-wrap: wrap;
+}
+
+.fa-thumbs-up,
+.fa-thumbs-down,
+.icon {
+ display: inline-block;
+ cursor: pointer;
+ margin: 5px;
+ color: #808080;
+ font-size: 16px;
+}
+
+.active-icon {
+ color: #ffec19;
+}
+
+.fa-thumbs-down:hover,
+.fa-thumbs-up:hover,
+.active {
+ color: #ffec19;
+ transition: all 0.2s ease-in-out;
+ transform: scale(1.1);
+}
+
+.feedback-input {
+ display: block;
+ width: 100%;
+ border: none;
+ border-bottom: 1px solid #000;
+ padding: 5px;
+ padding-right: 40px;
+}
+
+.feedback-container {
+ display: flex;
+ align-items: center;
+ position: relative;
+}
+
+.feedback-input-container {
+ position: relative;
+ width: 100%;
+ margin-top: 10px;
+}
+
+.feedback-input {
+ display: block;
+ width: 100%;
+ border: none;
+ border-bottom: 1px solid #000;
+ margin-top: 10px;
+ padding: 5px;
+ padding-right: 40px;
+}
+
+.send-icon {
+ position: absolute;
+ right: 10px;
+ top: 55%;
+ transform: translateY(-50%);
+ cursor: pointer;
+ color: #ffec19;
+}
+
+.send-icon:hover {
+ color: #ffec19c4;
+}
+
+.rating-box {
+ display: inline-flex;
+ align-items: center;
+ background-color: #5f5d5d00;
+ border: 1px solid #797676;
+ border-radius: 5px;
+ padding: 5px 10px;
+ margin: 5px;
+ cursor: pointer;
+ color: #808080;
+ font-size: 16px;
+ transition: all 0.2s ease-in-out;
+}
+
+.rating-box:hover {
+ background-color: #414040;
+}
+
+.rating-box:hover .icon,
+.active {
+ color: #ffec19;
+ transition: all 0.2s ease-in-out;
+ transform: scale(1.1);
+}
+
+.active {
+ color: #ffec19;
+}
+
+.success-message {
+ color: green;
+}
+
+.error-message {
+ color: red;
+}
+
+@media (max-width: 768px) {
+ .feedback-input,
+ .send-icon {
+ font-size: 12px;
+ padding-right: 30px;
+ }
+
+ .send-icon {
+ font-size: 18px;
+ }
+
+ .rating-box {
+ margin: 3px;
+ padding: 3px 6px;
+ }
+}
diff --git a/site/src/css/illustration.css b/site/src/css/illustration.css
new file mode 100644
index 0000000..05e6a8a
--- /dev/null
+++ b/site/src/css/illustration.css
@@ -0,0 +1,20 @@
+.tbd-yellow-illustration {
+ filter: var(--color-primary-yellow-filter);
+}
+
+.tbd-cyan-illustration {
+ filter: var(--color-primary-cyan-filter);
+}
+
+.tbd-purple-illustration {
+ filter: var(--color-primary-purple-filter);
+}
+
+.dark .invertDarkMode .tbd-illustration {
+ filter: none;
+}
+
+.tbd-social-icon {
+ min-width: 1.5rem;
+ min-height: 1.5rem;
+}
diff --git a/site/src/css/jsvariables.js b/site/src/css/jsvariables.js
new file mode 100644
index 0000000..e1e9394
--- /dev/null
+++ b/site/src/css/jsvariables.js
@@ -0,0 +1,3 @@
+import tokens from './styles.json';
+
+export default { TypographyBaseFontSize: 16, ...tokens };
diff --git a/site/src/css/layout.css b/site/src/css/layout.css
new file mode 100644
index 0000000..d56d950
--- /dev/null
+++ b/site/src/css/layout.css
@@ -0,0 +1,70 @@
+body,
+html {
+ max-width: 100vw;
+ overflow-x: hidden !important;
+ background-color: black;
+}
+
+.navbar,
+.main-wrapper {
+ max-width: 1440px;
+ margin: 0 auto;
+ width: 100%;
+}
+
+#__docusaurus {
+ padding-left: 1.5rem;
+ padding-right: 1.5rem;
+}
+
+@media (min-width: 1024px) {
+ #__docusaurus {
+ padding-left: 5rem;
+ padding-right: 5rem;
+ }
+}
+
+@media (min-width: 768px) and (max-width: 1023px) {
+ #__docusaurus {
+ padding-left: calc(((34 / 16) * 1rem));
+ padding-right: calc(((34 / 16) * 1rem));
+ }
+}
+
+.main-wrapper {
+ margin-top: 4.5rem;
+}
+
+.container {
+ padding-left: 0 !important;
+ padding-right: 0 !important;
+}
+
+.max-w-container {
+ max-width: var(--max-page-width);
+}
+
+@media (max-width: 1024px) {
+ .main-wrapper {
+ margin-top: 3rem;
+ }
+}
+
+@media (min-width: 997px) {
+ .docMainContainer_src-layout-DocPage-styles-module {
+ max-width: calc(
+ var(--max-page-width) - var(--doc-sidebar-width)
+ ) !important;
+ width: calc(var(--max-page-width) - var(--doc-sidebar-width)) !important;
+ }
+
+ .main-wrapper
+ .docItemCol_node_modules-\@docusaurus-theme-classic-lib-next-theme-DocItem-styles-module {
+ max-width: 75% !important;
+ }
+ .docSidebarContainer_CEHd,
+ .docSidebarContainer_src-theme-DocPage-styles-module {
+ min-width: 16.625rem !important;
+ max-width: 16.625rem !important;
+ }
+}
diff --git a/site/src/css/navbar.css b/site/src/css/navbar.css
new file mode 100644
index 0000000..9fcd730
--- /dev/null
+++ b/site/src/css/navbar.css
@@ -0,0 +1,313 @@
+/** HEADER **/
+.navbar {
+ border-bottom: 2px solid var(--color-yellow);
+ height: fit-content;
+ padding-top: 3rem;
+ padding-bottom: 0px;
+ padding-left: 0px;
+ padding-right: 0px;
+ font-family: 'IBM Plex Mono', monospace;
+ line-height: 24px;
+}
+
+.navbar__inner {
+ align-items: center;
+}
+
+.navbar a {
+ text-decoration: none;
+}
+
+.navbar.navbar--dark {
+ --ifm-navbar-background-color: var(--color-black);
+}
+
+@media (min-width: 768px) and (max-width: 1023px) {
+ .navbar-sidebar__brand {
+ margin-left: calc(((34 / 16) * 1rem)) !important;
+ margin-right: calc(((34 / 16) * 1rem)) !important;
+ }
+
+ .navbar-sidebar__item {
+ padding-right: calc(((34 / 16) * 1rem)) !important;
+ padding-left: calc(((34 / 16) * 1rem)) !important;
+ }
+}
+
+.navbar__link {
+ color: var(--color-yellow);
+ font-size: 18px;
+}
+
+.navbar__logo {
+ width: 10rem;
+ height: 4.375rem;
+ margin-bottom: 3.4375rem;
+ transition: transform 0.3s ease-in-out;
+ }
+.navbar__logo:hover,
+.navbar__logo:focus {
+ transform: scale(1.05);
+}
+
+.navbar--fixed-top {
+ position: inherit;
+ z-index: 200;
+}
+
+.navbar__items {
+ align-items: flex-end;
+}
+
+.navbar__item {
+ padding: 0px;
+ margin-right: 3rem;
+ padding-bottom: 3rem;
+ transition: transform 0.3s ease-in-out;
+ }
+.navbar__item:hover,
+.navbar__item:focus {
+ transform: scale(1.05);
+}
+
+.navbar__items.navbar__items--right .navbar__item {
+ margin-right: 0rem;
+}
+
+.navbar__brand {
+ margin-right: 8rem;
+}
+
+.navbar-sidebar {
+ padding-top: 1.5rem;
+ width: 100%;
+ overflow: hidden;
+ background-image: url('/static/img/mobile-menu-glitch-bottom-dark.svg');
+ background-repeat: repeat-x;
+ background-position: bottom;
+ min-height: 26rem;
+ transition-duration: 0ms;
+ transition-property: none;
+ z-index: 200;
+}
+
+.navbar-sidebar__brand {
+ border-bottom: 2px solid var(--color-yellow);
+ margin-left: 1.5rem;
+ margin-right: 1.5rem;
+ padding: 0rem;
+
+ height: fit-content;
+}
+
+.navbar-sidebar__item {
+ padding-top: 0rem;
+ padding-right: 1.5rem;
+ padding-left: 1.5rem;
+}
+
+.navbar-sidebar__item.menu {
+ width: 100%;
+}
+
+.navbar-sidebar__items {
+ padding-top: 2.875rem;
+}
+
+.navbar__link:hover,
+.navbar__link--active {
+ border-bottom: 4px solid var(--color-yellow);
+ color: var(--color-yellow);
+ padding-bottom: 2.75rem;
+}
+
+.navbar-sidebar .navbar-sidebar__item:first-child .menu__list {
+ gap: 1.75rem;
+ display: flex;
+ flex-direction: column;
+}
+.navbar-sidebar .navbar-sidebar__item:first-child .menu__list-item:last-child {
+ background-image: url('/static/img/divider-mobile-menu-dark.svg');
+ width: 100%;
+ background-repeat: repeat-x;
+ padding-top: 1.8rem;
+}
+
+.navbar-sidebar
+ .navbar-sidebar__item:first-child
+ .menu__link--active:not(.menu__link--sublist) {
+ background-color: var(--color-black);
+}
+
+.navbar-sidebar .navbar-sidebar__item:first-child .menu__link--active::before {
+ content: url('/static/img/selected-arrow.svg');
+ top: 5px;
+ position: relative;
+ margin-right: 0.375rem;
+}
+.navbar-sidebar .navbar-sidebar__item:first-child .menu__link {
+ color: var(--color-yellow);
+ font-size: var(--typography-links-m-font-size) !important;
+ line-height: var(--typography-links-m-line-height) !important;
+ font-weight: var(--typography-links-m-font-weight) !important;
+ padding: 0rem;
+}
+@media (max-width: 996px) {
+ .navbar {
+ padding-top: 1.5rem;
+ }
+ .navbar__brand {
+ margin-right: 0rem;
+ }
+ .navbar__logo {
+ width: 6rem;
+ height: 2.625rem;
+ margin-bottom: 1.5rem;
+ }
+ .navbar__items {
+ justify-content: space-between;
+ display: flex;
+ flex-direction: row-reverse;
+ }
+
+ .navbar__toggle.clean-btn {
+ align-self: center;
+ margin-right: 0rem;
+ }
+ .navbar__toggle {
+ display: inherit;
+ }
+ .navbar__toggle.clean-btn::before {
+ width: 1.125rem;
+ height: 1.125rem;
+ content: url('/static/img/menu-mobile.svg');
+ }
+ .navbar__item {
+ display: none;
+ }
+ .navbar__toggle.clean-btn svg {
+ display: none;
+ }
+
+ .clean-btn.navbar-sidebar__close::before {
+ width: 1.125rem;
+ height: 1.875rem;
+ content: url('/static/img/close-menu-mobile.svg');
+ }
+
+ .clean-btn.navbar-sidebar__close svg {
+ display: none;
+ }
+}
+
+/** sidebar in mobile menu **/
+
+.navbar-sidebar .navbar-sidebar__item:last-child .menu__link,
+.navbar-sidebar .navbar-sidebar__item:last-child .clean-btn {
+ color: var(--color-yellow);
+ font-size: var(--typography-links-m-font-size) !important;
+ line-height: var(--typography-links-m-line-height) !important;
+ font-weight: var(--typography-links-m-font-weight) !important;
+}
+.navbar-sidebar
+ .navbar-sidebar__item:last-child
+ .menu__list-item:not(:first-child) {
+ margin-top: 1.5rem;
+}
+
+.navbar-sidebar .navbar-sidebar__item:last-child .menu__caret {
+ padding-right: 0px !important;
+}
+
+.navbar__items--right > :last-child {
+ padding-right: 16px;
+}
+
+.navbar-sidebar .navbar-sidebar__item:last-child .menu__link {
+ padding-left: 0px !important;
+}
+
+.navbar-sidebar .navbar-sidebar__item:last-child .menu__caret:before {
+ content: url('/static/img/arrow-yellow.svg') !important;
+ top: 3px !important;
+ position: relative;
+}
+.navbar-sidebar
+ .navbar-sidebar__item:last-child
+ .menu__list-item--collapsed
+ .menu__caret:before {
+ content: url('/static/img/arrow-yellow.svg') !important;
+ top: -1px !important;
+ position: relative;
+}
+
+.navbar-sidebar .navbar-sidebar__item:last-child .menu__list-item-collapsible {
+ justify-content: space-evenly;
+}
+
+.navbar-sidebar
+ .navbar-sidebar__item:last-child
+ .menu__list
+ .menu__list
+ .menu__link.menu__link--active::before {
+ content: url('/static/img/selected-arrow-yellow.svg');
+ top: 5px;
+ position: relative;
+ margin-right: -1.5rem;
+ left: -1.75rem;
+}
+
+.navbar-sidebar .navbar-sidebar__item:last-child .menu__list .menu__list {
+ padding-left: 1.6875rem;
+ margin-top: 1.125rem !important;
+}
+
+.navbar-sidebar
+ .navbar-sidebar__item:last-child
+ .menu__list
+ .menu__list
+ .menu__link.menu__link--active {
+ background-color: var(--color-black);
+}
+
+.navbar-sidebar .navbar-sidebar__item:last-child > .clean-btn {
+ font-size: 0px !important;
+}
+
+.navbar-sidebar
+ .navbar-sidebar__item:last-child
+ .clean-btn.navbar-sidebar__back::after {
+ content: 'Back to main menu';
+ color: var(--color-yellow);
+ font-size: var(--typography-links-m-font-size) !important;
+ line-height: var(--typography-links-m-line-height) !important;
+ font-weight: var(--typography-links-m-font-weight) !important;
+ position: relative;
+}
+
+.navbar-sidebar
+ .navbar-sidebar__item:last-child
+ .clean-btn.navbar-sidebar__back::before {
+ display: inline-block;
+ content: url('/static/img/arrow-yellow.svg');
+
+ position: relative;
+ left: -13px;
+ top: -6px;
+}
+
+.navbar-sidebar__item.menu{
+ margin-bottom: 100px;
+}
+
+aside .menu__link:not(.docs-wrapper .menu__link) {
+ color: gray !important;
+ padding-top: 0rem;
+ padding-bottom: 0rem;
+ background-color: transparent !important;
+ text-decoration: none;
+}
+
+aside .menu__link--sublist-caret:after {
+ position: relative;
+}
diff --git a/site/src/css/prose.css b/site/src/css/prose.css
new file mode 100644
index 0000000..efe40e4
--- /dev/null
+++ b/site/src/css/prose.css
@@ -0,0 +1,90 @@
+.prose,
+.prose.prose-pink {
+ width: 100%;
+ max-width: none !important;
+}
+
+.prose.prose-pink em {
+ font-weight: 900;
+}
+
+.prose.prose-pink code {
+ color: var(--color-black) !important;
+}
+
+.prose.prose-pink code a {
+ color: var(--color-black) !important;
+ text-decoration: underline;
+}
+
+.prose.prose-pink code a:hover {
+ color: var(--color-black) !important;
+ text-decoration: none;
+}
+
+.prose.prose-pink a code {
+ color: var(--color-black) !important;
+ text-decoration: underline;
+}
+
+.prose.prose-pink a:hover code {
+ color: var(--color-black) !important;
+ text-decoration: none;
+}
+
+.prose.prose-pink
+ :where(tbody td:first-child):not(:where([class~='not-prose'] *)) {
+ padding-left: 0.5714286em;
+}
+
+.prose.prose-pink
+ :where(tbody td:last-child):not(:where([class~='not-prose'] *)) {
+ padding-right: 0.5714286em;
+}
+
+.prose.prose-pink
+ :where(thead th:first-child):not(:where([class~='not-prose'] *)) {
+ padding-left: 0.5714286em;
+}
+
+.prose.prose-pink
+ :where(thead th:last-child):not(:where([class~='not-prose'] *)) {
+ padding-right: 0.5714286em;
+}
+
+hr {
+ height: 2px;
+ border-width: 0;
+ background-image: url('/static/img/divider-dotted-dark.svg');
+}
+
+hr.bg-dotted-dark {
+ height: 2px;
+ border-width: 0;
+ background-image: url('/static/img/divider-dotted-dark.svg');
+}
+
+hr.bg-slash-dark {
+ height: 8px;
+ border-width: 0;
+ background-image: url('/static/img/divider-slash-dark.svg');
+ margin-top: 3rem;
+ margin-bottom: 3rem;
+ background-color: transparent;
+}
+
+.prose :where(code):not(:where([class~='not-prose'] *)):before,
+.prose :where(code):not(:where([class~='not-prose'] *)):after {
+ content: '' !important;
+}
+
+.prose :where(thead th):not(:where([class~='not-prose'] *)) {
+ text-transform: uppercase;
+}
+
+.prose :where(hr):not(:where([class~=not-prose] *)) {
+ border-color: var(--tw-prose-hr);
+ border-top-width: 1px;
+ margin-bottom: 3em;
+ margin-top: 3em;
+}
\ No newline at end of file
diff --git a/site/src/css/search.css b/site/src/css/search.css
new file mode 100644
index 0000000..27afcae
--- /dev/null
+++ b/site/src/css/search.css
@@ -0,0 +1,28 @@
+.search-widget p {
+ margin-block: var(--ifm-paragraph-margin-bottom);
+}
+
+.search-widget ol,
+.search-widget ul {
+ margin: 0 0 var(--ifm-list-margin);
+ padding-left: var(--ifm-list-left-padding);
+}
+
+.search-widget ol {
+ list-style: decimal;
+}
+
+.search-widget ul {
+ list-style: disc;
+}
+
+.search-widget a {
+ color: var(--color-black);
+ background: var(--color-blue);
+}
+
+.search-widget pre code {
+ background: initial;
+ border: initial;
+}
+
diff --git a/site/src/css/sidebar.css b/site/src/css/sidebar.css
new file mode 100644
index 0000000..e2f62e0
--- /dev/null
+++ b/site/src/css/sidebar.css
@@ -0,0 +1,126 @@
+/**SIDEBAR **/
+
+.menu.thin-scrollbar:not(.docs-wrapper .thin-scrollbar) {
+ padding: 0;
+ scrollbar-gutter: initial;
+}
+
+aside .menu__link {
+ color: var(--color-blue);
+ padding-left: 1.875rem;
+ padding-top: 0rem;
+ padding-bottom: 0rem;
+}
+
+aside .menu__link--sublist-caret:after {
+ content: url('/img/arrow-blue.svg');
+ background: none;
+ width: 1.25rem;
+ height: 1.25rem;
+ transform: rotateZ(90deg);
+ transform-origin: 50% 50%;
+ justify-content: center;
+ align-items: center;
+ display: flex;
+ filter: none;
+ rotate: 90deg;
+}
+
+aside .menu__list {
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+ transition: all 221ms ease-in-out 0s !important;
+}
+
+aside .menu__list .menu__list:not(.docs-wrapper .menu__list) {
+ display: flex !important;
+ margin-top: 0.5rem;
+}
+
+aside .menu__link--sublist.menu__link--active:not(.docs-wrapper .menu__link) {
+ color: white !important;
+ padding-top: 0rem;
+ padding-bottom: 0rem;
+}
+
+aside .theme-doc-sidebar-item-link > .menu__link.menu__link--active {
+ color: var(--color-blue) !important;
+ padding-top: 0rem;
+ padding-bottom: 0rem;
+}
+
+.menu__caret:before {
+ content: url('/img/arrow-blue.svg');
+}
+
+.menu__caret:before:not(.docs-wrapper .menu__caret:before) {
+ background: none !important;
+ filter: none !important;
+}
+.menu__list-item--collapsed .menu__caret:before {
+ top: -4px;
+ left: 4px;
+ position: relative;
+}
+.menu__caret {
+ padding-top: 0rem;
+ padding-bottom: 0rem;
+ position: relative;
+ top: 6px;
+}
+.menu__caret:hover {
+ height: 10px;
+ background: none !important;
+}
+
+aside .menu__list-item:not(:first-child) {
+ margin-top: 0rem;
+}
+aside .menu__list-item--collapsed .menu__list {
+ margin-top: 0rem;
+}
+aside .menu__list-item--collapsed .menu__link--sublist:after {
+ transform: rotateZ(0deg);
+}
+
+aside
+ .menu__list
+ .menu__list-item
+ .menu__list-item-collapsible
+ .menu__link--active::before {
+ content: none;
+}
+
+aside .menu__list .menu__list .menu__link:not(.docs-wrapper .menu__link) {
+ padding-left: 25px;
+ height: fit-content;
+}
+
+aside .menu__link:hover {
+ color: var(--color-blue) !important;
+}
+
+@media (min-width: 997px) {
+ aside.docSidebarContainer_src-layout-DocPage-styles-module,
+ aside.theme-doc-sidebar-container {
+ margin-right: 1.5rem !important;
+ }
+}
+
+@media (min-width: 997px) {
+ .menu_node_modules-\@docusaurus-theme-classic-lib-next-theme-DocSidebar-Desktop-Content-styles-module {
+ flex-grow: 1;
+ padding-left: 0rem !important;
+ }
+}
+
+.menu__list-item-collapsible a {
+ font-weight: 800;
+}
+
+.theme-doc-sidebar-item-link-level-1 a:not(.docs-wrapper a),
+.theme-doc-sidebar-item-category-level-1 > div > a:not(.docs-wrapper a) {
+ font-weight: 800;
+ font-size: 18px;
+}
diff --git a/site/src/css/styles.js b/site/src/css/styles.js
new file mode 100644
index 0000000..5cfd6c8
--- /dev/null
+++ b/site/src/css/styles.js
@@ -0,0 +1,949 @@
+export default {
+ ColorBlack: '#000000',
+ ColorYellow: '#ffec19',
+ ColorBlue: '#24f2ff',
+ ColorPurple: '#9a1aff',
+ ColorWhite: '#ffffff',
+ ColorRed: '#ff2e00',
+ ColorGreyDark: '#333333',
+ GridDesktop: {
+ pattern: 'columns',
+ gutterSize: 32,
+ alignment: 'stretch',
+ count: 12,
+ offset: 160,
+ },
+ GridMobile: {
+ pattern: 'columns',
+ gutterSize: 20,
+ alignment: 'stretch',
+ count: 4,
+ offset: 24,
+ },
+ GridTablet: {
+ pattern: 'columns',
+ gutterSize: 20,
+ alignment: 'stretch',
+ count: 12,
+ offset: 34,
+ },
+ GridStyleGuide: {
+ pattern: 'columns',
+ gutterSize: 24,
+ alignment: 'stretch',
+ count: 12,
+ offset: 180,
+ },
+ FontH1D: {
+ fontSize: 56,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 700,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: -1,
+ lineHeight: 58,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontH2D: {
+ fontSize: 24,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 700,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 28,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'uppercase',
+ },
+ FontBody1D: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 400,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 26,
+ paragraphIndent: 0,
+ paragraphSpacing: 16,
+ textCase: 'none',
+ },
+ FontBody2D: {
+ fontSize: 14,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 400,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 20,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontLinksD: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 24,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontInputFieldLabelD: {
+ fontSize: 12,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 400,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 12,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontTagsD: {
+ fontSize: 12,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 12,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontH1M: {
+ fontSize: 32,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 700,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: -1,
+ lineHeight: 38,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontH2M: {
+ fontSize: 24,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 700,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 28,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'uppercase',
+ },
+ FontBody1M: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 400,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 26,
+ paragraphIndent: 0,
+ paragraphSpacing: 16,
+ textCase: 'none',
+ },
+ FontBody2M: {
+ fontSize: 12,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 400,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 16,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontLinksM: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 18,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontInputFieldLabelM: {
+ fontSize: 12,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 400,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 12,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontTagsM: {
+ fontSize: 12,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 12,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontH3M: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 24,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontH3D: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 24,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontH4D: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 700,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 26,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontH4M: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 700,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 26,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontBody1DBold: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 700,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 26,
+ paragraphIndent: 0,
+ paragraphSpacing: 16,
+ textCase: 'none',
+ },
+ FontBody1MBold: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 700,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 26,
+ paragraphIndent: 0,
+ paragraphSpacing: 16,
+ textCase: 'none',
+ },
+ FontListItemBulletsD: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 400,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 26,
+ paragraphIndent: 0,
+ paragraphSpacing: 16,
+ textCase: 'none',
+ },
+ FontListItemBulletsM: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 400,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 24,
+ paragraphIndent: 0,
+ paragraphSpacing: 16,
+ textCase: 'none',
+ },
+ FontLinksDUnderline: {
+ fontSize: 18,
+ textDecoration: 'underline',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 26,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontLinksMUnderline: {
+ fontSize: 18,
+ textDecoration: 'underline',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 26,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontListItemD: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 26,
+ paragraphIndent: 0,
+ paragraphSpacing: 16,
+ textCase: 'none',
+ },
+ FontListItemM: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 26,
+ paragraphIndent: 0,
+ paragraphSpacing: 16,
+ textCase: 'none',
+ },
+ FontTableHeadersD: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 700,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 28,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'uppercase',
+ },
+ FontTableHeadersM: {
+ fontSize: 18,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 700,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 28,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'uppercase',
+ },
+ FontH2DMedium: {
+ fontSize: 24,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 32,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontH2MMedium: {
+ fontSize: 24,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 32,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontTagsDUnderline: {
+ fontSize: 12,
+ textDecoration: 'underline',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 12,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontTagsMUnderline: {
+ fontSize: 12,
+ textDecoration: 'underline',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 12,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontH3DUnderline: {
+ fontSize: 18,
+ textDecoration: 'underline',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 24,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontH3MUnderline: {
+ fontSize: 18,
+ textDecoration: 'underline',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 500,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 24,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontBody3M: {
+ fontSize: 14,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 400,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 20,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontH1T: {
+ fontSize: 48,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 700,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: -1,
+ lineHeight: 50,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontBreadcrumbsDUnderline: {
+ fontSize: 16,
+ textDecoration: 'underline',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 400,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 20,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ FontBreadcrumbsD: {
+ fontSize: 16,
+ textDecoration: 'none',
+ fontFamily: 'IBM Plex Mono',
+ fontWeight: 400,
+ fontStyle: 'normal',
+ fontStretch: 'normal',
+ letterSpacing: 0,
+ lineHeight: 20,
+ paragraphIndent: 0,
+ paragraphSpacing: 0,
+ textCase: 'none',
+ },
+ TypographyH1DFontSize: 56,
+ TypographyH1DTextDecoration: 'none',
+ TypographyH1DFontFamily: 'IBM Plex Mono',
+ TypographyH1DFontWeight: 700,
+ TypographyH1DFontStyle: 'normal',
+ TypographyH1DFontStretch: 'normal',
+ TypographyH1DLetterSpacing: -1,
+ TypographyH1DLineHeight: 58,
+ TypographyH1DParagraphIndent: 0,
+ TypographyH1DParagraphSpacing: 0,
+ TypographyH1DTextCase: 'none',
+ TypographyH2DFontSize: 24,
+ TypographyH2DTextDecoration: 'none',
+ TypographyH2DFontFamily: 'IBM Plex Mono',
+ TypographyH2DFontWeight: 700,
+ TypographyH2DFontStyle: 'normal',
+ TypographyH2DFontStretch: 'normal',
+ TypographyH2DLetterSpacing: 0,
+ TypographyH2DLineHeight: 28,
+ TypographyH2DParagraphIndent: 0,
+ TypographyH2DParagraphSpacing: 0,
+ TypographyH2DTextCase: 'uppercase',
+ TypographyBody1DFontSize: 18,
+ TypographyBody1DTextDecoration: 'none',
+ TypographyBody1DFontFamily: 'IBM Plex Mono',
+ TypographyBody1DFontWeight: 400,
+ TypographyBody1DFontStyle: 'normal',
+ TypographyBody1DFontStretch: 'normal',
+ TypographyBody1DLetterSpacing: 0,
+ TypographyBody1DLineHeight: 26,
+ TypographyBody1DParagraphIndent: 0,
+ TypographyBody1DParagraphSpacing: 16,
+ TypographyBody1DTextCase: 'none',
+ TypographyBody2DFontSize: 14,
+ TypographyBody2DTextDecoration: 'none',
+ TypographyBody2DFontFamily: 'IBM Plex Mono',
+ TypographyBody2DFontWeight: 400,
+ TypographyBody2DFontStyle: 'normal',
+ TypographyBody2DFontStretch: 'normal',
+ TypographyBody2DLetterSpacing: 0,
+ TypographyBody2DLineHeight: 20,
+ TypographyBody2DParagraphIndent: 0,
+ TypographyBody2DParagraphSpacing: 0,
+ TypographyBody2DTextCase: 'none',
+ TypographyLinksDFontSize: 18,
+ TypographyLinksDTextDecoration: 'none',
+ TypographyLinksDFontFamily: 'IBM Plex Mono',
+ TypographyLinksDFontWeight: 500,
+ TypographyLinksDFontStyle: 'normal',
+ TypographyLinksDFontStretch: 'normal',
+ TypographyLinksDLetterSpacing: 0,
+ TypographyLinksDLineHeight: 24,
+ TypographyLinksDParagraphIndent: 0,
+ TypographyLinksDParagraphSpacing: 0,
+ TypographyLinksDTextCase: 'none',
+ TypographyInputFieldLabelDFontSize: 12,
+ TypographyInputFieldLabelDTextDecoration: 'none',
+ TypographyInputFieldLabelDFontFamily: 'IBM Plex Mono',
+ TypographyInputFieldLabelDFontWeight: 400,
+ TypographyInputFieldLabelDFontStyle: 'normal',
+ TypographyInputFieldLabelDFontStretch: 'normal',
+ TypographyInputFieldLabelDLetterSpacing: 0,
+ TypographyInputFieldLabelDLineHeight: 12,
+ TypographyInputFieldLabelDParagraphIndent: 0,
+ TypographyInputFieldLabelDParagraphSpacing: 0,
+ TypographyInputFieldLabelDTextCase: 'none',
+ TypographyTagsDFontSize: 12,
+ TypographyTagsDTextDecoration: 'none',
+ TypographyTagsDFontFamily: 'IBM Plex Mono',
+ TypographyTagsDFontWeight: 500,
+ TypographyTagsDFontStyle: 'normal',
+ TypographyTagsDFontStretch: 'normal',
+ TypographyTagsDLetterSpacing: 0,
+ TypographyTagsDLineHeight: 12,
+ TypographyTagsDParagraphIndent: 0,
+ TypographyTagsDParagraphSpacing: 0,
+ TypographyTagsDTextCase: 'none',
+ TypographyH1MFontSize: 32,
+ TypographyH1MTextDecoration: 'none',
+ TypographyH1MFontFamily: 'IBM Plex Mono',
+ TypographyH1MFontWeight: 700,
+ TypographyH1MFontStyle: 'normal',
+ TypographyH1MFontStretch: 'normal',
+ TypographyH1MLetterSpacing: -1,
+ TypographyH1MLineHeight: 38,
+ TypographyH1MParagraphIndent: 0,
+ TypographyH1MParagraphSpacing: 0,
+ TypographyH1MTextCase: 'none',
+ TypographyH2MFontSize: 24,
+ TypographyH2MTextDecoration: 'none',
+ TypographyH2MFontFamily: 'IBM Plex Mono',
+ TypographyH2MFontWeight: 700,
+ TypographyH2MFontStyle: 'normal',
+ TypographyH2MFontStretch: 'normal',
+ TypographyH2MLetterSpacing: 0,
+ TypographyH2MLineHeight: 28,
+ TypographyH2MParagraphIndent: 0,
+ TypographyH2MParagraphSpacing: 0,
+ TypographyH2MTextCase: 'uppercase',
+ TypographyBody1MFontSize: 18,
+ TypographyBody1MTextDecoration: 'none',
+ TypographyBody1MFontFamily: 'IBM Plex Mono',
+ TypographyBody1MFontWeight: 400,
+ TypographyBody1MFontStyle: 'normal',
+ TypographyBody1MFontStretch: 'normal',
+ TypographyBody1MLetterSpacing: 0,
+ TypographyBody1MLineHeight: 26,
+ TypographyBody1MParagraphIndent: 0,
+ TypographyBody1MParagraphSpacing: 16,
+ TypographyBody1MTextCase: 'none',
+ TypographyBody2MFontSize: 12,
+ TypographyBody2MTextDecoration: 'none',
+ TypographyBody2MFontFamily: 'IBM Plex Mono',
+ TypographyBody2MFontWeight: 400,
+ TypographyBody2MFontStyle: 'normal',
+ TypographyBody2MFontStretch: 'normal',
+ TypographyBody2MLetterSpacing: 0,
+ TypographyBody2MLineHeight: 16,
+ TypographyBody2MParagraphIndent: 0,
+ TypographyBody2MParagraphSpacing: 0,
+ TypographyBody2MTextCase: 'none',
+ TypographyLinksMFontSize: 18,
+ TypographyLinksMTextDecoration: 'none',
+ TypographyLinksMFontFamily: 'IBM Plex Mono',
+ TypographyLinksMFontWeight: 500,
+ TypographyLinksMFontStyle: 'normal',
+ TypographyLinksMFontStretch: 'normal',
+ TypographyLinksMLetterSpacing: 0,
+ TypographyLinksMLineHeight: 18,
+ TypographyLinksMParagraphIndent: 0,
+ TypographyLinksMParagraphSpacing: 0,
+ TypographyLinksMTextCase: 'none',
+ TypographyInputFieldLabelMFontSize: 12,
+ TypographyInputFieldLabelMTextDecoration: 'none',
+ TypographyInputFieldLabelMFontFamily: 'IBM Plex Mono',
+ TypographyInputFieldLabelMFontWeight: 400,
+ TypographyInputFieldLabelMFontStyle: 'normal',
+ TypographyInputFieldLabelMFontStretch: 'normal',
+ TypographyInputFieldLabelMLetterSpacing: 0,
+ TypographyInputFieldLabelMLineHeight: 12,
+ TypographyInputFieldLabelMParagraphIndent: 0,
+ TypographyInputFieldLabelMParagraphSpacing: 0,
+ TypographyInputFieldLabelMTextCase: 'none',
+ TypographyTagsMFontSize: 12,
+ TypographyTagsMTextDecoration: 'none',
+ TypographyTagsMFontFamily: 'IBM Plex Mono',
+ TypographyTagsMFontWeight: 500,
+ TypographyTagsMFontStyle: 'normal',
+ TypographyTagsMFontStretch: 'normal',
+ TypographyTagsMLetterSpacing: 0,
+ TypographyTagsMLineHeight: 12,
+ TypographyTagsMParagraphIndent: 0,
+ TypographyTagsMParagraphSpacing: 0,
+ TypographyTagsMTextCase: 'none',
+ TypographyH3MFontSize: 18,
+ TypographyH3MTextDecoration: 'none',
+ TypographyH3MFontFamily: 'IBM Plex Mono',
+ TypographyH3MFontWeight: 500,
+ TypographyH3MFontStyle: 'normal',
+ TypographyH3MFontStretch: 'normal',
+ TypographyH3MLetterSpacing: 0,
+ TypographyH3MLineHeight: 24,
+ TypographyH3MParagraphIndent: 0,
+ TypographyH3MParagraphSpacing: 0,
+ TypographyH3MTextCase: 'none',
+ TypographyH3DFontSize: 18,
+ TypographyH3DTextDecoration: 'none',
+ TypographyH3DFontFamily: 'IBM Plex Mono',
+ TypographyH3DFontWeight: 500,
+ TypographyH3DFontStyle: 'normal',
+ TypographyH3DFontStretch: 'normal',
+ TypographyH3DLetterSpacing: 0,
+ TypographyH3DLineHeight: 24,
+ TypographyH3DParagraphIndent: 0,
+ TypographyH3DParagraphSpacing: 0,
+ TypographyH3DTextCase: 'none',
+ TypographyH4DFontSize: 18,
+ TypographyH4DTextDecoration: 'none',
+ TypographyH4DFontFamily: 'IBM Plex Mono',
+ TypographyH4DFontWeight: 700,
+ TypographyH4DFontStyle: 'normal',
+ TypographyH4DFontStretch: 'normal',
+ TypographyH4DLetterSpacing: 0,
+ TypographyH4DLineHeight: 26,
+ TypographyH4DParagraphIndent: 0,
+ TypographyH4DParagraphSpacing: 0,
+ TypographyH4DTextCase: 'none',
+ TypographyH4MFontSize: 18,
+ TypographyH4MTextDecoration: 'none',
+ TypographyH4MFontFamily: 'IBM Plex Mono',
+ TypographyH4MFontWeight: 700,
+ TypographyH4MFontStyle: 'normal',
+ TypographyH4MFontStretch: 'normal',
+ TypographyH4MLetterSpacing: 0,
+ TypographyH4MLineHeight: 26,
+ TypographyH4MParagraphIndent: 0,
+ TypographyH4MParagraphSpacing: 0,
+ TypographyH4MTextCase: 'none',
+ TypographyBody1DBoldFontSize: 18,
+ TypographyBody1DBoldTextDecoration: 'none',
+ TypographyBody1DBoldFontFamily: 'IBM Plex Mono',
+ TypographyBody1DBoldFontWeight: 700,
+ TypographyBody1DBoldFontStyle: 'normal',
+ TypographyBody1DBoldFontStretch: 'normal',
+ TypographyBody1DBoldLetterSpacing: 0,
+ TypographyBody1DBoldLineHeight: 26,
+ TypographyBody1DBoldParagraphIndent: 0,
+ TypographyBody1DBoldParagraphSpacing: 16,
+ TypographyBody1DBoldTextCase: 'none',
+ TypographyBody1MBoldFontSize: 18,
+ TypographyBody1MBoldTextDecoration: 'none',
+ TypographyBody1MBoldFontFamily: 'IBM Plex Mono',
+ TypographyBody1MBoldFontWeight: 700,
+ TypographyBody1MBoldFontStyle: 'normal',
+ TypographyBody1MBoldFontStretch: 'normal',
+ TypographyBody1MBoldLetterSpacing: 0,
+ TypographyBody1MBoldLineHeight: 26,
+ TypographyBody1MBoldParagraphIndent: 0,
+ TypographyBody1MBoldParagraphSpacing: 16,
+ TypographyBody1MBoldTextCase: 'none',
+ TypographyListItemBulletsDFontSize: 18,
+ TypographyListItemBulletsDTextDecoration: 'none',
+ TypographyListItemBulletsDFontFamily: 'IBM Plex Mono',
+ TypographyListItemBulletsDFontWeight: 400,
+ TypographyListItemBulletsDFontStyle: 'normal',
+ TypographyListItemBulletsDFontStretch: 'normal',
+ TypographyListItemBulletsDLetterSpacing: 0,
+ TypographyListItemBulletsDLineHeight: 26,
+ TypographyListItemBulletsDParagraphIndent: 0,
+ TypographyListItemBulletsDParagraphSpacing: 16,
+ TypographyListItemBulletsDTextCase: 'none',
+ TypographyListItemBulletsMFontSize: 18,
+ TypographyListItemBulletsMTextDecoration: 'none',
+ TypographyListItemBulletsMFontFamily: 'IBM Plex Mono',
+ TypographyListItemBulletsMFontWeight: 400,
+ TypographyListItemBulletsMFontStyle: 'normal',
+ TypographyListItemBulletsMFontStretch: 'normal',
+ TypographyListItemBulletsMLetterSpacing: 0,
+ TypographyListItemBulletsMLineHeight: 24,
+ TypographyListItemBulletsMParagraphIndent: 0,
+ TypographyListItemBulletsMParagraphSpacing: 16,
+ TypographyListItemBulletsMTextCase: 'none',
+ TypographyLinksDUnderlineFontSize: 18,
+ TypographyLinksDUnderlineTextDecoration: 'underline',
+ TypographyLinksDUnderlineFontFamily: 'IBM Plex Mono',
+ TypographyLinksDUnderlineFontWeight: 500,
+ TypographyLinksDUnderlineFontStyle: 'normal',
+ TypographyLinksDUnderlineFontStretch: 'normal',
+ TypographyLinksDUnderlineLetterSpacing: 0,
+ TypographyLinksDUnderlineLineHeight: 26,
+ TypographyLinksDUnderlineParagraphIndent: 0,
+ TypographyLinksDUnderlineParagraphSpacing: 0,
+ TypographyLinksDUnderlineTextCase: 'none',
+ TypographyLinksMUnderlineFontSize: 18,
+ TypographyLinksMUnderlineTextDecoration: 'underline',
+ TypographyLinksMUnderlineFontFamily: 'IBM Plex Mono',
+ TypographyLinksMUnderlineFontWeight: 500,
+ TypographyLinksMUnderlineFontStyle: 'normal',
+ TypographyLinksMUnderlineFontStretch: 'normal',
+ TypographyLinksMUnderlineLetterSpacing: 0,
+ TypographyLinksMUnderlineLineHeight: 26,
+ TypographyLinksMUnderlineParagraphIndent: 0,
+ TypographyLinksMUnderlineParagraphSpacing: 0,
+ TypographyLinksMUnderlineTextCase: 'none',
+ TypographyListItemDFontSize: 18,
+ TypographyListItemDTextDecoration: 'none',
+ TypographyListItemDFontFamily: 'IBM Plex Mono',
+ TypographyListItemDFontWeight: 500,
+ TypographyListItemDFontStyle: 'normal',
+ TypographyListItemDFontStretch: 'normal',
+ TypographyListItemDLetterSpacing: 0,
+ TypographyListItemDLineHeight: 26,
+ TypographyListItemDParagraphIndent: 0,
+ TypographyListItemDParagraphSpacing: 16,
+ TypographyListItemDTextCase: 'none',
+ TypographyListItemMFontSize: 18,
+ TypographyListItemMTextDecoration: 'none',
+ TypographyListItemMFontFamily: 'IBM Plex Mono',
+ TypographyListItemMFontWeight: 500,
+ TypographyListItemMFontStyle: 'normal',
+ TypographyListItemMFontStretch: 'normal',
+ TypographyListItemMLetterSpacing: 0,
+ TypographyListItemMLineHeight: 26,
+ TypographyListItemMParagraphIndent: 0,
+ TypographyListItemMParagraphSpacing: 16,
+ TypographyListItemMTextCase: 'none',
+ TypographyTableHeadersDFontSize: 18,
+ TypographyTableHeadersDTextDecoration: 'none',
+ TypographyTableHeadersDFontFamily: 'IBM Plex Mono',
+ TypographyTableHeadersDFontWeight: 700,
+ TypographyTableHeadersDFontStyle: 'normal',
+ TypographyTableHeadersDFontStretch: 'normal',
+ TypographyTableHeadersDLetterSpacing: 0,
+ TypographyTableHeadersDLineHeight: 28,
+ TypographyTableHeadersDParagraphIndent: 0,
+ TypographyTableHeadersDParagraphSpacing: 0,
+ TypographyTableHeadersDTextCase: 'uppercase',
+ TypographyTableHeadersMFontSize: 18,
+ TypographyTableHeadersMTextDecoration: 'none',
+ TypographyTableHeadersMFontFamily: 'IBM Plex Mono',
+ TypographyTableHeadersMFontWeight: 700,
+ TypographyTableHeadersMFontStyle: 'normal',
+ TypographyTableHeadersMFontStretch: 'normal',
+ TypographyTableHeadersMLetterSpacing: 0,
+ TypographyTableHeadersMLineHeight: 28,
+ TypographyTableHeadersMParagraphIndent: 0,
+ TypographyTableHeadersMParagraphSpacing: 0,
+ TypographyTableHeadersMTextCase: 'uppercase',
+ TypographyH2DMediumFontSize: 24,
+ TypographyH2DMediumTextDecoration: 'none',
+ TypographyH2DMediumFontFamily: 'IBM Plex Mono',
+ TypographyH2DMediumFontWeight: 500,
+ TypographyH2DMediumFontStyle: 'normal',
+ TypographyH2DMediumFontStretch: 'normal',
+ TypographyH2DMediumLetterSpacing: 0,
+ TypographyH2DMediumLineHeight: 32,
+ TypographyH2DMediumParagraphIndent: 0,
+ TypographyH2DMediumParagraphSpacing: 0,
+ TypographyH2DMediumTextCase: 'none',
+ TypographyH2MMediumFontSize: 24,
+ TypographyH2MMediumTextDecoration: 'none',
+ TypographyH2MMediumFontFamily: 'IBM Plex Mono',
+ TypographyH2MMediumFontWeight: 500,
+ TypographyH2MMediumFontStyle: 'normal',
+ TypographyH2MMediumFontStretch: 'normal',
+ TypographyH2MMediumLetterSpacing: 0,
+ TypographyH2MMediumLineHeight: 32,
+ TypographyH2MMediumParagraphIndent: 0,
+ TypographyH2MMediumParagraphSpacing: 0,
+ TypographyH2MMediumTextCase: 'none',
+ TypographyTagsDUnderlineFontSize: 12,
+ TypographyTagsDUnderlineTextDecoration: 'underline',
+ TypographyTagsDUnderlineFontFamily: 'IBM Plex Mono',
+ TypographyTagsDUnderlineFontWeight: 500,
+ TypographyTagsDUnderlineFontStyle: 'normal',
+ TypographyTagsDUnderlineFontStretch: 'normal',
+ TypographyTagsDUnderlineLetterSpacing: 0,
+ TypographyTagsDUnderlineLineHeight: 12,
+ TypographyTagsDUnderlineParagraphIndent: 0,
+ TypographyTagsDUnderlineParagraphSpacing: 0,
+ TypographyTagsDUnderlineTextCase: 'none',
+ TypographyTagsMUnderlineFontSize: 12,
+ TypographyTagsMUnderlineTextDecoration: 'underline',
+ TypographyTagsMUnderlineFontFamily: 'IBM Plex Mono',
+ TypographyTagsMUnderlineFontWeight: 500,
+ TypographyTagsMUnderlineFontStyle: 'normal',
+ TypographyTagsMUnderlineFontStretch: 'normal',
+ TypographyTagsMUnderlineLetterSpacing: 0,
+ TypographyTagsMUnderlineLineHeight: 12,
+ TypographyTagsMUnderlineParagraphIndent: 0,
+ TypographyTagsMUnderlineParagraphSpacing: 0,
+ TypographyTagsMUnderlineTextCase: 'none',
+ TypographyH3DUnderlineFontSize: 18,
+ TypographyH3DUnderlineTextDecoration: 'underline',
+ TypographyH3DUnderlineFontFamily: 'IBM Plex Mono',
+ TypographyH3DUnderlineFontWeight: 500,
+ TypographyH3DUnderlineFontStyle: 'normal',
+ TypographyH3DUnderlineFontStretch: 'normal',
+ TypographyH3DUnderlineLetterSpacing: 0,
+ TypographyH3DUnderlineLineHeight: 24,
+ TypographyH3DUnderlineParagraphIndent: 0,
+ TypographyH3DUnderlineParagraphSpacing: 0,
+ TypographyH3DUnderlineTextCase: 'none',
+ TypographyH3MUnderlineFontSize: 18,
+ TypographyH3MUnderlineTextDecoration: 'underline',
+ TypographyH3MUnderlineFontFamily: 'IBM Plex Mono',
+ TypographyH3MUnderlineFontWeight: 500,
+ TypographyH3MUnderlineFontStyle: 'normal',
+ TypographyH3MUnderlineFontStretch: 'normal',
+ TypographyH3MUnderlineLetterSpacing: 0,
+ TypographyH3MUnderlineLineHeight: 24,
+ TypographyH3MUnderlineParagraphIndent: 0,
+ TypographyH3MUnderlineParagraphSpacing: 0,
+ TypographyH3MUnderlineTextCase: 'none',
+ TypographyBody3MFontSize: 14,
+ TypographyBody3MTextDecoration: 'none',
+ TypographyBody3MFontFamily: 'IBM Plex Mono',
+ TypographyBody3MFontWeight: 400,
+ TypographyBody3MFontStyle: 'normal',
+ TypographyBody3MFontStretch: 'normal',
+ TypographyBody3MLetterSpacing: 0,
+ TypographyBody3MLineHeight: 20,
+ TypographyBody3MParagraphIndent: 0,
+ TypographyBody3MParagraphSpacing: 0,
+ TypographyBody3MTextCase: 'none',
+ TypographyH1TFontSize: 48,
+ TypographyH1TTextDecoration: 'none',
+ TypographyH1TFontFamily: 'IBM Plex Mono',
+ TypographyH1TFontWeight: 700,
+ TypographyH1TFontStyle: 'normal',
+ TypographyH1TFontStretch: 'normal',
+ TypographyH1TLetterSpacing: -1,
+ TypographyH1TLineHeight: 50,
+ TypographyH1TParagraphIndent: 0,
+ TypographyH1TParagraphSpacing: 0,
+ TypographyH1TTextCase: 'none',
+ TypographyBreadcrumbsDUnderlineFontSize: 16,
+ TypographyBreadcrumbsDUnderlineTextDecoration: 'underline',
+ TypographyBreadcrumbsDUnderlineFontFamily: 'IBM Plex Mono',
+ TypographyBreadcrumbsDUnderlineFontWeight: 400,
+ TypographyBreadcrumbsDUnderlineFontStyle: 'normal',
+ TypographyBreadcrumbsDUnderlineFontStretch: 'normal',
+ TypographyBreadcrumbsDUnderlineLetterSpacing: 0,
+ TypographyBreadcrumbsDUnderlineLineHeight: 20,
+ TypographyBreadcrumbsDUnderlineParagraphIndent: 0,
+ TypographyBreadcrumbsDUnderlineParagraphSpacing: 0,
+ TypographyBreadcrumbsDUnderlineTextCase: 'none',
+ TypographyBreadcrumbsDFontSize: 16,
+ TypographyBreadcrumbsDTextDecoration: 'none',
+ TypographyBreadcrumbsDFontFamily: 'IBM Plex Mono',
+ TypographyBreadcrumbsDFontWeight: 400,
+ TypographyBreadcrumbsDFontStyle: 'normal',
+ TypographyBreadcrumbsDFontStretch: 'normal',
+ TypographyBreadcrumbsDLetterSpacing: 0,
+ TypographyBreadcrumbsDLineHeight: 20,
+ TypographyBreadcrumbsDParagraphIndent: 0,
+ TypographyBreadcrumbsDParagraphSpacing: 0,
+ TypographyBreadcrumbsDTextCase: 'none',
+};
diff --git a/site/src/css/text.css b/site/src/css/text.css
new file mode 100644
index 0000000..0221ea8
--- /dev/null
+++ b/site/src/css/text.css
@@ -0,0 +1,8 @@
+header {
+ color: var(--color-yellow);
+}
+
+.avatar__name::before {
+ content: "Posted by ";
+ color: var(--color-yellow);
+}
\ No newline at end of file
diff --git a/site/src/css/variables.css b/site/src/css/variables.css
new file mode 100644
index 0000000..43091f1
--- /dev/null
+++ b/site/src/css/variables.css
@@ -0,0 +1,431 @@
+:root {
+ --color-black: #000000;
+ --color-yellow: #ffec19;
+ --color-blue: #24f2ff;
+ --color-purple: #9a1aff;
+ --color-white: #ffffff;
+ --color-red: #ff2e00;
+ --color-grey-dark: #333333;
+ --tbd-font-mono: 'IBM Plex Mono';
+ --tbd-font-sans: 'IBM Plex Sans';
+ --tbd-line-height-heading: 1.5;
+ --tbd-line-height: 1.75;
+ --typography-h1-d-font-size: 3.052rem;
+ --typography-h1-d-text-decoration: none;
+ --typography-h1-d-font-family: var(--tbd-font-mono);
+ --typography-h1-d-font-weight: 700;
+ --typography-h1-d-font-style: normal;
+ --typography-h1-d-font-stretch: normal;
+ --typography-h1-d-letter-spacing: -1px;
+ --typography-h1-d-line-height: var(--tbd-line-height-heading);
+ --typography-h1-d-paragraph-indent: 0;
+ --typography-h1-d-paragraph-spacing: 0;
+ --typography-h1-d-text-case: none;
+ --typography-h2-d-font-size: 2.441rem;
+ --typography-h2-d-text-decoration: none;
+ --typography-h2-d-font-family: var(--tbd-font-mono);
+ --typography-h2-d-font-weight: 700;
+ --typography-h2-d-font-style: normal;
+ --typography-h2-d-font-stretch: normal;
+ --typography-h2-d-letter-spacing: 0;
+ --typography-h2-d-line-height: var(--tbd-line-height-heading);
+ --typography-h2-d-paragraph-indent: 0;
+ --typography-h2-d-paragraph-spacing: 0;
+ --typography-h2-d-text-case: uppercase;
+ --typography-body-1-d-font-size: 18px;
+ --typography-body-1-d-text-decoration: none;
+ --typography-body-1-d-font-family: var(--tbd-font-mono);
+ --typography-body-1-d-font-weight: 400;
+ --typography-body-1-d-font-style: normal;
+ --typography-body-1-d-font-stretch: normal;
+ --typography-body-1-d-letter-spacing: 0;
+ --typography-body-1-d-line-height: var(--tbd-line-height);
+ --typography-body-1-d-paragraph-indent: 0;
+ --typography-body-1-d-paragraph-spacing: 16px;
+ --typography-body-1-d-text-case: none;
+ --typography-body-2-d-font-size: 14px;
+ --typography-body-2-d-text-decoration: none;
+ --typography-body-2-d-font-family: var(--tbd-font-mono);
+ --typography-body-2-d-font-weight: 400;
+ --typography-body-2-d-font-style: normal;
+ --typography-body-2-d-font-stretch: normal;
+ --typography-body-2-d-letter-spacing: 0;
+ --typography-body-2-d-line-height: var(--tbd-line-height);
+ --typography-body-2-d-paragraph-indent: 0;
+ --typography-body-2-d-paragraph-spacing: 0;
+ --typography-body-2-d-text-case: none;
+ --typography-links-d-font-size: 18px;
+ --typography-links-d-text-decoration: none;
+ --typography-links-d-font-family: var(--tbd-font-mono);
+ --typography-links-d-font-weight: 500;
+ --typography-links-d-font-style: normal;
+ --typography-links-d-font-stretch: normal;
+ --typography-links-d-letter-spacing: 0;
+ --typography-links-d-line-height: var(--tbd-line-height);
+ --typography-links-d-paragraph-indent: 0;
+ --typography-links-d-paragraph-spacing: 0;
+ --typography-links-d-text-case: none;
+ --typography-input-field-label-d-font-size: 12px;
+ --typography-input-field-label-d-text-decoration: none;
+ --typography-input-field-label-d-font-family: var(--tbd-font-mono);
+ --typography-input-field-label-d-font-weight: 400;
+ --typography-input-field-label-d-font-style: normal;
+ --typography-input-field-label-d-font-stretch: normal;
+ --typography-input-field-label-d-letter-spacing: 0;
+ --typography-input-field-label-d-line-height: var(--tbd-line-height);
+ --typography-input-field-label-d-paragraph-indent: 0;
+ --typography-input-field-label-d-paragraph-spacing: 0;
+ --typography-input-field-label-d-text-case: none;
+ --typography-tags-d-font-size: 12px;
+ --typography-tags-d-text-decoration: none;
+ --typography-tags-d-font-family: var(--tbd-font-mono);
+ --typography-tags-d-font-weight: 500;
+ --typography-tags-d-font-style: normal;
+ --typography-tags-d-font-stretch: normal;
+ --typography-tags-d-letter-spacing: 0;
+ --typography-tags-d-line-height: var(--tbd-line-height);
+ --typography-tags-d-paragraph-indent: 0;
+ --typography-tags-d-paragraph-spacing: 0;
+ --typography-tags-d-text-case: none;
+ --typography-h1-m-font-size: 32px;
+ --typography-h1-m-text-decoration: none;
+ --typography-h1-m-font-family: var(--tbd-font-mono);
+ --typography-h1-m-font-weight: 700;
+ --typography-h1-m-font-style: normal;
+ --typography-h1-m-font-stretch: normal;
+ --typography-h1-m-letter-spacing: -1px;
+ --typography-h1-m-line-height: var(--tbd-line-height-heading);
+ --typography-h1-m-paragraph-indent: 0;
+ --typography-h1-m-paragraph-spacing: 0;
+ --typography-h1-m-text-case: none;
+ --typography-h2-m-font-size: 24px;
+ --typography-h2-m-text-decoration: none;
+ --typography-h2-m-font-family: var(--tbd-font-mono);
+ --typography-h2-m-font-weight: 700;
+ --typography-h2-m-font-style: normal;
+ --typography-h2-m-font-stretch: normal;
+ --typography-h2-m-letter-spacing: 0;
+ --typography-h2-m-line-height: var(--tbd-line-height-heading);
+ --typography-h2-m-paragraph-indent: 0;
+ --typography-h2-m-paragraph-spacing: 0;
+ --typography-h2-m-text-case: uppercase;
+ --typography-body-1-m-font-size: 18px;
+ --typography-body-1-m-text-decoration: none;
+ --typography-body-1-m-font-family: var(--tbd-font-mono);
+ --typography-body-1-m-font-weight: 400;
+ --typography-body-1-m-font-style: normal;
+ --typography-body-1-m-font-stretch: normal;
+ --typography-body-1-m-letter-spacing: 0;
+ --typography-body-1-m-line-height: var(--tbd-line-height);
+ --typography-body-1-m-paragraph-indent: 0;
+ --typography-body-1-m-paragraph-spacing: 16px;
+ --typography-body-1-m-text-case: none;
+ --typography-body-2-m-font-size: 12px;
+ --typography-body-2-m-text-decoration: none;
+ --typography-body-2-m-font-family: var(--tbd-font-mono);
+ --typography-body-2-m-font-weight: 400;
+ --typography-body-2-m-font-style: normal;
+ --typography-body-2-m-font-stretch: normal;
+ --typography-body-2-m-letter-spacing: 0;
+ --typography-body-2-m-line-height: var(--tbd-line-height);
+ --typography-body-2-m-paragraph-indent: 0;
+ --typography-body-2-m-paragraph-spacing: 0;
+ --typography-body-2-m-text-case: none;
+ --typography-links-m-font-size: 18px;
+ --typography-links-m-text-decoration: none;
+ --typography-links-m-font-family: var(--tbd-font-mono);
+ --typography-links-m-font-weight: 500;
+ --typography-links-m-font-style: normal;
+ --typography-links-m-font-stretch: normal;
+ --typography-links-m-letter-spacing: 0;
+ --typography-links-m-line-height: var(--tbd-line-height);
+ --typography-links-m-paragraph-indent: 0;
+ --typography-links-m-paragraph-spacing: 0;
+ --typography-links-m-text-case: none;
+ --typography-input-field-label-m-font-size: 12px;
+ --typography-input-field-label-m-text-decoration: none;
+ --typography-input-field-label-m-font-family: var(--tbd-font-mono);
+ --typography-input-field-label-m-font-weight: 400;
+ --typography-input-field-label-m-font-style: normal;
+ --typography-input-field-label-m-font-stretch: normal;
+ --typography-input-field-label-m-letter-spacing: 0;
+ --typography-input-field-label-m-line-height: var(--tbd-line-height);
+ --typography-input-field-label-m-paragraph-indent: 0;
+ --typography-input-field-label-m-paragraph-spacing: 0;
+ --typography-input-field-label-m-text-case: none;
+ --typography-tags-m-font-size: 12px;
+ --typography-tags-m-text-decoration: none;
+ --typography-tags-m-font-family: var(--tbd-font-mono);
+ --typography-tags-m-font-weight: 500;
+ --typography-tags-m-font-style: normal;
+ --typography-tags-m-font-stretch: normal;
+ --typography-tags-m-letter-spacing: 0;
+ --typography-tags-m-line-height: var(--tbd-line-height);
+ --typography-tags-m-paragraph-indent: 0;
+ --typography-tags-m-paragraph-spacing: 0;
+ --typography-tags-m-text-case: none;
+ --typography-h3-m-font-size: 18px;
+ --typography-h3-m-text-decoration: none;
+ --typography-h3-m-font-family: var(--tbd-font-mono);
+ --typography-h3-m-font-weight: 500;
+ --typography-h3-m-font-style: normal;
+ --typography-h3-m-font-stretch: normal;
+ --typography-h3-m-letter-spacing: 0;
+ --typography-h3-m-line-height: var(--tbd-line-height-heading);
+ --typography-h3-m-paragraph-indent: 0;
+ --typography-h3-m-paragraph-spacing: 0;
+ --typography-h3-m-text-case: none;
+ --typography-h3-d-font-size: 1.953rem;
+ --typography-h3-d-text-decoration: none;
+ --typography-h3-d-font-family: var(--tbd-font-mono);
+ --typography-h3-d-font-weight: 500;
+ --typography-h3-d-font-style: normal;
+ --typography-h3-d-font-stretch: normal;
+ --typography-h3-d-letter-spacing: 0;
+ --typography-h3-d-line-height: var(--tbd-line-height-heading);
+ --typography-h3-d-paragraph-indent: 0;
+ --typography-h3-d-paragraph-spacing: 0;
+ --typography-h3-d-text-case: none;
+ --typography-h4-d-font-size: 1.563rem;
+ --typography-h4-d-text-decoration: none;
+ --typography-h4-d-font-family: var(--tbd-font-mono);
+ --typography-h4-d-font-weight: 700;
+ --typography-h4-d-font-style: normal;
+ --typography-h4-d-font-stretch: normal;
+ --typography-h4-d-letter-spacing: 0;
+ --typography-h4-d-line-height: var(--tbd-line-height-heading);
+ --typography-h4-d-paragraph-indent: 0;
+ --typography-h4-d-paragraph-spacing: 0;
+ --typography-h4-d-text-case: none;
+ --typography-h4-m-font-size: 18px;
+ --typography-h4-m-text-decoration: none;
+ --typography-h4-m-font-family: var(--tbd-font-mono);
+ --typography-h4-m-font-weight: 700;
+ --typography-h4-m-font-style: normal;
+ --typography-h4-m-font-stretch: normal;
+ --typography-h4-m-letter-spacing: 0;
+ --typography-h4-m-line-height: var(--tbd-line-height-heading);
+ --typography-h4-m-paragraph-indent: 0;
+ --typography-h4-m-paragraph-spacing: 0;
+ --typography-h4-m-text-case: none;
+ --typography-body-1-d-bold-font-size: 18px;
+ --typography-body-1-d-bold-text-decoration: none;
+ --typography-body-1-d-bold-font-family: var(--tbd-font-mono);
+ --typography-body-1-d-bold-font-weight: 700;
+ --typography-body-1-d-bold-font-style: normal;
+ --typography-body-1-d-bold-font-stretch: normal;
+ --typography-body-1-d-bold-letter-spacing: 0;
+ --typography-body-1-d-bold-line-height: var(--tbd-line-height);
+ --typography-body-1-d-bold-paragraph-indent: 0;
+ --typography-body-1-d-bold-paragraph-spacing: 16px;
+ --typography-body-1-d-bold-text-case: none;
+ --typography-body-1-m-bold-font-size: 18px;
+ --typography-body-1-m-bold-text-decoration: none;
+ --typography-body-1-m-bold-font-family: var(--tbd-font-mono);
+ --typography-body-1-m-bold-font-weight: 700;
+ --typography-body-1-m-bold-font-style: normal;
+ --typography-body-1-m-bold-font-stretch: normal;
+ --typography-body-1-m-bold-letter-spacing: 0;
+ --typography-body-1-m-bold-line-height: var(--tbd-line-height);
+ --typography-body-1-m-bold-paragraph-indent: 0;
+ --typography-body-1-m-bold-paragraph-spacing: 16px;
+ --typography-body-1-m-bold-text-case: none;
+ --typography-list-item-bullets-d-font-size: 18px;
+ --typography-list-item-bullets-d-text-decoration: none;
+ --typography-list-item-bullets-d-font-family: var(--tbd-font-mono);
+ --typography-list-item-bullets-d-font-weight: 400;
+ --typography-list-item-bullets-d-font-style: normal;
+ --typography-list-item-bullets-d-font-stretch: normal;
+ --typography-list-item-bullets-d-letter-spacing: 0;
+ --typography-list-item-bullets-d-line-height: var(--tbd-line-height);
+ --typography-list-item-bullets-d-paragraph-indent: 0;
+ --typography-list-item-bullets-d-paragraph-spacing: 16px;
+ --typography-list-item-bullets-d-text-case: none;
+ --typography-list-item-bullets-m-font-size: 18px;
+ --typography-list-item-bullets-m-text-decoration: none;
+ --typography-list-item-bullets-m-font-family: var(--tbd-font-mono);
+ --typography-list-item-bullets-m-font-weight: 400;
+ --typography-list-item-bullets-m-font-style: normal;
+ --typography-list-item-bullets-m-font-stretch: normal;
+ --typography-list-item-bullets-m-letter-spacing: 0;
+ --typography-list-item-bullets-m-line-height: var(--tbd-line-height);
+ --typography-list-item-bullets-m-paragraph-indent: 0;
+ --typography-list-item-bullets-m-paragraph-spacing: 16px;
+ --typography-list-item-bullets-m-text-case: none;
+ --typography-links-d-underline-font-size: 18px;
+ --typography-links-d-underline-text-decoration: underline;
+ --typography-links-d-underline-font-family: var(--tbd-font-mono);
+ --typography-links-d-underline-font-weight: 500;
+ --typography-links-d-underline-font-style: normal;
+ --typography-links-d-underline-font-stretch: normal;
+ --typography-links-d-underline-letter-spacing: 0;
+ --typography-links-d-underline-line-height: var(--tbd-line-height);
+ --typography-links-d-underline-paragraph-indent: 0;
+ --typography-links-d-underline-paragraph-spacing: 0;
+ --typography-links-d-underline-text-case: none;
+ --typography-links-m-underline-font-size: 18px;
+ --typography-links-m-underline-text-decoration: underline;
+ --typography-links-m-underline-font-family: var(--tbd-font-mono);
+ --typography-links-m-underline-font-weight: 500;
+ --typography-links-m-underline-font-style: normal;
+ --typography-links-m-underline-font-stretch: normal;
+ --typography-links-m-underline-letter-spacing: 0;
+ --typography-links-m-underline-line-height: var(--tbd-line-height);
+ --typography-links-m-underline-paragraph-indent: 0;
+ --typography-links-m-underline-paragraph-spacing: 0;
+ --typography-links-m-underline-text-case: none;
+ --typography-list-item-d-font-size: 18px;
+ --typography-list-item-d-text-decoration: none;
+ --typography-list-item-d-font-family: var(--tbd-font-mono);
+ --typography-list-item-d-font-weight: 500;
+ --typography-list-item-d-font-style: normal;
+ --typography-list-item-d-font-stretch: normal;
+ --typography-list-item-d-letter-spacing: 0;
+ --typography-list-item-d-line-height: var(--tbd-line-height);
+ --typography-list-item-d-paragraph-indent: 0;
+ --typography-list-item-d-paragraph-spacing: 16px;
+ --typography-list-item-d-text-case: none;
+ --typography-list-item-m-font-size: 18px;
+ --typography-list-item-m-text-decoration: none;
+ --typography-list-item-m-font-family: var(--tbd-font-mono);
+ --typography-list-item-m-font-weight: 500;
+ --typography-list-item-m-font-style: normal;
+ --typography-list-item-m-font-stretch: normal;
+ --typography-list-item-m-letter-spacing: 0;
+ --typography-list-item-m-line-height: var(--tbd-line-height);
+ --typography-list-item-m-paragraph-indent: 0;
+ --typography-list-item-m-paragraph-spacing: 16px;
+ --typography-list-item-m-text-case: none;
+ --typography-table-headers-d-font-size: 18px;
+ --typography-table-headers-d-text-decoration: none;
+ --typography-table-headers-d-font-family: var(--tbd-font-mono);
+ --typography-table-headers-d-font-weight: 700;
+ --typography-table-headers-d-font-style: normal;
+ --typography-table-headers-d-font-stretch: normal;
+ --typography-table-headers-d-letter-spacing: 0;
+ --typography-table-headers-d-line-height: var(--tbd-line-height);
+ --typography-table-headers-d-paragraph-indent: 0;
+ --typography-table-headers-d-paragraph-spacing: 0;
+ --typography-table-headers-d-text-case: uppercase;
+ --typography-table-headers-m-font-size: 18px;
+ --typography-table-headers-m-text-decoration: none;
+ --typography-table-headers-m-font-family: var(--tbd-font-mono);
+ --typography-table-headers-m-font-weight: 700;
+ --typography-table-headers-m-font-style: normal;
+ --typography-table-headers-m-font-stretch: normal;
+ --typography-table-headers-m-letter-spacing: 0;
+ --typography-table-headers-m-line-height: var(--tbd-line-height);
+ --typography-table-headers-m-paragraph-indent: 0;
+ --typography-table-headers-m-paragraph-spacing: 0;
+ --typography-table-headers-m-text-case: uppercase;
+ --typography-h2-d-medium-font-size: 24px;
+ --typography-h2-d-medium-text-decoration: none;
+ --typography-h2-d-medium-font-family: var(--tbd-font-mono);
+ --typography-h2-d-medium-font-weight: 500;
+ --typography-h2-d-medium-font-style: normal;
+ --typography-h2-d-medium-font-stretch: normal;
+ --typography-h2-d-medium-letter-spacing: 0;
+ --typography-h2-d-medium-line-height: var(--tbd-line-height-heading);
+ --typography-h2-d-medium-paragraph-indent: 0;
+ --typography-h2-d-medium-paragraph-spacing: 0;
+ --typography-h2-d-medium-text-case: none;
+ --typography-h2-m-medium-font-size: 24px;
+ --typography-h2-m-medium-text-decoration: none;
+ --typography-h2-m-medium-font-family: var(--tbd-font-mono);
+ --typography-h2-m-medium-font-weight: 500;
+ --typography-h2-m-medium-font-style: normal;
+ --typography-h2-m-medium-font-stretch: normal;
+ --typography-h2-m-medium-letter-spacing: 0;
+ --typography-h2-m-medium-line-height: var(--tbd-line-height-heading);
+ --typography-h2-m-medium-paragraph-indent: 0;
+ --typography-h2-m-medium-paragraph-spacing: 0;
+ --typography-h2-m-medium-text-case: none;
+ --typography-tags-d-underline-font-size: 12px;
+ --typography-tags-d-underline-text-decoration: underline;
+ --typography-tags-d-underline-font-family: var(--tbd-font-mono);
+ --typography-tags-d-underline-font-weight: 500;
+ --typography-tags-d-underline-font-style: normal;
+ --typography-tags-d-underline-font-stretch: normal;
+ --typography-tags-d-underline-letter-spacing: 0;
+ --typography-tags-d-underline-line-height: var(--tbd-line-height);
+ --typography-tags-d-underline-paragraph-indent: 0;
+ --typography-tags-d-underline-paragraph-spacing: 0;
+ --typography-tags-d-underline-text-case: none;
+ --typography-tags-m-underline-font-size: 12px;
+ --typography-tags-m-underline-text-decoration: underline;
+ --typography-tags-m-underline-font-family: var(--tbd-font-mono);
+ --typography-tags-m-underline-font-weight: 500;
+ --typography-tags-m-underline-font-style: normal;
+ --typography-tags-m-underline-font-stretch: normal;
+ --typography-tags-m-underline-letter-spacing: 0;
+ --typography-tags-m-underline-line-height: var(--tbd-line-height);
+ --typography-tags-m-underline-paragraph-indent: 0;
+ --typography-tags-m-underline-paragraph-spacing: 0;
+ --typography-tags-m-underline-text-case: none;
+ --typography-h3-d-underline-font-size: 18px;
+ --typography-h3-d-underline-text-decoration: underline;
+ --typography-h3-d-underline-font-family: var(--tbd-font-mono);
+ --typography-h3-d-underline-font-weight: 500;
+ --typography-h3-d-underline-font-style: normal;
+ --typography-h3-d-underline-font-stretch: normal;
+ --typography-h3-d-underline-letter-spacing: 0;
+ --typography-h3-d-underline-line-height: var(--tbd-line-height-heading);
+ --typography-h3-d-underline-paragraph-indent: 0;
+ --typography-h3-d-underline-paragraph-spacing: 0;
+ --typography-h3-d-underline-text-case: none;
+ --typography-h3-m-underline-font-size: 18px;
+ --typography-h3-m-underline-text-decoration: underline;
+ --typography-h3-m-underline-font-family: var(--tbd-font-mono);
+ --typography-h3-m-underline-font-weight: 500;
+ --typography-h3-m-underline-font-style: normal;
+ --typography-h3-m-underline-font-stretch: normal;
+ --typography-h3-m-underline-letter-spacing: 0;
+ --typography-h3-m-underline-line-height: var(--tbd-line-height-heading);
+ --typography-h3-m-underline-paragraph-indent: 0;
+ --typography-h3-m-underline-paragraph-spacing: 0;
+ --typography-h3-m-underline-text-case: none;
+ --typography-body-3-m-font-size: 14px;
+ --typography-body-3-m-text-decoration: none;
+ --typography-body-3-m-font-family: var(--tbd-font-mono);
+ --typography-body-3-m-font-weight: 400;
+ --typography-body-3-m-font-style: normal;
+ --typography-body-3-m-font-stretch: normal;
+ --typography-body-3-m-letter-spacing: 0;
+ --typography-body-3-m-line-height: var(--tbd-line-height);
+ --typography-body-3-m-paragraph-indent: 0;
+ --typography-body-3-m-paragraph-spacing: 0;
+ --typography-body-3-m-text-case: none;
+ --typography-h1-t-font-size: 48px;
+ --typography-h1-t-text-decoration: none;
+ --typography-h1-t-font-family: var(--tbd-font-mono);
+ --typography-h1-t-font-weight: 700;
+ --typography-h1-t-font-style: normal;
+ --typography-h1-t-font-stretch: normal;
+ --typography-h1-t-letter-spacing: -1px;
+ --typography-h1-t-line-height: var(--tbd-line-height-heading);
+ --typography-h1-t-paragraph-indent: 0;
+ --typography-h1-t-paragraph-spacing: 0;
+ --typography-h1-t-text-case: none;
+ --typography-breadcrumbs-d-underline-font-size: 16px;
+ --typography-breadcrumbs-d-underline-text-decoration: underline;
+ --typography-breadcrumbs-d-underline-font-family: var(--tbd-font-mono);
+ --typography-breadcrumbs-d-underline-font-weight: 400;
+ --typography-breadcrumbs-d-underline-font-style: normal;
+ --typography-breadcrumbs-d-underline-font-stretch: normal;
+ --typography-breadcrumbs-d-underline-letter-spacing: 0;
+ --typography-breadcrumbs-d-underline-line-height: var(--tbd-line-height);
+ --typography-breadcrumbs-d-underline-paragraph-indent: 0;
+ --typography-breadcrumbs-d-underline-paragraph-spacing: 0;
+ --typography-breadcrumbs-d-underline-text-case: none;
+ --typography-breadcrumbs-d-font-size: 16px;
+ --typography-breadcrumbs-d-text-decoration: none;
+ --typography-breadcrumbs-d-font-family: var(--tbd-font-mono);
+ --typography-breadcrumbs-d-font-weight: 400;
+ --typography-breadcrumbs-d-font-style: normal;
+ --typography-breadcrumbs-d-font-stretch: normal;
+ --typography-breadcrumbs-d-letter-spacing: 0;
+ --typography-breadcrumbs-d-line-height: var(--tbd-line-height);
+ --typography-breadcrumbs-d-paragraph-indent: 0;
+ --typography-breadcrumbs-d-paragraph-spacing: 0;
+ --typography-breadcrumbs-d-text-case: none;
+}
diff --git a/site/src/css/web5-quickstart.css b/site/src/css/web5-quickstart.css
new file mode 100644
index 0000000..50868ab
--- /dev/null
+++ b/site/src/css/web5-quickstart.css
@@ -0,0 +1,94 @@
+body {
+ margin: 0;
+ font-family: sans-serif;
+}
+
+body > progress {
+ position: fixed;
+ inset: 0;
+ display: block;
+ width: 50vw;
+ margin: calc(50vh - 0.5em) 25vw;
+}
+
+body > progress ~ * {
+ display: none;
+}
+
+.sandbox-container progress {
+ vertical-align: middle;
+ visibility: visible;
+}
+
+.markdown progress {
+ vertical-align: middle;
+ visibility: visible;
+}
+
+.markdown input[type='file'] {
+ display: block;
+ margin-bottom: 0.5em;
+}
+
+.markdown textarea {
+ display: block;
+ width: 100%;
+ min-height: 8em;
+ font-family: monospace;
+ resize: vertical;
+}
+
+.markdown code {
+ font-size: 90%;
+}
+
+.markdown .output {
+ width: 100%;
+ margin-top: 2em;
+ margin-bottom: 2em;
+}
+
+.input button {
+ border-color: var(--color-blue);
+ color: var(--color-blue);
+ padding: 0.5em 1em;
+ text-align: center;
+ border: 2px solid;
+ border-radius: 0.5em;
+}
+
+.input button:disabled {
+ border-color: gray;
+ color: gray;
+ padding: 0.5em 1em;
+ text-align: center;
+ border: 2px solid;
+ border-radius: 0.5em;
+}
+
+.quickstart-container {
+ margin: 0 2em;
+}
+
+.result {
+ color: white;
+ font-weight: bold;
+ font-size: 2em;
+}
+
+.json-view {
+ color: white !important;
+ --json-property: var(--color-yellow) !important;
+ --json-index: var(--color-yellow) !important;
+ --json-number:var(--color-blue) !important;
+ --json-string: var(--color-blue) !important;
+ --json-boolean: var(--color-blue) !important;
+ --json-null: var(--color-blue) !important;
+}
+
+.json-view .json-view--property { color: var(--json-property); }
+.json-view .json-view--index { color: var(--json-index); }
+.json-view .json-view--number { color: var(--json-number); }
+.json-view .json-view--string { color: var(--json-string); }
+.json-view .json-view--boolean { color: var(--json-boolean); }
+.json-view .json-view--null { color: var(--json-null); }
\ No newline at end of file
diff --git a/site/src/externalContributors.json b/site/src/externalContributors.json
new file mode 100644
index 0000000..af7839a
--- /dev/null
+++ b/site/src/externalContributors.json
@@ -0,0 +1,177 @@
+[
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/TBD_nabhel.png",
+ "title": "My Hacktoberfest Experience Contributing to TBD",
+ "link": "https://dev.to/nabhel/my-hacktoberfest-experience-contributing-to-tbd-3i6f",
+ "contributor": "Nabhel"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/kiranbaliga.png",
+ "title": "Key Management for DIDs",
+ "link": "https://dev.to/kiran_baliga/key-management-for-dids-in-web5-a-beginners-guide-28nj",
+ "contributor": "Kiran Baliga"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/Ashit743_DWN_Web5.png",
+ "title": "What are DWNs in Web5?",
+ "link": "https://medium.com/@ashitsdarurmath/what-are-dwns-in-web5-5ae759341a6d",
+ "contributor": "Ashit Darurmath"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/Kiran_verificablecredentials_1.png",
+ "title": "Verifiable Credentials (VCs) in Web5",
+ "link": "https://dev.to/kiran_baliga/understanding-verifiable-credentials-vcs-in-web5-a-beginners-guide-f38",
+ "contributor": "Kiran Baliga"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/chrissiku_the_future_0f_web.png",
+ "title": "The Future of Web: How Web5 Transforms Identity and Data OwnerShip",
+ "link": "https://dev.to/chrissiku/the-future-of-web-how-web5-transforms-identity-and-data-ownership-2062",
+ "contributor": "Christian Siku"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/how_to_resolve_dids.png",
+ "title": "Decentralized Identity Simplified: How to Resolve DIDs Effectively",
+ "link": "https://dev.to/chrissiku/decentralized-identity-simplified-how-to-resolve-dids-effectively-36kp",
+ "contributor": "Christian Siku"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/Lymah123_comparing_DID_methods.png",
+ "title": "Comparing Dentralized Identifier (DID) Methods",
+ "link": "https://dev.to/lymah/comparing-decentralized-identifiersdid-methods-el",
+ "contributor": "Lymah123"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/DRL.png",
+ "title": "Decentralized Resource Locators(DRL)",
+ "link": "https://dev.to/kiran_baliga/getting-started-with-decentralized-resource-locators-drls-43jd",
+ "contributor": "Kiran Baliga"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/ProtocolRules.png",
+ "title": "Protocol Rules",
+ "link": "https://dev.to/kiran_baliga/a-simple-guide-to-web5-protocol-roles-41m4",
+ "contributor": "Kiran Baliga"
+ },
+ {
+ "type": "video",
+ "thumbnail": "/img/external-contributor/quick_start_web5_chrissiku.png",
+ "title": "My first line of web5.js : Quick start",
+ "link": "https://www.youtube.com/watch?v=4kOBPE63eUc",
+ "contributor": "Christian Siku"
+ },
+ {
+ "type": "video",
+ "thumbnail": "/img/external-contributor/resolve_did_short_chrissiku.jpg",
+ "title": "Resolve a DID",
+ "link": "https://www.youtube.com/shorts/AfLj2il7aGM",
+ "contributor": "Christian Siku"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/Lymah123_understanding_web5_and_its_potential.png",
+ "title": "Understanding Web5 and its Potential",
+ "link": "https://dev.to/lymah/understanding-web5-and-its-potential-2p30",
+ "contributor": "Lymah123"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/hackexperience.png",
+ "title": "Hacktoberfest Experience",
+ "link": "https://dev.to/kiran_baliga/my-hacktoberfest-2024-journey-2odn",
+ "contributor": "Kiran Baliga"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/Lymah123_understanding_dwns.png",
+ "title": "Understanding the Power of Decentralized Web Nodes (DWNs)",
+ "link": "https://dev.to/lymah/understanding-the-power-of-decentralized-web-nodes-dwns-5dm5",
+ "contributor": "Lymah123"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/dwns_blog_chrissiku.png",
+ "title": "Practical Guide to CRUD Operations on DWNs",
+ "link": "https://dev.to/chrissiku/a-practical-guide-to-crud-operations-on-decentralized-web-nodes-aka-dwns-5ca1",
+ "contributor": "Christian Siku"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/Lymah123_protocol_roles.png",
+ "title": "The Role of Protocols in Decentralized Systems",
+ "link": "https://dev.to/lymah/the-role-of-protocols-in-decentralized-systems-3l9f",
+ "contributor": "Lymah123"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/web5_nabhel_new.png",
+ "title": "Understanding Web5: Your Guide to the Decentralized Web",
+ "link": "https://dev.to/nabhel/understanding-web5-your-guide-to-the-decentralized-web-49m2",
+ "contributor": "Nabhel"
+ },
+ {
+ "type": "video",
+ "thumbnail": "/img/external-contributor/web5short.png",
+ "title": "Welcome to the world of Web5",
+ "link": "https://youtube.com/shorts/RznqmwME_p4?si=_snyCXX9hDzgkMO2",
+ "contributor": "Kiran Baliga"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/Lymah123_PFI.png",
+ "title": "How to Stand Up Your Own Participant Financial Institution (PFI)",
+ "link": "https://dev.to/lymah/how-to-stand-up-your-own-participant-financial-institution-pfi-59o8",
+ "contributor": "Lymah123"
+ },
+ {
+ "type": "video",
+ "thumbnail": "/img/external-contributor/VC.png",
+ "title": "Verifiable Credentials",
+ "link": "https://youtu.be/DtiLPhQQnl4?si=zsBgag4dK5TvM8v2",
+ "contributor": "Kiran Baliga"
+ },
+ {
+ "type": "video",
+ "thumbnail": "/img/external-contributor/hfest.png",
+ "title": "Hacktoberfest 2024 Experience",
+ "link": "https://youtu.be/Kb5eqXe3tGo?si=pHNi5kL2r4_jTSvd",
+ "contributor": "Kiran Baliga"
+ },
+ {
+ "type": "video",
+ "thumbnail": "img/external-contributor/dwn_video_thumbnail.png",
+ "title": "What are Decentralized Web Nodes (DWNs)?",
+ "link": "https://youtu.be/p45SB9VfHZI",
+ "contributor": "Mohit Raj Sinha"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/hacktoberfest-journey.png",
+ "title": "Hacktoberfest Journey",
+ "link": "https://medium.com/@ankitv78389/hacktoberfest-journey-1d3c4e48bee2",
+ "contributor": "Ankit Verma"
+ },
+ {
+ "type": "video",
+ "thumbnail": "/img/external-contributor/breehall_verifiable_credentials.png",
+ "title": "Web5: What Are Verifiable Credentials?",
+ "link": "https://www.tiktok.com/@bytesofbree/video/7431311214673726762",
+ "contributor": "Bree Hall"
+ },
+ {
+ "type": "blog",
+ "thumbnail": "/img/external-contributor/mohit_hacktoberfest_journey.png",
+ "title": "Contributing to the Future with TBD: My Hacktoberfest Journey",
+ "link": "https://marstech.hashnode.dev/contributing-to-the-future-with-tbd-my-hacktoberfest-journey",
+ "contributor": "Mohit Raj Sinha"
+ }
+]
diff --git a/site/src/hooks/index.js b/site/src/hooks/index.js
new file mode 100644
index 0000000..5e581c6
--- /dev/null
+++ b/site/src/hooks/index.js
@@ -0,0 +1 @@
+export * from './use-feedback-rating';
diff --git a/site/src/hooks/use-feedback-rating.js b/site/src/hooks/use-feedback-rating.js
new file mode 100644
index 0000000..7395673
--- /dev/null
+++ b/site/src/hooks/use-feedback-rating.js
@@ -0,0 +1,99 @@
+import { useState, useEffect } from 'react';
+import { wait } from '../util/feedback-retry-wait';
+import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
+
+export const useFeedbackRating = () => {
+ const [userFeedback, setUserFeedback] = useState('');
+ const [csrfToken, setCsrfToken] = useState('');
+
+ const {
+ siteConfig: { customFields },
+ } = useDocusaurusContext();
+
+ const feedbackWidgetUrl = customFields.feedbackWidgetApiUrl;
+ const isFeedbackRatingEnabled = feedbackWidgetUrl && csrfToken;
+
+ useEffect(() => {
+ if (feedbackWidgetUrl) {
+ getFeedbackCsrfToken(feedbackWidgetUrl)
+ .then(setCsrfToken)
+ .catch(console.error);
+ }
+ }, []);
+
+ const refreshCsrfToken = async (feedbackWidgetUrl) => {
+ const freshToken = await getFeedbackCsrfToken(feedbackWidgetUrl);
+ setCsrfToken(freshToken);
+ return freshToken;
+ };
+
+ const submitUserRating = async (rating, maxTries = 3) => {
+ let currentToken = csrfToken;
+
+ for (let currentTry = 1; currentTry <= maxTries; currentTry++) {
+ try {
+ setUserFeedback('submitting');
+ await postFeedbackRating(feedbackWidgetUrl, currentToken, rating);
+ setUserFeedback(rating);
+ break;
+ } catch (error) {
+ console.error(`Attempt ${currentTry} failed:`, error);
+ setUserFeedback('failed');
+
+ if (currentTry < maxTries) {
+ try {
+ currentToken = await refreshCsrfToken(feedbackWidgetUrl);
+ } catch (tokenError) {
+ console.error('Failed to refresh CSRF token:', tokenError);
+ continue;
+ }
+
+ const waitTime = currentTry * 1000;
+ await wait(waitTime);
+ }
+ }
+ }
+ };
+
+ return {
+ isFeedbackRatingEnabled,
+ userFeedback,
+ submitUserRating,
+ };
+};
+
+const getFeedbackCsrfToken = async (feedbackWidgetUrl) => {
+ const res = await fetch(`${feedbackWidgetUrl}/csrf-token`, {
+ credentials: 'include',
+ });
+
+ if (!res.ok) {
+ throw new Error(
+ `Failed to fetch feedback widget CSRF token: ${res.status} ${res.statusText}`,
+ );
+ }
+
+ const data = await res.json();
+ return data.csrfToken;
+};
+
+const postFeedbackRating = async (feedbackWidgetUrl, csrfToken, rating) => {
+ const requestBody = {
+ rating: rating === 'like' ? 'helpful' : 'notHelpful',
+ pageLink: window.location.href,
+ };
+
+ const res = await fetch(`${feedbackWidgetUrl}/feedback`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'x-csrf-token': csrfToken,
+ },
+ credentials: 'include',
+ body: JSON.stringify(requestBody),
+ });
+
+ if (!res.ok) {
+ throw new Error('Failed to submit feedback rating');
+ }
+};
diff --git a/site/src/pages/community/ambassadors.mdx b/site/src/pages/community/ambassadors.mdx
new file mode 100644
index 0000000..17e042f
--- /dev/null
+++ b/site/src/pages/community/ambassadors.mdx
@@ -0,0 +1,12 @@
+---
+hide_table_of_contents: true
+---
+
+import ContributorShowcase from '@site/src/components/ExternalContributors';
+
+# TBD Ambassadors
+
+
+
+## Let's stay connected!
+
\ No newline at end of file
diff --git a/site/src/pages/community/discord-messages-view.js b/site/src/pages/community/discord-messages-view.js
new file mode 100644
index 0000000..d918ece
--- /dev/null
+++ b/site/src/pages/community/discord-messages-view.js
@@ -0,0 +1,195 @@
+import React, { useState, useEffect } from 'react';
+import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';
+
+function DiscordMessagesView({
+ channelID,
+ channelName,
+ discordChannelUrl,
+ style,
+}) {
+ const [messages, setMessages] = useState([]);
+ const [screenWidth, setScreenWidth] = useState(
+ ExecutionEnvironment.canUseDOM ? window.innerWidth : 1000,
+ );
+
+ const mockMessages = [
+ {
+ id: 'mock1',
+ type: 0,
+ content: 'This is a mock message.',
+ author: {
+ avatar: null,
+ username: 'MockUser',
+ },
+ timestamp: new Date().getTime(),
+ },
+ {
+ id: 'mock2',
+ type: 0,
+ content: 'This is a mock message.',
+ author: {
+ avatar: null,
+ username: 'MockUser',
+ },
+ timestamp: new Date().getTime(),
+ },
+ ];
+
+ useEffect(() => {
+ async function fetchMessages() {
+ const response = await fetch(
+ `/.netlify/functions/discord-messages?channelID=${channelID}`,
+ );
+ if (!response.ok) {
+ console.error(
+ `There was an issue fetching messages: ${response.statusText}`,
+ );
+ setMessages(mockMessages);
+ return;
+ }
+ const data = await response.json();
+ setMessages(data);
+ }
+
+ const handleResize = () => {
+ if (ExecutionEnvironment.canUseDOM) {
+ setScreenWidth(window.innerWidth);
+ }
+ };
+
+ if (ExecutionEnvironment.canUseDOM) {
+ window.addEventListener('resize', handleResize);
+ fetchMessages();
+ return () => window.removeEventListener('resize', handleResize);
+ }
+ }, [channelID]);
+
+ const formatTimestamp = (timestamp) => {
+ const date = new Date(timestamp);
+ const hours = date.getHours().toString().padStart(2, '0');
+ const minutes = date.getMinutes().toString().padStart(2, '0');
+ return `${hours}:${minutes}`;
+ };
+
+ const isSmallScreen = screenWidth < 480;
+ const avatarSize = isSmallScreen ? '30px' : '50px';
+
+ return (
+
+
+
+
+ {messages
+ .filter((message) => message.type === 0 && message.content)
+ .map((message) => (
+
+
+
+
+
+ {message.author.username}
+
+
+ {formatTimestamp(message.timestamp)}
+
+
+
+ {message.content}
+
+
+
+ ))}
+
+
+ );
+}
+
+export default DiscordMessagesView;
diff --git a/site/src/pages/community/incubation-projects.mdx b/site/src/pages/community/incubation-projects.mdx
new file mode 100644
index 0000000..8b471e0
--- /dev/null
+++ b/site/src/pages/community/incubation-projects.mdx
@@ -0,0 +1,31 @@
+---
+hide_table_of_contents: true
+---
+
+import metacontent from '@site/src/content/global-meta';
+import { content } from '@site/src/content/incubation-projects/incubation-project-index/incubation-projects';
+
+
+ {content.meta.title}
+
+
+
+
+
+
+
+
+
+
diff --git a/site/src/pages/community/index.js b/site/src/pages/community/index.js
new file mode 100644
index 0000000..19d5370
--- /dev/null
+++ b/site/src/pages/community/index.js
@@ -0,0 +1,295 @@
+import React, { useState } from 'react';
+import HeroCard from '@site/src/components/HeroCard';
+import Community from '../../components/Community';
+import Layout from '@theme/Layout';
+import contributorsData from '@site/src/contributors.json';
+import Head from '@docusaurus/Head';
+import Gallery from '@site/src/components/Gallery';
+import CalendarComponent from '@site/src/components/Calendar';
+
+function CommunityIndex() {
+ const imageGalleryData = [
+ {
+ path: '/img/innovator-projects/netonomy.png',
+ url: 'https://twitter.com/netonomyinc/status/1694366100664819936',
+ },
+ {
+ path: '/img/innovator-projects/ariton.png',
+ url: 'https://ariton.app/#learn',
+ },
+ {
+ path: '/img/innovator-projects/home-node.png',
+ url: 'https://developer.tbd.website/blog/homenode-manager',
+ },
+ {
+ path: '/img/innovator-projects/qnav-links.png',
+ url: 'https://github.com/flothjl/QNav#qnav-links',
+ },
+ {
+ path: '/img/innovator-projects/blockcore.png',
+ url: 'https://www.blockcore.net/wallet/guide',
+ },
+ {
+ path: '/img/innovator-projects/mykin.png',
+ url: 'https://mykin.ai/',
+ },
+ ];
+
+ const [flippedCardIndex, setFlippedCardIndex] = useState(null);
+
+ return (
+
+ {/* banner if you ever want to display anything on the top of the page pls use this*/}
+ {/*
+ We're participating in Hacktoberfest, a month-long celebration of open
+ source! 🎉{' '}
+
+ Find out more here
+
+ .
+
*/}
+
+
+
+
+
+ Welcome to your TBD community!
+
+ {/* contributor spotlight section */}
+
+
TBD Monthly Spotlight ✨
+
+ Shoutout to our superstar contributors! Whether you're coding,
+ brainstorming, or cheering us on, every contribution adds magic to our
+ community. Ready to contribute? We're looking forward to seeing your
+ name light up this space soon! 🚀 Want a closer look at an
+ individual's contributions? Simply click on a card to uncover more
+ about their achievement for the month.
+
+
+ {contributorsData.map((contributor, index) => (
+
+ setFlippedCardIndex(flippedCardIndex === index ? null : index)
+ }
+ >
+
+
+
+
{contributor.login}
+
+ {contributor.contributions.map((contribution, cIndex) => (
+
+ {contribution}
+
+ ))}
+
+
+
+ {/* Back of the card */}
+
+
+
+ {contributor.description}
+
+
+
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
Upcoming Events 🥳
+
+ Filter through our exciting events: 👀 Show & Tells for project
+ highlights, 🏢 Office Hours for open discussions, 💡 Workshops for
+ skill-building, 🎮 Live Streams for everything fun. Miss an event?
+ Check out our{' '}
+
+ YouTube channel
+ {' '}
+ to catch up. Whether you're with us live or watching later, we're
+ thrilled to have you!
+
+ {/* community calendar view */}
+
+ {/* Featured Communtiy Projects */}
+
+
TBD Innovators: Monthly Showcase
+
+ Click on each image to learn more about individual projects. Have a
+ cool project that incorporates TBD's technologies? We'd love to hear
+ about it! Share your work with us in Discord in our{' '}
+
+ #share-what-you-do channel!
+ {' '}
+
+
+
+
+
+
+ );
+}
+
+export default CommunityIndex;
diff --git a/site/src/pages/getVC.mdx b/site/src/pages/getVC.mdx
new file mode 100644
index 0000000..f085c07
--- /dev/null
+++ b/site/src/pages/getVC.mdx
@@ -0,0 +1,6 @@
+import GetVC from '@site/src/components/renderatl/GetVC';
+
+# WAD x TBD Scavenger Hunt
+
+
+
diff --git a/site/src/pages/index.js b/site/src/pages/index.js
new file mode 100644
index 0000000..fe04eac
--- /dev/null
+++ b/site/src/pages/index.js
@@ -0,0 +1,48 @@
+import React from 'react';
+import Layout from '@theme/Layout';
+import Head from '@docusaurus/Head';
+import HomeList from '../components/HomeList';
+import { content } from '@site/src/content/home/home.js';
+
+export default function Home() {
+ const Web5CTA = content.web5cta;
+ const TbdexCTA = content.tbdexCTA;
+ const Heading = content.heading;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/site/src/pages/index.module.css b/site/src/pages/index.module.css
new file mode 100644
index 0000000..9f71a5d
--- /dev/null
+++ b/site/src/pages/index.module.css
@@ -0,0 +1,23 @@
+/**
+ * CSS files with the .module.css suffix will be treated as CSS modules
+ * and scoped locally.
+ */
+
+.heroBanner {
+ padding: 4rem 0;
+ text-align: center;
+ position: relative;
+ overflow: hidden;
+}
+
+@media screen and (max-width: 996px) {
+ .heroBanner {
+ padding: 2rem;
+ }
+}
+
+.buttons {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
diff --git a/site/src/pages/open-source/code-of-conduct.mdx b/site/src/pages/open-source/code-of-conduct.mdx
new file mode 100644
index 0000000..2df56c0
--- /dev/null
+++ b/site/src/pages/open-source/code-of-conduct.mdx
@@ -0,0 +1,162 @@
+import ButtonGroup from '@site/src/components/ButtonGroup';
+import TBDBreadcrumbs from '@site/src/components/TBDBreadcrumbs';
+
+
+ Code of Conduct | TBD
+
+
+
+
+
+
+
+
+
+# TBD Code of Conduct
+
+TBD builds infrastructure for the next wave of innovation in financial services — which we believe will be decentralized, permissionless, and non-custodial. This means opening the global economy to everyone. We extend the same principles of inclusion to our developer ecosystem. We are excited to build with you. So we will ensure our community is truly open, transparent and inclusive. Because of the global nature of our project, diversity and inclusivity is paramount to our success. We not only welcome diverse perspectives, we **need** them!
+
+The code of conduct below reflects the expectations for ourselves and for our community.
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, physical appearance, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, caste, color, religion, or sexual
+identity and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+- Demonstrating empathy and kindness toward other people
+- Being respectful and welcoming of differing opinions, viewpoints, and experiences
+- Giving and gracefully accepting constructive feedback
+- Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+- Focusing on what is best not just for us as individuals, but for the overall
+ community
+
+Examples of unacceptable behavior include:
+
+- The use of sexualized language or imagery, and sexual attention or advances of
+ any kind
+- Trolling, insulting or derogatory comments, and personal or political attacks
+- Public or private harassment
+- Publishing others' private information, such as a physical or email address,
+ without their explicit permission
+- Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Enforcement Responsibilities
+
+The TBD Open Source Governance Committee (GC) is responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+The GC has the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event, or any space where the project is listed as part of your profile.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the TBD Open Source Governance Committee (GC) at
+tbd-open-source-governance@squareup.com.
+All complaints will be reviewed and investigated promptly and fairly.
+
+The GC is obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+The GC will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from the GC, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series of
+actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media and forums.
+
+Although this list cannot be exhaustive, we explicitly honor diversity in age, culture, ethnicity, gender identity or expression, language, national origin, political beliefs, profession, race, religion, sexual orientation, socioeconomic status, and technical ability. We will not tolerate discrimination based on any of the protected characteristics above, including participants with disabilities.
+
+Violating these terms may lead to a temporary or permanent ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within the
+community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.1, available at
+[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
+
+Community Impact Guidelines were inspired by
+[Mozilla's code of conduct enforcement ladder][mozilla coc].
+
+For answers to common questions about this code of conduct, see the FAQ at
+[https://www.contributor-covenant.org/faq][faq]. Translations are available at
+[https://www.contributor-covenant.org/translations][translations].
+
+[homepage]: https://www.contributor-covenant.org
+[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
+[mozilla coc]: https://github.com/mozilla/diversity
+[faq]: https://www.contributor-covenant.org/faq
+[translations]: https://www.contributor-covenant.org/translations
+
+
diff --git a/site/src/pages/open-source/contributing.mdx b/site/src/pages/open-source/contributing.mdx
new file mode 100644
index 0000000..7625e07
--- /dev/null
+++ b/site/src/pages/open-source/contributing.mdx
@@ -0,0 +1,251 @@
+---
+title: 'Contributor Guide'
+---
+
+import CommunitySection from '../../components/Community';
+
+# Welcome to Our Contributor Community!
+
+We're thrilled that you're interested in becoming a part of our thriving community. We believe in fostering an environment where everyone feels welcome and is able to contribute. To ensure the well-being of our community, we adhere to a [Code of Conduct](/open-source/code-of-conduct). Please take a moment to read it thoroughly before making any contributions.
+
+Before you begin working on an issue, please familiarize yourself with the project's contribution guidelines in their CONTRIBUTING.md. This will provide you with an understanding of the project's process.
+
+## How Can You Contribute?
+
+There are numerous ways to contribute to TBD. Here are some suggestions to get started. If you have any questions or need help, feel free to reach out to us on [Discord](https://discord.gg/tbd).
+
+- **Stars on GitHub:** If you resonate with our mission and believe in a decentralized web, consider starring our projects on GitHub! 🌟
+- **Ask Questions:** Your questions not only help us improve but also benefit the community. If you have a question, don't hesitate to ask it in [Discord](https://discord.gg/tbd).
+- **Contribute to the Codebase:** We welcome any and all contributors to help us push the web forward by building a decentralized ecosystem.
+- **Participate in Community Events:** We host a variety of community events on our Discord stage every month, ranging from Show & Tells to brainstorming sessions. Got an event idea or wish to host one? Post it in our [#community-events forum](https://discord.com/channels/937858703112155166/1101192919706255430). The DWN project also host office hours every Tuesday. All events will be posted in our events calendar in Discord.
+- **Write a Blog Post:** Are you passionate about writing? Share your expertise and insights with our community! We welcome your contributions to our blog section on the [TBD Developer website](https://developer.tbd.website/blog). Propose blog topics in our [#general channel](https://discord.com/channels/937858703112155166/937858703820980296) on Discord. We can't wait to read and share them with the community!
+- **Propose a New Project:** We believe in community-driven innovation. If you have an idea for a project that helps Web5, tbDEX, or the TBD open source ecosystem, we'd love to talk with you about our [Incubation Program](https://developer.tbd.website/open-source/incubation).
+- **Improve Documentation:** Good documentation is key to the success of any project. You can help improve the quality of our [existing docs](https://github.com/TBD54566975/developer.tbd.website/tree/main/site/docs) or add new pages.
+- **Showcase Your Work:** Working on a project or written a blog post recently? Share it with the community in our [#share-what-you-do channel](https://discord.com/channels/937858703112155166/1098207585661878402).
+- **Give Feedback:** We're always looking for ways to improve. If you have feedback on our website or docs, feel free to use our [feedback template](https://github.com/TBD54566975/developer.tbd.website/issues/new/choose).
+- **Give Shoutouts:** Is there a project you love or a community/TBD member who's been especially helpful? Feel free to give them a shoutout in our [#general channel](https://discord.com/channels/937858703112155166/937858703820980296).
+- **Spread the Word:** Help us reach more people by sharing [TBD's projects](https://github.com/TBD54566975), [website](https://developer.tbd.website/docs/), and/or [Twitter/X](https://twitter.com/TBDDev).
+
+## Good First Issues
+
+We understand that contributing to open source for the first time can be daunting. That's why we've highlighted some repositories with good first issues. Be sure to check the repo's contribution guidelines and don't hesitate to ask any questions on [Discord](https://discord.gg/tbd) or on the issue ticket itself. We're looking forward to celebrating your first commit with you! 🎉
+
+- [Developer Website](https://github.com/TBD54566975/developer.tbd.website/issues?q=is%3Aopen+label%3A%22good+first+issue%22+no%3Aassignee)
+- [Web5-JS](https://github.com/TBD54566975/web5-js/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee+label%3A%22good+first+issue%22)
+- [SSI-Service](https://github.com/TBD54566975/ssi-service/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee+label%3A%22good+first+issue%22)
+- [SSI-SDK](https://github.com/TBD54566975/ssi-sdk/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee+label%3A%22good+first+issue%22)
+- [SSI-Playground](https://github.com/TBD54566975/ssi-playground/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee+label%3A%22good+first+issue%22)
+- [SSI-admin-ui](https://github.com/TBD54566975/ssi-admin-ui/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee+label%3A%22good+first+issue%22)
+- [DWN-Server](https://github.com/TBD54566975/dwn-server/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee+label%3A%22good+first+issue%22)
+- [DWN-SDK-JS](https://github.com/TBD54566975/dwn-sdk-js/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee+label%3A%22good+first+issue%22)
+
+## New Open Issues
+
+We've highlighted some repositories with new open issues to help you get started. If you don't see a project here that you're interested in, Check out our [other repos here](https://github.com/orgs/TBD54566975/repositories).
+
+- [Developer Website](https://github.com/TBD54566975/developer.tbd.website/issues?q=is%3Aopen+is%3Aissue)
+- [Web5-JS](https://github.com/TBD54566975/web5-js/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee)
+- [SSI-Service](https://github.com/TBD54566975/ssi-service/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee)
+- [SSI-SDK](https://github.com/TBD54566975/ssi-sdk/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee)
+- [SSI-Playground](https://github.com/TBD54566975/ssi-playground/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee)
+- [SSI-admin-ui](https://github.com/TBD54566975/ssi-admin-ui/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee)
+- [DWN-Server](https://github.com/TBD54566975/dwn-server/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee)
+- [DWN-SDK-JS](https://github.com/TBD54566975/dwn-sdk-js/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee)
+
+## Contributing Code Snippets
+
+Our Code Snippet system allows for updates in one place while ensuring code is runnable and tested, enhancing our tutorials and guides.
+
+### Steps to Create a Code Snippet
+
+1. **Create Your Test**: Navigate to `site/__test__` and create a test file named to match the functionality of the code, e.g., `how-to-create-did.test.js`.
+
+ :::note
+ Use the `.test.` naming convention for Vite to recognize and run these tests.
+ :::
+
+2. **Tag Your Snippets**: In your test files, use `:snippet-start:` and `:snippet-end:` tags to mark the beginning and end of a code snippet. Immediately name your snippet after the `:snippet-start:` tag.
+
+ ```js
+ test('createDidDht creates a DID with did:dht method', async () => {
+ // :snippet-start: createDidDht
+ const didDht = await DidDhtMethod.create({ publish: true });
+ // ... rest of the code ...
+ // :snippet-end:
+ });
+ ```
+
+3. After creating your snippets, run the command `pnpm run shnip`. This will generate a folder called `snippets` and create a directory structure similar to where the file is.
+
+4. In the generated folder you'll find the generated file named as `functionName.snippet.js` (or the respective file extension). For example, the above snippet will be `createDidDht.snippet.js`.
+
+To use the snippet in your documentation(`.mdx` file), you're going to use the `Shnip` component. The Shnip component will dynamically import your snippets for you. Here's an example on how to use it:
+
+// if it's a multi language doc, you'll need to specify it with the LanguageSwitcher component
+
+
+
+
+```
+
+This is how you can add a generated code snippet and an inline hardcoded snippet into the doc:
+
+```js
+
+```
+
+To display inline code in a language different from the tab's primary language, use `codeLanguage`.
+If `codeLanguage` is unspecified, it defaults to `language`.
+Example: For Bash in a JavaScript tab, set `language: 'JavaScript`', `codeLanguage: 'bash'`
+
+```js
+
+```
+
+MDX and JSX struggle to parse line breaks.
+For controlled line breaks in inline snippets, use `breakLineAt` with line numbers in an array.
+Example: To break after lines 1 and 5, set breakLineAt: [1, 5]
+
+```js
+
+```
+
+To add titles to code snippets, use the title prop. Example: title: 'Issuer.js' adds a title to the snippet.
+
+```
+
+```
+
+## Using Prepend tags
+
+To enhance our documentation with executable code snippets that remain synchronized with the latest test cases, we've introduced prepend tags. These tags allow you to specify setup code, such as import statements, that should be automatically included at the beginning of designated snippets. This ensures that our documentation reflects accurate and executable code examples.
+
+## Directory Structure Configurations
+
+- match: Mimics the test file's directory structure.
+- byLanguage: Organizes snippets into language-specific directories.
+- organized: A structure that organizes by language and function name. For example: `/snippets/js/createDidDht` and `/snippets/kt/createDidDht`
+- flat: Places all snippets directly within the snippets folder.
+
+### Usage
+
+Prepend tags are used to mark blocks of code that should be prepended to one or more snippets. Here's how to use them:
+
+1. Marking Prepend Blocks: In your test files, use the :prepend-start: and :prepend-end: tags to denote the beginning and end of a code block that should be prepended. Immediately after the :prepend-start: tag, specify the names of the snippets that should include this block, separated by spaces.
+
+```js
+// :prepend-start: snippetName1 snippetName2
+import { SomeLibrary } from 'some-library';
+// Additional setup code...
+// :prepend-end:
+```
+
+2. Associating with Snippets: Ensure that the snippet names provided after the :prepend-start: tag match exactly with the names used in your :snippet-start: tags. This association is case-sensitive and must be precise to ensure the correct prepend blocks are included.
+
+### Generating Snippets with Prepend Blocks
+
+After marking your prepend blocks and associating them with snippets, run the pnpm shnip command. This process will automatically prepend the specified blocks to the snippets and generate the output in the configured snippets directory.
+
+## Example
+
+```js
+// :prepend-start: createDidDht
+import { DidDhtMethod } from '@web5/dids';
+// :prepend-end:
+
+// :snippet-start: createDidDht
+const didDht = await DidDhtMethod.create({ publish: true });
+// :snippet-end:
+```
+
+The generated snippet will include the import statement at the top, ensuring the snippet is executable and reflects the necessary setup:
+
+```js
+import { DidDhtMethod } from '@web5/dids';
+
+const didDht = await DidDhtMethod.create({ publish: true });
+```
+
+## CLI
+
+- Clear Command: `pnpm shnip clear`
+- Structure Flag: `pnpm shnip --structure byLanguage`
+
+### Caveats for Code Snippets
+
+- The code snippet function names need to be unique, these names are what is used to generate/name the snippet files.
+- These tests are only testing the code snippets. There are more thorough tests that actually test the SDK.
+
+### Running tests
+
+You can use the following scripts to run the tests:
+
+- `pnpm test` to run tests
+- `pnpm test:watch` to run tests in dev mode
+
+## License
+
+```
+
+```
diff --git a/site/src/pages/open-source/governance.mdx b/site/src/pages/open-source/governance.mdx
new file mode 100644
index 0000000..b9e43e1
--- /dev/null
+++ b/site/src/pages/open-source/governance.mdx
@@ -0,0 +1,33 @@
+---
+hide_table_of_contents: true
+---
+
+import metacontent from '@site/src/content/global-meta';
+import { content } from '@site/src/content/open-source/governance/governance.js';
+import Heading from '@site/src/content/open-source/governance/heading.mdx';
+import Content from '@site/src/content/open-source/governance/content.mdx';
+
+
+ {content.meta.title}
+
+
+
+
+
+
+
+
diff --git a/site/src/pages/open-source/incubation.mdx b/site/src/pages/open-source/incubation.mdx
new file mode 100644
index 0000000..c45f675
--- /dev/null
+++ b/site/src/pages/open-source/incubation.mdx
@@ -0,0 +1,33 @@
+---
+hide_table_of_contents: true
+---
+
+import metacontent from '@site/src/content/global-meta';
+import { content } from '@site/src/content/open-source/incubation/incubation-program.js';
+import Heading from '@site/src/content/open-source/incubation/heading.mdx';
+import Content from '@site/src/content/open-source/incubation/content.mdx';
+
+
+ {content.meta.title}
+
+
+
+
+
+
+
+
diff --git a/site/src/pages/open-source/projects-dashboard.mdx b/site/src/pages/open-source/projects-dashboard.mdx
new file mode 100644
index 0000000..13e9b34
--- /dev/null
+++ b/site/src/pages/open-source/projects-dashboard.mdx
@@ -0,0 +1,12 @@
+---
+title: OSS Projects Dashboard
+hide_table_of_contents: true
+---
+
+import ProjectsDashboard from '../../components/ProjectsDashboard';
+
+## OSS Projects Health Dashboard
+
+Our Health Dashboard below is the cornerstone for monitoring the health and quality of our open-source projects. It provides a clear, comprehensive view of our CI/CD processes, security checks, and release tags, underlining our promise of high-quality and transparent software development.
+
+
diff --git a/site/src/pages/open-source/security.mdx b/site/src/pages/open-source/security.mdx
new file mode 100644
index 0000000..cd972ac
--- /dev/null
+++ b/site/src/pages/open-source/security.mdx
@@ -0,0 +1,45 @@
+---
+title: Security Policy
+hide_table_of_contents: true
+---
+
+import metacontent from '@site/src/content/global-meta';
+import { content } from '@site/src/content/open-source/security';
+
+## TBD Open Source Security Policy
+
+Security is a core principle built into the TBD ecosystem. In open finance, we are in the business of trust.
+
+A secure environment not only protects our assets but also strengthens the
+relationships we have built throughout our community.
+
+### Reporting Security Vulnerabilities
+
+If you discover or suspect any security vulnerabilities within our open source projects,
+we encourage you to promptly report them to us via email at security@tbd.email.
+Your diligence in bringing such issues to our attention is invaluable in maintaining
+the integrity and security of our software.
+
+### Confidentiality and Collaboration
+
+Please do not open issues for security vulnerabilities in the project's public issue tracker or share in
+other public channels.
+
+Our security response team consists of engineering leaders, security experts, TBD management, and
+the Head of Open Source. We will work with you to confirm the vulnerabilitity, remediate, and responsibily
+communicate recommended actions to the public.
+
+### Valid Security Reports
+
+A valid security report should include:
+
+* Description of the vulnerability
+* Steps to reproduce or exploit
+* Potential impact
+
+The more context you can provide, the better. This will help us reproduce your use case and
+potentially validate the vulnerability.
+
+We appreciate you - and your efforts in protecting open finance and the global TBD Community.
+
+
\ No newline at end of file
diff --git a/site/src/pages/projects.mdx b/site/src/pages/projects.mdx
new file mode 100644
index 0000000..08804d6
--- /dev/null
+++ b/site/src/pages/projects.mdx
@@ -0,0 +1,47 @@
+---
+hide_table_of_contents: true
+---
+
+import metacontent from '@site/src/content/global-meta';
+import { content } from '@site/src/content/projects/project-index/projects';
+
+
+ {content.meta.title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/src/pages/projects/tbdex.mdx b/site/src/pages/projects/tbdex.mdx
new file mode 100644
index 0000000..87005a1
--- /dev/null
+++ b/site/src/pages/projects/tbdex.mdx
@@ -0,0 +1,47 @@
+---
+title: tbDEX
+hide_table_of_contents: true
+---
+
+import metacontent from '@site/src/content/global-meta';
+import { content } from '@site/src/content/projects/tbdex/tbdex.js';
+import TbdexSdk from '@site/src/components/TbdexSdk.jsx';
+
+
+ {content.meta.title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/src/pages/projects/web5.mdx b/site/src/pages/projects/web5.mdx
new file mode 100644
index 0000000..87934ad
--- /dev/null
+++ b/site/src/pages/projects/web5.mdx
@@ -0,0 +1,45 @@
+---
+title: Web5
+hide_table_of_contents: true
+---
+
+import metacontent from '@site/src/content/global-meta';
+import { content } from '@site/src/content/projects/web5/web5.js';
+import Web5Sdk from '@site/src/components/Web5Sdk.jsx';
+
+
+ {content.meta.title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/src/pages/wad-scavengerhunt.mdx b/site/src/pages/wad-scavengerhunt.mdx
new file mode 100644
index 0000000..f07f56f
--- /dev/null
+++ b/site/src/pages/wad-scavengerhunt.mdx
@@ -0,0 +1,8 @@
+import ScavengerHunt from '@site/src/components/renderatl/ScavengerHunt';
+
+
+
+
+
+
+
diff --git a/site/src/pages/wad24.mdx b/site/src/pages/wad24.mdx
new file mode 100644
index 0000000..5b385aa
--- /dev/null
+++ b/site/src/pages/wad24.mdx
@@ -0,0 +1,24 @@
+# Meet TBD at WeAreDevelopers!
+
+As one of four businesses at Block Inc. (fka Square), TBD is focused on creating **open** and **decentralized** technologies to connect the financial world.
+Guided by this vision, TBD is building an **open source developer platform** and infrastructure that enables **everyone** to access and participate in the global economy.
+We invite you to join us in creating and adopting open and decentralized technologies that solve real problems for real people.
+To learn more about our projects check out our [Docs](https://developer.tbd.website/docs/).
+
+## TBD Events
+
+
+## Lightning Talks
+ Swing by the TBD booth (Hall 2.2, Booth 2_40) and learn about Web5 and tbDEX!
+
+
+
+
+## Scavenger Hunt 🔎
+ All conference attendees are invited to participate in our scavenger hunt: meet the TBD team, scan their QR codes, and collect all 6 Verifiable Credentials to win a prize! 🏆 That is if you can find us! 👀
+**HINT:** You should be able to easily find TBD members at any of the talks above!
+
+
+
+## Let's stay connected!
+
\ No newline at end of file
diff --git a/site/src/theme/DocItem/Footer/index.js b/site/src/theme/DocItem/Footer/index.js
new file mode 100644
index 0000000..7876aac
--- /dev/null
+++ b/site/src/theme/DocItem/Footer/index.js
@@ -0,0 +1,7 @@
+import React from 'react';
+import FeedbackWidget from '../../../components/FeedbackWidget';
+import EditThisPage from '@theme/EditThisPage';
+
+export default function FooterWrapper(props) {
+ return <>>;
+}
diff --git a/site/src/theme/Footer.js b/site/src/theme/Footer.js
new file mode 100644
index 0000000..2836c96
--- /dev/null
+++ b/site/src/theme/Footer.js
@@ -0,0 +1,171 @@
+import React from 'react';
+import Illustration from '../components/Illustration';
+import SmallSocialButton from '../components/SmallSocialButton';
+import TextLink from '../components/TextLink';
+
+export function Footer() {
+ const footer = {
+ logoSrc: '/img/tbd-logo-square.svg',
+ copyrightSignSrc: '/img/copyright-image.svg',
+ year: new Date().getFullYear(),
+ links: [
+ {
+ text: 'Legal',
+ href: 'https://www.tbd.website/legal/terms',
+ },
+ {
+ text: 'Code of Conduct',
+ href: '/open-source/code-of-conduct',
+ },
+ {
+ text: 'TBD Home',
+ href: 'https://www.tbd.website',
+ },
+ ],
+ socialText: 'Connect with us',
+ socialButtons: [
+ {
+ src: '/img/github-icon.svg',
+ url: 'https://github.com/TBD54566975/',
+ altText: 'GitHub button',
+ title: 'Go to GitHub',
+ },
+ {
+ src: '/img/discord-icon.svg',
+ url: 'https://discord.gg/tbd',
+ altText: 'Discord button',
+ title: 'Go to Discord',
+ },
+ {
+ src: '/img/twitter-icon.svg',
+ url: 'https://twitter.com/TBDevs',
+ altText: 'Twitter button',
+ title: 'Go to Twitter/X',
+ },
+ {
+ src: '/img/youtube-icon.svg',
+ url: 'https://www.youtube.com/@tbd.videos',
+ altText: 'YouTube button',
+ title: 'Go to YouTube',
+ },
+ {
+ src: '/img/twitch-icon.svg',
+ url: 'https://www.twitch.tv/tbdevs',
+ altText: 'Twitch button',
+ title: 'Go to Twitch',
+ },
+ {
+ src: '/img/linkedin-icon.svg',
+ url: 'https://www.linkedin.com/company/tbd54566975',
+ altText: 'LinkedIn button',
+ title: 'Go to LinkedIn',
+ },
+ {
+ src: '/img/shopping-cart.svg',
+ url: 'https://tbd.shop/',
+ altText: 'TBD Shop',
+ title: 'Go to TBD Shop',
+ }
+ /*
+
+ Removed these social links until we'd like to be responsive to these mediums:
+ https://github.com/TBD54566975/developer.tbd.website/issues/293
+ {
+ src: '/img/vimeo-icon.svg',
+ url: 'https://vimeo.com/tbd54566975',
+ altText: 'Vimeo button',
+ title: 'Go to Vimeo',
+ },
+ {
+ src: '/img/instagram-icon.svg',
+ url: 'https://instagram.com/tbd54566975?igshid=YmMyMTA2M2Y=',
+ altText: 'Instagram button',
+ title: 'Go to Instagram',
+ },
+ {
+ src: '/img/tiktok-icon.svg',
+ url: 'https://vm.tiktok.com/ZTdx4L1Ft/',
+ altText: 'TikTok button',
+ title: 'Go to TikTok',
+ },
+ */
+ ],
+ isLegal: false,
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {footer.year}
+
+
+ {footer.links &&
+ footer.links.map((link, index) => (
+
+
+
+ ))}
+
+
+
+
+
+
+ {footer.socialButtons.map((socialButton, idx) => (
+
+ ))}
+
+
+
+
+
+
+ );
+}
+
+export default Footer;
diff --git a/site/src/theme/Layout/index.js b/site/src/theme/Layout/index.js
new file mode 100644
index 0000000..78c04b4
--- /dev/null
+++ b/site/src/theme/Layout/index.js
@@ -0,0 +1,47 @@
+import React, { useEffect } from 'react';
+import Layout from '@theme-original/Layout';
+import GlitchWrapper from '@site/src/components/GlitchWrapper';
+import MDXContent from '@theme/MDXContent';
+import { useLocation } from '@docusaurus/router';
+import useBrokenLinks from '@docusaurus/useBrokenLinks';
+import ChatSearch from '../../components/ChatGPTSearch';
+import { LanguageProvider } from '../../components/language/LanguageContext';
+import NewsletterSubscription from '../../components/NewsletterSubscribe';
+
+import { SSRProvider } from '@react-aria/ssr';
+import { LanguageOptionsProvider } from '../../components/language/SupportedLanguagesContext';
+
+export default function LayoutWrapper(props) {
+ const { hash } = useLocation();
+ useBrokenLinks().collectAnchor("ask");
+ useBrokenLinks().collectAnchor("tag/Manifests");
+ useBrokenLinks().collectAnchor("tag/PresentationRequests");
+ useBrokenLinks().collectAnchor("tag/Presentations/paths/~1v1~1presentations~1definitions/put");
+ useBrokenLinks().collectAnchor("tag/Credentials/paths/~1v1~1credentials/put");
+ useBrokenLinks().collectAnchor("offering-object");
+
+ useEffect(() => {
+ if (hash) {
+ function scrollToAnchor() {
+ document.getElementById(hash.substring(1))?.scrollIntoView();
+ clearTimeout(timeout);
+ }
+ const timeout = setTimeout(scrollToAnchor, 0);
+ }
+ }, []);
+ return (
+
+
+
+
+
+
+ {props.children}
+
+
+
+
+
+
+ );
+}
diff --git a/site/src/theme/MDXComponents.js b/site/src/theme/MDXComponents.js
new file mode 100644
index 0000000..35a8f6f
--- /dev/null
+++ b/site/src/theme/MDXComponents.js
@@ -0,0 +1,56 @@
+import React from 'react';
+import MDXComponents from '@theme-original/MDXComponents';
+import TooltipWrapper from '@site/src/components/TooltipWrapper';
+import ButtonGroup from '@site/src/components/ButtonGroup';
+import Actors from '@site/src/components/Actors';
+import ProjectList from '@site/src/components/ProjectList';
+import Divider from '@site/src/components/Divider';
+import PillarList from '@site/src/components/PillarList';
+import SwitchIllustration from '@site/src/components/SwitchIllustration';
+import TwoColumnContainer from '@site/src/components/TwoColumnContainer';
+import Community from '@site/src/components/Community';
+import ConferenceSchedule from '@site/src/components/ConferenceScheduleSection';
+import ConferenceCommunity from '@site/src/components/ConferenceCommunitySection';
+import LanguageSwitchBlock from '@site/src/components/language/LanguageSwitchBlock';
+import LanguageSwitchLink from '@site/src/components/language/LanguageSwitchLink';
+import LanguageSupport from '@site/src/components/language/LanguageSupport';
+import LanguageSwitcher from '@site/src/components/language/LanguageSwitcher';
+import LanguageTabBar from '@site/src/components/language/LanguageTabBar';
+import Dependency from '@site/src/components/Dependency';
+import Shnip from '@site/src/components/language/Shnip';
+import CodeBlock from '@theme/CodeBlock';
+import QuickstartCodeRunner from '@site/src/components/QuickstartCodeRunner';
+
+
+import Dependencies from '@site/src/components/Dependencies';
+const CustomMDXComponents = {
+ ...MDXComponents,
+ TooltipWrapper,
+ ButtonGroup,
+ Actors,
+ ProjectList,
+ Divider,
+ Dependency,
+ PillarList,
+ SwitchIllustration,
+ TwoColumnContainer,
+ Community,
+ ConferenceSchedule,
+ ConferenceCommunity,
+ LanguageSwitchBlock,
+ LanguageSwitchLink,
+ LanguageSupport,
+ LanguageSwitcher,
+ LanguageTabBar,
+ Shnip,
+ CodeBlock,
+ Dependencies,
+ QuickstartCodeRunner,
+ p: (props) =>
,
+ ul: (props) => ,
+ li: (props) => ,
+ strong: (props) => (
+
+ ),
+};
+export default CustomMDXComponents;
diff --git a/site/src/util/code-snippets-map.json b/site/src/util/code-snippets-map.json
new file mode 100644
index 0000000..8256cf1
--- /dev/null
+++ b/site/src/util/code-snippets-map.json
@@ -0,0 +1,78 @@
+{
+ "getProtocolDefinition": "const { protocol } = await web5.dwn.protocols.configure({\n message: {\n definition: protocolDefinition\n }\n });\n\n //highlight-start\n const definition = protocol.definition;\n //highlight-end",
+ "configureProtocolAndSend": "const { protocol } = await web5.dwn.protocols.configure({\n message: {\n definition: protocolDefinition\n }\n });\n\n \n //highlight-start\n const {status} = await protocol.send(myDid);\n //highlight-end",
+ "queryProtocol": "const { protocols } = await web5.dwn.protocols.query({\n message: {\n filter: {\n protocol: 'http://social-media.xyz'\n }\n }\n });\n\n //highlight-start\n const protocolConfig = protocols[0].toJSON();\n //highlight-end",
+ "configureProtocolWithDefinition": "const { protocol, status } = await web5.dwn.protocols.configure({\n message: {\n definition: {\n \"protocol\": \"https://photos.org/protocol\",\n \"published\": false,\n \"types\": {\n \"album\": {\n \"schema\": \"https://photos.org/protocol/album\",\n \"dataFormats\": [\"application/json\"]\n },\n \"photo\": {\n \"schema\": \"https://photos.org/protocols/photo\",\n \"dataFormats\": [\"application/json\"]\n },\n \"binaryImage\": {\n \"dataFormats\": [\"image/png\", \"jpeg\", \"gif\"]\n },\n \"comment\": {\n \"schema\": \"https://photos.org/protocols/comment\",\n \"dataFormats\": [\"application/json\"]\n }\n },\n \"structure\": {\n \"album\": {\n \"$actions\": [\n { \"who\": \"author\", \"of\": \"album\", \"can\": \"write\" }\n ]\n },\n \"photo\": {\n \"$actions\": [\n { \"who\": \"recipient\", \"of\": \"photo\", \"can\": \"read\" }\n ],\n \"binaryImage\": {\n \"$actions\": [\n { \"who\": \"author\", \"of\": \"photo\", \"can\": \"write\" }\n ]\n },\n \"comment\": {\n \"$actions\": [\n { \"who\": \"anyone\", \"can\": \"write\" },\n { \"who\": \"anyone\", \"can\": \"read\" },\n { \"who\": \"author\", \"of\": \"comment\", \"can\": \"delete\" },\n { \"who\": \"recipient\", \"of\": \"comment\", \"can\": \"delete\" },\n { \"who\": \"author\", \"of\": \"comment\", \"can\": \"update\" }\n ]\n }\n }\n }\n }\n },\n });",
+ "queryMusicProtocol": "const { protocols, status } = await web5.dwn.protocols.query({\n message: {\n filter: {\n protocol: 'https://music.org/protocol',\n },\n },\n });\n\n // logs an array of protocol configurations installed on the user's DWN\n console.log(protocols);",
+ "queryProtocolDescending": "// Sorting protocols by dateCreated in descending order\n\n const { protocols, status } = await web5.dwn.protocols.query({\n message: {\n filter: {\n protocol: 'http://social-media.xyz',\n },\n //highlight-start\n dateSort: 'createdDescending',\n //highlight-end\n },\n });",
+ "queryProtocolsFromDid": "//Query protocol on someone else's DWN\n \n const { protocols } = await web5.dwn.protocols.query({\n //highlight-start\n from: bobDid,\n //highlight-end\n message: {\n filter: {\n protocol: 'https://music.org/protocol',\n },\n },\n });\n\n // logs an array of protocol configurations installed on Bob's DWN\n console.log(protocols);",
+ "createRecordWithHighlight": "const { record } = await web5.dwn.records.create({\n data: 'Hello World!',\n message: {\n dataFormat: 'text/plain',\n },\n });\n\n //highlight-start\n const { status } = await record.send(myDid);\n //highlight-end",
+ "createRecord": "const { record } = await web5.dwn.records.create({\n data: 'Hello World!',\n message: {\n dataFormat: 'text/plain',\n },\n });\n\n const { status } = await record.send(myDid);",
+ "readRecord": "const recordText = await textRecord.data.text();",
+ "deleteRecord": "const response = await web5.dwn.records.delete({\n from: did,\n message: { \n recordId: recordId\n },\n });",
+ "updateRecord": "const response = await record.update({ data: \"Hello', I'm updated\" });",
+ "createRecordsWithPlaylist": "const { record } = await web5.dwn.records.create({\n data: playlistJson,\n message: {\n recipient: 'did:example:alice',\n schema: 'https://schema.org/Playlist',\n dataFormat: 'application/json',\n },\n });",
+ "createRecordWithoutStore": "// this creates a record, but does not store it in the user's local DWN\n const { record } = await web5.dwn.records.create({\n //highlight-start\n store: false,\n //highlight-end\n data: 'Hello again, World!',\n message: {\n recipient: 'did:example:alice',\n dataFormat: 'text/plain',\n },\n });",
+ "createRecordAndSend": "// this creates a record and stores it in the user's local DWN\n const { record } = await web5.dwn.records.create({\n data: 'Hello World!',\n message: {\n dataFormat: 'text/plain',\n },\n });\n\n /*\n send the record to the user's remote DWNs. Only needed\n if it's a record that cannot wait for sync to occur.\n */\n const { status: myDidStatus } = await record.send(myDid);\n\n // send the newly generated record to Bob's DWNs\n const { status: bobStatus } = await record.send(bobDid);",
+ "queryPlaylistFromDid": "const response = await web5.dwn.records.query({\n from: myDid,\n message: {\n filter: {\n schema: 'https://schema.org/Playlist',\n dataFormat: 'application/json',\n },\n },\n });\n\n // response.records.forEach((record) => {\n // console.log(record.id);\n // });",
+ "sortQueriedRecordsByDate": "// Sorting records by dateCreated in ascending order\n const response = await web5.dwn.records.query({\n message: {\n filter: {\n dataFormat: 'text/plain',\n },\n //highlight-start\n dateSort: 'createdAscending',\n //highlight-end\n },\n });",
+ "readRecordFromId": "// Reads the indicated record from the user's DWNs\n let { record } = await web5.dwn.records.read({\n message: {\n filter: {\n recordId: recordId,\n },\n },\n });\n\n // assuming the record has a text payload\n const text = await record.data.text();",
+ "readRecordByIdFromDid": "// Reads the indicated record from Bob's DWNs\n const { record } = await web5.dwn.records.read({\n //highlight-start\n from: bobDid,\n //highlight-end\n message: {\n filter: {\n recordId: recordId,\n },\n },\n });\n\n // assuming the record is a json payload\n const data = await record.data.json();",
+ "deleteRecordFromDid": "const response = await web5.dwn.records.delete({\n //highlight-next-line\n from: did,\n message: {\n recordId: record.id,\n },\n });",
+ "connectWithDWNEndpoint": "const { web5, did } = await Web5.connect({\n techPreview: {\n dwnEndpoints: ['https://dwn.your-domain.org/'],\n },\n });",
+ "connectWithAgentAndConnectedDid": "const { web5, did } = await Web5.connect({\n agent: identityAgent,\n connectedDid: existingDid,\n });",
+ "connectWithSyncConfig": "const { web5, did } = await Web5.connect({\n sync: '5s',\n });",
+ "createRecordWithTodoItem": "const myRecord = await web5.dwn.records.create(myDid.id, {\n data: 'todoItem',\n message: {\n dataFormat: 'text/plain',\n },\n });",
+ "createAliceDid": "const { web5, did: aliceDid } = await Web5.connect();\n\n // Create the record\n const { record } = await web5.dwn.records.create({\n data: 'Hello Web5',\n message: {\n dataFormat: 'text/plain',\n },\n });\n\n // Read the record\n const readResult = await record.data.text();",
+ "createDidAutomatically": "const { web5, did: userDid } = await Web5.connect();",
+ "createDidDht": "//Creates a DID using the DHT method and publishes the DID Document to the DHT\n const didDht = await DidDhtMethod.create({ publish: true });\n\n //DID and its associated data which can be exported and used in different contexts/apps\n const portableDID = JSON.stringify(didDht);\n\n //DID string\n const did = didDht.did;\n\n //DID Document\n const didDocument = JSON.stringify(didDht.document);\n\n //Cryptographic keys associated with DID\n const keys = JSON.stringify(didDht.keySet);\n\n //Primary form of a DID. more info: https://www.w3.org/TR/did-core/#dfn-canonicalid\n const canonicalId = didDht.canonicalId;",
+ "createDidKey": "//Creates a DID using the did:key method\n const didKey = await DidKeyMethod.create();\n\n //DID and its associated data which can be exported and used in different contexts/apps\n const portableDID = JSON.stringify(didKey);\n\n //DID string\n const did = didKey.did;\n\n //DID Document\n const didDocument = JSON.stringify(didKey.document);\n\n //Cryptographic keys associated with DID\n const keys = JSON.stringify(didKey.keySet);\n\n //Primary form of a DID. more info: https://www.w3.org/TR/did-core/#dfn-canonicalid\n const canonicalId = didKey.canonicalId;",
+ "deleteFromLocalDWN": "const deleteResult = await web5.dwn.records.delete({\n message: {\n recordId: recordId\n },\n });",
+ "createPublishedRecord": "const {record} = await web5.dwn.records.create({\n data: \"a published record\",\n message: {\n dataFormat: \"text/plain\",\n //highlight-start\n published: true\n //highlight-end\n }\n });",
+ "createRecordWithDatePublished": "// Create a new Date instance for tomorrow\nconst today = new Date();\nconst tomorrow = new Date(today);\ntomorrow.setDate(today.getDate() + 1);\n\n// Format the date and time in YYYY-MM-DDThh:mm:ss.ssssssZ format\nconst formattedDate = tomorrow.toISOString().replace(/\\.\\d{3}Z$/, '.000000Z');\n\n// Create a record today to be published tomorrow\nconst { record } = await web5.dwn.records.create({\n data: \"This record will be created now and published tomorrow\",\n message: {\n dataFormat: \"text/plain\",\n //highlight-start\n published: true,\n datePublished: formattedDate\n //highlight-end\n },\n});",
+ "queryProtocolsForMusic": "const { protocols } = await web5.dwn.protocols.query({\n message: {\n filter: {\n protocol: 'https://music.org/protocol',\n },\n },\n });",
+ "queryProtocolsWithFilterDescending": "const { protocols } = await web5.dwn.protocols.query({\n message: {\n filter: {\n protocol: 'http://social-media.xyz',\n },\n //highlight-next-line\n dateSort: 'createdDescending'\n },\n });",
+ "queryRecordsWithFilterAscending": "const response = await web5.dwn.records.query({\n message: {\n filter: {\n dataFormat: 'text/plain',\n },\n //highlight-next-line\n dateSort: 'publishedAscending',\n },\n });",
+ "queryRecordsFromDid": "const { records } = await web5.dwn.records.query({\n //highlight-next-line\n from: did,\n message: {\n filter: {\n schema: 'https://schema.org/Playlist',\n dataFormat: 'application/json',\n },\n },\n });",
+ "queryRecordWithParentId": "const response = await web5.dwn.records.query({\n message: {\n filter: {\n parentId: 'bafyreianzpmhbgcgam5mys722vnsiuwn7y4ek6kjeyjptttquasw4hge2m',\n },\n },\n });",
+ "playlistProtocolDefinition": "const playlistProtocolDefinition = {\n protocol: \"https://playlist.org/protocol\",\n published: true,\n types: {\n playlist: {\n schema: \"https://schema.org/MusicPlaylist\",\n dataFormats: [\"application/json\"],\n },\n audio: {\n schema: \"https://schema.org/AudioObject\",\n dataFormats: [\"audio/mp3\"],\n },\n video: {\n schema: \"https://schema.org/VideoObject\",\n dataFormats: [\"video/mp4\"],\n },\n },\n structure: {\n playlist: {\n $actions: [\n { who: \"anyone\", can: \"write\" },\n { who: \"author\", of: \"playlist\", can: \"read\" },\n { who: \"recipient\", of: \"playlist\", can: \"read\" },\n ],\n audio: {\n $actions: [\n { who: \"anyone\", can: \"write\" },\n { who: \"author\", of: \"audio\", can: \"read\" },\n { who: \"recipient\", of: \"audio\", can: \"read\" },\n ],\n },\n video: {\n $actions: [\n { who: \"anyone\", can: \"write\" },\n { who: \"author\", of: \"video\", can: \"read\" },\n { who: \"recipient\", of: \"video\", can: \"read\" },\n ]\n },\n },\n }\n };",
+ "queryFromDwnByProtocolPath": "const { records } = await web5.dwn.records.query({\n message: {\n filter: {\n //highlight-start\n protocol: 'https://playlist.org/protocol',\n protocolPath: 'playlist/video'\n //highlight-end\n },\n },\n });",
+ "readFromDwn": "const response = await web5.dwn.records.query({\n message: {\n filter: {\n dataFormat: 'text/plain',\n },\n },\n });",
+ "createLocalRecord": "const { record } = await web5.dwn.records.create({\n data: \"this record will be written to the local DWN\",\n message: {\n dataFormat: 'text/plain'\n }\n});",
+ "createLocalProtocol": "const response = await web5.dwn.protocols.configure({\n message: {\n definition: protocolDefinition\n }\n});",
+ "sendLocalRecordToTarget": "const { record } = await web5.dwn.records.create({\n data: \"this record will be written to the target's local DWN\",\n message: {\n target: targetDid,\n dataFormat: 'text/plain'\n }\n});",
+ "sendRecordToRemoteDWNs": "const { record } = await web5.dwn.records.create({\n data: \"this record will be written to the local DWN\",\n message: {\n dataFormat: 'text/plain'\n }\n});\n\n//immediately send record to user's remote DWNs\nconst {status} = await record.send(userDid);",
+ "sendProtocolToRemoteDWNs": "const { protocol } = await web5.dwn.protocols.configure({\n message: {\n definition: protocolDefinition\n }\n});\n\n//immediately send protocol to user's remote DWNs\nconst {status} = await protocol.send(userDid);",
+ "sendRecordToDWNOfRecipient": "const { record } = await web5.dwn.records.create({\n data: \"this record will be created but not saved to DWN\",\n store: false, //remove this line if you want to keep a copy of the record in the sender's DWN\n message: {\n dataFormat: 'text/plain'\n },\n});\n\n//send record to recipient's DWN\nconst {status} = await record.send(recipientDid);",
+ "updateDwnRecord": "// Get the record\nconst { record } = await web5.dwn.records.read({\n message: {\n filter: {\n recordId: createdRecord.id\n }\n }\n});\n\n// Update the record\n// highlight-next-line\nconst {status} = await record.update({ data: \"Hello, I'm updated!\" });",
+ "createIdentityAgent": "const agent = await IdentityAgent.create();",
+ "authenticateIdentityAgent": "await agent.start({ passphrase: 'default-passphrase' });",
+ "getDwnEndpoints": "// selects DWN endpoints that are provided by default during the Web5 tech preview period\nconst serviceEndpointNodes = await getTechPreviewDwnEndpoints();\n\n// generates key pairs used for authorization and encryption when interfacing with DWNs\nconst didOptions = await DidIonMethod.generateDwnOptions({ serviceEndpointNodes });",
+ "createSocialMediaAndCareerIdentity": "const socialMediaIdentity = await agent.identityManager.create({\n name: 'SocialMedia',\n didMethod: 'ion',\n didOptions,\n kms: 'local'\n });\n\n const careerIdentity = await agent.identityManager.create({\n name: 'Career',\n didMethod: 'ion',\n didOptions,\n kms: 'local'\n });",
+ "connectIdentityToWeb5": "const { web5 } = await Web5.connect({\n connectedDid: socialMediaIdentity.did,\n agent,\n });",
+ "connectToWeb5": "const { web5 } = await Web5.connect({\n connectedDid: socialIdentity.did,\n agent,\n });",
+ "createTextRecord": "const { record } = await web5.dwn.records.create({\n data: 'Hello, Web5!',\n message: {\n dataFormat: 'text/plain',\n },\n });",
+ "createJsonRecord": "// Create a JSON record\nconst { record } = await web5.dwn.records.create({\n data: {\n content: \"Hello Web5\",\n description: \"Keep Building!\"\n },\n message: {\n dataFormat: 'application/json'\n }\n});",
+ "uploadImage": "// Create a blob record\n async function upload(event) {\n const blob = new Blob(event.currentTarget.files, { type: \"image/png\" });\n const { record } = await web5.dwn.records.create({\n data: blob,\n message: {\n dataFormat: \"image/png\"\n }\n });\n \n }",
+ "uploadFile": "// Create a file record\n async function upload(event) {\n const file = event.currentTarget.files[0];\n const { status: fileStatus, record } = await web5.dwn.records.create({\n data: file,\n message: {\n schema: \"https://schema.org/path/to/schema\",\n dataFormat: \"application/octet-stream\"\n }\n });\n \n }",
+ "createMixedRecord": "// Create a mixed record\n async function createMessage(username, messageText, imageFile) {\n let base64Image = null;\n \n if (imageFile) {\n const binaryImage = await imageFile.arrayBuffer();\n base64Image = btoa(\n new Uint8Array(binaryImage).reduce(\n (data, byte) => data + String.fromCharCode(byte),\n \"\"\n )\n );\n }\n\n const messageData = {\n username,\n message: messageText,\n image: base64Image\n };\n\n const { record } = await web5.dwn.records.create({\n data: messageData,\n message: {\n schema: \"http://schema-registry.org/message\",\n dataFormat: \"application/json\"\n },\n });\n \n }",
+ "assignVcJwt": "const signedVcJwt = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpkaHQ6a2ZkdGJjbTl6Z29jZjVtYXRmOWZ4dG5uZmZoaHp4YzdtZ2J3cjRrM3gzcXppYXVjcHA0eSMwIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiRW1wbG95bWVudENyZWRlbnRpYWwiXSwiaWQiOiJ1cm46dXVpZDo4ZmQ1MjAzMC0xY2FmLTQ5NzgtYTM1ZC1kNDE3ZWI4ZTAwYjIiLCJpc3N1ZXIiOiJkaWQ6ZGh0OmtmZHRiY205emdvY2Y1bWF0ZjlmeHRubmZmaGh6eGM3bWdid3I0azN4M3F6aWF1Y3BwNHkiLCJpc3N1YW5jZURhdGUiOiIyMDIzLTEyLTIxVDE3OjAyOjAxWiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmRodDp5MzltNDhvem9ldGU3ejZmemFhbmdjb3M4N2ZodWgxZHppN2Y3andiamZ0N290c2toOXRvIiwicG9zaXRpb24iOiJTb2Z0d2FyZSBEZXZlbG9wZXIiLCJzdGFydERhdGUiOiIyMDIxLTA0LTAxVDEyOjM0OjU2WiIsImVtcGxveW1lbnRTdGF0dXMiOiJDb250cmFjdG9yIn0sImV4cGlyYXRpb25EYXRlIjoiMjAyMi0wOS0zMFQxMjozNDo1NloifSwiaXNzIjoiZGlkOmRodDprZmR0YmNtOXpnb2NmNW1hdGY5Znh0bm5mZmhoenhjN21nYndyNGszeDNxemlhdWNwcDR5Iiwic3ViIjoiZGlkOmRodDp5MzltNDhvem9ldGU3ejZmemFhbmdjb3M4N2ZodWgxZHppN2Y3andiamZ0N290c2toOXRvIn0.ntcgPOdXOatULWo-q6gkuhKmi5X3bzCONQY38t_rsC1hVhvvdAtmiz-ccoLIYUkjECRHIxO_UZbOKgn0EETBCA\";",
+ "parseSignedVcJwt": "const vc = VerifiableCredential.parseJwt({ vcJwt: signedVcJwt });",
+ "validatePresentationDefinition": "const validation = PresentationExchange.validateDefinition({ \n presentationDefinition: pd \n});",
+ "pex_getLoanAppPresentationDefinition": "const presentationDefinition = {\n id: 'presDefIdloanAppVerification123',\n name: 'Loan Application Employment Verification',\n purpose: 'To verify applicant’s employment, date of birth, and name',\n input_descriptors: [\n // Employment Verification\n {\n id: 'employmentVerification',\n purpose: 'Confirm current employment status',\n constraints: {\n fields: [\n {\n path: ['$.credentialSubject.employmentStatus'],\n filter: {\n type: 'string',\n pattern: 'employed',\n },\n },\n ],\n },\n },\n // Date of Birth Verification\n {\n id: 'dobVerification',\n purpose: 'Confirm the applicant’s date of birth',\n constraints: {\n fields: [\n {\n path: ['$.credentialSubject.dateOfBirth'],\n filter: {\n type: 'string',\n format: 'date',\n },\n },\n ],\n },\n },\n // Name Verification\n {\n id: 'nameVerification',\n purpose: 'Confirm the applicant’s legal name',\n constraints: {\n fields: [\n {\n path: ['$.credentialSubject.name'],\n filter: {\n type: 'string'\n }\n }\n ]\n }\n }\n ]\n };",
+ "pex_selectCredentials": "const selectedCredentials = PresentationExchange.selectCredentials({\n vcJwts: allCredentials,\n presentationDefinition: presentationDefinition\n });",
+ "pex_checkPresentationDefinitionSatisfaction": "try {\n PresentationExchange.satisfiesPresentationDefinition({ \n vcJwts: selectedCredentials, \n presentationDefinition: presentationDefinition\n });\n } catch (err) {\n //Handle errors here\n \n }",
+ "pex_createPresentationFromCredentials": "const presentationResult = PresentationExchange.createPresentationFromCredentials({\n vcJwts: selectedCredentials,\n presentationDefinition: presentationDefinition\n });",
+ "pex_submissionCheck": "const submissionCheck = PresentationExchange.validateSubmission({\n presentationSubmission: presentationResult.presentationSubmission\n });",
+ "pex_getPresentationFromResult": "const presentation = presentationResult.presentation;",
+ "test1VcJwt": "const signedVcJwt =\n 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpkaHQ6a2ZkdGJjbTl6Z29jZjVtYXRmOWZ4dG5uZmZoaHp4YzdtZ2J3cjRrM3gzcXppYXVjcHA0eSMwIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiRW1wbG95bWVudENyZWRlbnRpYWwiXSwiaWQiOiJ1cm46dXVpZDo4ZmQ1MjAzMC0xY2FmLTQ5NzgtYTM1ZC1kNDE3ZWI4ZTAwYjIiLCJpc3N1ZXIiOiJkaWQ6ZGh0OmtmZHRiY205emdvY2Y1bWF0ZjlmeHRubmZmaGh6eGM3bWdid3I0azN4M3F6aWF1Y3BwNHkiLCJpc3N1YW5jZURhdGUiOiIyMDIzLTEyLTIxVDE3OjAyOjAxWiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmRodDp5MzltNDhvem9ldGU3ejZmemFhbmdjb3M4N2ZodWgxZHppN2Y3andiamZ0N290c2toOXRvIiwicG9zaXRpb24iOiJTb2Z0d2FyZSBEZXZlbG9wZXIiLCJzdGFydERhdGUiOiIyMDIxLTA0LTAxVDEyOjM0OjU2WiIsImVtcGxveW1lbnRTdGF0dXMiOiJDb250cmFjdG9yIn0sImV4cGlyYXRpb25EYXRlIjoiMjAyMi0wOS0zMFQxMjozNDo1NloifSwiaXNzIjoiZGlkOmRodDprZmR0YmNtOXpnb2NmNW1hdGY5Znh0bm5mZmhoenhjN21nYndyNGszeDNxemlhdWNwcDR5Iiwic3ViIjoiZGlkOmRodDp5MzltNDhvem9ldGU3ejZmemFhbmdjb3M4N2ZodWgxZHppN2Y3andiamZ0N290c2toOXRvIn0.ntcgPOdXOatULWo-q6gkuhKmi5X3bzCONQY38t_rsC1hVhvvdAtmiz-ccoLIYUkjECRHIxO_UZbOKgn0EETBCA';",
+ "createEmploymentCredential": "const vc = await VerifiableCredential.create({\n type: 'EmploymentCredential',\n issuer: employer.did,\n subject: employee.did,\n expirationDate: '2023-09-30T12:34:56Z',\n data: {\n \"position\": \"Software Developer\",\n \"startDate\": \"2023-04-01T12:34:56Z\",\n \"employmentStatus\": \"Contractor\"\n }\n});",
+ "signCredential": "//sign with PortableDid\nconst vc_jwt_employment = await vc.sign({ did: employer });",
+ "verifyCredentials": "//highlight-next-line\nconst vcJwtArray = presentationResult.presentation.verifiableCredential;\nconst verificationResults = [];\nlet errorsFound = false;\n\nfor (let vcJwt of vcJwtArray) {\n try {\n //highlight-next-line\n const verificationResult = await VerifiableCredential.verify({ vcJwt: vcJwt });\n \n //no error thrown\n verificationResults.push({\n jwt: vcJwt,\n result: verificationResult,\n isValid: true,\n error: null\n });\n } catch (error) {\n errorsFound = true;\n verificationResults.push({\n jwt: vcJwt,\n result: null,\n isValid: false,\n error: error.message\n });\n }\n}",
+ "checkVerificationResults": "if(errorsFound) {\n verificationResults.forEach(result => {\n if (!result.isValid) {\n console.log(`Error: ${result.error} for JWT ${result.jwt}`);\n }\n });\n}\nelse {\n //no errors are found. continue processing\n}",
+ "evaluatePresentation": "const evaluationResults = PresentationExchange.evaluatePresentation({\n presentationDefinition: presentationDefinition, \n presentation: presentationResult.presentation \n});",
+ "didCreate": "const { web5, did: aliceDid } = await Web5.connect();",
+ "readTextRecord": "const readResult = await record.data.text();",
+ "updateTextRecord": "const updateResult = await record.update({\n data: 'Hello, Web5! I am updated.',\n });",
+ "deleteTextRecord": "const deleteResult = await web5.dwn.records.delete({\n message: {\n recordId: record.id,\n },\n });"
+}
diff --git a/site/src/util/code-snippets.js b/site/src/util/code-snippets.js
new file mode 100644
index 0000000..3b2bd7c
--- /dev/null
+++ b/site/src/util/code-snippets.js
@@ -0,0 +1,14 @@
+import { Web5 } from '@web5/api';
+
+export async function didCreate() {
+ return await Web5.connect();
+}
+
+export async function createTextRecord(web5, textData) {
+ return await web5.dwn.records.create({
+ data: textData,
+ message: {
+ dataFormat: 'text/plain',
+ },
+ });
+}
diff --git a/site/src/util/feedback-retry-wait.js b/site/src/util/feedback-retry-wait.js
new file mode 100644
index 0000000..c8ab40c
--- /dev/null
+++ b/site/src/util/feedback-retry-wait.js
@@ -0,0 +1 @@
+export const wait = (duration) => new Promise(resolve => setTimeout(resolve, duration));
\ No newline at end of file
diff --git a/site/src/util/glitches.js b/site/src/util/glitches.js
new file mode 100644
index 0000000..30f03e3
--- /dev/null
+++ b/site/src/util/glitches.js
@@ -0,0 +1,50 @@
+const glitchImages = [
+ {
+ src: '/img/rectangle.svg',
+ alt: 'A pixelated upright rectangle',
+ },
+ {
+ src: '/img/small-glitch-cluster.svg',
+ alt: 'a glitch cluster',
+ },
+ {
+ src: '/img/zcluster.svg',
+ alt: 'a glitch cluster in a z shape',
+ },
+ {
+ src: '/img/small-glitch-cluster-vert.svg',
+ alt: 'a glitch cluster',
+ },
+ {
+ src: '/img/checkered-glitch.svg',
+ alt: 'checkered glitch cluster',
+ },
+ {
+ src: '/img/bar-code.svg',
+ alt: 'barcode glitch',
+ },
+];
+
+export const getGlitchMap = (glitchZones) => {
+ const glitchInvertClasses = [
+ 'tbd-cyan-illustration',
+ 'tbd-purple-illustration',
+ ];
+
+ let glitchMap = {};
+ const glitchArt = [...glitchImages];
+
+ glitchZones.forEach((glitchZone) => {
+ const imgIndex = Math.floor(Math.random() * glitchArt.length);
+ glitchMap[glitchZone] = {
+ img: glitchArt[imgIndex],
+ class:
+ glitchInvertClasses[
+ Math.floor(Math.random() * glitchInvertClasses.length)
+ ],
+ };
+ glitchArt.splice(imgIndex, 1);
+ });
+
+ return glitchMap;
+};
diff --git a/site/src/util/random-accent-color.js b/site/src/util/random-accent-color.js
new file mode 100644
index 0000000..3bcae8c
--- /dev/null
+++ b/site/src/util/random-accent-color.js
@@ -0,0 +1,20 @@
+const RandomAccentColor = (exclude) => {
+ let colors = [
+ 'tbd-yellow-illustration',
+ 'tbd-purple-illustration',
+ 'tbd-cyan-illustration',
+ ];
+ if (exclude !== null && exclude !== undefined) {
+ colors = colors.filter((color) => color !== exclude);
+ }
+
+ return colors[getRandomInt(0, colors.length)];
+};
+
+export function getRandomInt(min, max) {
+ min = Math.ceil(min);
+ max = Math.floor(max);
+ return Math.floor(Math.random() * (max - min)) + min;
+}
+
+export default RandomAccentColor;
diff --git a/site/src/util/remote-content-modification.js b/site/src/util/remote-content-modification.js
new file mode 100644
index 0000000..23a3fc7
--- /dev/null
+++ b/site/src/util/remote-content-modification.js
@@ -0,0 +1,67 @@
+import { components } from '../content/remote-md.json';
+import metacontent from '../content/global-meta';
+
+const modContent = function (filename, content, contentKey) {
+ let fileData = components[contentKey]['files'].find((file) => {
+ return file.file === filename;
+ });
+
+ let showBreadCrumbs = fileData.breadcrumbs && fileData.breadcrumbs === true;
+
+ let buttons = '';
+ if (fileData.buttons) {
+ buttons = `
`;
+ }
+
+ let re1 = /```mermaid/g;
+ var hasMermaid = false;
+ while (re1.exec(content) != null) {
+ hasMermaid = true;
+ break;
+ }
+
+ let re = /```mermaid([\s\S]*?)```/gm;
+
+ if (fileData) {
+ return {
+ content: `${hasMermaid ? 'import { Mermaid } from "@theme/Mermaid";' : ''}
+${fileData.buttons ? 'import ButtonGroup from "@site/src/ButtonGroup";' : ''}
+${
+ showBreadCrumbs
+ ? 'import TBDBreadcrumbs from "@site/src/TBDBreadcrumbs";'
+ : ''
+}
+
+
+ ${fileData.meta.title}
+
+
+
+
+
+
+
+
+
+${showBreadCrumbs ? ' ' : ''}
+
+${buttons}
+
+${content.replaceAll(re, '\r\r\r')}
+
+
`,
+ };
+ }
+
+ return undefined;
+};
+
+export default modContent;
diff --git a/site/src/vcUtils.js b/site/src/vcUtils.js
new file mode 100644
index 0000000..a80399c
--- /dev/null
+++ b/site/src/vcUtils.js
@@ -0,0 +1,86 @@
+const people = [
+ { name: 'Adewale Abati', urlParam: 'ace' },
+ { name: 'Angie Jones', urlParam: 'angie' },
+ { name: 'Daniel Buchner', urlParam: 'daniel' },
+ { name: 'Ebony Louis', urlParam: 'ebony' },
+ { name: 'Kirah Sapong', urlParam: 'kirah' },
+ { name: 'Tania Chakraborty', urlParam: 'tania' },
+ ];
+
+ export const createAndIssueVC = async (metParam) => {
+ if (typeof window === 'undefined') {
+ throw new Error('Web5 operations can only be performed in a browser environment');
+ }
+
+ const { Web5 } = await import('@web5/api');
+ const { DidDht } = await import('@web5/dids');
+ const { VerifiableCredential } = await import('@web5/credentials');
+
+ const person = people.find(p => p.urlParam === metParam);
+ if (!person) {
+ throw new Error(`Person with urlParam ${metParam} not found`);
+ }
+
+ const { web5, did: userDid } = await Web5.connect();
+ const issuerDid = await DidDht.create({ publish: true });
+ const schema = `https://schema.org/wadScavengerHunt`;
+
+ const { records } = await web5.dwn.records.query({
+ from: userDid,
+ message: {
+ filter: {
+ schema: schema,
+ dataFormat: 'application/json',
+ }
+ }
+ });
+
+ let existingVc = null;
+
+ if (records.length > 0) {
+ for (let record of records) {
+ const data = await record.data.json();
+ if (data.personUrlParam === person.urlParam) {
+ existingVc = data;
+ break;
+ }
+ }
+ if (existingVc) {
+ return existingVc;
+ }
+ }
+
+ if (!existingVc) {
+ const vc = await VerifiableCredential.create({
+ type: ['VerifiableCredential', 'NetworkingCredential'],
+ issuer: issuerDid.uri,
+ subject: userDid,
+ issuanceDate: new Date().toISOString(),
+ data: {
+ met: person.name,
+ event: 'WAD',
+ },
+ });
+
+ const vcJwt = await vc.sign({ did: issuerDid });
+
+ const { record } = await web5.dwn.records.create({
+ data: {
+ personUrlParam: person.urlParam,
+ vcJwt: vcJwt,
+ },
+ message: {
+ schema: schema,
+ dataFormat: 'application/json',
+ },
+ });
+
+ await record.send(userDid);
+
+ return {
+ personUrlParam: person.urlParam,
+ vcJwt: vcJwt,
+ };
+ }
+ };
+
\ No newline at end of file
diff --git a/site/static/.nojekyll b/site/static/.nojekyll
new file mode 100644
index 0000000..e69de29
diff --git a/site/static/files/Decentralized-Web-Platform.pdf b/site/static/files/Decentralized-Web-Platform.pdf
new file mode 100644
index 0000000..d7032e5
Binary files /dev/null and b/site/static/files/Decentralized-Web-Platform.pdf differ
diff --git a/site/static/files/index.txt b/site/static/files/index.txt
new file mode 100644
index 0000000..c42aa3a
--- /dev/null
+++ b/site/static/files/index.txt
@@ -0,0 +1,32 @@
+import { Web5 } from '@web5/api';
+import { VerifiableCredential } from '@web5/credentials';
+
+const { web5, did: aliceDid } = await Web5.connect();
+
+const { did: aliceBearerDid } = await web5.agent.identity.get({ didUri: aliceDid });
+
+const vc = await VerifiableCredential.create({
+ type: 'Web5QuickstartCompletionCredential',
+ issuer: aliceDid,
+ subject: aliceDid,
+ data: {
+ name: 'Alice Smith',
+ completionDate: new Date().toISOString(),
+ expertiseLevel: 'Beginner'
+ }
+});
+
+const signedVc = await vc.sign({ did: aliceBearerDid });
+
+const { record } = await web5.dwn.records.create({
+ data: signedVc,
+ message: {
+ schema: 'Web5QuickstartCompletionCredential',
+ dataFormat: 'application/vc+jwt',
+ published: true
+ }
+});
+
+const readSignedVc = await record.data.text();
+
+const parsedVc = VerifiableCredential.parseJwt({ vcJwt: readSignedVc });
\ No newline at end of file
diff --git a/site/static/files/schema.txt b/site/static/files/schema.txt
new file mode 100644
index 0000000..d5e2d31
--- /dev/null
+++ b/site/static/files/schema.txt
@@ -0,0 +1,58 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://json-schema.org/draft/2020-12/schema",
+ "$vocabulary": {
+ "https://json-schema.org/draft/2020-12/vocab/core": true,
+ "https://json-schema.org/draft/2020-12/vocab/applicator": true,
+ "https://json-schema.org/draft/2020-12/vocab/unevaluated": true,
+ "https://json-schema.org/draft/2020-12/vocab/validation": true,
+ "https://json-schema.org/draft/2020-12/vocab/meta-data": true,
+ "https://json-schema.org/draft/2020-12/vocab/format-annotation": true,
+ "https://json-schema.org/draft/2020-12/vocab/content": true
+ },
+ "$dynamicAnchor": "meta",
+
+ "title": "Core and Validation specifications meta-schema",
+ "allOf": [
+ {"$ref": "meta/core"},
+ {"$ref": "meta/applicator"},
+ {"$ref": "meta/unevaluated"},
+ {"$ref": "meta/validation"},
+ {"$ref": "meta/meta-data"},
+ {"$ref": "meta/format-annotation"},
+ {"$ref": "meta/content"}
+ ],
+ "type": ["object", "boolean"],
+ "$comment": "This meta-schema also defines keywords that have appeared in previous drafts in order to prevent incompatible extensions as they remain in common use.",
+ "properties": {
+ "definitions": {
+ "$comment": "\"definitions\" has been replaced by \"$defs\".",
+ "type": "object",
+ "additionalProperties": { "$dynamicRef": "#meta" },
+ "deprecated": true,
+ "default": {}
+ },
+ "dependencies": {
+ "$comment": "\"dependencies\" has been split and replaced by \"dependentSchemas\" and \"dependentRequired\" in order to serve their differing semantics.",
+ "type": "object",
+ "additionalProperties": {
+ "anyOf": [
+ { "$dynamicRef": "#meta" },
+ { "$ref": "meta/validation#/$defs/stringArray" }
+ ]
+ },
+ "deprecated": true,
+ "default": {}
+ },
+ "$recursiveAnchor": {
+ "$comment": "\"$recursiveAnchor\" has been replaced by \"$dynamicAnchor\".",
+ "$ref": "meta/core#/$defs/anchorString",
+ "deprecated": true
+ },
+ "$recursiveRef": {
+ "$comment": "\"$recursiveRef\" has been replaced by \"$dynamicRef\".",
+ "$ref": "meta/core#/$defs/uriReferenceString",
+ "deprecated": true
+ }
+ }
+}
diff --git a/site/static/img/7-ways-we-use-vcs-banner.png b/site/static/img/7-ways-we-use-vcs-banner.png
new file mode 100644
index 0000000..81ca240
Binary files /dev/null and b/site/static/img/7-ways-we-use-vcs-banner.png differ
diff --git a/site/static/img/Home-breadcrumbs-icon.svg b/site/static/img/Home-breadcrumbs-icon.svg
new file mode 100644
index 0000000..6eaf64b
--- /dev/null
+++ b/site/static/img/Home-breadcrumbs-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/TBD54566975.svg b/site/static/img/TBD54566975.svg
new file mode 100644
index 0000000..baf8ab8
--- /dev/null
+++ b/site/static/img/TBD54566975.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/abc_conf_angie.png b/site/static/img/abc_conf_angie.png
new file mode 100644
index 0000000..07a47d9
Binary files /dev/null and b/site/static/img/abc_conf_angie.png differ
diff --git a/site/static/img/aceVcCard.png b/site/static/img/aceVcCard.png
new file mode 100644
index 0000000..e01128f
Binary files /dev/null and b/site/static/img/aceVcCard.png differ
diff --git a/site/static/img/acme-bank-example.png b/site/static/img/acme-bank-example.png
new file mode 100644
index 0000000..68c06f9
Binary files /dev/null and b/site/static/img/acme-bank-example.png differ
diff --git a/site/static/img/actors-index-1.svg b/site/static/img/actors-index-1.svg
new file mode 100644
index 0000000..bbe9a8a
--- /dev/null
+++ b/site/static/img/actors-index-1.svg
@@ -0,0 +1,433 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/actors-index-2.svg b/site/static/img/actors-index-2.svg
new file mode 100644
index 0000000..a28246c
--- /dev/null
+++ b/site/static/img/actors-index-2.svg
@@ -0,0 +1,433 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/actors-index-3.svg b/site/static/img/actors-index-3.svg
new file mode 100644
index 0000000..5ac20bc
--- /dev/null
+++ b/site/static/img/actors-index-3.svg
@@ -0,0 +1,433 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/actors-web5-desktop.svg b/site/static/img/actors-web5-desktop.svg
new file mode 100644
index 0000000..4c90032
--- /dev/null
+++ b/site/static/img/actors-web5-desktop.svg
@@ -0,0 +1,275 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/actors-web5-mobile-1.svg b/site/static/img/actors-web5-mobile-1.svg
new file mode 100644
index 0000000..1590fd3
--- /dev/null
+++ b/site/static/img/actors-web5-mobile-1.svg
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/actors-web5-mobile-2.svg b/site/static/img/actors-web5-mobile-2.svg
new file mode 100644
index 0000000..207ec8b
--- /dev/null
+++ b/site/static/img/actors-web5-mobile-2.svg
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/actors-web5-mobile.svg b/site/static/img/actors-web5-mobile.svg
new file mode 100644
index 0000000..0ba306f
--- /dev/null
+++ b/site/static/img/actors-web5-mobile.svg
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/africabitcoin22.png b/site/static/img/africabitcoin22.png
new file mode 100644
index 0000000..e0d68a8
Binary files /dev/null and b/site/static/img/africabitcoin22.png differ
diff --git a/site/static/img/ai-bestie.png b/site/static/img/ai-bestie.png
new file mode 100644
index 0000000..7a70d26
Binary files /dev/null and b/site/static/img/ai-bestie.png differ
diff --git a/site/static/img/alice-bob-dwn.png b/site/static/img/alice-bob-dwn.png
new file mode 100644
index 0000000..cff99e2
Binary files /dev/null and b/site/static/img/alice-bob-dwn.png differ
diff --git a/site/static/img/aliceKcc.png b/site/static/img/aliceKcc.png
new file mode 100644
index 0000000..06a24fa
Binary files /dev/null and b/site/static/img/aliceKcc.png differ
diff --git a/site/static/img/allthingsopen22-angie.jpg b/site/static/img/allthingsopen22-angie.jpg
new file mode 100644
index 0000000..1778560
Binary files /dev/null and b/site/static/img/allthingsopen22-angie.jpg differ
diff --git a/site/static/img/angieVcCard.png b/site/static/img/angieVcCard.png
new file mode 100644
index 0000000..1b4cfc5
Binary files /dev/null and b/site/static/img/angieVcCard.png differ
diff --git a/site/static/img/arrow-blue-navbar.svg b/site/static/img/arrow-blue-navbar.svg
new file mode 100644
index 0000000..bd892d9
--- /dev/null
+++ b/site/static/img/arrow-blue-navbar.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/arrow-blue-right.svg b/site/static/img/arrow-blue-right.svg
new file mode 100644
index 0000000..0241027
--- /dev/null
+++ b/site/static/img/arrow-blue-right.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/site/static/img/arrow-blue.svg b/site/static/img/arrow-blue.svg
new file mode 100644
index 0000000..69b1e0d
--- /dev/null
+++ b/site/static/img/arrow-blue.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/site/static/img/arrow-icon.svg b/site/static/img/arrow-icon.svg
new file mode 100644
index 0000000..64c7fff
--- /dev/null
+++ b/site/static/img/arrow-icon.svg
@@ -0,0 +1,4 @@
+
+
+
diff --git a/site/static/img/arrow-yellow.svg b/site/static/img/arrow-yellow.svg
new file mode 100644
index 0000000..66c1df9
--- /dev/null
+++ b/site/static/img/arrow-yellow.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/site/static/img/article-icon.svg b/site/static/img/article-icon.svg
new file mode 100644
index 0000000..2775fea
--- /dev/null
+++ b/site/static/img/article-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/site/static/img/article-media-icon.svg b/site/static/img/article-media-icon.svg
new file mode 100644
index 0000000..14b03ec
--- /dev/null
+++ b/site/static/img/article-media-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/ask-chad.png b/site/static/img/ask-chad.png
new file mode 100644
index 0000000..06d6e2d
Binary files /dev/null and b/site/static/img/ask-chad.png differ
diff --git a/site/static/img/audio-media-icon.svg b/site/static/img/audio-media-icon.svg
new file mode 100644
index 0000000..b858510
--- /dev/null
+++ b/site/static/img/audio-media-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/bank-purple-yellow.svg b/site/static/img/bank-purple-yellow.svg
new file mode 100644
index 0000000..ca01c94
--- /dev/null
+++ b/site/static/img/bank-purple-yellow.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/static/img/bank.svg b/site/static/img/bank.svg
new file mode 100644
index 0000000..e8c03ba
--- /dev/null
+++ b/site/static/img/bank.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/bar-code.svg b/site/static/img/bar-code.svg
new file mode 100644
index 0000000..bf306fa
--- /dev/null
+++ b/site/static/img/bar-code.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/blog-benri-ssi-host3.png b/site/static/img/blog-benri-ssi-host3.png
new file mode 100644
index 0000000..3e2d19e
Binary files /dev/null and b/site/static/img/blog-benri-ssi-host3.png differ
diff --git a/site/static/img/blog-ca-dmv-mdl.png b/site/static/img/blog-ca-dmv-mdl.png
new file mode 100644
index 0000000..bc2658d
Binary files /dev/null and b/site/static/img/blog-ca-dmv-mdl.png differ
diff --git a/site/static/img/blog-companies-embrace-web5.png b/site/static/img/blog-companies-embrace-web5.png
new file mode 100644
index 0000000..45b594c
Binary files /dev/null and b/site/static/img/blog-companies-embrace-web5.png differ
diff --git a/site/static/img/blog-decentralized-apps.png b/site/static/img/blog-decentralized-apps.png
new file mode 100644
index 0000000..005c7a9
Binary files /dev/null and b/site/static/img/blog-decentralized-apps.png differ
diff --git a/site/static/img/blog-did-dht.png b/site/static/img/blog-did-dht.png
new file mode 100644
index 0000000..d372a8f
Binary files /dev/null and b/site/static/img/blog-did-dht.png differ
diff --git a/site/static/img/blog-google-podcasts-discontinued.png b/site/static/img/blog-google-podcasts-discontinued.png
new file mode 100644
index 0000000..7ffbda2
Binary files /dev/null and b/site/static/img/blog-google-podcasts-discontinued.png differ
diff --git a/site/static/img/blog-la-wallet-vcs.png b/site/static/img/blog-la-wallet-vcs.png
new file mode 100644
index 0000000..7437bb1
Binary files /dev/null and b/site/static/img/blog-la-wallet-vcs.png differ
diff --git a/site/static/img/blog-open-standards.png b/site/static/img/blog-open-standards.png
new file mode 100644
index 0000000..328d5d1
Binary files /dev/null and b/site/static/img/blog-open-standards.png differ
diff --git a/site/static/img/blog-tbd-innovators-1024.png b/site/static/img/blog-tbd-innovators-1024.png
new file mode 100644
index 0000000..4e4fc66
Binary files /dev/null and b/site/static/img/blog-tbd-innovators-1024.png differ
diff --git a/site/static/img/blog-vcs-combat-fake-reviews.png b/site/static/img/blog-vcs-combat-fake-reviews.png
new file mode 100644
index 0000000..e5aae58
Binary files /dev/null and b/site/static/img/blog-vcs-combat-fake-reviews.png differ
diff --git a/site/static/img/blog-yellow-blue.svg b/site/static/img/blog-yellow-blue.svg
new file mode 100644
index 0000000..4dabe99
--- /dev/null
+++ b/site/static/img/blog-yellow-blue.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/static/img/blog_hacktoberfest-2024.png b/site/static/img/blog_hacktoberfest-2024.png
new file mode 100644
index 0000000..7aba81f
Binary files /dev/null and b/site/static/img/blog_hacktoberfest-2024.png differ
diff --git a/site/static/img/blog_recognition_program.png b/site/static/img/blog_recognition_program.png
new file mode 100644
index 0000000..0d40fdf
Binary files /dev/null and b/site/static/img/blog_recognition_program.png differ
diff --git a/site/static/img/blog_social_media_handles_vs_dids.png b/site/static/img/blog_social_media_handles_vs_dids.png
new file mode 100644
index 0000000..6856fc7
Binary files /dev/null and b/site/static/img/blog_social_media_handles_vs_dids.png differ
diff --git a/site/static/img/blue-arrow-left.svg b/site/static/img/blue-arrow-left.svg
new file mode 100644
index 0000000..25032d0
--- /dev/null
+++ b/site/static/img/blue-arrow-left.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/site/static/img/blue-arrow-right.svg b/site/static/img/blue-arrow-right.svg
new file mode 100644
index 0000000..0241027
--- /dev/null
+++ b/site/static/img/blue-arrow-right.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/site/static/img/bluesky-dids.png b/site/static/img/bluesky-dids.png
new file mode 100644
index 0000000..5302f52
Binary files /dev/null and b/site/static/img/bluesky-dids.png differ
diff --git a/site/static/img/box.svg b/site/static/img/box.svg
new file mode 100644
index 0000000..b08b707
--- /dev/null
+++ b/site/static/img/box.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/brain-image-dark.svg b/site/static/img/brain-image-dark.svg
new file mode 100644
index 0000000..deb976b
--- /dev/null
+++ b/site/static/img/brain-image-dark.svg
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/brain-image-light.svg b/site/static/img/brain-image-light.svg
new file mode 100644
index 0000000..ae730a6
--- /dev/null
+++ b/site/static/img/brain-image-light.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/site/static/img/chatgpt-plugin-create-did.png b/site/static/img/chatgpt-plugin-create-did.png
new file mode 100644
index 0000000..1527bc7
Binary files /dev/null and b/site/static/img/chatgpt-plugin-create-did.png differ
diff --git a/site/static/img/chatgpt-plugin-create-protocol.png b/site/static/img/chatgpt-plugin-create-protocol.png
new file mode 100644
index 0000000..e934ee7
Binary files /dev/null and b/site/static/img/chatgpt-plugin-create-protocol.png differ
diff --git a/site/static/img/chatgpt-plugin-install.png b/site/static/img/chatgpt-plugin-install.png
new file mode 100644
index 0000000..3749c02
Binary files /dev/null and b/site/static/img/chatgpt-plugin-install.png differ
diff --git a/site/static/img/chatgpt-plugin-what-is-a-did.png b/site/static/img/chatgpt-plugin-what-is-a-did.png
new file mode 100644
index 0000000..4ca03ec
Binary files /dev/null and b/site/static/img/chatgpt-plugin-what-is-a-did.png differ
diff --git a/site/static/img/chatgpt_error.png b/site/static/img/chatgpt_error.png
new file mode 100644
index 0000000..8968ae6
Binary files /dev/null and b/site/static/img/chatgpt_error.png differ
diff --git a/site/static/img/chatgpt_resolver.png b/site/static/img/chatgpt_resolver.png
new file mode 100644
index 0000000..6ed61b8
Binary files /dev/null and b/site/static/img/chatgpt_resolver.png differ
diff --git a/site/static/img/checkered-glitch.svg b/site/static/img/checkered-glitch.svg
new file mode 100644
index 0000000..f3ea08e
--- /dev/null
+++ b/site/static/img/checkered-glitch.svg
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/clarity-icon.svg b/site/static/img/clarity-icon.svg
new file mode 100644
index 0000000..34fc7e6
--- /dev/null
+++ b/site/static/img/clarity-icon.svg
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/close-menu-mobile.svg b/site/static/img/close-menu-mobile.svg
new file mode 100644
index 0000000..a493a9b
--- /dev/null
+++ b/site/static/img/close-menu-mobile.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/communityPanel.png b/site/static/img/communityPanel.png
new file mode 100644
index 0000000..e71c2ae
Binary files /dev/null and b/site/static/img/communityPanel.png differ
diff --git a/site/static/img/component-icon.svg b/site/static/img/component-icon.svg
new file mode 100644
index 0000000..1d1609f
--- /dev/null
+++ b/site/static/img/component-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/converge22-daniel.png b/site/static/img/converge22-daniel.png
new file mode 100644
index 0000000..e81b71e
Binary files /dev/null and b/site/static/img/converge22-daniel.png differ
diff --git a/site/static/img/copyright-image.svg b/site/static/img/copyright-image.svg
new file mode 100644
index 0000000..e754451
--- /dev/null
+++ b/site/static/img/copyright-image.svg
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/static/img/credential-blue.svg b/site/static/img/credential-blue.svg
new file mode 100644
index 0000000..fd2c0e8
--- /dev/null
+++ b/site/static/img/credential-blue.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/site/static/img/credential-yellow.svg b/site/static/img/credential-yellow.svg
new file mode 100644
index 0000000..fea2d88
--- /dev/null
+++ b/site/static/img/credential-yellow.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/site/static/img/credential_working_group_banner.png b/site/static/img/credential_working_group_banner.png
new file mode 100644
index 0000000..bde1180
Binary files /dev/null and b/site/static/img/credential_working_group_banner.png differ
diff --git a/site/static/img/currency-bitcoin.svg b/site/static/img/currency-bitcoin.svg
new file mode 100644
index 0000000..47a0458
--- /dev/null
+++ b/site/static/img/currency-bitcoin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/currency-euro.svg b/site/static/img/currency-euro.svg
new file mode 100644
index 0000000..7d332e6
--- /dev/null
+++ b/site/static/img/currency-euro.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/currency-of-freedom.png b/site/static/img/currency-of-freedom.png
new file mode 100644
index 0000000..25f3b69
Binary files /dev/null and b/site/static/img/currency-of-freedom.png differ
diff --git a/site/static/img/currency-pound.svg b/site/static/img/currency-pound.svg
new file mode 100644
index 0000000..ee502da
--- /dev/null
+++ b/site/static/img/currency-pound.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/currency-usd.svg b/site/static/img/currency-usd.svg
new file mode 100644
index 0000000..e64b086
--- /dev/null
+++ b/site/static/img/currency-usd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/currency-yen.svg b/site/static/img/currency-yen.svg
new file mode 100644
index 0000000..d502206
--- /dev/null
+++ b/site/static/img/currency-yen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/danielVcCard.png b/site/static/img/danielVcCard.png
new file mode 100644
index 0000000..7589c37
Binary files /dev/null and b/site/static/img/danielVcCard.png differ
diff --git a/site/static/img/daniel_buchner.jpg b/site/static/img/daniel_buchner.jpg
new file mode 100644
index 0000000..3bcced0
Binary files /dev/null and b/site/static/img/daniel_buchner.jpg differ
diff --git a/site/static/img/dap-blog-banner.png b/site/static/img/dap-blog-banner.png
new file mode 100644
index 0000000..bb0c693
Binary files /dev/null and b/site/static/img/dap-blog-banner.png differ
diff --git a/site/static/img/dark-mode-toggle-2.svg b/site/static/img/dark-mode-toggle-2.svg
new file mode 100644
index 0000000..4e4114b
--- /dev/null
+++ b/site/static/img/dark-mode-toggle-2.svg
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/dark-mode-toggle.svg b/site/static/img/dark-mode-toggle.svg
new file mode 100644
index 0000000..f544a88
--- /dev/null
+++ b/site/static/img/dark-mode-toggle.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/site/static/img/data-icon.svg b/site/static/img/data-icon.svg
new file mode 100644
index 0000000..467e1bc
--- /dev/null
+++ b/site/static/img/data-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/devcareer-hackathon-winners.png b/site/static/img/devcareer-hackathon-winners.png
new file mode 100644
index 0000000..d08e655
Binary files /dev/null and b/site/static/img/devcareer-hackathon-winners.png differ
diff --git a/site/static/img/devices-icon.svg b/site/static/img/devices-icon.svg
new file mode 100644
index 0000000..ea9f035
--- /dev/null
+++ b/site/static/img/devices-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/did-Authentication.png b/site/static/img/did-Authentication.png
new file mode 100644
index 0000000..591b1f1
Binary files /dev/null and b/site/static/img/did-Authentication.png differ
diff --git a/site/static/img/did-contact-info.png b/site/static/img/did-contact-info.png
new file mode 100644
index 0000000..20de9c4
Binary files /dev/null and b/site/static/img/did-contact-info.png differ
diff --git a/site/static/img/did-controller-trust.png b/site/static/img/did-controller-trust.png
new file mode 100644
index 0000000..7ada17c
Binary files /dev/null and b/site/static/img/did-controller-trust.png differ
diff --git a/site/static/img/did-example.png b/site/static/img/did-example.png
new file mode 100644
index 0000000..3ccb9cd
Binary files /dev/null and b/site/static/img/did-example.png differ
diff --git a/site/static/img/did-format.png b/site/static/img/did-format.png
new file mode 100644
index 0000000..0cf9b70
Binary files /dev/null and b/site/static/img/did-format.png differ
diff --git a/site/static/img/did-hack-slide0.png b/site/static/img/did-hack-slide0.png
new file mode 100644
index 0000000..94ded5d
Binary files /dev/null and b/site/static/img/did-hack-slide0.png differ
diff --git a/site/static/img/did-hack-slide1.png b/site/static/img/did-hack-slide1.png
new file mode 100644
index 0000000..41ce7c5
Binary files /dev/null and b/site/static/img/did-hack-slide1.png differ
diff --git a/site/static/img/did-hack-slide2.png b/site/static/img/did-hack-slide2.png
new file mode 100644
index 0000000..efccdd6
Binary files /dev/null and b/site/static/img/did-hack-slide2.png differ
diff --git a/site/static/img/did-hack-slide3.png b/site/static/img/did-hack-slide3.png
new file mode 100644
index 0000000..8fbec48
Binary files /dev/null and b/site/static/img/did-hack-slide3.png differ
diff --git a/site/static/img/did-hack-winners.jpg b/site/static/img/did-hack-winners.jpg
new file mode 100644
index 0000000..b397bd4
Binary files /dev/null and b/site/static/img/did-hack-winners.jpg differ
diff --git a/site/static/img/did-parental-controls.png b/site/static/img/did-parental-controls.png
new file mode 100644
index 0000000..403e3b1
Binary files /dev/null and b/site/static/img/did-parental-controls.png differ
diff --git a/site/static/img/did-resolve.png b/site/static/img/did-resolve.png
new file mode 100644
index 0000000..926ba24
Binary files /dev/null and b/site/static/img/did-resolve.png differ
diff --git a/site/static/img/did-vc.svg b/site/static/img/did-vc.svg
new file mode 100644
index 0000000..10be13b
--- /dev/null
+++ b/site/static/img/did-vc.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/did_format.png b/site/static/img/did_format.png
new file mode 100644
index 0000000..2772ed4
Binary files /dev/null and b/site/static/img/did_format.png differ
diff --git a/site/static/img/dids-in-the-real-world.png b/site/static/img/dids-in-the-real-world.png
new file mode 100644
index 0000000..5327b76
Binary files /dev/null and b/site/static/img/dids-in-the-real-world.png differ
diff --git a/site/static/img/dif-hackathon-ace.jpg b/site/static/img/dif-hackathon-ace.jpg
new file mode 100644
index 0000000..4076cb6
Binary files /dev/null and b/site/static/img/dif-hackathon-ace.jpg differ
diff --git a/site/static/img/dif-hackathon-banner.gif b/site/static/img/dif-hackathon-banner.gif
new file mode 100644
index 0000000..9e44eb3
Binary files /dev/null and b/site/static/img/dif-hackathon-banner.gif differ
diff --git a/site/static/img/dif-hackathon-winners.png b/site/static/img/dif-hackathon-winners.png
new file mode 100644
index 0000000..99435f4
Binary files /dev/null and b/site/static/img/dif-hackathon-winners.png differ
diff --git a/site/static/img/dinosaur-illustration.svg b/site/static/img/dinosaur-illustration.svg
new file mode 100644
index 0000000..0223f10
--- /dev/null
+++ b/site/static/img/dinosaur-illustration.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/discord-avatar.png b/site/static/img/discord-avatar.png
new file mode 100644
index 0000000..0788fae
Binary files /dev/null and b/site/static/img/discord-avatar.png differ
diff --git a/site/static/img/discord-icon.svg b/site/static/img/discord-icon.svg
new file mode 100644
index 0000000..68b3fdf
--- /dev/null
+++ b/site/static/img/discord-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/site/static/img/discourse-icon.svg b/site/static/img/discourse-icon.svg
new file mode 100644
index 0000000..40add7a
--- /dev/null
+++ b/site/static/img/discourse-icon.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/site/static/img/divider-dotted-dark.svg b/site/static/img/divider-dotted-dark.svg
new file mode 100644
index 0000000..1b95fde
--- /dev/null
+++ b/site/static/img/divider-dotted-dark.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/site/static/img/divider-dotted-light.svg b/site/static/img/divider-dotted-light.svg
new file mode 100644
index 0000000..a2a9fbc
--- /dev/null
+++ b/site/static/img/divider-dotted-light.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/site/static/img/divider-dotted-small-dark.svg b/site/static/img/divider-dotted-small-dark.svg
new file mode 100644
index 0000000..a5e5283
--- /dev/null
+++ b/site/static/img/divider-dotted-small-dark.svg
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/divider-dotted-white.svg b/site/static/img/divider-dotted-white.svg
new file mode 100644
index 0000000..1412ec7
--- /dev/null
+++ b/site/static/img/divider-dotted-white.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/divider-mobile-menu-dark copy.svg b/site/static/img/divider-mobile-menu-dark copy.svg
new file mode 100644
index 0000000..9822355
--- /dev/null
+++ b/site/static/img/divider-mobile-menu-dark copy.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/divider-mobile-menu-dark.svg b/site/static/img/divider-mobile-menu-dark.svg
new file mode 100644
index 0000000..9822355
--- /dev/null
+++ b/site/static/img/divider-mobile-menu-dark.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/divider-mobile-menu.svg b/site/static/img/divider-mobile-menu.svg
new file mode 100644
index 0000000..6fc97f8
--- /dev/null
+++ b/site/static/img/divider-mobile-menu.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/divider-slash-dark.svg b/site/static/img/divider-slash-dark.svg
new file mode 100644
index 0000000..2c0c46c
--- /dev/null
+++ b/site/static/img/divider-slash-dark.svg
@@ -0,0 +1,749 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/divider-slash-light.svg b/site/static/img/divider-slash-light.svg
new file mode 100644
index 0000000..21f4c35
--- /dev/null
+++ b/site/static/img/divider-slash-light.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/docs-app.svg b/site/static/img/docs-app.svg
new file mode 100644
index 0000000..1d73ff0
--- /dev/null
+++ b/site/static/img/docs-app.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/docs-blog-icon.svg b/site/static/img/docs-blog-icon.svg
new file mode 100644
index 0000000..43621ea
--- /dev/null
+++ b/site/static/img/docs-blog-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/docs-chatting.svg b/site/static/img/docs-chatting.svg
new file mode 100644
index 0000000..cd96909
--- /dev/null
+++ b/site/static/img/docs-chatting.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/docs-cloud-server.svg b/site/static/img/docs-cloud-server.svg
new file mode 100644
index 0000000..acbfc0c
--- /dev/null
+++ b/site/static/img/docs-cloud-server.svg
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/docs-coffee-break.svg b/site/static/img/docs-coffee-break.svg
new file mode 100644
index 0000000..4a2fae4
--- /dev/null
+++ b/site/static/img/docs-coffee-break.svg
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/docs-computer-user.svg b/site/static/img/docs-computer-user.svg
new file mode 100644
index 0000000..f9b8ada
--- /dev/null
+++ b/site/static/img/docs-computer-user.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
diff --git a/site/static/img/docs-conference-speaker.svg b/site/static/img/docs-conference-speaker.svg
new file mode 100644
index 0000000..5ba302a
--- /dev/null
+++ b/site/static/img/docs-conference-speaker.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/docs-id-icon.svg b/site/static/img/docs-id-icon.svg
new file mode 100644
index 0000000..187d067
--- /dev/null
+++ b/site/static/img/docs-id-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/docs-listen-music.svg b/site/static/img/docs-listen-music.svg
new file mode 100644
index 0000000..1ab9e50
--- /dev/null
+++ b/site/static/img/docs-listen-music.svg
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/docs-page-icon.svg b/site/static/img/docs-page-icon.svg
new file mode 100644
index 0000000..0f037eb
--- /dev/null
+++ b/site/static/img/docs-page-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/docs-puzzle.svg b/site/static/img/docs-puzzle.svg
new file mode 100644
index 0000000..09f251a
--- /dev/null
+++ b/site/static/img/docs-puzzle.svg
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
diff --git a/site/static/img/docs-task-list.svg b/site/static/img/docs-task-list.svg
new file mode 100644
index 0000000..6cc9d28
--- /dev/null
+++ b/site/static/img/docs-task-list.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/docs-todo-icon.png b/site/static/img/docs-todo-icon.png
new file mode 100644
index 0000000..2c2470a
Binary files /dev/null and b/site/static/img/docs-todo-icon.png differ
diff --git a/site/static/img/docs-video-camera.svg b/site/static/img/docs-video-camera.svg
new file mode 100644
index 0000000..40298fb
--- /dev/null
+++ b/site/static/img/docs-video-camera.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
diff --git a/site/static/img/docs-web5-code-connect-animated.png b/site/static/img/docs-web5-code-connect-animated.png
new file mode 100644
index 0000000..3138644
Binary files /dev/null and b/site/static/img/docs-web5-code-connect-animated.png differ
diff --git a/site/static/img/docs-web5-code-connect.png b/site/static/img/docs-web5-code-connect.png
new file mode 100644
index 0000000..8ce9c42
Binary files /dev/null and b/site/static/img/docs-web5-code-connect.png differ
diff --git a/site/static/img/document.svg b/site/static/img/document.svg
new file mode 100644
index 0000000..6e6ccbf
--- /dev/null
+++ b/site/static/img/document.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/docusaurus-social-card.jpg b/site/static/img/docusaurus-social-card.jpg
new file mode 100644
index 0000000..ffcb448
Binary files /dev/null and b/site/static/img/docusaurus-social-card.jpg differ
diff --git a/site/static/img/docusaurus.png b/site/static/img/docusaurus.png
new file mode 100644
index 0000000..f458149
Binary files /dev/null and b/site/static/img/docusaurus.png differ
diff --git a/site/static/img/dot-icon.svg b/site/static/img/dot-icon.svg
new file mode 100644
index 0000000..bb79d7a
--- /dev/null
+++ b/site/static/img/dot-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/download-icon.svg b/site/static/img/download-icon.svg
new file mode 100644
index 0000000..86079ec
--- /dev/null
+++ b/site/static/img/download-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/dwas-vs-pwas.png b/site/static/img/dwas-vs-pwas.png
new file mode 100644
index 0000000..bd31795
Binary files /dev/null and b/site/static/img/dwas-vs-pwas.png differ
diff --git a/site/static/img/ebonyVcCard.png b/site/static/img/ebonyVcCard.png
new file mode 100644
index 0000000..8677008
Binary files /dev/null and b/site/static/img/ebonyVcCard.png differ
diff --git a/site/static/img/email-icon.svg b/site/static/img/email-icon.svg
new file mode 100644
index 0000000..33da9d7
--- /dev/null
+++ b/site/static/img/email-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/evolving-the-web.png b/site/static/img/evolving-the-web.png
new file mode 100644
index 0000000..a8e4de2
Binary files /dev/null and b/site/static/img/evolving-the-web.png differ
diff --git a/site/static/img/external-contributor/Ashit743_DWN_Web5.png b/site/static/img/external-contributor/Ashit743_DWN_Web5.png
new file mode 100644
index 0000000..921ac19
Binary files /dev/null and b/site/static/img/external-contributor/Ashit743_DWN_Web5.png differ
diff --git a/site/static/img/external-contributor/DRL.png b/site/static/img/external-contributor/DRL.png
new file mode 100644
index 0000000..56ccd62
Binary files /dev/null and b/site/static/img/external-contributor/DRL.png differ
diff --git a/site/static/img/external-contributor/Kiran_verificablecredentials_1.png b/site/static/img/external-contributor/Kiran_verificablecredentials_1.png
new file mode 100644
index 0000000..83bea10
Binary files /dev/null and b/site/static/img/external-contributor/Kiran_verificablecredentials_1.png differ
diff --git a/site/static/img/external-contributor/Lymah123_PFI.png b/site/static/img/external-contributor/Lymah123_PFI.png
new file mode 100644
index 0000000..f5bf579
Binary files /dev/null and b/site/static/img/external-contributor/Lymah123_PFI.png differ
diff --git a/site/static/img/external-contributor/Lymah123_comparing_DID_methods.png b/site/static/img/external-contributor/Lymah123_comparing_DID_methods.png
new file mode 100644
index 0000000..8760dab
Binary files /dev/null and b/site/static/img/external-contributor/Lymah123_comparing_DID_methods.png differ
diff --git a/site/static/img/external-contributor/Lymah123_protocol_roles.png b/site/static/img/external-contributor/Lymah123_protocol_roles.png
new file mode 100644
index 0000000..b00a673
Binary files /dev/null and b/site/static/img/external-contributor/Lymah123_protocol_roles.png differ
diff --git a/site/static/img/external-contributor/Lymah123_understanding_dwns.png b/site/static/img/external-contributor/Lymah123_understanding_dwns.png
new file mode 100644
index 0000000..3d6382a
Binary files /dev/null and b/site/static/img/external-contributor/Lymah123_understanding_dwns.png differ
diff --git a/site/static/img/external-contributor/Lymah123_understanding_web5_and_its_potential.png b/site/static/img/external-contributor/Lymah123_understanding_web5_and_its_potential.png
new file mode 100644
index 0000000..766dc2f
Binary files /dev/null and b/site/static/img/external-contributor/Lymah123_understanding_web5_and_its_potential.png differ
diff --git a/site/static/img/external-contributor/ProtocolRules.png b/site/static/img/external-contributor/ProtocolRules.png
new file mode 100644
index 0000000..515cb24
Binary files /dev/null and b/site/static/img/external-contributor/ProtocolRules.png differ
diff --git a/site/static/img/external-contributor/TBD_nabhel.png b/site/static/img/external-contributor/TBD_nabhel.png
new file mode 100644
index 0000000..fc7d2a2
Binary files /dev/null and b/site/static/img/external-contributor/TBD_nabhel.png differ
diff --git a/site/static/img/external-contributor/VC.png b/site/static/img/external-contributor/VC.png
new file mode 100644
index 0000000..02f4dc8
Binary files /dev/null and b/site/static/img/external-contributor/VC.png differ
diff --git a/site/static/img/external-contributor/breehall_verifiable_credentials.png b/site/static/img/external-contributor/breehall_verifiable_credentials.png
new file mode 100644
index 0000000..f78ecf9
Binary files /dev/null and b/site/static/img/external-contributor/breehall_verifiable_credentials.png differ
diff --git a/site/static/img/external-contributor/chrissiku_the_future_0f_web.png b/site/static/img/external-contributor/chrissiku_the_future_0f_web.png
new file mode 100644
index 0000000..b5de642
Binary files /dev/null and b/site/static/img/external-contributor/chrissiku_the_future_0f_web.png differ
diff --git a/site/static/img/external-contributor/dwn_video_thumbnail.png b/site/static/img/external-contributor/dwn_video_thumbnail.png
new file mode 100644
index 0000000..97349da
Binary files /dev/null and b/site/static/img/external-contributor/dwn_video_thumbnail.png differ
diff --git a/site/static/img/external-contributor/dwns_blog_chrissiku.png b/site/static/img/external-contributor/dwns_blog_chrissiku.png
new file mode 100644
index 0000000..09235e0
Binary files /dev/null and b/site/static/img/external-contributor/dwns_blog_chrissiku.png differ
diff --git a/site/static/img/external-contributor/hackexperience.png b/site/static/img/external-contributor/hackexperience.png
new file mode 100644
index 0000000..0bb7c44
Binary files /dev/null and b/site/static/img/external-contributor/hackexperience.png differ
diff --git a/site/static/img/external-contributor/hacktoberfest-journey.png b/site/static/img/external-contributor/hacktoberfest-journey.png
new file mode 100644
index 0000000..9994b88
Binary files /dev/null and b/site/static/img/external-contributor/hacktoberfest-journey.png differ
diff --git a/site/static/img/external-contributor/hfest.png b/site/static/img/external-contributor/hfest.png
new file mode 100644
index 0000000..9ee66c2
Binary files /dev/null and b/site/static/img/external-contributor/hfest.png differ
diff --git a/site/static/img/external-contributor/how_to_resolve_dids.png b/site/static/img/external-contributor/how_to_resolve_dids.png
new file mode 100644
index 0000000..50d1554
Binary files /dev/null and b/site/static/img/external-contributor/how_to_resolve_dids.png differ
diff --git a/site/static/img/external-contributor/kiranbaliga.png b/site/static/img/external-contributor/kiranbaliga.png
new file mode 100644
index 0000000..54c3c03
Binary files /dev/null and b/site/static/img/external-contributor/kiranbaliga.png differ
diff --git a/site/static/img/external-contributor/mohit_hacktoberfest_journey.png b/site/static/img/external-contributor/mohit_hacktoberfest_journey.png
new file mode 100644
index 0000000..1ec59c6
Binary files /dev/null and b/site/static/img/external-contributor/mohit_hacktoberfest_journey.png differ
diff --git a/site/static/img/external-contributor/quick_start_web5_chrissiku.png b/site/static/img/external-contributor/quick_start_web5_chrissiku.png
new file mode 100644
index 0000000..59b4cb1
Binary files /dev/null and b/site/static/img/external-contributor/quick_start_web5_chrissiku.png differ
diff --git a/site/static/img/external-contributor/resolve_did_short_chrissiku.jpg b/site/static/img/external-contributor/resolve_did_short_chrissiku.jpg
new file mode 100644
index 0000000..edd7a61
Binary files /dev/null and b/site/static/img/external-contributor/resolve_did_short_chrissiku.jpg differ
diff --git a/site/static/img/external-contributor/test1.png b/site/static/img/external-contributor/test1.png
new file mode 100644
index 0000000..7b44fac
Binary files /dev/null and b/site/static/img/external-contributor/test1.png differ
diff --git a/site/static/img/external-contributor/web5_nabhel_new.png b/site/static/img/external-contributor/web5_nabhel_new.png
new file mode 100644
index 0000000..6554406
Binary files /dev/null and b/site/static/img/external-contributor/web5_nabhel_new.png differ
diff --git a/site/static/img/external-contributor/web5short.png b/site/static/img/external-contributor/web5short.png
new file mode 100644
index 0000000..726a306
Binary files /dev/null and b/site/static/img/external-contributor/web5short.png differ
diff --git a/site/static/img/external-link-blue-icon.svg b/site/static/img/external-link-blue-icon.svg
new file mode 100644
index 0000000..844ba19
--- /dev/null
+++ b/site/static/img/external-link-blue-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/site/static/img/external-link-icon.svg b/site/static/img/external-link-icon.svg
new file mode 100644
index 0000000..a2568d7
--- /dev/null
+++ b/site/static/img/external-link-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/external-link.svg b/site/static/img/external-link.svg
new file mode 100644
index 0000000..90c4588
--- /dev/null
+++ b/site/static/img/external-link.svg
@@ -0,0 +1,5 @@
+
+
+
diff --git a/site/static/img/favicon.ico b/site/static/img/favicon.ico
new file mode 100644
index 0000000..0127a2a
Binary files /dev/null and b/site/static/img/favicon.ico differ
diff --git a/site/static/img/features-graphic.png b/site/static/img/features-graphic.png
new file mode 100644
index 0000000..70d8c8d
Binary files /dev/null and b/site/static/img/features-graphic.png differ
diff --git a/site/static/img/footer-bottom-dark-bw.svg b/site/static/img/footer-bottom-dark-bw.svg
new file mode 100644
index 0000000..495e7de
--- /dev/null
+++ b/site/static/img/footer-bottom-dark-bw.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/site/static/img/footer-bottom-dark.svg b/site/static/img/footer-bottom-dark.svg
new file mode 100644
index 0000000..a037eb8
--- /dev/null
+++ b/site/static/img/footer-bottom-dark.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/site/static/img/footer-bottom-light.svg b/site/static/img/footer-bottom-light.svg
new file mode 100644
index 0000000..3c7e9e5
--- /dev/null
+++ b/site/static/img/footer-bottom-light.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/site/static/img/footer-top-marquee.svg b/site/static/img/footer-top-marquee.svg
new file mode 100644
index 0000000..c83bc5d
--- /dev/null
+++ b/site/static/img/footer-top-marquee.svg
@@ -0,0 +1,912 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/github-button-icon.svg b/site/static/img/github-button-icon.svg
new file mode 100644
index 0000000..29a3ccd
--- /dev/null
+++ b/site/static/img/github-button-icon.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/github-icon.svg b/site/static/img/github-icon.svg
new file mode 100644
index 0000000..b0b83b0
--- /dev/null
+++ b/site/static/img/github-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/hacktoberfest_blog.png b/site/static/img/hacktoberfest_blog.png
new file mode 100644
index 0000000..701de84
Binary files /dev/null and b/site/static/img/hacktoberfest_blog.png differ
diff --git a/site/static/img/happy-hour.png b/site/static/img/happy-hour.png
new file mode 100644
index 0000000..78fe0c4
Binary files /dev/null and b/site/static/img/happy-hour.png differ
diff --git a/site/static/img/heart.svg b/site/static/img/heart.svg
new file mode 100644
index 0000000..5576d68
--- /dev/null
+++ b/site/static/img/heart.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/site/static/img/heart.zip b/site/static/img/heart.zip
new file mode 100644
index 0000000..ce64083
Binary files /dev/null and b/site/static/img/heart.zip differ
diff --git a/site/static/img/homenode-porotcol-messaging.jpg b/site/static/img/homenode-porotcol-messaging.jpg
new file mode 100644
index 0000000..9089bb3
Binary files /dev/null and b/site/static/img/homenode-porotcol-messaging.jpg differ
diff --git a/site/static/img/hotel-travel-plans.png b/site/static/img/hotel-travel-plans.png
new file mode 100644
index 0000000..01aec48
Binary files /dev/null and b/site/static/img/hotel-travel-plans.png differ
diff --git a/site/static/img/id-blue-purple.svg b/site/static/img/id-blue-purple.svg
new file mode 100644
index 0000000..27c87b4
--- /dev/null
+++ b/site/static/img/id-blue-purple.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/static/img/identity-icon.svg b/site/static/img/identity-icon.svg
new file mode 100644
index 0000000..1cae31c
--- /dev/null
+++ b/site/static/img/identity-icon.svg
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/identity-wallets.png b/site/static/img/identity-wallets.png
new file mode 100644
index 0000000..84c9822
Binary files /dev/null and b/site/static/img/identity-wallets.png differ
diff --git a/site/static/img/inclusivity-icon.svg b/site/static/img/inclusivity-icon.svg
new file mode 100644
index 0000000..1e452d1
--- /dev/null
+++ b/site/static/img/inclusivity-icon.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/incubator-vcs.png b/site/static/img/incubator-vcs.png
new file mode 100644
index 0000000..5d1eee3
Binary files /dev/null and b/site/static/img/incubator-vcs.png differ
diff --git a/site/static/img/innovator-projects/ariton.png b/site/static/img/innovator-projects/ariton.png
new file mode 100644
index 0000000..3d44a0b
Binary files /dev/null and b/site/static/img/innovator-projects/ariton.png differ
diff --git a/site/static/img/innovator-projects/blockcore.png b/site/static/img/innovator-projects/blockcore.png
new file mode 100644
index 0000000..aea20a4
Binary files /dev/null and b/site/static/img/innovator-projects/blockcore.png differ
diff --git a/site/static/img/innovator-projects/home-node.png b/site/static/img/innovator-projects/home-node.png
new file mode 100644
index 0000000..ef42f5a
Binary files /dev/null and b/site/static/img/innovator-projects/home-node.png differ
diff --git a/site/static/img/innovator-projects/mykin.png b/site/static/img/innovator-projects/mykin.png
new file mode 100644
index 0000000..f414fec
Binary files /dev/null and b/site/static/img/innovator-projects/mykin.png differ
diff --git a/site/static/img/innovator-projects/netonomy.png b/site/static/img/innovator-projects/netonomy.png
new file mode 100644
index 0000000..8a28d0e
Binary files /dev/null and b/site/static/img/innovator-projects/netonomy.png differ
diff --git a/site/static/img/innovator-projects/qnav-links.png b/site/static/img/innovator-projects/qnav-links.png
new file mode 100644
index 0000000..3ec3a5b
Binary files /dev/null and b/site/static/img/innovator-projects/qnav-links.png differ
diff --git a/site/static/img/innovator-projects/time-blind.png b/site/static/img/innovator-projects/time-blind.png
new file mode 100644
index 0000000..0c9df8e
Binary files /dev/null and b/site/static/img/innovator-projects/time-blind.png differ
diff --git a/site/static/img/instagram-icon.svg b/site/static/img/instagram-icon.svg
new file mode 100644
index 0000000..f465bdf
--- /dev/null
+++ b/site/static/img/instagram-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/site/static/img/issue_student_id_manually.png b/site/static/img/issue_student_id_manually.png
new file mode 100644
index 0000000..f30beb9
Binary files /dev/null and b/site/static/img/issue_student_id_manually.png differ
diff --git a/site/static/img/issue_vc_for_student_id.png b/site/static/img/issue_vc_for_student_id.png
new file mode 100644
index 0000000..35e2e16
Binary files /dev/null and b/site/static/img/issue_vc_for_student_id.png differ
diff --git a/site/static/img/jwt-encoded.png b/site/static/img/jwt-encoded.png
new file mode 100644
index 0000000..f77db1d
Binary files /dev/null and b/site/static/img/jwt-encoded.png differ
diff --git a/site/static/img/kcc-hackathon.gif b/site/static/img/kcc-hackathon.gif
new file mode 100644
index 0000000..fcf4f02
Binary files /dev/null and b/site/static/img/kcc-hackathon.gif differ
diff --git a/site/static/img/kcc-hackathon.png b/site/static/img/kcc-hackathon.png
new file mode 100644
index 0000000..4672993
Binary files /dev/null and b/site/static/img/kcc-hackathon.png differ
diff --git a/site/static/img/kiaVcCard.png b/site/static/img/kiaVcCard.png
new file mode 100644
index 0000000..f3266af
Binary files /dev/null and b/site/static/img/kiaVcCard.png differ
diff --git a/site/static/img/kirahVcCard.png b/site/static/img/kirahVcCard.png
new file mode 100644
index 0000000..f41e35f
Binary files /dev/null and b/site/static/img/kirahVcCard.png differ
diff --git a/site/static/img/learn/architectural_concerns_with_blockchain.png b/site/static/img/learn/architectural_concerns_with_blockchain.png
new file mode 100644
index 0000000..b100336
Binary files /dev/null and b/site/static/img/learn/architectural_concerns_with_blockchain.png differ
diff --git a/site/static/img/learn/blockchain_crypto_tbd.png b/site/static/img/learn/blockchain_crypto_tbd.png
new file mode 100644
index 0000000..6adeb19
Binary files /dev/null and b/site/static/img/learn/blockchain_crypto_tbd.png differ
diff --git a/site/static/img/learn/blockchain_skepticism.png b/site/static/img/learn/blockchain_skepticism.png
new file mode 100644
index 0000000..e7e9dbe
Binary files /dev/null and b/site/static/img/learn/blockchain_skepticism.png differ
diff --git a/site/static/img/learn/decentralized_identity.png b/site/static/img/learn/decentralized_identity.png
new file mode 100644
index 0000000..438a056
Binary files /dev/null and b/site/static/img/learn/decentralized_identity.png differ
diff --git a/site/static/img/learn/headshots/angie_jones.png b/site/static/img/learn/headshots/angie_jones.png
new file mode 100644
index 0000000..2a2524a
Binary files /dev/null and b/site/static/img/learn/headshots/angie_jones.png differ
diff --git a/site/static/img/learn/headshots/brooklyn_zelenka.jpg b/site/static/img/learn/headshots/brooklyn_zelenka.jpg
new file mode 100644
index 0000000..e88728b
Binary files /dev/null and b/site/static/img/learn/headshots/brooklyn_zelenka.jpg differ
diff --git a/site/static/img/learn/headshots/daniel_buchner.jpg b/site/static/img/learn/headshots/daniel_buchner.jpg
new file mode 100644
index 0000000..de7b99a
Binary files /dev/null and b/site/static/img/learn/headshots/daniel_buchner.jpg differ
diff --git a/site/static/img/learn/headshots/grady_booch.jpg b/site/static/img/learn/headshots/grady_booch.jpg
new file mode 100644
index 0000000..e26fe8b
Binary files /dev/null and b/site/static/img/learn/headshots/grady_booch.jpg differ
diff --git a/site/static/img/learn/headshots/henry_tsai.jpg b/site/static/img/learn/headshots/henry_tsai.jpg
new file mode 100644
index 0000000..cfdafd4
Binary files /dev/null and b/site/static/img/learn/headshots/henry_tsai.jpg differ
diff --git a/site/static/img/learn/headshots/kelsey_hightower.jpg b/site/static/img/learn/headshots/kelsey_hightower.jpg
new file mode 100644
index 0000000..da4fad5
Binary files /dev/null and b/site/static/img/learn/headshots/kelsey_hightower.jpg differ
diff --git a/site/static/img/learn/headshots/kim_hamilton_duffy.jpg b/site/static/img/learn/headshots/kim_hamilton_duffy.jpg
new file mode 100644
index 0000000..033b864
Binary files /dev/null and b/site/static/img/learn/headshots/kim_hamilton_duffy.jpg differ
diff --git a/site/static/img/learn/headshots/mike_brock.jpeg b/site/static/img/learn/headshots/mike_brock.jpeg
new file mode 100644
index 0000000..ae1e7e9
Binary files /dev/null and b/site/static/img/learn/headshots/mike_brock.jpeg differ
diff --git a/site/static/img/learn/headshots/moe_jangda.jpg b/site/static/img/learn/headshots/moe_jangda.jpg
new file mode 100644
index 0000000..c138c90
Binary files /dev/null and b/site/static/img/learn/headshots/moe_jangda.jpg differ
diff --git a/site/static/img/learn/headshots/nader_dabit.jpg b/site/static/img/learn/headshots/nader_dabit.jpg
new file mode 100644
index 0000000..aaa1909
Binary files /dev/null and b/site/static/img/learn/headshots/nader_dabit.jpg differ
diff --git a/site/static/img/learn/headshots/rhian_lewis.jpg b/site/static/img/learn/headshots/rhian_lewis.jpg
new file mode 100644
index 0000000..fb6ce2a
Binary files /dev/null and b/site/static/img/learn/headshots/rhian_lewis.jpg differ
diff --git a/site/static/img/learn/history_of_blockchains.png b/site/static/img/learn/history_of_blockchains.png
new file mode 100644
index 0000000..2d6b8fe
Binary files /dev/null and b/site/static/img/learn/history_of_blockchains.png differ
diff --git a/site/static/img/learn/nader_dabit_banner.png b/site/static/img/learn/nader_dabit_banner.png
new file mode 100644
index 0000000..30295c5
Binary files /dev/null and b/site/static/img/learn/nader_dabit_banner.png differ
diff --git a/site/static/img/learn/web5_ama_banner.png b/site/static/img/learn/web5_ama_banner.png
new file mode 100644
index 0000000..d24554a
Binary files /dev/null and b/site/static/img/learn/web5_ama_banner.png differ
diff --git a/site/static/img/lightningTalkWad.png b/site/static/img/lightningTalkWad.png
new file mode 100644
index 0000000..d915ee4
Binary files /dev/null and b/site/static/img/lightningTalkWad.png differ
diff --git a/site/static/img/lightningTalkWad1.png b/site/static/img/lightningTalkWad1.png
new file mode 100644
index 0000000..81dd965
Binary files /dev/null and b/site/static/img/lightningTalkWad1.png differ
diff --git a/site/static/img/linkedin-icon.svg b/site/static/img/linkedin-icon.svg
new file mode 100644
index 0000000..282de51
--- /dev/null
+++ b/site/static/img/linkedin-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/lock-key.png b/site/static/img/lock-key.png
new file mode 100644
index 0000000..1de8807
Binary files /dev/null and b/site/static/img/lock-key.png differ
diff --git a/site/static/img/logo.svg b/site/static/img/logo.svg
new file mode 100644
index 0000000..9db6d0d
--- /dev/null
+++ b/site/static/img/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/mainnet22-mike.jpg b/site/static/img/mainnet22-mike.jpg
new file mode 100644
index 0000000..7706743
Binary files /dev/null and b/site/static/img/mainnet22-mike.jpg differ
diff --git a/site/static/img/mainnet22.png b/site/static/img/mainnet22.png
new file mode 100644
index 0000000..6084e2b
Binary files /dev/null and b/site/static/img/mainnet22.png differ
diff --git a/site/static/img/marquee-d-1440.svg b/site/static/img/marquee-d-1440.svg
new file mode 100644
index 0000000..f75cb1c
--- /dev/null
+++ b/site/static/img/marquee-d-1440.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/maze.svg b/site/static/img/maze.svg
new file mode 100644
index 0000000..a7eace8
--- /dev/null
+++ b/site/static/img/maze.svg
@@ -0,0 +1,1453 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/menu-mobile-dark.png b/site/static/img/menu-mobile-dark.png
new file mode 100644
index 0000000..f2199be
Binary files /dev/null and b/site/static/img/menu-mobile-dark.png differ
diff --git a/site/static/img/menu-mobile-light.png b/site/static/img/menu-mobile-light.png
new file mode 100644
index 0000000..c33fff1
Binary files /dev/null and b/site/static/img/menu-mobile-light.png differ
diff --git a/site/static/img/menu-mobile.svg b/site/static/img/menu-mobile.svg
new file mode 100644
index 0000000..951f401
--- /dev/null
+++ b/site/static/img/menu-mobile.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/site/static/img/message-icon-purple.png b/site/static/img/message-icon-purple.png
new file mode 100644
index 0000000..477b6db
Binary files /dev/null and b/site/static/img/message-icon-purple.png differ
diff --git a/site/static/img/message-icon.png b/site/static/img/message-icon.png
new file mode 100644
index 0000000..70b06f6
Binary files /dev/null and b/site/static/img/message-icon.png differ
diff --git a/site/static/img/message-icon.svg b/site/static/img/message-icon.svg
new file mode 100644
index 0000000..56816d7
--- /dev/null
+++ b/site/static/img/message-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/microphone-yellow-blue.svg b/site/static/img/microphone-yellow-blue.svg
new file mode 100644
index 0000000..71c5c74
--- /dev/null
+++ b/site/static/img/microphone-yellow-blue.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/static/img/mobile-menu-glitch-bottom-dark.svg b/site/static/img/mobile-menu-glitch-bottom-dark.svg
new file mode 100644
index 0000000..501cb3b
--- /dev/null
+++ b/site/static/img/mobile-menu-glitch-bottom-dark.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/mobile-menu-glitch-bottom.svg b/site/static/img/mobile-menu-glitch-bottom.svg
new file mode 100644
index 0000000..dc99350
--- /dev/null
+++ b/site/static/img/mobile-menu-glitch-bottom.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/mobile-phone-yellow-blue.svg b/site/static/img/mobile-phone-yellow-blue.svg
new file mode 100644
index 0000000..433307d
--- /dev/null
+++ b/site/static/img/mobile-phone-yellow-blue.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/static/img/money-msg-blue-purple.svg b/site/static/img/money-msg-blue-purple.svg
new file mode 100644
index 0000000..d2ba265
--- /dev/null
+++ b/site/static/img/money-msg-blue-purple.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/money-msg-blue-yellow.svg b/site/static/img/money-msg-blue-yellow.svg
new file mode 100644
index 0000000..b94d3cf
--- /dev/null
+++ b/site/static/img/money-msg-blue-yellow.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/static/img/money-transfer.svg b/site/static/img/money-transfer.svg
new file mode 100644
index 0000000..f421b50
--- /dev/null
+++ b/site/static/img/money-transfer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/music-to-my-ears.png b/site/static/img/music-to-my-ears.png
new file mode 100644
index 0000000..0a88c5e
Binary files /dev/null and b/site/static/img/music-to-my-ears.png differ
diff --git a/site/static/img/new-web5-desktop.svg b/site/static/img/new-web5-desktop.svg
new file mode 100644
index 0000000..f52c86b
--- /dev/null
+++ b/site/static/img/new-web5-desktop.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/new-web5-mobile.svg b/site/static/img/new-web5-mobile.svg
new file mode 100644
index 0000000..ef593c3
--- /dev/null
+++ b/site/static/img/new-web5-mobile.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/new-web5-tablet.svg b/site/static/img/new-web5-tablet.svg
new file mode 100644
index 0000000..a9d4e4b
--- /dev/null
+++ b/site/static/img/new-web5-tablet.svg
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/npr-article-on-x-handle.png b/site/static/img/npr-article-on-x-handle.png
new file mode 100644
index 0000000..7ded93f
Binary files /dev/null and b/site/static/img/npr-article-on-x-handle.png differ
diff --git a/site/static/img/open-sandbox-in-new-tab.gif b/site/static/img/open-sandbox-in-new-tab.gif
new file mode 100644
index 0000000..4b1af58
Binary files /dev/null and b/site/static/img/open-sandbox-in-new-tab.gif differ
diff --git a/site/static/img/opening_panel.png b/site/static/img/opening_panel.png
new file mode 100644
index 0000000..a07a722
Binary files /dev/null and b/site/static/img/opening_panel.png differ
diff --git a/site/static/img/paper.svg b/site/static/img/paper.svg
new file mode 100644
index 0000000..06f60e0
--- /dev/null
+++ b/site/static/img/paper.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/person-example.png b/site/static/img/person-example.png
new file mode 100644
index 0000000..e401fc7
Binary files /dev/null and b/site/static/img/person-example.png differ
diff --git a/site/static/img/peso.svg b/site/static/img/peso.svg
new file mode 100644
index 0000000..966d09b
--- /dev/null
+++ b/site/static/img/peso.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/phone.svg b/site/static/img/phone.svg
new file mode 100644
index 0000000..f7558a2
--- /dev/null
+++ b/site/static/img/phone.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/pii-form.gif b/site/static/img/pii-form.gif
new file mode 100644
index 0000000..85495f4
Binary files /dev/null and b/site/static/img/pii-form.gif differ
diff --git a/site/static/img/pillars-of-web5.png b/site/static/img/pillars-of-web5.png
new file mode 100644
index 0000000..7a5c328
Binary files /dev/null and b/site/static/img/pillars-of-web5.png differ
diff --git a/site/static/img/placeholder-media-image.png b/site/static/img/placeholder-media-image.png
new file mode 100644
index 0000000..ea1138b
Binary files /dev/null and b/site/static/img/placeholder-media-image.png differ
diff --git a/site/static/img/practicality-did-blog-banner.png b/site/static/img/practicality-did-blog-banner.png
new file mode 100644
index 0000000..a6686e9
Binary files /dev/null and b/site/static/img/practicality-did-blog-banner.png differ
diff --git a/site/static/img/protocols-illustration.png b/site/static/img/protocols-illustration.png
new file mode 100644
index 0000000..7fc8b82
Binary files /dev/null and b/site/static/img/protocols-illustration.png differ
diff --git a/site/static/img/pwa-dwa.png b/site/static/img/pwa-dwa.png
new file mode 100644
index 0000000..b2565cd
Binary files /dev/null and b/site/static/img/pwa-dwa.png differ
diff --git a/site/static/img/rectangle.svg b/site/static/img/rectangle.svg
new file mode 100644
index 0000000..caf3a44
--- /dev/null
+++ b/site/static/img/rectangle.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/refactr-2022-angie.png b/site/static/img/refactr-2022-angie.png
new file mode 100644
index 0000000..3b35d31
Binary files /dev/null and b/site/static/img/refactr-2022-angie.png differ
diff --git a/site/static/img/right-bracket-light.svg b/site/static/img/right-bracket-light.svg
new file mode 100644
index 0000000..a9f71f0
--- /dev/null
+++ b/site/static/img/right-bracket-light.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/rizelVcCard.png b/site/static/img/rizelVcCard.png
new file mode 100644
index 0000000..0cdd2e4
Binary files /dev/null and b/site/static/img/rizelVcCard.png differ
diff --git a/site/static/img/roadshow-ace-teaching.jpg b/site/static/img/roadshow-ace-teaching.jpg
new file mode 100644
index 0000000..ad141a1
Binary files /dev/null and b/site/static/img/roadshow-ace-teaching.jpg differ
diff --git a/site/static/img/roadshow-angie-teaching.jpg b/site/static/img/roadshow-angie-teaching.jpg
new file mode 100644
index 0000000..7be09ed
Binary files /dev/null and b/site/static/img/roadshow-angie-teaching.jpg differ
diff --git a/site/static/img/roadshow-attendees-2.jpg b/site/static/img/roadshow-attendees-2.jpg
new file mode 100644
index 0000000..9859403
Binary files /dev/null and b/site/static/img/roadshow-attendees-2.jpg differ
diff --git a/site/static/img/roadshow-attendees.jpg b/site/static/img/roadshow-attendees.jpg
new file mode 100644
index 0000000..ed88a08
Binary files /dev/null and b/site/static/img/roadshow-attendees.jpg differ
diff --git a/site/static/img/roadshow-group.jpg b/site/static/img/roadshow-group.jpg
new file mode 100644
index 0000000..7383c5b
Binary files /dev/null and b/site/static/img/roadshow-group.jpg differ
diff --git a/site/static/img/roadshow-id4africa.jpg b/site/static/img/roadshow-id4africa.jpg
new file mode 100644
index 0000000..33d6184
Binary files /dev/null and b/site/static/img/roadshow-id4africa.jpg differ
diff --git a/site/static/img/roadshow-joy997fm.jpg b/site/static/img/roadshow-joy997fm.jpg
new file mode 100644
index 0000000..a3fa7b8
Binary files /dev/null and b/site/static/img/roadshow-joy997fm.jpg differ
diff --git a/site/static/img/roadshow-mike-stage.jpg b/site/static/img/roadshow-mike-stage.jpg
new file mode 100644
index 0000000..abb334b
Binary files /dev/null and b/site/static/img/roadshow-mike-stage.jpg differ
diff --git a/site/static/img/roadshow-roundtable.jpg b/site/static/img/roadshow-roundtable.jpg
new file mode 100644
index 0000000..29b5beb
Binary files /dev/null and b/site/static/img/roadshow-roundtable.jpg differ
diff --git a/site/static/img/roadshow-tbd-team.jpg b/site/static/img/roadshow-tbd-team.jpg
new file mode 100644
index 0000000..c8284ca
Binary files /dev/null and b/site/static/img/roadshow-tbd-team.jpg differ
diff --git a/site/static/img/scavengerHunt.png b/site/static/img/scavengerHunt.png
new file mode 100644
index 0000000..b3d1ebc
Binary files /dev/null and b/site/static/img/scavengerHunt.png differ
diff --git a/site/static/img/search-icon.png b/site/static/img/search-icon.png
new file mode 100644
index 0000000..be3e207
Binary files /dev/null and b/site/static/img/search-icon.png differ
diff --git a/site/static/img/selected-arrow-blue.svg b/site/static/img/selected-arrow-blue.svg
new file mode 100644
index 0000000..d622f19
--- /dev/null
+++ b/site/static/img/selected-arrow-blue.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/selected-arrow-mobile.svg b/site/static/img/selected-arrow-mobile.svg
new file mode 100644
index 0000000..b24b68d
--- /dev/null
+++ b/site/static/img/selected-arrow-mobile.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/selected-arrow-yellow.svg b/site/static/img/selected-arrow-yellow.svg
new file mode 100644
index 0000000..85c1e88
--- /dev/null
+++ b/site/static/img/selected-arrow-yellow.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/selected-arrow.svg b/site/static/img/selected-arrow.svg
new file mode 100644
index 0000000..f0f93e7
--- /dev/null
+++ b/site/static/img/selected-arrow.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/separator-mobile-menu.svg b/site/static/img/separator-mobile-menu.svg
new file mode 100644
index 0000000..01b9862
--- /dev/null
+++ b/site/static/img/separator-mobile-menu.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/shifting-loan-power-to-borrowers.png b/site/static/img/shifting-loan-power-to-borrowers.png
new file mode 100644
index 0000000..5b58b84
Binary files /dev/null and b/site/static/img/shifting-loan-power-to-borrowers.png differ
diff --git a/site/static/img/shopping-cart.svg b/site/static/img/shopping-cart.svg
new file mode 100644
index 0000000..124915f
--- /dev/null
+++ b/site/static/img/shopping-cart.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/site/static/img/small-glitch-cluster-vert.svg b/site/static/img/small-glitch-cluster-vert.svg
new file mode 100644
index 0000000..974661d
--- /dev/null
+++ b/site/static/img/small-glitch-cluster-vert.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/small-glitch-cluster.svg b/site/static/img/small-glitch-cluster.svg
new file mode 100644
index 0000000..a606af6
--- /dev/null
+++ b/site/static/img/small-glitch-cluster.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/smallTwitterDark.png b/site/static/img/smallTwitterDark.png
new file mode 100644
index 0000000..a24d725
Binary files /dev/null and b/site/static/img/smallTwitterDark.png differ
diff --git a/site/static/img/smallTwitterLight.png b/site/static/img/smallTwitterLight.png
new file mode 100644
index 0000000..f23e3fb
Binary files /dev/null and b/site/static/img/smallTwitterLight.png differ
diff --git a/site/static/img/speak-money.svg b/site/static/img/speak-money.svg
new file mode 100644
index 0000000..1426f64
--- /dev/null
+++ b/site/static/img/speak-money.svg
@@ -0,0 +1 @@
+>
\ No newline at end of file
diff --git a/site/static/img/speech-bubble-filled.svg b/site/static/img/speech-bubble-filled.svg
new file mode 100644
index 0000000..a9b679f
--- /dev/null
+++ b/site/static/img/speech-bubble-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/speech-bubble.svg b/site/static/img/speech-bubble.svg
new file mode 100644
index 0000000..63ccef6
--- /dev/null
+++ b/site/static/img/speech-bubble.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/sphere-index.svg b/site/static/img/sphere-index.svg
new file mode 100644
index 0000000..db4c323
--- /dev/null
+++ b/site/static/img/sphere-index.svg
@@ -0,0 +1,337 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/ssi-console.png b/site/static/img/ssi-console.png
new file mode 100644
index 0000000..d484f72
Binary files /dev/null and b/site/static/img/ssi-console.png differ
diff --git a/site/static/img/ssi-service-playground.png b/site/static/img/ssi-service-playground.png
new file mode 100644
index 0000000..6969f5d
Binary files /dev/null and b/site/static/img/ssi-service-playground.png differ
diff --git a/site/static/img/ssi-trust-model.png b/site/static/img/ssi-trust-model.png
new file mode 100644
index 0000000..ba278e3
Binary files /dev/null and b/site/static/img/ssi-trust-model.png differ
diff --git a/site/static/img/ssi_console.png b/site/static/img/ssi_console.png
new file mode 100644
index 0000000..5c1f2f7
Binary files /dev/null and b/site/static/img/ssi_console.png differ
diff --git a/site/static/img/ssi_tbd_web5.png b/site/static/img/ssi_tbd_web5.png
new file mode 100644
index 0000000..a6adfb4
Binary files /dev/null and b/site/static/img/ssi_tbd_web5.png differ
diff --git a/site/static/img/star-filled.svg b/site/static/img/star-filled.svg
new file mode 100644
index 0000000..a4724fa
--- /dev/null
+++ b/site/static/img/star-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/star-half.svg b/site/static/img/star-half.svg
new file mode 100644
index 0000000..4a2a524
--- /dev/null
+++ b/site/static/img/star-half.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/static-vertical-cyan.svg b/site/static/img/static-vertical-cyan.svg
new file mode 100644
index 0000000..aeac5cd
--- /dev/null
+++ b/site/static/img/static-vertical-cyan.svg
@@ -0,0 +1,258 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/swag-giveaway.png b/site/static/img/swag-giveaway.png
new file mode 100644
index 0000000..75d56c9
Binary files /dev/null and b/site/static/img/swag-giveaway.png differ
diff --git a/site/static/img/tag-front.svg b/site/static/img/tag-front.svg
new file mode 100644
index 0000000..d90c335
--- /dev/null
+++ b/site/static/img/tag-front.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/taniaVcCard.png b/site/static/img/taniaVcCard.png
new file mode 100644
index 0000000..7686c0d
Binary files /dev/null and b/site/static/img/taniaVcCard.png differ
diff --git a/site/static/img/tbd-at-renderatl.png b/site/static/img/tbd-at-renderatl.png
new file mode 100644
index 0000000..c052e5b
Binary files /dev/null and b/site/static/img/tbd-at-renderatl.png differ
diff --git a/site/static/img/tbd-at-wad.png b/site/static/img/tbd-at-wad.png
new file mode 100644
index 0000000..60ac5e9
Binary files /dev/null and b/site/static/img/tbd-at-wad.png differ
diff --git a/site/static/img/tbd-fav-icon-main.png b/site/static/img/tbd-fav-icon-main.png
new file mode 100644
index 0000000..e08babc
Binary files /dev/null and b/site/static/img/tbd-fav-icon-main.png differ
diff --git a/site/static/img/tbd-hackathon-winners.png b/site/static/img/tbd-hackathon-winners.png
new file mode 100644
index 0000000..2dc995c
Binary files /dev/null and b/site/static/img/tbd-hackathon-winners.png differ
diff --git a/site/static/img/tbd-logo-light.png b/site/static/img/tbd-logo-light.png
new file mode 100644
index 0000000..6f21030
Binary files /dev/null and b/site/static/img/tbd-logo-light.png differ
diff --git a/site/static/img/tbd-logo-square.svg b/site/static/img/tbd-logo-square.svg
new file mode 100644
index 0000000..917ca6a
--- /dev/null
+++ b/site/static/img/tbd-logo-square.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/site/static/img/tbd-logo.svg b/site/static/img/tbd-logo.svg
new file mode 100644
index 0000000..1fe23f2
--- /dev/null
+++ b/site/static/img/tbd-logo.svg
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/tbd-long-logo.svg b/site/static/img/tbd-long-logo.svg
new file mode 100644
index 0000000..74e5b7c
--- /dev/null
+++ b/site/static/img/tbd-long-logo.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/tbd-predicts.png b/site/static/img/tbd-predicts.png
new file mode 100644
index 0000000..f30ccb0
Binary files /dev/null and b/site/static/img/tbd-predicts.png differ
diff --git a/site/static/img/tbd-yellowcard-asset-full.png b/site/static/img/tbd-yellowcard-asset-full.png
new file mode 100644
index 0000000..aefa20b
Binary files /dev/null and b/site/static/img/tbd-yellowcard-asset-full.png differ
diff --git a/site/static/img/tbd_circle_partnership.png b/site/static/img/tbd_circle_partnership.png
new file mode 100644
index 0000000..c459e8f
Binary files /dev/null and b/site/static/img/tbd_circle_partnership.png differ
diff --git a/site/static/img/tbd_og_meta_image.png b/site/static/img/tbd_og_meta_image.png
new file mode 100644
index 0000000..c9eb8ad
Binary files /dev/null and b/site/static/img/tbd_og_meta_image.png differ
diff --git a/site/static/img/tbd_spruce_did_interoperability.png b/site/static/img/tbd_spruce_did_interoperability.png
new file mode 100644
index 0000000..600e9a7
Binary files /dev/null and b/site/static/img/tbd_spruce_did_interoperability.png differ
diff --git a/site/static/img/tbdex-actors.png b/site/static/img/tbdex-actors.png
new file mode 100644
index 0000000..ecfd20c
Binary files /dev/null and b/site/static/img/tbdex-actors.png differ
diff --git a/site/static/img/tbdex-protocol-illustration.png b/site/static/img/tbdex-protocol-illustration.png
new file mode 100644
index 0000000..e6cf4cc
Binary files /dev/null and b/site/static/img/tbdex-protocol-illustration.png differ
diff --git a/site/static/img/tbdex-v1-blog-header.png b/site/static/img/tbdex-v1-blog-header.png
new file mode 100644
index 0000000..8449f00
Binary files /dev/null and b/site/static/img/tbdex-v1-blog-header.png differ
diff --git a/site/static/img/tbdex-workshop-icon.png b/site/static/img/tbdex-workshop-icon.png
new file mode 100644
index 0000000..2b07311
Binary files /dev/null and b/site/static/img/tbdex-workshop-icon.png differ
diff --git a/site/static/img/test-image.png b/site/static/img/test-image.png
new file mode 100644
index 0000000..3376da7
Binary files /dev/null and b/site/static/img/test-image.png differ
diff --git a/site/static/img/things-you-didnt-know-dids.png b/site/static/img/things-you-didnt-know-dids.png
new file mode 100644
index 0000000..3aa4193
Binary files /dev/null and b/site/static/img/things-you-didnt-know-dids.png differ
diff --git a/site/static/img/tiktok-icon.svg b/site/static/img/tiktok-icon.svg
new file mode 100644
index 0000000..6c3a368
--- /dev/null
+++ b/site/static/img/tiktok-icon.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/site/static/img/tiktok_blog_banner.png b/site/static/img/tiktok_blog_banner.png
new file mode 100644
index 0000000..715ab37
Binary files /dev/null and b/site/static/img/tiktok_blog_banner.png differ
diff --git a/site/static/img/todo-app-tutorial.png b/site/static/img/todo-app-tutorial.png
new file mode 100644
index 0000000..8e80dfb
Binary files /dev/null and b/site/static/img/todo-app-tutorial.png differ
diff --git a/site/static/img/tooltip-border.png b/site/static/img/tooltip-border.png
new file mode 100644
index 0000000..9b7fee5
Binary files /dev/null and b/site/static/img/tooltip-border.png differ
diff --git a/site/static/img/tooltip-info-icon.svg b/site/static/img/tooltip-info-icon.svg
new file mode 100644
index 0000000..8586c8c
--- /dev/null
+++ b/site/static/img/tooltip-info-icon.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/site/static/img/tooltip-x-icon.svg b/site/static/img/tooltip-x-icon.svg
new file mode 100644
index 0000000..a95ef7a
--- /dev/null
+++ b/site/static/img/tooltip-x-icon.svg
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/static/img/transparency-icon.svg b/site/static/img/transparency-icon.svg
new file mode 100644
index 0000000..985b96d
--- /dev/null
+++ b/site/static/img/transparency-icon.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/site/static/img/tutorial/docsVersionDropdown.png b/site/static/img/tutorial/docsVersionDropdown.png
new file mode 100644
index 0000000..ff1cbe6
Binary files /dev/null and b/site/static/img/tutorial/docsVersionDropdown.png differ
diff --git a/site/static/img/tutorial/localeDropdown.png b/site/static/img/tutorial/localeDropdown.png
new file mode 100644
index 0000000..d7163f9
Binary files /dev/null and b/site/static/img/tutorial/localeDropdown.png differ
diff --git a/site/static/img/tutorial_issue_vc.png b/site/static/img/tutorial_issue_vc.png
new file mode 100644
index 0000000..cd93256
Binary files /dev/null and b/site/static/img/tutorial_issue_vc.png differ
diff --git a/site/static/img/tutorial_todo_app.png b/site/static/img/tutorial_todo_app.png
new file mode 100644
index 0000000..90de339
Binary files /dev/null and b/site/static/img/tutorial_todo_app.png differ
diff --git a/site/static/img/tv-yellow-blue.svg b/site/static/img/tv-yellow-blue.svg
new file mode 100644
index 0000000..c5e2c1c
--- /dev/null
+++ b/site/static/img/tv-yellow-blue.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/static/img/tweet-from-music-handle.png b/site/static/img/tweet-from-music-handle.png
new file mode 100644
index 0000000..a7ddae8
Binary files /dev/null and b/site/static/img/tweet-from-music-handle.png differ
diff --git a/site/static/img/twitch-icon.svg b/site/static/img/twitch-icon.svg
new file mode 100644
index 0000000..d4e17b5
--- /dev/null
+++ b/site/static/img/twitch-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/twitter-icon.svg b/site/static/img/twitter-icon.svg
new file mode 100644
index 0000000..8029b97
--- /dev/null
+++ b/site/static/img/twitter-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/twitterDark.png b/site/static/img/twitterDark.png
new file mode 100644
index 0000000..224243c
Binary files /dev/null and b/site/static/img/twitterDark.png differ
diff --git a/site/static/img/twitterLight.png b/site/static/img/twitterLight.png
new file mode 100644
index 0000000..e06b71e
Binary files /dev/null and b/site/static/img/twitterLight.png differ
diff --git a/site/static/img/twitter_space_are_we_web5_yet.png b/site/static/img/twitter_space_are_we_web5_yet.png
new file mode 100644
index 0000000..81aaa51
Binary files /dev/null and b/site/static/img/twitter_space_are_we_web5_yet.png differ
diff --git a/site/static/img/twitter_space_verifiable_credentials.png b/site/static/img/twitter_space_verifiable_credentials.png
new file mode 100644
index 0000000..5ade4a4
Binary files /dev/null and b/site/static/img/twitter_space_verifiable_credentials.png differ
diff --git a/site/static/img/undraw_docusaurus_mountain.svg b/site/static/img/undraw_docusaurus_mountain.svg
new file mode 100644
index 0000000..af961c4
--- /dev/null
+++ b/site/static/img/undraw_docusaurus_mountain.svg
@@ -0,0 +1,171 @@
+
+ Easy to Use
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/undraw_docusaurus_react.svg b/site/static/img/undraw_docusaurus_react.svg
new file mode 100644
index 0000000..94b5cf0
--- /dev/null
+++ b/site/static/img/undraw_docusaurus_react.svg
@@ -0,0 +1,170 @@
+
+ Powered by React
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/undraw_docusaurus_tree.svg b/site/static/img/undraw_docusaurus_tree.svg
new file mode 100644
index 0000000..d9161d3
--- /dev/null
+++ b/site/static/img/undraw_docusaurus_tree.svg
@@ -0,0 +1,40 @@
+
+ Focus on What Matters
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/usd.svg b/site/static/img/usd.svg
new file mode 100644
index 0000000..03af4ae
--- /dev/null
+++ b/site/static/img/usd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/vc-fanclub.png b/site/static/img/vc-fanclub.png
new file mode 100644
index 0000000..3c6bd49
Binary files /dev/null and b/site/static/img/vc-fanclub.png differ
diff --git a/site/static/img/vc-three-party-model.png b/site/static/img/vc-three-party-model.png
new file mode 100644
index 0000000..2074b79
Binary files /dev/null and b/site/static/img/vc-three-party-model.png differ
diff --git a/site/static/img/vc-verifiable-credential.svg b/site/static/img/vc-verifiable-credential.svg
new file mode 100644
index 0000000..c3da25e
--- /dev/null
+++ b/site/static/img/vc-verifiable-credential.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/vc_ecosystem.svg b/site/static/img/vc_ecosystem.svg
new file mode 100644
index 0000000..32c8680
--- /dev/null
+++ b/site/static/img/vc_ecosystem.svg
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+Issuer
+Issues VCs
+
+ Issue Credentials
+
+ Verify Identifiers
+ and use Schemas
+
+
+
+Holder
+Acquires, stores,
+presents VCs
+
+ Send Presentation
+
+ Register Identifiers
+ and use Schemas
+
+
+
+Verifier
+Verifies VCs
+
+ Verify Identifiersand Schemas
+
+
+
+Verifiable Data Registry
+Maintains identifiers and schemas
+
+
diff --git a/site/static/img/vertical-divider.svg b/site/static/img/vertical-divider.svg
new file mode 100644
index 0000000..8e2fd3b
--- /dev/null
+++ b/site/static/img/vertical-divider.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/video-media-icon.svg b/site/static/img/video-media-icon.svg
new file mode 100644
index 0000000..724843d
--- /dev/null
+++ b/site/static/img/video-media-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/vimeo-icon.svg b/site/static/img/vimeo-icon.svg
new file mode 100644
index 0000000..0fb9524
--- /dev/null
+++ b/site/static/img/vimeo-icon.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/site/static/img/vite.config.ts b/site/static/img/vite.config.ts
new file mode 100644
index 0000000..e093a08
--- /dev/null
+++ b/site/static/img/vite.config.ts
@@ -0,0 +1,20 @@
+import { defineConfig, configDefaults } from "vitest/config";
+
+export default defineConfig({
+ test: {
+ testTimeout: 40000,
+ hookTimeout: 40000,
+ exclude: [...configDefaults.exclude, "apps/**"],
+ //TODO: Investigate coverage options later for output files
+ // coverage: {
+ // provider: 'istanbul',
+ // enabled: true,
+ // reporter: 'html'
+ // },
+ browser: {
+ name: "chrome",
+ enabled: true,
+ headless: true,
+ },
+ },
+});
diff --git a/site/static/img/wallet-blue-yellow.svg b/site/static/img/wallet-blue-yellow.svg
new file mode 100644
index 0000000..5288f81
--- /dev/null
+++ b/site/static/img/wallet-blue-yellow.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/static/img/wallet-icon.svg b/site/static/img/wallet-icon.svg
new file mode 100644
index 0000000..46daa06
--- /dev/null
+++ b/site/static/img/wallet-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/wallet.svg b/site/static/img/wallet.svg
new file mode 100644
index 0000000..28dc98b
--- /dev/null
+++ b/site/static/img/wallet.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/wasm-chatgpt-ssi.png b/site/static/img/wasm-chatgpt-ssi.png
new file mode 100644
index 0000000..0760e14
Binary files /dev/null and b/site/static/img/wasm-chatgpt-ssi.png differ
diff --git a/site/static/img/web5-chatgpt-plugin-blog-banner.png b/site/static/img/web5-chatgpt-plugin-blog-banner.png
new file mode 100644
index 0000000..a9a4442
Binary files /dev/null and b/site/static/img/web5-chatgpt-plugin-blog-banner.png differ
diff --git a/site/static/img/web5-desktop.svg b/site/static/img/web5-desktop.svg
new file mode 100644
index 0000000..e723ce9
--- /dev/null
+++ b/site/static/img/web5-desktop.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/site/static/img/web5-graphic.png b/site/static/img/web5-graphic.png
new file mode 100644
index 0000000..bdb9b1e
Binary files /dev/null and b/site/static/img/web5-graphic.png differ
diff --git a/site/static/img/web5-journey-to-adoption.png b/site/static/img/web5-journey-to-adoption.png
new file mode 100644
index 0000000..4fa7d31
Binary files /dev/null and b/site/static/img/web5-journey-to-adoption.png differ
diff --git a/site/static/img/web5-meets-generative-ai.png b/site/static/img/web5-meets-generative-ai.png
new file mode 100644
index 0000000..79d3ad1
Binary files /dev/null and b/site/static/img/web5-meets-generative-ai.png differ
diff --git a/site/static/img/web5-mobile.svg b/site/static/img/web5-mobile.svg
new file mode 100644
index 0000000..c32c16c
--- /dev/null
+++ b/site/static/img/web5-mobile.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/site/static/img/web5-roadmap.jpeg b/site/static/img/web5-roadmap.jpeg
new file mode 100644
index 0000000..c4bcd12
Binary files /dev/null and b/site/static/img/web5-roadmap.jpeg differ
diff --git a/site/static/img/web5-tablet.svg b/site/static/img/web5-tablet.svg
new file mode 100644
index 0000000..1051926
--- /dev/null
+++ b/site/static/img/web5-tablet.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/site/static/img/what_are_vcs_banner.png b/site/static/img/what_are_vcs_banner.png
new file mode 100644
index 0000000..cdd41a6
Binary files /dev/null and b/site/static/img/what_are_vcs_banner.png differ
diff --git a/site/static/img/what_is_web5.png b/site/static/img/what_is_web5.png
new file mode 100644
index 0000000..f2f26c1
Binary files /dev/null and b/site/static/img/what_is_web5.png differ
diff --git a/site/static/img/woman.svg b/site/static/img/woman.svg
new file mode 100644
index 0000000..e31b030
--- /dev/null
+++ b/site/static/img/woman.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/img/youtube-icon.svg b/site/static/img/youtube-icon.svg
new file mode 100644
index 0000000..b4ed03a
--- /dev/null
+++ b/site/static/img/youtube-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/site/static/img/zcluster.svg b/site/static/img/zcluster.svg
new file mode 100644
index 0000000..7b91749
--- /dev/null
+++ b/site/static/img/zcluster.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/site/static/scripts/custom.js b/site/static/scripts/custom.js
new file mode 100644
index 0000000..2befa9e
--- /dev/null
+++ b/site/static/scripts/custom.js
@@ -0,0 +1,26 @@
+function addListeners(block) {
+ block.addEventListener('click', function() {
+ let codeBlock = this.closest('.theme-code-block');
+ codeBlock.classList.add('wiggle-code-block');
+
+ codeBlock.addEventListener('animationend', function() {
+ this.classList.remove('wiggle-code-block');
+ });
+ });
+}
+
+let codeBlocks = document.querySelectorAll('.theme-code-block .clean-btn');
+codeBlocks.forEach(addListeners);
+
+let observer = new MutationObserver(function(mutations) {
+ mutations.forEach(function(mutation) {
+ if (mutation.type === 'childList') {
+ let newCodeBlocks = mutation.target.querySelectorAll('.theme-code-block .clean-btn');
+ newCodeBlocks.forEach(addListeners);
+ }
+ });
+});
+
+let config = { childList: true, subtree: true };
+
+observer.observe(document.body, config);
\ No newline at end of file
diff --git a/site/static/scripts/dd-analytics.js b/site/static/scripts/dd-analytics.js
new file mode 100644
index 0000000..f5459b3
--- /dev/null
+++ b/site/static/scripts/dd-analytics.js
@@ -0,0 +1,18 @@
+window.DD_RUM && window.DD_RUM.init({
+ clientToken: 'pub4c8b1a9ef4c424ef4d0ce30adaedc6d0',
+ applicationId: '3937f727-75df-40e8-bed7-84fd4ef7bcf6',
+ site: 'datadoghq.com',
+ service: 'tbd.website',
+ env: 'devtest',
+ // Specify a version number to identify the deployed version of your application in Datadog
+ // version: '1.0.0',
+ sessionSampleRate: 100,
+ sessionReplaySampleRate: 20,
+ trackUserInteractions: true,
+ trackResources: true,
+ trackLongTasks: true,
+ defaultPrivacyLevel: 'mask-user-input',
+});
+
+window.DD_RUM &&
+window.DD_RUM.startSessionReplayRecording();
\ No newline at end of file
diff --git a/site/static/tutorial/docsVersionDropdown.png b/site/static/tutorial/docsVersionDropdown.png
new file mode 100644
index 0000000..ff1cbe6
Binary files /dev/null and b/site/static/tutorial/docsVersionDropdown.png differ
diff --git a/site/static/tutorial/localeDropdown.png b/site/static/tutorial/localeDropdown.png
new file mode 100644
index 0000000..d7163f9
Binary files /dev/null and b/site/static/tutorial/localeDropdown.png differ
diff --git a/site/tailwind.config.js b/site/tailwind.config.js
new file mode 100644
index 0000000..435d696
--- /dev/null
+++ b/site/tailwind.config.js
@@ -0,0 +1,77 @@
+module.exports = {
+ mode: 'jit',
+ purge: [
+ './public/**/*.html',
+ './src/**/*.{js,jsx,ts,tsx,mdx}',
+ './docs/**/*.{js,jsx,ts,tsx,md,mdx}',
+ ],
+ important: false,
+ content: [
+ './src/**/*.{js,jsx,ts,tsx,md,mdx}',
+ './blog/**/*.{js,jsx,ts,tsx,md,mdx}',
+ './events/**/*.{js,jsx,ts,tsx,md,mdx}',
+ './learn/**/*.{js,jsx,ts,tsx,md,mdx}',
+ './docs/**/*.{js,jsx,ts,tsx,md,mdx}',
+ ],
+ darkMode: 'class',
+ theme: {
+ extend: {
+ screens: {
+ 'tablet': '768px',
+ // => @media (min-width: 768px) { ... }
+ 'desktop': '1024px',
+ // => @media (min-width: 1024px) { ... }
+ 'desktop-lg': '1200px',
+ // => @media (min-width: 1200) { ... }
+ 'desktop-xl': '1400px',
+ // => @media (min-width: 1200) { ... }
+ 'hd': '1820px',
+ // => @media (min-width: 1820px) { ... }
+ },
+ colors: {
+ 'primary-yellow': 'var(--color-yellow)',
+ 'primary-black': 'var(--color-black)',
+ 'primary-white': 'var(--color-white)',
+ 'accent-cyan': 'var(--color-blue)',
+ 'accent-purple': 'var(--color-purple)',
+ },
+ },
+ fontFamily: {
+ sans: ['IBM Plex Mono', 'monospace'],
+ heading: ['IBM Plex Mono', 'monospace'],
+ },
+ boxShadow: {
+ 'button-sh':
+ '2px 2px 0px 0px #000, 4px 4px 0px 0px #000, 6px 6px 0px 0px #000, 8px 8px 0px 0px #000',
+ 'button-sh-hv': '2px 2px 0px 0px #000, 4px 4px 0px 0px #000',
+ 'button-sh-yellow':
+ '2px 2px 0px 0px var(--color-yellow), 4px 4px 0px 0px var(--color-yellow), 6px 6px 0px 0px var(--color-yellow), 8px 8px 0px 0px var(--color-yellow)',
+ 'button-sh-hv-yellow':
+ '2px 2px 0px 0px var(--color-yellow), 4px 4px 0px 0px var(--color-yellow)',
+ 'button-sh-cyan':
+ '2px 2px 0px 0px var(--color-blue), 4px 4px 0px 0px var(--color-blue), 6px 6px 0px 0px var(--color-blue), 8px 8px 0px 0px var(--color-blue)',
+ 'button-sh-hv-cyan':
+ '2px 2px 0px 0px var(--color-blue), 4px 4px 0px 0px var(--color-blue)',
+ 'button-sh-purple':
+ '2px 2px 0px 0px var(--color-purple), 4px 4px 0px 0px var(--color-purple), 6px 6px 0px 0px var(--color-purple), 8px 8px 0px 0px var(--color-purple)',
+ 'button-sh-hv-purple':
+ '2px 2px 0px 0px var(--color-purple), 4px 4px 0px 0px var(--color-purple)',
+ },
+ plugins: [require('tailwind-component-classes')],
+ components: {
+ 'copy':
+ 'text-copy-mobile tablet:text-copy font-copy-mobile tablet:font-copy',
+ 'copy-sm':
+ 'text-copy-sm-mobile tablet:text-copy-sm font-copy-sm-mobile tablet:font-copy-sm',
+ 'copy-footer':
+ 'text-copy-footer-mobile tablet:text-copy-footer font-copy-footer-mobile tablet:font-copy-footer',
+ 'nav-links':
+ 'text-nav-links-mobile tablet:text-nav-links font-nav-links-mobile tablet:font-nav-links',
+ 'button-text': 'text-button-text font-button-text',
+ 'breadcrumbs-text': 'text-breadcrumbs font-breadcrumbs',
+ },
+ backgroundImage: {
+ 'vertical-divider': 'url(/img/vertical-divider.svg)',
+ },
+ },
+};
diff --git a/site/testsuites/testsuite-javascript/__tests__/blog/2023-05-23-dwas-vs-pwas.test.js b/site/testsuites/testsuite-javascript/__tests__/blog/2023-05-23-dwas-vs-pwas.test.js
new file mode 100644
index 0000000..cab66bd
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/blog/2023-05-23-dwas-vs-pwas.test.js
@@ -0,0 +1,24 @@
+import { test, beforeAll, expect, describe } from 'vitest';
+
+import { createRecordWithTodoItem } from '../../../../code-snippets/blog/2023-05-23-dwas-vs-pwas';
+import { setUpWeb5 } from '../setup-web5';
+
+let web5;
+let did;
+
+describe('delete-from-dwn', () => {
+ beforeAll(async () => {
+ await setUpWeb5();
+ web5 = globalThis.web5;
+ did = globalThis.did;
+ });
+
+ test.skip('createRecordWithTodoItem returns a record with the todoItem being the same value as the data attribute', async () => {
+ const todoItem = 'Some todo item';
+ const recordResult = await createRecordWithTodoItem(web5, did, todoItem);
+
+ console.log('recordResult', JSON.stringify(recordResult, null, 2));
+
+ expect(recordResult.data).toBe(todoItem);
+ });
+});
diff --git a/site/testsuites/testsuite-javascript/__tests__/quickstart.test.js b/site/testsuites/testsuite-javascript/__tests__/quickstart.test.js
new file mode 100644
index 0000000..7e7486e
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/quickstart.test.js
@@ -0,0 +1,183 @@
+import { test, beforeAll, expect, describe } from 'vitest';
+import { setUpWeb5 } from './setup-web5';
+import { VerifiableCredential } from '@web5/credentials';
+
+// This is the web5 instance that will be referred to for all tests. This comes back as a result from Web5.connect() being used in the didCreate function.
+let web5;
+// This is the decentralized ID that will be referred to for all tests. This comes back as a result from Web5.connect() being used in the didCreate function.
+let aliceDid;
+// This record result is what comes back from the createTextRecord function. This is used to test the record's attributes and methods.
+
+describe('/site/tests/quickstart.test.js', async () => {
+ // This is where we create a DID, assign the web5 and aliceDid variables, and then use the aliceDid to write a text record.
+ beforeAll(async () => {
+ await setUpWeb5();
+ web5 = globalThis.web5;
+ aliceDid = globalThis.did;
+ });
+
+ test('didCreate returns a decentralized ID', async () => {
+ expect(typeof aliceDid).toBe('string');
+ const didRegex = /^did:[a-z0-9]+:.+/i;
+ expect(didRegex.test(aliceDid)).toBe(true);
+ });
+
+ test('getBearerDid returns a bearer identity', async () => {
+ // :snippet-start: getBearerDid
+ const { did: aliceBearerDid } = await web5.agent.identity.get({ didUri: aliceDid });
+ // :snippet-end:
+ expect(aliceBearerDid.uri).toBe(aliceDid);
+ });
+
+ test('createQuickstartVc returns a vc', async () => {
+ // :snippet-start: createQuickstartVc
+ const vc = await VerifiableCredential.create({
+ type: 'Web5QuickstartCompletionCredential',
+ issuer: aliceDid,
+ subject: aliceDid,
+ data: {
+ name: 'Alice Smith',
+ completionDate: new Date().toISOString(),
+ expertiseLevel: 'Beginner'
+ }
+ });
+ // :snippet-end:
+ expect(vc.vcDataModel.issuer).toBe(aliceDid);
+ });
+
+ test('signQuickstartVc returns a jwt', async () => {
+ const { did: aliceBearerDid } = await web5.agent.identity.get({ didUri: aliceDid });
+ class Web5QuickstartCompletionCredential {
+ constructor(name, completionDate, expertiseLevel) {
+ this.name = name;
+ this.completionDate = completionDate;
+ this.expertiseLevel = expertiseLevel;
+ }
+ }
+
+ const vc = await VerifiableCredential.create({
+ type: 'Web5QuickstartCompletionCredential',
+ issuer: aliceDid,
+ subject: aliceDid,
+ data: new Web5QuickstartCompletionCredential(
+ 'Alice Smith',
+ '2024-05-22',
+ 'Beginner',
+ )
+ });
+ // :snippet-start: signQuickstartVc
+ const signedVc = await vc.sign({ did: aliceBearerDid });
+ // :snippet-end:
+ expect(typeof signedVc).toBe('string');
+ });
+
+ test('writeQuickstartVcToDwn writes a signed vc to dwn', async () => {
+ const { did: aliceBearerDid } = await web5.agent.identity.get({ didUri: aliceDid });
+ class Web5QuickstartCompletionCredential {
+ constructor(name, completionDate, expertiseLevel) {
+ this.name = name;
+ this.completionDate = completionDate;
+ this.expertiseLevel = expertiseLevel;
+ }
+ }
+
+ const vc = await VerifiableCredential.create({
+ type: 'Web5QuickstartCompletionCredential',
+ issuer: aliceDid,
+ subject: aliceDid,
+ data: new Web5QuickstartCompletionCredential(
+ 'Alice Smith',
+ '2024-05-22',
+ 'Beginner',
+ )
+ });
+ const signedVc = await vc.sign({ did: aliceBearerDid });
+ // :snippet-start: writeQuickstartVcToDwn
+ const { record } = await web5.dwn.records.create({
+ data: signedVc,
+ message: {
+ schema: 'Web5QuickstartCompletionCredential',
+ dataFormat: 'application/vc+jwt',
+ published: true
+ }
+ });
+ // :snippet-end:
+ expect(record.author).toBe(aliceDid);
+ });
+
+ test('readQuickstartVc reads jwt from DWN', async () => {
+ const { did: aliceBearerDid } = await web5.agent.identity.get({ didUri: aliceDid });
+ class Web5QuickstartCompletionCredential {
+ constructor(name, completionDate, expertiseLevel) {
+ this.name = name;
+ this.completionDate = completionDate;
+ this.expertiseLevel = expertiseLevel;
+ }
+ }
+
+ const vc = await VerifiableCredential.create({
+ type: 'Web5QuickstartCompletionCredential',
+ issuer: aliceDid,
+ subject: aliceDid,
+ data: new Web5QuickstartCompletionCredential(
+ 'Alice Smith',
+ '2024-05-22',
+ 'Beginner',
+ )
+ });
+ const signedVc = await vc.sign({ did: aliceBearerDid });
+
+ const { record } = await web5.dwn.records.create({
+ data: signedVc,
+ message: {
+ schema: 'Web5QuickstartCompletionCredential',
+ dataFormat: 'application/vc+jwt',
+ published: true
+ }
+ });
+ // :snippet-start: readQuickstartVc
+ const readSignedVc = await record.data.text();
+ // :snippet-end:
+ expect(typeof readSignedVc).toBe('string');
+ });
+
+ test('parseQuickstartVc reads jwt from DWN', async () => {
+ const { did: aliceBearerDid } = await web5.agent.identity.get({ didUri: aliceDid });
+ class Web5QuickstartCompletionCredential {
+ constructor(name, completionDate, expertiseLevel) {
+ this.name = name;
+ this.completionDate = completionDate;
+ this.expertiseLevel = expertiseLevel;
+ }
+ }
+
+ const vc = await VerifiableCredential.create({
+ type: 'Web5QuickstartCompletionCredential',
+ issuer: aliceDid,
+ subject: aliceDid,
+ data: new Web5QuickstartCompletionCredential(
+ 'Alice Smith',
+ '2024-05-22',
+ 'Beginner',
+ )
+ });
+
+ const signedVc = await vc.sign({ did: aliceBearerDid });
+
+ const { record } = await web5.dwn.records.create({
+ data: signedVc,
+ message: {
+ schema: 'Web5QuickstartCompletionCredential',
+ dataFormat: 'application/vc+jwt',
+ published: true
+ }
+ });
+
+ const readSignedVc = await record.data.text();
+ // :snippet-start: parseQuickstartVc
+ const parsedVc = VerifiableCredential.parseJwt({ vcJwt: readSignedVc });
+ // :snippet-end:
+ expect(parsedVc.vcDataModel.issuer).toBe(aliceDid);
+ });
+
+});
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/setup-web5.js b/site/testsuites/testsuite-javascript/__tests__/setup-web5.js
new file mode 100644
index 0000000..fc0dd9d
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/setup-web5.js
@@ -0,0 +1,72 @@
+import { beforeAll, beforeEach, afterEach, afterAll } from 'vitest';
+import { Web5 } from '@web5/api';
+
+// node.js 18 and earlier, needs globalThis.crypto polyfill
+import { webcrypto } from 'node:crypto';
+// @ts-ignore
+if (!globalThis.crypto) globalThis.crypto = webcrypto;
+
+const testDwnUrl = import.meta.env.VITE_APP_TEST_DWN_URL;
+
+import { Web5IdentityAgent } from '@web5/identity-agent';
+
+export const setUpWeb5 = async () => {
+ const password = 'super-secret-test-password';
+
+ const dwnOptions = testDwnUrl
+ ? {
+ techPreview: {
+ dwnEndpoints: ['http://localhost:3000'],
+ },
+ }
+ : undefined;
+
+ let options = { password: password };
+
+ if (dwnOptions) {
+ options.techPreview = dwnOptions.techPreview;
+ }
+
+ const { web5, did } = await Web5.connect(options);
+
+ globalThis.web5 = web5;
+ globalThis.did = did;
+
+ return { web5, did };
+};
+
+export const setUpIdentityManager = async () => {
+ const identityAgent = await Web5IdentityAgent.create();
+
+ globalThis.identityAgent = identityAgent;
+
+ return identityAgent;
+};
+
+afterAll(async () => {
+ const agent = globalThis.identityAgent || globalThis.web5?.agent;
+
+ if (agent) {
+
+ await agent.sync.stopSync();
+
+ const dbs = [
+ agent.vault._store,
+ agent.did.cache.cache,
+ agent.sync._syncEngine._db,
+ agent.dwn._dwn.messageStore.blockstore.db,
+ agent.dwn._dwn.messageStore.index.db,
+ agent.dwn._dwn.dataStore.blockstore.db,
+ agent.dwn._dwn.eventLog.index.db,
+ agent.dwn._dwn.resumableTaskStore.db
+ ];
+
+ for (const db of dbs) {
+ await db.clear();
+ await db.close();
+ }
+ delete globalThis.identityAgent;
+ delete globalThis.web5;
+ delete globalThis.did;
+ }
+});
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/credentialIssuance.bash b/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/credentialIssuance.bash
new file mode 100644
index 0000000..844838b
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/credentialIssuance.bash
@@ -0,0 +1,3 @@
+# :snippet-start: credentialIssuanceJsPackage
+npm i @web5/credentials
+# :snippet-end: credentialIssuanceJsPackage
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/credentialIssuance.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/credentialIssuance.test.js
new file mode 100644
index 0000000..3cba19c
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/credentialIssuance.test.js
@@ -0,0 +1,191 @@
+import { describe, test, expect } from 'vitest';
+import express from 'express';
+import { Jwt, VerifiableCredential } from '@web5/credentials';
+import { DidDht } from '@web5/dids';
+
+const issuerDid = await DidDht.create({
+ options: { publish: true },
+});
+
+const signerDid = await DidDht.create({
+ options: { publish: true },
+});
+
+// :snippet-start: sanctionsCredentialClass
+class SanctionsCredential {
+ constructor(check) {
+ this.listsCleared = check.listsCleared;
+ }
+}
+
+export default SanctionsCredential;
+// :snippet-end:
+
+// :snippet-start: checkSanctionsListsFunction
+function checkSanctionsList(payload) {
+ // This is where you would add the functionality to perform the actual sanction checks
+ return {
+ isSanctioned: false,
+ listsCleared: ["FBI's Most Wanted, USA Watchlist", 'EU Watchlist'],
+ };
+}
+// :snippet-end:
+
+// :snippet-start: createADidWithServiceEndpointJS
+const issuerBearerDid = await DidDht.create({
+ options: {
+ publish: true,
+ services: [
+ {
+ id: 'idv',
+ type: 'IDV',
+ serviceEndpoint: 'https://exampleIdvEndpoint.com/idv/siopv2/initiate',
+ },
+ ],
+ },
+});
+// :snippet-end:
+
+const app = express();
+app.use(express.json());
+
+// :snippet-start: checkSanctionsEndpoint
+app.get('/check-sanctions', async (req, res) => {
+ /***********************************************
+ * Accepts a JWT in the Authorization header
+ * and parse to get the signer DID
+ ************************************************/
+ try {
+ const authHeader = req.headers['authorization'];
+
+ if (!authHeader) {
+ return res.status(401).json({
+ errors: ['Authorization header required'],
+ });
+ }
+
+ const tokenParts = authHeader.split('Bearer ');
+
+ if (tokenParts.length !== 2) {
+ return res.status(401).json({
+ errors: ['Authorization header format is Bearer '],
+ });
+ }
+
+ const compactJwt = tokenParts[1];
+
+ let subject, payload;
+
+ try {
+ const verificationResult = await Jwt.verify({ jwt: compactJwt });
+ subject = verificationResult.payload.sub;
+ payload = verificationResult.payload;
+ } catch (error) {
+ return res.status(401).json({
+ errors: ['Invalid token'],
+ });
+ }
+
+ /***********************************************
+ * Perform the sanctions check and get the result
+ ************************************************/
+ const sanctionsListResult = checkSanctionsList(payload);
+
+ if (!sanctionsListResult || sanctionsListResult.isSanctioned) {
+ return res.status(403).json({
+ errors: ['User is not eligible for a credential due to sanctions'],
+ });
+ }
+
+ /***********************************************
+ * Create credential
+ ************************************************/
+ const sanctions_credential = await VerifiableCredential.create({
+ type: 'SanctionsCredential',
+ issuer: issuerDid.uri,
+ subject: subject,
+ data: new SanctionsCredential(sanctionsListResult),
+ });
+
+ /***********************************************
+ * To secure the VC, you must sign it
+ ************************************************/
+ const credential_token = await sanctions_credential.sign({
+ did: issuerDid,
+ });
+
+ return res.status(200).json({ credential: credential_token });
+ } catch (error) {
+ // Generic error handling
+ return res.status(500).json({
+ errors: [`An unexpected error occurred: ${error.message}`],
+ });
+ }
+});
+// :snippet-end:
+
+/*
+Have to add tests separately because the big snippet is
+contained within the express app and the objects within
+are outside of the function's scope to be tested
+*/
+
+describe('Sanctions Credential Issuance', () => {
+ const sanctionsListResult = {
+ listsCleared: ["FBI's Most Wanted, USA Watchlist", 'EU Watchlist'],
+ };
+
+ test('Jwt.verify() works with a valid JWT', async () => {
+ const validJwt =
+ 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa3djSmkzeVVONDJFZ1N2cmNHRlFyQzRKY1pkenlWWkhQOVdmMXFRZWRuVlRQI3o2TWt3Y0ppM3lVTjQyRWdTdnJjR0ZRckM0SmNaZHp5VlpIUDlXZjFxUWVkblZUUCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiSWRlbnRpZmljYXRpb25DcmVkZW50aWFsIl0sImlkIjoidXJuOnV1aWQ6MDQ3ZTg0ZWItY2NhMS00NjFlLWFjZjAtMGMyZGE5ZDczOTNhIiwiaXNzdWVyIjoiZGlkOmtleTp6Nk1rd2NKaTN5VU40MkVnU3ZyY0dGUXJDNEpjWmR6eVZaSFA5V2YxcVFlZG5WVFAiLCJpc3N1YW5jZURhdGUiOiIyMDI0LTAyLTE1VDE5OjMyOjE2WiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6Nk1rd2NKaTN5VU40MkVnU3ZyY0dGUXJDNEpjWmR6eVZaSFA5V2YxcVFlZG5WVFAiLCJuYW1lIjoiam9obiJ9fSwiaXNzIjoiZGlkOmtleTp6Nk1rd2NKaTN5VU40MkVnU3ZyY0dGUXJDNEpjWmR6eVZaSFA5V2YxcVFlZG5WVFAiLCJzdWIiOiJkaWQ6a2V5Ono2TWt3Y0ppM3lVTjQyRWdTdnJjR0ZRckM0SmNaZHp5VlpIUDlXZjFxUWVkblZUUCJ9.7oFAPckx-vxCbbzKSk9bU7eXlnjBFvMborl9woHCbcvWaLt0LvTRuDfvGDPC24V9D1K5OFpTnnBiN5jtIOmbBg';
+ const verificationResult = await Jwt.verify({ jwt: validJwt });
+
+ expect(verificationResult).toHaveProperty('header');
+ expect(verificationResult).toHaveProperty('payload');
+ expect(verificationResult.payload).toHaveProperty('iss');
+ expect(verificationResult.payload).toHaveProperty('sub');
+ });
+
+ test('add service endpoint to existing DID document', async () => {
+ // :snippet-start: updateADidWithServiceEndpointJS
+ issuerBearerDid.document.service.push({
+ id: 'idv',
+ type: 'IDV',
+ serviceEndpoint: 'https://exampleIdvEndpoint.com/idv/siopv2/initiate',
+ });
+
+ const updatedDidDocument = await DidDht.publish({ did: issuerBearerDid });
+ // :snippet-end:
+
+ expect(updatedDidDocument.didDocument).toHaveProperty('service');
+ expect(updatedDidDocument.didDocument.service.some(service => service.id === 'idv')).toBeTruthy();
+ });
+
+ test('.create() creates a credential with expected fields', async () => {
+ const createdCredential = await VerifiableCredential.create({
+ type: 'SanctionsCredential',
+ issuer: issuerDid.uri,
+ subject: signerDid.uri,
+ data: new SanctionsCredential(sanctionsListResult),
+ });
+
+ expect(createdCredential).toHaveProperty('type');
+ expect(createdCredential).toHaveProperty('issuer', issuerDid.uri);
+ });
+
+ test('.sign() method signs the credential and includes expected fields', async () => {
+ const sanctionsCredential = await VerifiableCredential.create({
+ type: 'SanctionsCredential',
+ issuer: issuerDid.uri,
+ subject: signerDid.uri,
+ data: new SanctionsCredential(sanctionsListResult),
+ });
+
+ const signedCredential = await sanctionsCredential.sign({
+ did: issuerDid,
+ });
+
+ expect(typeof signedCredential).toBe('string');
+ expect(signedCredential).not.toBe('');
+ });
+});
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/kbc/knownBusinessCredentialIssuer.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/kbc/knownBusinessCredentialIssuer.test.js
new file mode 100644
index 0000000..3de74fd
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/kbc/knownBusinessCredentialIssuer.test.js
@@ -0,0 +1,129 @@
+import { describe, test, expect, beforeAll } from 'vitest';
+import { VerifiableCredential } from '@web5/credentials';
+import { DidDht } from '@web5/dids';
+import { Offering } from '@tbdex/http-client';
+
+describe("Known Business Credential", () => {
+ let pfiDid;
+ let subjectDidUri;
+ beforeAll(async () => {
+ pfiDid = await DidDht.create({
+ options: {
+ publish: true,
+ services: [{
+ id: 'pfi',
+ type: 'PFI',
+ serviceEndpoint: 'https://example.com/'
+ }]
+ },
+ })
+ const subjectDid = await DidDht.create()
+ subjectDidUri = subjectDid.uri;
+ })
+
+ test("Issue Known Business Credential", async () => {
+ // :snippet-start: issueKbcJs
+ const kbc = await VerifiableCredential.create({
+ issuer: pfiDid.uri, // Issuer's DID URI
+ subject: subjectDidUri, // Wallet app's DID URI
+ expirationDate: '2025-09-30T12:34:56Z', // Date the KBC should expire
+ data: {
+ //Custom attributes for the KBC
+ },
+ credentialSchema: {
+ type: "JsonSchema", // Format type of the schema used for the KBC
+ id: "https://vc.schemas.host/kbc.schema.json" // URL to the schema used for the KBC
+ }
+ })
+ const signedKbc = await kbc.sign({ did: pfiDid });
+ // :snippet-end:
+ expect(kbc).toBeDefined();
+ expect.soft(kbc).toHaveProperty('issuer', pfiDid.uri);
+ expect(typeof signedKbc).toBe('string');
+
+ })
+
+ test("Required claims in Known Business Credential", async () => {
+ // :snippet-start: kbcPresentationDefinitionJs
+ const pd = {
+ id: "presentation-definition-kbc", // required unique id for presentation definition
+ name: "KYB Verification",
+ purpose: "Verifiying your business status.",
+ format: {
+ jwt_vc: {
+ alg: ["ES256K", "EdDSA"]
+ }
+ },
+ input_descriptors: [
+ {
+ id: "known-business-credential_1", // required unique id for the input descriptor
+ name: "Known Business Credential",
+ purpose: "Please present your Known Business Credential for verification.",
+ constraints: {
+ fields: [
+ {
+ path: ["$.vc.credentialSchema[0].id"],
+ filter: {
+ type: "string",
+ const: "https://vc.schemas.host/kbc.schema.json"
+ }
+ },
+ {
+ path: ["$.vc.issuer"],
+ filter: {
+ type: "string",
+ const: pfiDid.uri
+ }
+ }
+ ]
+ },
+ }
+ ]
+ };
+ // :snippet-end:
+
+ try {
+ // :snippet-start: kbcCreateOfferingJs
+ const offering = Offering.create({
+ metadata: {
+ from: pfiDid.uri,
+ },
+ data: {
+ description: "Selling BTC for USD",
+ payin: {
+ currencyCode: "USD",
+ max: "100.00",
+ methods: [
+ {
+ description: "Pay in via Debit Card, Apple Pay, or CashApp Pay",
+ kind: "PAYMENT_LINK",
+ name: "Debit Card, ApplePay, CashApp Pay"
+ }
+ ]
+ },
+ payout: {
+ currencyCode: 'BTC',
+ methods: [
+ {
+ kind: 'BTC_ADDRESS',
+ estimatedSettlementTime: 60,
+ fee: '0.25',
+ }
+ ]
+ },
+ payoutUnitsPerPayinUnit: '0.00003826',
+ // highlight-next-line
+ requiredClaims: pd
+ }
+ });
+
+ await offering.sign(pfiDid);
+ offering.validate();
+
+ // :snippet-end:
+
+ } catch (e) {
+ expect.fail(e.message)
+ }
+ })
+})
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/kcc/knownCustomerCredential.bash b/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/kcc/knownCustomerCredential.bash
new file mode 100644
index 0000000..980d676
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/kcc/knownCustomerCredential.bash
@@ -0,0 +1,3 @@
+# :snippet-start: knownCustomerCredentialJsPackage
+npm i @web5/credentials @web5/dids node-fetch
+# :snippet-end:
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/kcc/knownCustomerCredentialIssuer.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/kcc/knownCustomerCredentialIssuer.test.js
new file mode 100644
index 0000000..b0a41ff
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/kcc/knownCustomerCredentialIssuer.test.js
@@ -0,0 +1,538 @@
+import { describe, test, expect } from 'vitest';
+import { Jwt, VerifiableCredential } from '@web5/credentials';
+import { DidJwk } from '@web5/dids';
+import express from 'express';
+
+const issuerBearerDid = await DidJwk.create();
+const customerBearerDid = await DidJwk.create();
+
+const app = express();
+app.use(express.json());
+
+// :snippet-start: siopv2InitiateId_tokenEndpointIssuerJs
+app.get('/idv/siopv2/initiate', async (req, res) => {
+ const siopRequestOnlyIdToken = {
+ client_id: issuerBearerDid.uri, // Issuer's Decentralized Identifier string
+ scope: 'openid', // Standard OpenID Connect scope
+ response_type: 'id_token', // Only requesting an ID Token
+ response_uri: 'https://issuer.example.com/siopv2/response', // Endpoint for SIOP response delivery
+ response_mode: 'direct_post', // Delivery method of the SIOP response
+ nonce: 'n-0S6_WzA2Mj', // Unique string to link the request and response
+ // Note: No presentation_definition is included, as we're not requesting a vp_token
+ };
+
+ // Sign and send the SIOPv2 Authorization Request as JAR
+});
+// :snippet-end:
+
+// :snippet-start: siopv2InitiateId_tokenAndVp_tokenEndpointIssuerJs
+app.get('/idv/siopv2/initiate', async (req, res) => {
+ // Construct the SIOPv2 Authorization Request
+ const siopRequestPayload = {
+ client_id: issuerBearerDid.uri, // Issuer's Decentralized Identifier string
+ scope: 'openid', // Standard OpenID Connect scope
+ response_type: 'id_token vp_token', // Expected response formats: ID Token and optionally, Verifiable Presentation Token
+ response_uri: 'https://issuer.example.com/siopv2/response', // Endpoint for SIOP response delivery
+ response_mode: 'direct_post', // Delivery method of the SIOP response
+ nonce: 'n-0S6_WzA2Mj', // Unique string to link the request and response
+ client_metadata: {
+ // Descriptive metadata about the requesting party (Issuer)
+ subject_syntax_types_supported: 'did:dht did:jwk',
+ client_name: 'Issuance Service Name',
+ client_uri: 'https://issuer.example.com',
+ logo_uri: 'https://issuer.example.com/logo.png',
+ tos_uri: 'https://issuer.example.com/tos',
+ policy_uri: 'https://issuer.example.com/privacy',
+ },
+ presentation_definition: {
+ id: 'IDCardCredentials',
+ input_descriptors: [
+ {
+ id: 'IDCardCredential',
+ schema: {
+ uri: [
+ 'https://www.w3.org/2018/credentials#VerifiableCredential',
+ 'https://www.w3.org/2018/credentials/examples/v1#IDCardCredential',
+ ],
+ name: 'ID Card Credential',
+ purpose: 'We need to verify your identity.',
+ },
+ constraints: {
+ fields: [
+ {
+ path: ['$.vc.credentialSubject.given_name'],
+ purpose: 'The given name on your ID card.',
+ },
+ {
+ path: ['$.vc.credentialSubject.family_name'],
+ purpose: 'The family name on your ID card.',
+ },
+ {
+ path: ['$.vc.credentialSubject.birthdate'],
+ purpose: 'Your birth date.',
+ },
+ {
+ path: ['$.vc.credentialSubject.national_identifier'],
+ purpose: 'Your national identifier.',
+ },
+ ],
+ },
+ },
+ ],
+ },
+ };
+
+ // Sign and send the SIOPv2 Authorization Request as JAR
+});
+// :snippet-end:
+
+// :snippet-start: encodeSiopv2AuthRequestIssuerJs
+app.get('/idv/siopv2/initiate', async (req, res) => {
+ // Construct the SIOPv2 Authorization Request
+ const siopRequestPayload = {
+ client_id: issuerBearerDid.uri, // Issuer's Decentralized Identifier string
+ scope: 'openid', // Standard OpenID Connect scope
+ response_type: 'id_token vp_token', // Expected response formats: ID Token and optionally, Verifiable Presentation Token
+ response_uri: 'https://issuer.example.com/siopv2/response', // Endpoint for SIOP response delivery
+ response_mode: 'direct_post', // Delivery method of the SIOP response
+ nonce: 'n-0S6_WzA2Mj', // Unique string to link the request and response
+ client_metadata: {
+ // Descriptive metadata about the requesting party (Issuer)
+ subject_syntax_types_supported: 'did:dht did:jwk',
+ client_name: 'Issuance Service Name',
+ client_uri: 'https://issuer.example.com',
+ logo_uri: 'https://issuer.example.com/logo.png',
+ tos_uri: 'https://issuer.example.com/tos',
+ policy_uri: 'https://issuer.example.com/privacy',
+ },
+ presentation_definition: {
+ id: 'IDCardCredentials',
+ input_descriptors: [
+ {
+ id: 'IDCardCredential',
+ schema: {
+ uri: [
+ 'https://www.w3.org/2018/credentials#VerifiableCredential',
+ 'https://www.w3.org/2018/credentials/examples/v1#IDCardCredential',
+ ],
+ name: 'ID Card Credential',
+ purpose: 'We need to verify your identity.',
+ },
+ constraints: {
+ fields: [
+ {
+ path: ['$.vc.credentialSubject.given_name'],
+ purpose: 'The given name on your ID card.',
+ },
+ {
+ path: ['$.vc.credentialSubject.family_name'],
+ purpose: 'The family name on your ID card.',
+ },
+ {
+ path: ['$.vc.credentialSubject.birthdate'],
+ purpose: 'Your birth date.',
+ },
+ {
+ path: ['$.vc.credentialSubject.national_identifier'],
+ purpose: 'Your national identifier.',
+ },
+ ],
+ },
+ },
+ ],
+ },
+ };
+ //highlight-start
+ // Sign the SIOPv2 Auth Request
+ const siopRequestJwtPayload = {
+ sub: issuerBearerDid.uri, // Issuer's Decentralized Identifier string
+ iss: issuerBearerDid.uri, // Issuer's Decentralized Identifier string
+ iat: Math.floor(Date.now() / 1000), // Issued at
+ exp: Math.floor(Date.now() / 1000) + 86400, // Expiration time
+ request: siopRequestPayload, // Embed the SIOPv2 Auth request payload
+ };
+
+ try {
+ const jwtToken = await Jwt.sign({
+ signerDid: issuerBearerDid,
+ payload: siopRequestJwtPayload,
+ });
+ // Send the SIOPv2 Auth Request in JAR format
+ const queryString = `client_id=${encodeURIComponent(issuerBearerDid.uri)}&request=${encodeURIComponent(jwtToken)}`;
+ res.send(queryString);
+ } catch (err) {
+ console.error('Error signing the SIOPv2 request:', err);
+ res.status(500).send('Failed to generate JWT for SIOPv2 Authorization Request');
+ }
+ //highlight-end
+});
+
+
+// :snippet-end:
+
+// :snippet-start: siopv2ResponseEndpointIssuerJs
+import { VerifiableCredential, Jwt } from '@web5/credentials';
+
+const preAuthCodeToDidMap = new Map();
+
+app.post('/siopv2/response', async (req, res) => {
+ const walletResponse = req.body; // The SIOPv2 Authorization Response from the Wallet
+
+ /************************************************************
+ * Extract and verify the ID Token from the Wallet's response
+ *************************************************************/
+ try {
+ const compactIdToken = walletResponse.id_token;
+ if (!compactIdToken) {
+ return res.status(400).json({ message: 'Missing ID Token' });
+ }
+ const idTokenVerificationResult = await Jwt.verify({ jwt: compactIdToken });
+
+ /************************************************************
+ * Extract customers Did from verificationResult
+ *************************************************************/
+ const customersDidUri = idTokenVerificationResult.payload.sub;
+ // Perform additional checks (e.g., nonce, audience, expiration)
+
+ const preAuthCode = generateUniquePreAuthCode();
+ preAuthCodeToDidMap.set(preAuthCode, customersDidUri); // needed for subsequent '/token' endpoint
+
+ /********************************************************************
+ * Define the initial structure for the Identity Verification Request
+ ********************************************************************/
+
+ let idvRequest = {
+ credential_offer: {
+ credential_issuer: 'https://issuer.example.com',
+ credential_configuration_ids: [
+ 'knownCustomerCredential-basic',
+ 'knownCustomerCredential-extended',
+ ],
+ grants: {
+ 'urn:ietf:params:oauth:grant-type:pre-authorized_code': preAuthCode,
+ },
+ },
+ };
+
+ let isVPValidIDV = false;
+ if (walletResponse.vp_token) {
+ const compactVpToken = walletResponse.vp_token;
+ const vpTokenVerificationResult = await Jwt.verify({
+ jwt: compactVpToken,
+ });
+
+ isVPValidIDV = true;
+ }
+
+ /********************************************************************
+ * If vp_token is not present include `url` for IDV form
+ ********************************************************************/
+
+ if (!isVPValidIDV) {
+ idvRequest = {
+ ...idvRequest,
+ url: 'https://issuer.example.com/idv/form',
+ };
+ }
+
+ res.json(credentialOffer);
+ } catch (error) {
+ // Handle verification errors
+ return res.status(401).json({
+ errors: ['Invalid token', error.message],
+ });
+ }
+});
+// :snippet-end:
+
+// :snippet-start: wellKnownIssuerMetadataEndpointIssuerJs
+app.get('/.well-known/openid-credential-issuer', (req, res) => {
+ const issuerMetadata = {
+ credential_issuer: 'https://issuer.example.com',
+ credential_endpoint: 'https://issuer.example.com/credentials',
+ credential_configurations_supported: {
+ // type of credentials Issuer supports and what credential will look like
+ KnownCustomerCredential: {
+ format: 'jwt_vc_json',
+ scope: 'CustomerIdentity',
+ cryptographic_binding_methods_supported: ['did:example'],
+ credential_signing_alg_values_supported: ['EdDSA', 'ES256K'],
+ credential_definition: {
+ type: ['VerifiableCredential'],
+ credentialSubject: {
+ country: {
+ display: [{ name: 'Country', locale: 'en-US' }],
+ },
+ },
+ },
+ proof_types_supported: {
+ jwt: {
+ proof_signing_alg_values_supported: ['EdDSA', 'ES256K'],
+ },
+ },
+ display: [
+ {
+ name: 'Known Customer Credential',
+ locale: 'en-US',
+ logo: {
+ url: 'https://issuer.example.com/public/logo.png',
+ alt_text: 'Issuer Logo',
+ },
+ background_color: '#FFFFFF',
+ text_color: '#000000',
+ },
+ ],
+ },
+ },
+ };
+
+ res.json(issuerMetadata);
+});
+// :snippet-end:
+
+// :snippet-start: wellKnownAuthorizationServerEndpointIssuerJs
+app.get('/.well-known/oauth-authorization-server', (req, res) => {
+ const oauthAuthorizationServerMetadata = {
+ issuer: 'https://issuer.example.com', // URL of the Credential Issuer
+ token_endpoint: 'https://issuer.example.com/token', // URL for the Access Token Request
+ };
+
+ res.json(oauthAuthorizationServerMetadata);
+});
+// :snippet-end:
+
+// :snippet-start: accessTokenEndpointIssuerJs
+import { VerifiableCredential, Jwt } from '@web5/credentials';
+
+const accessTokenToCNonceMap = new Map();
+
+app.post('/token', async (req, res) => {
+ const { grant_type, code } = req.body;
+
+ if (grant_type !== 'urn:ietf:params:oauth:grant-type:pre-authorized_code') {
+ return res.status(400).json({ error: 'unsupported_grant_type' });
+ }
+
+ const customersDidUri = preAuthCodeToDidMap.get(code);
+ if (!customersDidUri) {
+ return res.status(400).json({ error: 'invalid_grant' });
+ }
+
+ // Check the status of the IDV
+ const idvCompleted = checkIDVStatus(customersDidUri);
+ if (!idvCompleted) {
+ return res.status(400).json({ error: 'authorization_pending' });
+ }
+
+ /********************************************
+ * Create the payload for the access token
+ ********************************************/
+ const accessTokenPayload = {
+ sub: customersDidUri, // Customer's Decentralized Identifier string
+ iss: issuerBearerDid.uri, // Issuer's Decentralized Identifier string
+ iat: Math.floor(Date.now() / 1000), // Issued at
+ exp: Math.floor(Date.now() / 1000) + 86400, // Expiration time
+ };
+ /********************************************
+ * sign accessToken and generate a c_nonce
+ ********************************************/
+ try {
+ const accessToken = await Jwt.sign({
+ signerDid: issuerBearerDid,
+ payload: accessTokenPayload,
+ });
+
+ const cNonce = generateCNonce();
+ accessTokenToCNonceMap.set(accessToken, cNonce);
+
+ preAuthCodeToDidMap.delete(code);
+
+ res.json({
+ access_token: accessToken,
+ token_type: 'bearer',
+ expires_in: 86400, // Token expiration time
+ c_nonce: cNonce, // Challenge nonce to be signed
+ c_nonce_expires_in: 86400, // cNonce expiration time
+ });
+ } catch (error) {
+ return res
+ .status(500)
+ .json({ error: 'internal_server_error', message: error.message });
+ }
+});
+// :snippet-end:
+
+// :snippet-start: KnownCustomerCredentialsClass
+class KccCredential {
+ constructor(country, tier, jurisdiction, credentialSchema, evidence) {
+ this.data = {
+ countryOfResidence: country,
+ tier: tier, // optional
+ jurisdiction: jurisdiction // optional
+ };
+ this.credentialSchema = credentialSchema;
+ this.evidence = evidence; // optional
+ }
+}
+
+export default KccCredential;
+// :snippet-end:
+
+// :snippet-start: knownCustomerCredentialEndpointIssuerJs
+app.post('/credentials', async (req, res) => {
+ try {
+ /*****************************************************************
+ * Extract and validate the access token from Authorization header
+ ******************************************************************/
+ const authHeader = req.headers['authorization'];
+ if (!authHeader) {
+ return res
+ .status(401)
+ .json({ errors: ['Authorization header required'] });
+ }
+
+ const tokenParts = authHeader.split('Bearer ');
+ if (tokenParts.length !== 2) {
+ return res
+ .status(401)
+ .json({ errors: ['Authorization header format is Bearer '] });
+ }
+
+ const accessToken = tokenParts[1];
+ const storedCNonce = accessTokenToCNonceMap.get(accessToken);
+ if (!storedCNonce) {
+ return res
+ .status(401)
+ .json({ errors: ['Invalid or expired access token'] });
+ }
+
+ /**************************************************************
+ * Extract and validate the JWT and nonce from the proof object
+ **************************************************************/
+ const { proof } = req.body;
+ if (!proof || proof.proof_type !== 'jwt' || !proof.jwt) {
+ return res.status(400).json({ errors: ['Invalid proof provided'] });
+ }
+
+ let customersDidUri, payload;
+
+ try {
+ const verificationResult = await Jwt.verify({ jwt: proof.jwt });
+ customersDidUri = verificationResult.payload.iss; // Customer's Decentralized Identifier string
+ if (storedCNonce === payload.nonce) {
+ accessTokenToCNonceMap.delete(accessToken);
+ } else {
+ return res.status(401).json({ errors: ['Invalid nonce in proof'] });
+ }
+ } catch (error) {
+ return res.status(401).json({ errors: ['Invalid JWT in proof'] });
+ }
+
+ /***********************************************
+ * Create and sign the credential
+ ************************************************/
+ const kccCredentialInstance = new KccCredential('US', 'Gold', {
+ country: "US"
+ },
+ {
+ id: "https://vc.schemas.host/kcc.schema.json",
+ type: "JsonSchema"
+ },
+ [
+ {
+ kind: 'document_verification',
+ checks: ['passport', 'utility_bill'],
+ },
+ {
+ kind: 'sanction_screening',
+ checks: ['PEP'],
+ },
+ ]
+ );
+
+ const known_customer_credential = await VerifiableCredential.create({
+ issuer: issuerBearerDid.uri, // Issuer's Decentralized Identifier string
+ subject: customersDidUri, // Customer's Decentralized Identifier string from the verified JWT
+ expirationDate: '2026-05-19T08:02:04Z',
+ data: {
+ countryOfResidence: kccCredentialInstance.data.countryOfResidence,
+ tier: kccCredentialInstance.data.tier, // optional
+ jurisdiction: kccCredentialInstance.data.jurisdiction // optional
+ },
+ credentialSchema: kccCredentialInstance.credentialSchema,
+ evidence: kccCredentialInstance.evidence, // optional
+ });
+
+ const credential_token = await known_customer_credential.sign({
+ did: issuerBearerDid, // Signing with the issuer's bearer DID
+ });
+ /***********************************************
+ * Respond with the signed credential
+ ************************************************/
+ return res.status(200).json({ credential: credential_token });
+ } catch (error) {
+ /***********************************************
+ * Generic error handling
+ ************************************************/
+ return res.status(500).json({
+ errors: [`An unexpected error occurred: ${error.message}`],
+ });
+ }
+});
+// :snippet-end:
+
+/*
+Have to add tests separately because the big snippet is
+contained within the express app and the objects within
+are outside of the function's scope to be tested
+*/
+
+describe('Known Customer Credental Issuer Flow', () => {
+ test('Jwt.verify() works with a valid JWT', async () => {
+ const validJwt =
+ 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa3djSmkzeVVONDJFZ1N2cmNHRlFyQzRKY1pkenlWWkhQOVdmMXFRZWRuVlRQI3o2TWt3Y0ppM3lVTjQyRWdTdnJjR0ZRckM0SmNaZHp5VlpIUDlXZjFxUWVkblZUUCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiSWRlbnRpZmljYXRpb25DcmVkZW50aWFsIl0sImlkIjoidXJuOnV1aWQ6MDQ3ZTg0ZWItY2NhMS00NjFlLWFjZjAtMGMyZGE5ZDczOTNhIiwiaXNzdWVyIjoiZGlkOmtleTp6Nk1rd2NKaTN5VU40MkVnU3ZyY0dGUXJDNEpjWmR6eVZaSFA5V2YxcVFlZG5WVFAiLCJpc3N1YW5jZURhdGUiOiIyMDI0LTAyLTE1VDE5OjMyOjE2WiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6Nk1rd2NKaTN5VU40MkVnU3ZyY0dGUXJDNEpjWmR6eVZaSFA5V2YxcVFlZG5WVFAiLCJuYW1lIjoiam9obiJ9fSwiaXNzIjoiZGlkOmtleTp6Nk1rd2NKaTN5VU40MkVnU3ZyY0dGUXJDNEpjWmR6eVZaSFA5V2YxcVFlZG5WVFAiLCJzdWIiOiJkaWQ6a2V5Ono2TWt3Y0ppM3lVTjQyRWdTdnJjR0ZRckM0SmNaZHp5VlpIUDlXZjFxUWVkblZUUCJ9.7oFAPckx-vxCbbzKSk9bU7eXlnjBFvMborl9woHCbcvWaLt0LvTRuDfvGDPC24V9D1K5OFpTnnBiN5jtIOmbBg';
+ const verificationResult = await Jwt.verify({ jwt: validJwt });
+
+ expect(verificationResult).toHaveProperty('header');
+ expect(verificationResult).toHaveProperty('payload');
+ expect(verificationResult.payload).toHaveProperty('iss');
+ expect(verificationResult.payload).toHaveProperty('sub');
+ });
+
+ test('Jwt.sign() works with a valid payload & bearer DID', async () => {
+ const accessTokenPayload = {
+ "client_id": "did:web:192.168.4.23%3A8892:ingress",
+ "client_metadata": "",
+ "iss": "did:web:192.168.4.23%3A8892:ingress",
+ "nonce": "168e442893f72390bbe4778b94848011",
+ "response_mode": "direct_post",
+ "response_type": "id_token vp_token",
+ "response_uri": "http://192.168.4.23:8892/ingress/kcc",
+ "scope": "openid"
+ };
+
+ const accessToken = await Jwt.sign({
+ signerDid: issuerBearerDid,
+ payload: accessTokenPayload,
+ });
+
+ expect(typeof accessToken).toBe('string');
+ expect(accessToken).not.toBe('');
+ });
+
+ test('VerifiableCredential.create() creates credential & .sign() creates JWT', async () => {
+ const known_customer_credential = await VerifiableCredential.create({
+ issuer: issuerBearerDid.uri,
+ subject: customerBearerDid.uri,
+ expirationDate: '2026-05-19T08:02:04Z',
+ data: new KccCredential('US'),
+ });
+
+ const credential_token = await known_customer_credential.sign({
+ did: issuerBearerDid,
+ });
+
+ expect(typeof credential_token).toBe('string');
+ expect(credential_token).not.toBe('');
+ });
+});
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/kcc/knownCustomerCredentialWallet.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/kcc/knownCustomerCredentialWallet.test.js
new file mode 100644
index 0000000..7afbf93
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/issuer/kcc/knownCustomerCredentialWallet.test.js
@@ -0,0 +1,477 @@
+import { describe, test, expect, vi, beforeEach } from 'vitest';
+// :prepend-start: knownCustomerCredentialhandleSiopRequestWalletJS
+import { Jwt, PresentationExchange } from '@web5/credentials';
+// :prepend-end:
+import { DidJwk } from '@web5/dids';
+// :prepend-start: knownCustomerCredentialResolveIssuerDidJS
+import { resolveDid } from '@tbdex/protocol'
+// :prepend-end:
+
+const issuerBearerDid = await DidJwk.create();
+const issuerDidUri = issuerBearerDid.uri;
+const customerBearerDid = await DidJwk.create();
+
+describe('Presentation Exchange Process', () => {
+ const nameCredentialJwt =
+ 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byMwIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiSURDYXJkQ3JlZGVudGlhbFBhcnQxIl0sImlkIjoidXJuOnV1aWQ6NTdhNWU4ZWUtYmZlMC00YjQwLWJmMDAtZTA4MTY5ZDk5Y2Q1IiwiaXNzdWVyIjoiZGlkOmRodDpmYzZyNmJnNjl0Nms4dTl1OXN1NTNhYWY2anUxeGRwd2R6dXcza2p1OHNzYW1iM3Bwc3VvIiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMy0yMVQyMToyMTo1MVoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byIsImdpdmVuX25hbWUiOiJBbGljZSIsImZhbWlseV9uYW1lIjoiU21pdGgifX0sImlzcyI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byIsInN1YiI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byJ9.kt0rKEgZ1_U4eTUNDgUU9LzmFViHsx_1z6llfFAqCdpzwIsKKYbqfbtgckJDsoV9xqgG5TYAVPxeLo5hCAguDA';
+ const idCredentialJwt =
+ 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byMwIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiSURDYXJkQ3JlZGVudGlhbFBhcnQyIl0sImlkIjoidXJuOnV1aWQ6YTM5ZmQ3NjgtNjVjMy00MDZhLWIwMGItMTg1MjIxM2ExYzhjIiwiaXNzdWVyIjoiZGlkOmRodDpmYzZyNmJnNjl0Nms4dTl1OXN1NTNhYWY2anUxeGRwd2R6dXcza2p1OHNzYW1iM3Bwc3VvIiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMy0yMVQyMToyMTo1MVoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byIsImJpcnRoZGF0ZSI6IjE5OTAtMDEtMDEiLCJuYXRpb25hbF9pZGVudGlmaWVyIjoiMTIzLTQ1LTY3ODkifX0sImlzcyI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byIsInN1YiI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byJ9.lQOBdE3LGQ_rLz69SQoI_auOsFpsOESBIbHNf9HpYTGYTT2aYw8WrKd1rXQuRqzgELcv92iWQRpWoVm193x3CQ';
+ const credentials = [nameCredentialJwt, idCredentialJwt];
+ const presentation_definition = {
+ id: 'IDCardCredentials',
+ input_descriptors: [
+ // Given Name Verification
+ {
+ id: 'givenNameVerification',
+ purpose: 'We need to verify your given name.',
+ constraints: {
+ fields: [
+ {
+ path: [
+ '$.credentialSubject.given_name',
+ '$.vc.credentialSubject.given_name',
+ ],
+ filter: {
+ type: 'string',
+ },
+ },
+ ],
+ },
+ },
+ // Family Name Verification
+ {
+ id: 'familyNameVerification',
+ purpose: 'We need to verify your family name.',
+ constraints: {
+ fields: [
+ {
+ path: [
+ '$.credentialSubject.family_name',
+ '$.vc.credentialSubject.family_name',
+ ],
+ filter: {
+ type: 'string',
+ },
+ },
+ ],
+ },
+ },
+ // Birthdate Verification
+ {
+ id: 'birthdateVerification',
+ purpose: 'We need to verify your birthdate.',
+ constraints: {
+ fields: [
+ {
+ path: [
+ '$.credentialSubject.birthdate',
+ '$.vc.credentialSubject.birthdate',
+ ],
+ filter: {
+ type: 'string',
+ format: 'date',
+ },
+ },
+ ],
+ },
+ },
+ // National Identifier Verification
+ {
+ id: 'nationalIdentifierVerification',
+ purpose: 'We need to verify your national identifier.',
+ constraints: {
+ fields: [
+ {
+ path: [
+ '$.credentialSubject.national_identifier',
+ '$.vc.credentialSubject.national_identifier',
+ ],
+ filter: {
+ type: 'string',
+ },
+ },
+ ],
+ },
+ },
+ ],
+ };
+
+ test('presentation exchange selects, satisfies and creates VP', async () => {
+ const allCredentials = credentials;
+ const selectedCredentials = PresentationExchange.selectCredentials({
+ vcJwts: allCredentials,
+ presentationDefinition: presentation_definition,
+ });
+
+ PresentationExchange.satisfiesPresentationDefinition({
+ vcJwts: selectedCredentials,
+ presentationDefinition: presentation_definition,
+ });
+
+ const vp = PresentationExchange.createPresentationFromCredentials({
+ vcJwts: selectedCredentials,
+ presentationDefinition: presentation_definition,
+ });
+
+ expect(selectedCredentials).toBeDefined();
+ expect(selectedCredentials).toBeInstanceOf(Array);
+ expect.soft(selectedCredentials.length).toBe(2);
+ expect(vp).toBeDefined();
+ expect(vp).toHaveProperty('presentation');
+ expect(vp.presentation).toHaveProperty('presentation_submission');
+ expect(vp.presentation).toHaveProperty('verifiableCredential');
+ expect(vp.presentation.type).toContain('VerifiablePresentation');
+ });
+
+ test('Jwt.sign() works with a bearer DID & valid payload', async () => {
+ const accessTokenPayload = {
+ sub: customerBearerDid.uri,
+ iss: issuerBearerDid.uri,
+ iat: Math.floor(Date.now() / 1000),
+ exp: Math.floor(Date.now() / 1000) + 86400,
+ };
+ const accessToken = await Jwt.sign({
+ signerDid: issuerBearerDid,
+ payload: accessTokenPayload,
+ });
+
+ expect(typeof accessToken).toBe('string');
+ expect(accessToken).not.toBe('');
+ });
+});
+
+// :snippet-start: knownCustomerCredentialResolveIssuerDidJS
+async function resolveIssuerDid(issuerDidUri) {
+ try {
+ /****************************************
+ * Resolve DID & Get IDV Service Endpoint
+ ****************************************/
+ const didDocument = await resolveDid(issuerDidUri)
+ const idvService = didDocument.service.find(
+ (service) => service.type === 'IDV',
+ );
+
+ if (idvService) {
+ return idvService.serviceEndpoint;
+ } else {
+ throw new Error('IDV service not found in DID Document');
+ }
+ } catch (error) {
+ throw new Error(`Error resolving DID: ${error.message}`);
+ }
+}
+// :snippet-end:
+
+// :snippet-start: knownCustomerCredentialSendRequestToIdvServiceEndpointJS
+async function sendRequestToIdvServiceEndpoint(idvServiceEndpoint) {
+ try {
+ const response = await fetch(idvServiceEndpoint);
+ if (!response.ok) {
+ throw new Error('Network response was not ok');
+ }
+ const encodedSiopRequest = await response.text();
+ handleSiopRequest(encodedSiopRequest); // function shown in next step
+ } catch (error) {
+ throw new Error(
+ `There was a problem with the fetch operation: ${error.message}`,
+ );
+ }
+}
+// :snippet-end:
+
+// :snippet-start: knownCustomerCredentialhandleSiopRequestWalletJS
+async function handleSiopRequest(encodedSiopRequest) {
+ /*************************************************************
+ * Decode the SIOP request JAR from the encoded URL parameters
+ *************************************************************/
+ const params = new URLSearchParams(encodedSiopRequest);
+ const jwtRequest = params.get('request');
+
+ if (!jwtRequest) {
+ throw new Error('No JWT found in SIOP Request');
+ }
+
+ let decodedSiopRequest;
+ try {
+ decodedSiopRequest = await Jwt.verify({ jwt: jwtRequest });
+ } catch (error) {
+ throw new Error(`Error decoding SIOP Request JWT: ${error.message}`);
+ }
+
+ // Extract the payload from the verified JWT
+ const siopRequest = decodedSiopRequest.payload.request;
+
+ /*******************************************************
+ * Generate & sign id_token
+ *******************************************************/
+ const idTokenPayload = {
+ iss: customerBearerDid.uri, // user's DID string
+ sub: customerBearerDid.uri,
+ aud: siopRequest.client_id,
+ nonce: siopRequest.nonce,
+ exp: Math.floor(Date.now() / 1000) + 60 * 60, // Expiration time
+ iat: Math.floor(Date.now() / 1000), // Issued at time
+ };
+
+ const idToken = await Jwt.sign({
+ signerDid: customerBearerDid,
+ payload: idTokenPayload,
+ });
+
+ let vpToken;
+ if (siopRequest.response_type.includes('vp_token')) {
+ try {
+ /*******************************************************
+ * Select Credentials based on the Presentation Definition
+ *******************************************************/
+ const selectedCredentials = await PresentationExchange.selectCredentials({
+ vcJwts: userVcJwts, // Array of VC JWTs stored in the user's Wallet
+ presentationDefinition: siopRequest.presentation_definition,
+ });
+
+ PresentationExchange.satisfiesPresentationDefinition({
+ vcJwts: selectedCredentials,
+ presentationDefinition: siopRequest.presentation_definition,
+ });
+
+ /*******************************************************
+ * Generate & sign vp_token
+ *******************************************************/
+ const vp = await PresentationExchange.createPresentationFromCredentials({
+ vcJwts: selectedCredentials,
+ presentationDefinition: siopRequest.presentation_definition,
+ });
+
+ vpToken = await Jwt.sign({ signerDid: customerBearerDid, payload: vp });
+ } catch (error) {
+ throw new Error(
+ `Presentation Definition not satisfied: ${error.message}`,
+ );
+ }
+ }
+ /*******************************************************
+ * POST SIOPv2 Authorization response to the response_uri
+ *******************************************************/
+ const responsePayload = {
+ id_token: idToken,
+ ...(vpToken && { vp_token: vpToken }),
+ };
+
+ fetch(siopRequest.response_uri, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(responsePayload),
+ })
+ .then((response) => response.json())
+ .then((data) => {
+ handleIssuerResponse(data); // function shown in next step
+ })
+ .catch((error) => {
+ throw new Error(`Error sending SIOP response: ${error.message}`);
+ });
+}
+// :snippet-end:
+
+// :snippet-start: knownCustomerCredentialHandleIssuerResponseWalletJS
+let walletStorage = {
+ credentialIssuer: null,
+ preAuthorizedCode: null,
+ credentialEndpoint: null,
+ tokenEndpoint: null,
+ accessToken: null,
+ cNonce: null,
+};
+
+function handleIssuerResponse(issuerResponse) {
+ const { credential_issuer, grants } = issuerResponse.credential_offer;
+ const preAuthorizedCode =
+ grants['urn:ietf:params:oauth:grant-type:pre-authorized_code'];
+
+ /***********************************************************************
+ * Store the credential_issuer URL and pre_authorized_code for future use
+ ************************************************************************/
+ walletStorage.credentialIssuer = credential_issuer;
+ walletStorage.preAuthorizedCode = preAuthorizedCode;
+
+ if (issuerResponse.url) {
+ // Direct the user to this URL to complete their Identity Verification
+ openIdvForm(issuerResponse.url);
+ } else {
+ fetchIssuerMetadata(); // function shown in next step
+ }
+}
+// :snippet-end:
+
+// :snippet-start: knownCustomerCredentialFetchIssuerMetadataWalletJS
+function fetchIssuerMetadata() {
+ /*****************************
+ * Fetch the Issuer's metadata
+ *****************************/
+ const issuerMetadataUrl = `${walletStorage.credentialIssuer}/.well-known/openid-credential-issuer`;
+ fetch(issuerMetadataUrl)
+ .then((response) => response.json())
+ .then((issuerMetadata) => {
+ /**********************************************
+ * Store the credential endpoint for future use
+ **********************************************/
+ walletStorage.credentialEndpoint = issuerMetadata.credential_endpoint;
+ fetchAuthServerMetadata(); // function shown in next step
+ })
+ .catch((error) => {
+ console.error(`Error in fetching issuer metadata: ${error.message}`);
+ });
+}
+// :snippet-end:
+
+// :snippet-start: knownCustomerCredentialFetchAuthServerMetadataWalletJS
+function fetchAuthServerMetadata() {
+ /*******************************************
+ * Fetch the authorization server's metadata
+ *******************************************/
+ const authServerMetadataUrl = `${walletStorage.credentialIssuer}/.well-known/oauth-authorization-server`;
+ fetch(authServerMetadataUrl)
+ .then((response) => response.json())
+ .then((authServerMetadata) => {
+ /****************************************************
+ * Extract and store the token_endpoint for future use
+ *****************************************************/
+ walletStorage.tokenEndpoint = authServerMetadata.token_endpoint;
+ fetchAccessToken(
+ walletStorage.preAuthorizedCode,
+ walletStorage.tokenEndpoint,
+ ); // function shown in next step
+ })
+ .catch((error) => {
+ console.error(
+ `Error in fetching authorization server metadata: ${error.message}`,
+ );
+ });
+}
+// :snippet-end:
+
+// :snippet-start: knownCustomerCredentialFetchAccessTokenWalletJS
+function fetchAccessToken(
+ preAuthorizationCode,
+ tokenEndpoint,
+ retryDelay = 10000,
+) {
+ const requestBody = {
+ grant_type: 'urn:ietf:params:oauth:grant-type:pre-authorized_code',
+ code: preAuthorizationCode,
+ client_id: customerBearerDid.uri, // user's did string
+ };
+
+ /*********************************************
+ * Send the POST request to the token endpoint
+ **********************************************/
+ fetch(tokenEndpoint, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(requestBody),
+ })
+ .then((response) => {
+ if (!response.ok) {
+ throw new Error(`HTTP error! Status: ${response.status}`);
+ }
+ return response.json();
+ })
+ .then((data) => {
+ /*******************************************
+ * Handle the "authorization_pending" error
+ ********************************************/
+ if (data.error === 'authorization_pending') {
+ displayNotification(
+ "Hang tight, we're still waiting for IDV to complete.",
+ );
+
+ setTimeout(() => {
+ fetchAccessToken(preAuthorizationCode, tokenEndpoint, retryDelay);
+ }, retryDelay);
+ /*************************************************
+ * Store the access token & c_nonce for future use
+ **************************************************/
+ } else if (data.access_token) {
+ walletStorage.accessToken = data.access_token;
+ walletStorage.cNonce = data.c_nonce;
+ if (walletStorage.credentialEndpoint) {
+ requestKnownCustomerCredential(
+ walletStorage.credentialEndpoint,
+ walletStorage.accessToken,
+ ); // function shown in next step
+ } else {
+ console.error('Credential endpoint is missing in walletStorage.');
+ }
+ } else {
+ throw new Error('Access token not found in the response');
+ }
+ })
+ .catch((error) => {
+ throw new Error(`Error fetching access token: ${error.message} `);
+ });
+}
+// :snippet-end:
+
+// :snippet-start: knownCustomerCredentialRequestCredentialWalletJS
+function requestKnownCustomerCredential(credentialEndpoint, accessToken) {
+ if (!walletStorage.cNonce) {
+ throw new Error('cNonce is missing in Wallet storage');
+ }
+ /*************************************************
+ * Construct & sign the JWT payload
+ **************************************************/
+ const jwtPayload = {
+ iss: customerBearerDid.uri, // user's DID string
+ aud: issuerDidUri, // Issuer's DID string
+ iat: Math.floor(Date.now() / 1000),
+ nonce: walletStorage.cNonce,
+ };
+
+ Jwt.sign({ signerDid: customerBearerDid, payload: jwtPayload })
+ .then((signedJwt) => {
+ const requestBody = {
+ proof: {
+ proof_type: 'jwt',
+ jwt: signedJwt,
+ },
+ };
+ /*************************************************
+ * Request & securely store KCC
+ **************************************************/
+
+ fetch(credentialEndpoint, {
+ method: 'POST',
+ headers: {
+ // Include the access token in the Authorization header
+ 'Authorization': `Bearer ${accessToken}`,
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(requestBody),
+ })
+ .then((response) => {
+ if (!response.ok) {
+ throw new Error(
+ `Network response was not ok: ${response.statusText}`,
+ );
+ }
+ return response.json();
+ })
+ .then((data) => {
+ if (data.credential) {
+ secureStorage.setItem('signedCredential', data.credential);
+ } else {
+ throw new Error('Signed credential not found in the response');
+ }
+ })
+ .catch((error) => {
+ throw error;
+ });
+ })
+ .catch((error) => {
+ throw new Error(`Error signing JWT: ${error.message}`);
+ });
+}
+// :snippet-end:
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/creatingOfferings.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/creatingOfferings.test.js
new file mode 100644
index 0000000..9e70ca4
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/creatingOfferings.test.js
@@ -0,0 +1,149 @@
+import { test, expect, describe, beforeAll } from 'vitest';
+import { PresentationExchange } from '@web5/credentials';
+import { Offering } from '@tbdex/http-client';
+import { DidDht } from '@web5/dids';
+
+
+describe("PFI: Offerings", () => {
+
+ let pfiDid;
+ let pd;
+
+ beforeAll(async () => {
+ pfiDid = await DidDht.create();
+ // :snippet-start: kccPresentationDefintionJs
+ pd = {
+ id: "presentation-definition-kcc",
+ name: "KYC Verification",
+ purpose: "We need to verify your customer status and necessary checks.",
+ format: {
+ jwt_vc: {
+ alg: ["ES256K", "EdDSA"]
+ }
+ },
+ input_descriptors: [
+ {
+ id: "known-customer-credential",
+ name: "Known Customer Credential",
+ purpose: "Please present your Known Customer Credential for verification.",
+ constraints: {
+ fields: [
+ {
+ path: ["$.type[*]"],
+ filter: {
+ type: "string",
+ pattern: "KnownCustomerCredential"
+ }
+ },
+ {
+ path: ["$.evidence[*].kind"],
+ filter: {
+ type: "string",
+ pattern: "sanction_screening"
+ }
+ },
+ {
+ path: ["$.credentialSubject.countryOfResidence"],
+ filter: {
+ type: "string",
+ const: "US"
+ }
+ },
+ {
+ path: ["$.issuer"],
+ filter: {
+ type: "string",
+ const: "did:dht:d4sgiggd3dwimo4ubki7spo45q5dazxphrizbxhcgapapcnzpouy"
+ }
+ }
+ ]
+ }
+ }
+ ]
+ };
+ // :snippet-end:
+ })
+
+ test("Create Offering", async () => {
+ try{
+ // :snippet-start: pfiCreateOfferingJs
+ const offering = Offering.create({
+ metadata: {
+ from: pfiDid.uri,
+ protocol: "1.0"
+ },
+ data: {
+ description: "Selling BTC for USD",
+ payin: {
+ currencyCode: "USD",
+ methods: [{
+ kind: "DEBIT_CARD",
+ requiredPaymentDetails: {
+ "$schema": "http://json-schema.org/draft-07/schema",
+ "type": "object",
+ "properties": {
+ "cardNumber": {
+ "type": "string",
+ "description": "The 16-digit debit card number",
+ "minLength": 16,
+ "maxLength": 16
+ },
+ "expiryDate": {
+ "type": "string",
+ "description": "The expiry date of the card in MM/YY format",
+ "pattern": "^(0[1-9]|1[0-2])\\/([0-9]{2})$"
+ },
+ "cardHolderName": {
+ "type": "string",
+ "description": "Name of the cardholder as it appears on the card"
+ },
+ "cvv": {
+ "type": "string",
+ "description": "The 3-digit CVV code",
+ "minLength": 3,
+ "maxLength": 3
+ }
+ }
+ }
+ }]
+ },
+ payout: {
+ currencyCode: 'BTC',
+ methods: [
+ {
+ kind: 'BTC_ADDRESS',
+ estimatedSettlementTime: 60,
+ fee: '0.25',
+ }
+ ]
+ },
+ payoutUnitsPerPayinUnit: '0.00003826',
+ requiredClaims: pd
+ }
+ });
+ // :snippet-end:
+
+ // :snippet-start: pfiSignOfferingJs
+ await offering.sign(pfiDid);
+ // :snippet-end:
+
+ // :snippet-start: pfiValidateOfferingJs
+ offering.validate();
+ // :snippet-end:
+ } catch(e) {
+ expect.fail(e.message)
+ }
+ })
+
+ test("Validate KCC PD", async () => {
+ try {
+ // :snippet-start: kccValidatePdJs
+ PresentationExchange.validateDefinition({
+ presentationDefinition: pd
+ });
+ // :snippet-end:
+ } catch (e) {
+ expect.fail(e.message)
+ }
+ })
+})
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/creatingQuotes.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/creatingQuotes.test.js
new file mode 100644
index 0000000..65897da
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/creatingQuotes.test.js
@@ -0,0 +1,126 @@
+import { Rfq, Quote, Parser } from '@tbdex/http-server';
+import { DevTools } from '@tbdex/http-client';
+import { DidDht } from '@web5/dids';
+import { OfferingsApiProvider } from './offeringsApiProvider'
+import { ExchangesApiProvider } from './exchangesApiProvider'
+import { MockDataProvider } from '../../utils/mockDataProvider'
+import { vi, test, expect, describe, beforeAll } from 'vitest';
+
+let pfiDid;
+let senderDid;
+let message;
+let dataProvider = new MockDataProvider();
+let offeringsApiProvider;
+let exchangesApiProvider;
+let mockOffering;
+
+describe('PFI: Quotes', () => {
+ beforeAll(async () => {
+ // Set up providers and DID
+ pfiDid = await DidDht.create({
+ options:{
+ publish: true,
+ services: [{
+ id: 'pfi',
+ type: 'PFI',
+ serviceEndpoint: 'https://example.com/'
+ }]
+ }
+ });
+
+ senderDid = await DidDht.create({
+ options: { publish: true }
+ })
+
+ offeringsApiProvider = new OfferingsApiProvider(pfiDid);
+ exchangesApiProvider = new ExchangesApiProvider();
+
+ // Configure Mocks
+
+ message = await DevTools.createRfq({
+ sender: senderDid,
+ receiver: pfiDid
+ });
+ await message.sign(senderDid);
+
+ mockOffering = DevTools.createOffering({
+ from: pfiDid.uri,
+ offeringData: DevTools.createOfferingData()
+ })
+ await mockOffering.sign(pfiDid);
+
+
+ message.offeringId = mockOffering.id;
+ offeringsApiProvider.setOffering(mockOffering);
+
+
+ dataProvider.setupInsert("exchange", "", () => { return });
+ });
+
+ test('PFI creates offering', async () => {
+ // :snippet-start: pfiWriteOfferingJs
+ // Write the message to your exchanges database
+ await dataProvider.insert('exchange', {
+ exchangeid: message.exchangeId,
+ messagekind: message.kind,
+ messageid: message.id,
+ subject: message.subject,
+ message: await Parser.parseMessage(message)
+ });
+
+ //highlight-start
+ const offering = await offeringsApiProvider.getOffering(message.offeringId);
+ //highlight-end
+ // :snippet-end:
+ })
+
+ test('PFI creates and signs quote', async () => {
+ const offering = mockOffering
+
+ // :snippet-start: pfiCreateQuoteJs
+ // Set the Quote's expiration date for 1 day from now
+ var quoteExpiration = new Date();
+ quoteExpiration.setDate(quoteExpiration.getDate() + 1);
+
+ const quote = Quote.create({
+ metadata: {
+ from: pfiDid.uri,
+ to: message.from,
+ exchangeId: message.exchangeId,
+ protocol: '1.0'
+ },
+ data: {
+ expiresAt: quoteExpiration.toLocaleDateString('en-us'),
+ payin: {
+ currencyCode: offering.data.payin.currencyCode,
+ amount: '0.01',
+ fee: '0.0001',
+ paymentInstruction : {
+ link: 'https://example.com/paymentInstructions',
+ instruction: 'Detailed payment instructions'
+ }
+ },
+ payout: {
+ currencyCode: offering.data.payout.currencyCode,
+ amount: '1000.00',
+ paymentInstruction : {
+ link: 'https://example.com/paymentInstructions',
+ instruction: 'Detailed payout instructions'
+ }
+ }
+ }
+ });
+ // :snippet-end:
+
+ exchangesApiProvider.setWrite();
+
+ // :snippet-start: pfiSignQuoteJs
+ await quote.sign(pfiDid);
+ dataProvider.insert(quote);
+ // :snippet-end:
+
+ const signature = await quote.verifySignature();
+ expect(signature).toBeDefined();
+ })
+
+})
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/exchangesApiProvider.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/exchangesApiProvider.js
new file mode 100644
index 0000000..b625651
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/exchangesApiProvider.js
@@ -0,0 +1,24 @@
+import { MockExchangesApiProvider } from '../../utils/mockExchangesApiProvider'
+
+export class ExchangesApiProvider extends MockExchangesApiProvider {
+
+ // :snippet-start: pfiOverviewWriteJs
+ async write(message, replyTo) {
+ await this.dataProvider.insert('exchange', {
+ exchangeid: message.exchangeId,
+ messagekind: message.kind,
+ messageid: message.id,
+ subject: message.subject,
+ message: JSON.stringify(message)
+ });
+
+ if (replyTo != null) {
+ await this.dataProvider.insert('callbacks', {
+ exchangeId: message.exchangeId,
+ uri: replyTo
+ });
+ }
+ }
+ // :snippet-end:
+
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/offeringsApiProvider.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/offeringsApiProvider.js
new file mode 100644
index 0000000..6816349
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/offeringsApiProvider.js
@@ -0,0 +1,43 @@
+import { MockOfferingsApiProvider } from '../../utils/mockOfferingsApiProvider'
+import { Parser } from '@tbdex/http-server'
+
+export class OfferingsApiProvider extends MockOfferingsApiProvider {
+
+ constructor(pfiDid) {
+ super();
+ this.pfiDid = pfiDid;
+ }
+
+ // :snippet-start: pfiOverviewReadOfferingsJs
+ async getOffering(id) {
+ return this.dataProvider.get('offering', id).then(async (result) => {
+ if(result){
+ return await Parser.parseResource(result);
+ }
+ });
+ }
+
+
+ async getOfferings() {
+ return this.dataProvider.query('offering', "*").then((results) => {
+ const offerings = [];
+
+ for (let result of results) {
+ const offering = Parser.rawToResourceModel(result);
+ offerings.push(offering);
+ }
+
+ return offerings;
+ });
+ }
+
+ async setOffering(offering) {
+ await this.dataProvider.insert('offering', {
+ offeringid: offering.metadata.id,
+ payoutcurrency: offering.data.payout.currencyCode,
+ payincurrency: offering.data.payin.currencyCode,
+ offering: Parser.rawToResourceModel(offering)
+ });
+ }
+ // :snippet-end:
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/pfiOnboarding.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/pfiOnboarding.test.js
new file mode 100644
index 0000000..ca72066
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/pfiOnboarding.test.js
@@ -0,0 +1,26 @@
+// :snippet-start: pfiOnboardingImportsJs
+import { DidDht } from '@web5/dids';
+// :snippet-end:
+import { LocalKeyManager } from '@web5/crypto';
+import { test, expect, describe } from 'vitest';
+
+describe('PFI: Onboarding', () => {
+ test('Create DID for a PFI', async () => {
+ const keyManager = new LocalKeyManager();
+ // :snippet-start: pfiOnboardingCreateDidJs
+ const pfiDid = await DidDht.create({
+ options:{
+ publish: true,
+ services: [{
+ id: 'pfi',
+ type: 'PFI',
+ serviceEndpoint: 'https://example.com/'
+ }]
+ },
+ keyManager
+ })
+
+ // :snippet-end:
+ expect(pfiDid.document).toHaveProperty('service');
+ });
+ });
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/pfiStructure.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/pfiStructure.test.js
new file mode 100644
index 0000000..22f954a
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/pfiStructure.test.js
@@ -0,0 +1,240 @@
+import { TbdexHttpServer } from '@tbdex/http-server';
+import { TbdexHttpClient, Offering } from '@tbdex/http-client';
+import { DidDht } from '@web5/dids';
+import { OfferingsApiProvider } from './offeringsApiProvider'
+import { ExchangesApiProvider } from './exchangesApiProvider'
+import { test, expect, describe, beforeAll, assert } from 'vitest';
+import http from 'http';
+
+let pfiDid;
+let exchangesApiProvider;
+let offeringsApiProvider;
+let tbDexServer;
+let customerDid;
+
+describe('PFI: Structure', () => {
+ beforeAll(async () => {
+
+ //:snippet-start:pfiOverviewCreateDid
+ pfiDid = await DidDht.create({
+ options:{
+ services: [{
+ id: 'pfi',
+ type: 'PFI',
+ serviceEndpoint: 'https://example.com'
+ }]
+ }
+ });
+ //:snippet-end:
+
+ customerDid = await DidDht.create();
+ });
+
+ test('PFI initializes server', async () => {
+ try {
+ // :snippet-start: pfiOverviewConfigJs
+ exchangesApiProvider = new ExchangesApiProvider();
+ offeringsApiProvider = new OfferingsApiProvider(pfiDid);
+
+ tbDexServer = new TbdexHttpServer({
+ exchangesApi: exchangesApiProvider,
+ offeringsApi: offeringsApiProvider,
+ pfiDid: pfiDid.uri
+ })
+ // :snippet-end:
+
+ expect(tbDexServer).toBeDefined()
+ expect.soft(tbDexServer.exchangesApi).toBe(exchangesApiProvider)
+ expect.soft(tbDexServer.offeringsApi).toBe(offeringsApiProvider)
+ expect.soft(tbDexServer.pfiDid).toBe(pfiDid.uri)
+ } catch(e) {
+ assert.fail(`Failed to initialize server: ${e.message}`);
+ }
+ });
+
+ test('PFI initializes routes', async () => {
+ try {
+ // :snippet-start: pfiOverviewServerRoutesJs
+ tbDexServer.onCreateExchange(async (ctx, rfq, opts) => {
+ await exchangesApiProvider.write({ message: rfq, replyTo: opts.replyTo })
+ })
+
+ tbDexServer.onSubmitOrder(async (ctx, order, opts) => {
+ await exchangesApiProvider.write({ message: order, replyTo: opts.replyTo })
+ })
+
+ tbDexServer.onSubmitClose(async (ctx, close, opts) => {
+ await exchangesApiProvider.write({ message: close, replyTo: opts.replyTo })
+ })
+ // :snippet-end:
+
+ expect.soft(Object.keys(tbDexServer.callbacks).length).toBe(3)
+ expect.soft(tbDexServer.callbacks.createExchange).toBeDefined()
+ expect.soft(tbDexServer.callbacks.submitOrder).toBeDefined()
+ expect.soft(tbDexServer.callbacks.submitClose).toBeDefined()
+ } catch(e) {
+ assert.fail(`Failed to set up submit routes: ${e.message}`);
+ }
+ });
+
+ test('PFI starts server', async () => {
+ try {
+ // :snippet-start: pfiOverviewServerStartJs
+ const server = tbDexServer.listen(8080, () => {})
+ // :snippet-end:
+
+ // Wait for the server to start listening
+ await new Promise((resolve, reject) => {
+ server.on('listening', () => {
+ resolve();
+ });
+
+ server.on('error', (error) => {
+ assert.fail(`Failed to start server: ${error}`)
+ });
+ });
+
+ const requestToken = await TbdexHttpClient.generateRequestToken({
+ requesterDid: customerDid, pfiDid: pfiDid
+ });
+
+ const options = {
+ hostname: 'localhost',
+ port: 8080,
+ path: '/offerings',
+ method: 'GET',
+ headers: {
+ 'Authorization': `Bearer: ${requestToken}`
+ }
+ };
+ // :snippet-start: pfiCreateQuickstartOfferingJs
+ const offering = Offering.create({
+ metadata: {
+ from: pfiDid.uri,
+ protocol: "1.0"
+ },
+ data: {
+ description: "Exchange USD to KES",
+ payin: {
+ currencyCode: "USD",
+ methods: [{
+ kind: "USD_LEDGER",
+ requiredPaymentDetails: {}
+ }]
+ },
+ payout: {
+ currencyCode: 'KES',
+ methods: [
+ {
+ kind: "MOMO_MPESA",
+ requiredPaymentDetails: {
+ $schema: "http://json-schema.org/draft-07/schema#",
+ title: "Mobile Money Required Payment Details",
+ type: "object",
+ required: [
+ "phoneNumber",
+ "reason"
+ ],
+ additionalProperties: false,
+ properties: {
+ phoneNumber: {
+ title: "Mobile money phone number",
+ description: "Phone number",
+ type: "string"
+ },
+ reason: {
+ title: "Reason for sending",
+ description: "Required for legal reasons",
+ type: "string"
+ }
+ }
+ },
+ estimatedSettlementTime: 10
+ },
+ {
+ kind: "BANK_FIRSTBANK",
+ requiredPaymentDetails: {
+ $schema: "http://json-schema.org/draft-07/schema#",
+ title: "Bank Transfer Required Payment Details",
+ type: "object",
+ required: [
+ "accountNumber",
+ "reason"
+ ],
+ additionalProperties: false,
+ properties: {
+ accountNumber: {
+ title: "Bank account number",
+ description: "Recepient bank account",
+ type: "string"
+ },
+ reason: {
+ title: "Reason for sending",
+ description: "Required for legal reasons",
+ type: "string"
+ }
+ }
+ },
+ estimatedSettlementTime: 10
+ }
+ ]
+ },
+ payoutUnitsPerPayinUnit: '0.0069',
+ requiredClaims: {
+ "id": "7ce4004c-3c38-4853-968b-e411bafcd945",
+ "input_descriptors": [
+ {
+ "id": "bbdb9b7c-5754-4f46-b63b-590bada959e0",
+ "constraints": {
+ "fields": [
+ {
+ "path": [
+ "$.type[*]"
+ ],
+ "filter": {
+ "type": "string",
+ "pattern": "^SanctionCredential$"
+ }
+ },
+ {
+ "path": [
+ "$.issuer"
+ ],
+ "filter": {
+ "type": "string",
+ "const": "did:dht:bawc7n1sc4k89d8fyyayhjuk7dqmbtzt4pu58f8eam9fwq9qqp9y"
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ },
+ });
+ // :snippet-end:
+
+ await offering.sign(pfiDid);
+
+ offeringsApiProvider.setOfferings([offering]);
+
+ await new Promise((resolve, reject) => {
+ // Send the HTTP request
+ const req = http.request(options, (res) => {
+ expect(res.statusCode).toBe(200);
+ resolve();
+ });
+
+ // Handle request errors
+ req.on('error', (error) => {
+ assert.fail(`Failed to start server: ${error}`);
+ });
+
+ // End the request
+ req.end();
+ });
+ } catch(e) {
+ assert.fail(`Failed to start server: ${e.message}`);
+ }
+ });
+});
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/processingOrders.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/processingOrders.test.js
new file mode 100644
index 0000000..26095f6
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/processingOrders.test.js
@@ -0,0 +1,105 @@
+import { Order, OrderStatus, Close } from '@tbdex/http-server';
+import { DevTools } from '@tbdex/http-client';
+import { DidDht } from '@web5/dids';
+import { MockDataProvider } from '../../utils/mockDataProvider';
+import { test, expect, describe, beforeAll, assert } from 'vitest';
+
+let pfiDid;
+let senderDid;
+let dataProvider;
+let orderMessage;
+
+describe('PFI: Orders', () => {
+ beforeAll(async () => {
+ // Set up providers and DID
+ pfiDid = await DidDht.create({
+ options:{
+ publish: true,
+ services: [{
+ id: 'pfi',
+ type: 'PFI',
+ serviceEndpoint: 'https://example.com/'
+ }]
+ }
+ });
+
+ senderDid = await DidDht.create({
+ options: { publish: true }
+ });
+
+ dataProvider = new MockDataProvider();
+ orderMessage = Order.create({
+ metadata: {
+ from: senderDid.uri,
+ to: pfiDid.uri,
+ exchangeId: "MyExchange"
+ }
+ });
+ });
+
+ test('PFI Accesses Private Data', async () => {
+ const rfq = await DevTools.createRfq({
+ sender: senderDid,
+ receiver: pfiDid
+ });
+
+ // :snippet-start: pfiAccessPrivateDataJs
+ const creditCardNumber = rfq.privateData.payin.paymentDetails.cardNumber
+ // :snippet-end:
+
+ expect(creditCardNumber).toBeDefined();
+ });
+
+ test('PFI Creates OrderStatus', async () => {
+ // :snippet-start: pfiOrderStatusJs
+ const orderStatus = OrderStatus.create({
+ metadata: {
+ from: pfiDid.uri,
+ to: orderMessage.metadata.from,
+ exchangeId: orderMessage.metadata.exchangeId
+ },
+ data: { orderStatus: 'PROCESSING' }
+ })
+
+ await orderStatus.sign(pfiDid)
+ dataProvider.insert(orderStatus)
+ // :snippet-end:
+
+ expect.soft(orderStatus.data.orderStatus).toBe('PROCESSING');
+
+ try {
+ await orderStatus.verifySignature();
+ await orderStatus.verify();
+ } catch(e) {
+ assert.fail(`Failed to verify offering requirements: : ${e.message}`);
+ }
+ });
+
+ test('PFI Creates Close', async () => {
+ // :snippet-start: pfiCloseOrderJs
+ const closeMessage = Close.create({
+ metadata: {
+ from: pfiDid.uri,
+ to: orderMessage.metadata.from,
+ exchangeId: orderMessage.metadata.exchangeId
+ },
+ data: {
+ reason: 'COMPLETED',
+ success: true // Indicates the transaction was successful
+ }
+ })
+
+ await closeMessage.sign(pfiDid)
+ dataProvider.insert(closeMessage)
+ // :snippet-end:
+
+ expect.soft(closeMessage.data.reason).toBe('COMPLETED');
+
+ try {
+ await closeMessage.verifySignature();
+ await closeMessage.verify();
+ } catch(e) {
+ assert.fail(`Failed to verify offering requirements: ${e.message}`);
+ }
+ });
+});
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/required-sdks.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/required-sdks.js
new file mode 100644
index 0000000..635c74f
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/required-sdks.js
@@ -0,0 +1,12 @@
+// :snippet-start: pfiSdkImportJs
+import {
+ TbdexHttpServer,
+ Offering,
+ Rfq,
+ Quote,
+ Order,
+ OrderStatus,
+ Close,
+ Parser
+} from '@tbdex/http-server'
+// :snippet-end:
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/required.sdks.bash b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/required.sdks.bash
new file mode 100644
index 0000000..1e63b52
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/pfi/required.sdks.bash
@@ -0,0 +1,5 @@
+# :snippet-start: pfiSdkInstallJs
+npm i @web5/dids
+npm i @web5/credentials
+npm i @tbdex/http-server
+# :snippet-end:
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/allowListPfi.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/allowListPfi.test.js
new file mode 100644
index 0000000..8112236
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/allowListPfi.test.js
@@ -0,0 +1,32 @@
+import { test, expect, describe, beforeAll } from 'vitest';
+import { DidDht } from '@web5/dids';
+// :prepend-start: isPFIJs
+import { resolveDid } from '@tbdex/protocol'
+// :prepend-end:
+
+let pfiDid;
+
+describe('Wallet: Allowlist PFIs', () => {
+ beforeAll(async () => {
+ const bearerDid = await DidDht.create({
+ options:{
+ publish: true,
+ services: [{
+ id: 'pfi',
+ type: 'PFI',
+ serviceEndpoint: 'https://example.com/'
+ }]
+ }
+ })
+ pfiDid = bearerDid.uri;
+ });
+
+ test('PFI DID has PFI service', async () => {
+ // :snippet-start: isPFIJs
+ const didDocument = await resolveDid(pfiDid);
+ const isPFI = didDocument.service.some(service => service.type === 'PFI');
+ // :snippet-end:
+ expect(isPFI).toBe(true)
+ });
+
+});
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/getOfferings.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/getOfferings.test.js
new file mode 100644
index 0000000..40db0d5
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/getOfferings.test.js
@@ -0,0 +1,95 @@
+import { vi, test, expect, describe, beforeAll, afterAll } from 'vitest';
+import { TbdexHttpClient, DevTools } from '@tbdex/http-client';
+import { DidDht } from '@web5/dids';
+import { setupServer } from 'msw/node'
+import { HttpResponse, http } from 'msw'
+
+let pfi;
+let pfiDid; //The URI of the PFI's DID
+let server;
+let mockOffering;
+
+describe('Wallet: Get Offerings from PFI', () => {
+
+ beforeAll(async () => {
+ pfi = await DidDht.create({
+ options:{
+ publish: true,
+ services: [{
+ id: 'pfi',
+ type: 'PFI',
+ serviceEndpoint: 'https://localhost:9000'
+ }]
+ }
+ })
+ pfiDid = pfi.uri;
+
+ // Mock the response from the PFI
+ const defaultOfferingData = DevTools.createOfferingData()
+ mockOffering = DevTools.createOffering({
+ from: pfiDid,
+ offeringData: {
+ ...defaultOfferingData,
+ payin: {
+ ...defaultOfferingData.payin,
+ currencyCode: 'USD'
+ },
+ payout: {
+ ...defaultOfferingData.payout,
+ currencyCode: 'KES'
+ }
+ }
+ });
+ await mockOffering.sign(pfi)
+
+ server = setupServer(
+ http.get('https://localhost:9000/offerings', () => {
+ return HttpResponse.json({ data: [mockOffering] }, {
+ status: 200
+ })
+ }),
+ )
+ server.listen({onUnhandledRequest: 'bypass'})
+ });
+
+ afterAll(() => {
+ server.resetHandlers()
+ server.close()
+ });
+
+ test('get all offerings', async () => {
+ // :snippet-start: walletGetOfferingsJS
+ const offerings = await TbdexHttpClient.getOfferings({ pfiDid: pfiDid });
+ // :snippet-end:
+ expect(offerings).toEqual([mockOffering]);
+ });
+
+ test('find matching offerings', async () => {
+ const pfiDids = [pfiDid];
+
+ // :snippet-start: walletFindMatchingOfferingsJS
+ const payinCurrencyCode = 'USD'; // Desired payin currency code
+ const payoutCurrencyCode = 'KES'; // Desired payout currency code
+
+ const matchedOfferings = []; // Array to store the matched offerings
+
+ // Loop through the all PFIs in your network
+ for (const pfiDid of pfiDids) {
+
+ //Makes a request to the PFI to get their offerings
+ const offerings = await TbdexHttpClient.getOfferings({ pfiDid: pfiDid });
+
+ // Filter offerings based on the currency pair
+ if(offerings){
+ const filteredOfferings = offerings.filter(offering =>
+ offering.data.payin.currencyCode === payinCurrencyCode &&
+ offering.data.payout.currencyCode === payoutCurrencyCode
+ );
+ matchedOfferings.push(...filteredOfferings);
+ }
+ }
+ // :snippet-end:
+
+ expect(matchedOfferings).toEqual([mockOffering]);
+ });
+});
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/manageCredentials.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/manageCredentials.test.js
new file mode 100644
index 0000000..d9f2981
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/manageCredentials.test.js
@@ -0,0 +1,187 @@
+import { test, expect, describe, beforeAll, afterAll } from 'vitest';
+import { TbdexHttpClient, DevTools } from '@tbdex/http-client';
+import { DidDht } from '@web5/dids';
+import { setupServer } from 'msw/node';
+import { HttpResponse, http } from 'msw';
+import { PresentationExchange } from '@web5/credentials';
+
+describe('Wallet: Manage Credentials', () => {
+ let pfi;
+ let pfiDid; // The URI of the PFI's DID
+ let server;
+ let mockOffering;
+
+ let vcJwtResidence =
+ 'eyJraWQiOiJkaWQ6ZGh0OnA5cW5idDRrd3lrenF6Znp5eXN0ZDY5Zjhnb3N0YnAzbmY3dGRyczRyd3FqaW16MWsxY3kjMCIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6ZGh0OnA5cW5idDRrd3lrenF6Znp5eXN0ZDY5Zjhnb3N0YnAzbmY3dGRyczRyd3FqaW16MWsxY3kiLCJzdWIiOiJkaWQ6ZGh0OnV1b3J6ZHRqOXgzYTM1OTNtZjlleXNxaHM0NWRrZXpqdzZqYXBkdWRjMXpicjc4aXNnZXkiLCJpYXQiOjE3MDc3NjM4NDgsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJSZXNpZGVuY2VDcmVkZW50aWFsIl0sImlkIjoidXJuOnV1aWQ6ODc5N2VkZDgtNzE2Mi00YTliLWEyMjgtNGRkZTA4NjFlNzZmIiwiaXNzdWVyIjoiZGlkOmRodDpwOXFuYnQ0a3d5a3pxemZ6eXlzdGQ2OWY4Z29zdGJwM25mN3RkcnM0cndxamltejFrMWN5IiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMi0xMlQxODo1MDo0OFoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6dXVvcnpkdGo5eDNhMzU5M21mOWV5c3FoczQ1ZGtlemp3NmphcGR1ZGMxemJyNzhpc2dleSIsImFkZHJlc3MiOiIxMCBPcmNoYXJkIHN0In19fQ.Uvq5jHJbhe7mcPXAMNtfBoD7yez6GXP0GYNuyiZI0_pyfK_mKPjrbkJPXd3LbOtYvB06XxY6tGLMTo7tiMRFDQ';
+ let vcJwtSanctions =
+ 'eyJraWQiOiJkaWQ6ZGh0Onc4bThxNXFja21vZXRzaWlrajR3ZXFhYWRjeGtjNjFkNjh6cnk3aHBpZmdveXE4dG1zb28jMCIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6ZGh0Onc4bThxNXFja21vZXRzaWlrajR3ZXFhYWRjeGtjNjFkNjh6cnk3aHBpZmdveXE4dG1zb28iLCJzdWIiOiJkaWQ6ZGh0OmtkMzVlNmN4M3pueXp1ajR3ejF1ZmRjeGs4ODlzYXVrYXRhYWc3YmNrM2NwY2I3cGM4NW8iLCJpYXQiOjE3MDc0OTEzODcsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTYW5jdGlvbnNDcmVkZW50aWFsIl0sImlkIjoidXJuOnV1aWQ6MGU4YWJhMWYtMmMwZS00MDhlLWIxOWMtZjY0NzZiYTU3NDVhIiwiaXNzdWVyIjoiZGlkOmRodDp3OG04cTVxY2ttb2V0c2lpa2o0d2VxYWFkY3hrYzYxZDY4enJ5N2hwaWZnb3lxOHRtc29vIiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMi0wOVQxNTowOTo0N1oiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6a2QzNWU2Y3gzem55enVqNHd6MXVmZGN4azg4OXNhdWthdGFhZzdiY2szY3BjYjdwYzg1byIsInN0YXR1cyI6ImFwcHJvdmVkIn19fQ.Wc-qV2L3Z5WJYvUYirznpDsyk1Ntcw0kt_bhuXZDqNVXAn-d9Wta67eta-yu7V1C1T74yv6pQaqjgf2rDLxCAg';
+
+ const customPresentationDefinition = {
+ id: 'custom-pd-id',
+ input_descriptors: [
+ {
+ id: 'sanctionsVerification',
+ purpose: 'Confirm the individual is not sanctioned',
+ constraints: {
+ fields: [
+ {
+ path: [
+ '$.vc.credentialSubject.status',
+ '$.credentialSubject.status',
+ ],
+ filter: {
+ type: 'string',
+ const: 'approved',
+ },
+ },
+ ],
+ },
+ },
+ {
+ id: 'residenceVerification',
+ purpose: "Confirm the individual's residence address",
+ constraints: {
+ fields: [
+ {
+ path: [
+ '$.vc.credentialSubject.address',
+ '$.credentialSubject.address',
+ ],
+ filter: {
+ type: 'string',
+ const: '10 Orchard st',
+ },
+ },
+ ],
+ },
+ },
+ ],
+ };
+
+ beforeAll(async () => {
+ // Create a PFI DID
+ pfi = await DidDht.create({
+ options:{
+ publish: true,
+ services: [
+ {
+ id: 'pfi',
+ type: 'PFI',
+ serviceEndpoint: 'http://localhost:9000',
+ },
+ ]
+ }
+ });
+ pfiDid = pfi.uri;
+
+ // Mock an offering using customPresentationDefinition
+ const defaultOfferingData = DevTools.createOfferingData();
+ mockOffering = DevTools.createOffering({
+ from: pfiDid,
+ offeringData: {
+ ...defaultOfferingData,
+ payinCurrency: {
+ ...defaultOfferingData.payinCurrency,
+ currencyCode: 'USD',
+ },
+ payoutCurrency: {
+ ...defaultOfferingData.payoutCurrency,
+ currencyCode: 'KES',
+ },
+ requiredClaims: customPresentationDefinition,
+ },
+ });
+ await mockOffering.sign(pfi);
+
+ server = setupServer(
+ http.get('http://localhost:9000/offerings', () => {
+ return HttpResponse.json(
+ { data: [mockOffering] },
+ { status: 200 },
+ );
+ }),
+ );
+ server.listen({ onUnhandledRequest: 'bypass' });
+ });
+
+ afterAll(() => {
+ server.resetHandlers();
+ server.close();
+ });
+
+ test('requiredClaims from offering data are correctly assigned to presentationDefinition', async () => {
+ const offerings = await TbdexHttpClient.getOfferings({ pfiDid: pfiDid });
+ const offering = offerings[0];
+
+ // :snippet-start: retrievePresentationDefinitionFromOfferingsRequiredClaimsJS
+ const presentationDefinition = offering.data.requiredClaims;
+ // :snippet-end:
+
+ expect(presentationDefinition).toBeDefined();
+ expect(presentationDefinition).toHaveProperty(
+ 'id',
+ customPresentationDefinition.id,
+ );
+ expect(presentationDefinition).toHaveProperty('input_descriptors');
+ expect(Array.isArray(presentationDefinition.input_descriptors)).toBe(true);
+ });
+
+ test('find matching offerings with credential validation', async () => {
+ const pfiDids = [pfiDid];
+
+ // :snippet-start: findMatchingOfferingsWithCredentialValidationJS
+ const payinCurrencyCode = 'USD'; // Desired payin currency code
+ const payoutCurrencyCode = 'KES'; // Desired payout currency code
+
+ // Customer's signed credentials in JWT format
+ const credentials = [vcJwtResidence, vcJwtSanctions];
+
+ const matchedOfferings = []; // Array to store the matched offerings
+
+ for (const pfiDid of pfiDids) {
+ const offerings = await TbdexHttpClient.getOfferings({ pfiDid: pfiDid });
+
+ for (const offering of offerings) {
+ // Filter offerings based on the desired currency pair
+ if (
+ offering.data.payinCurrency.currencyCode === payinCurrencyCode &&
+ offering.data.payoutCurrency.currencyCode === payoutCurrencyCode
+ ) {
+ // Extract the presentation definition from the offering
+ const presentationDefinition = offering.data.requiredClaims;
+
+ try {
+ // Validate customer's VCs against the offering's presentation definition
+ //highlight-start
+ PresentationExchange.satisfiesPresentationDefinition({
+ vcJwts: credentials,
+ presentationDefinition: presentationDefinition,
+ });
+ //highlight-end
+
+ // Add offerings that match the customer's needs and qualifications
+ matchedOfferings.push(offering);
+ } catch (e) {
+ // Offerings where the customer's VCs do not meet the requirements are skipped
+ }
+ }
+ }
+ }
+ // :snippet-end:
+ expect(matchedOfferings.length).toBeGreaterThan(0);
+ });
+
+ test('selects credentials based on presentation definition', () => {
+ const credentials = [vcJwtResidence, vcJwtSanctions];
+ // :snippet-start: getSelectedCredentialsJS
+ // Select the credentials to be used for the exchange
+ const selectedCredentials = PresentationExchange.selectCredentials({
+ vcJwts: credentials,
+ presentationDefinition: customPresentationDefinition,
+ });
+ // :snippet-end:
+
+ expect(selectedCredentials).toBeDefined();
+ expect.soft(selectedCredentials.length).toBe(2);
+ });
+});
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/placeOrder.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/placeOrder.test.js
new file mode 100644
index 0000000..e0e06b9
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/placeOrder.test.js
@@ -0,0 +1,160 @@
+import { test, expect, describe, beforeAll, afterAll } from 'vitest';
+import { TbdexHttpClient, DevTools, Quote, Order, OrderStatus, Close, Message } from '@tbdex/http-client';
+import { DidDht } from '@web5/dids';
+import { setupServer } from 'msw/node'
+import { http, HttpResponse } from 'msw'
+
+let pfiDid;
+let customerDid;
+let server;
+let order;
+let orderStatusMsg = 'Processing';
+let closeReason = 'Transaction complete';
+
+describe('Wallet: Place Order', () => {
+
+ beforeAll(async () => {
+ customerDid = await DidDht.create({
+ options: { publish: true }
+ })
+
+ pfiDid = await DidDht.create({
+ options:{
+ services : [{
+ type : 'PFI',
+ id : 'pfi',
+ serviceEndpoint : 'https://localhost:9000'
+ }]
+ }
+ })
+
+ order = Order.create({
+ metadata: {
+ from : customerDid.uri,
+ to : pfiDid.uri,
+ exchangeId : Message.generateId('rfq'),
+ protocol : "1.0"
+ }
+ })
+ await order.sign(customerDid);
+
+ const orderStatus = OrderStatus.create({
+ metadata: {
+ from: pfiDid.uri,
+ to: customerDid.uri,
+ exchangeId: order.exchangeId,
+ protocol : "1.0"
+ },
+ data: {
+ orderStatus: orderStatusMsg
+ }
+ });
+ await orderStatus.sign(pfiDid);
+
+ const close = Close.create({
+ metadata: {
+ from: pfiDid.uri,
+ to: customerDid.uri,
+ exchangeId: order.exchangeId,
+ protocol : "1.0"
+ },
+ data: {
+ reason: closeReason,
+ success: true
+ }
+ });
+ await close.sign(pfiDid);
+
+ // Mock responses from the PFI
+ server = setupServer(
+ http.put(new RegExp('https://localhost:9000/exchanges/(.+)'), () => {
+ return HttpResponse.json({ status: 202 })
+ }),
+ http.post(new RegExp('https://localhost:9000/exchanges/(.+)'), () => {
+ return HttpResponse.json({ status: 202 })
+ }),
+ http.get(new RegExp('https://localhost:9000/exchanges/(.+)'), () => {
+ return HttpResponse.json(
+ {data: [orderStatus, close]},
+ { status: 202 },
+ )
+ }),
+ )
+ server.listen({onUnhandledRequest: 'bypass'})
+ });
+
+ afterAll(() => {
+ server.resetHandlers()
+ server.close()
+ });
+
+ test('send Order message', async () => {
+ const quote = Quote.create({
+ metadata: {
+ exchangeId : Message.generateId('rfq'),
+ from: pfiDid.uri,
+ to: customerDid.uri,
+ protocol: "1.0"
+ },
+ data: DevTools.createQuoteData()
+ })
+
+ // :snippet-start: createOrderJS
+ const order = Order.create({
+ metadata: {
+ from: customerDid.uri, // Customer's DID
+ to: quote.metadata.from, // PFI's DID
+ exchangeId: quote.exchangeId, // Exchange ID from the Quote
+ protocol: "1.0" // Version of tbDEX protocol you're using
+ }
+ });
+ // :snippet-end:
+
+ // :snippet-start: signOrderJS
+ await order.sign(customerDid);
+ // :snippet-end:
+
+ try{
+ // :snippet-start: sendOrderJS
+ await TbdexHttpClient.submitOrder(order);
+ // :snippet-end:
+ }catch(e){
+ expect.fail(e.message);
+ }
+ });
+
+ test('listen for Order Status updates', async () => {
+ // :snippet-start: listenForOrderStatusJS
+ let orderStatusUpdate;
+ let close;
+
+ while (!close) {
+ const exchange = await TbdexHttpClient.getExchange({
+ pfiDid: order.metadata.to,
+ did: customerDid,
+ exchangeId: order.exchangeId
+ });
+
+ for (const message of exchange) {
+ if (message instanceof OrderStatus) {
+ // a status update to display to your customer
+ orderStatusUpdate = message.data.orderStatus;
+ }
+ else if (message instanceof Close){
+ // final message of exchange has been written
+ close = message;
+ break;
+ }
+ }
+ }
+ // :snippet-end:
+ expect.soft(orderStatusUpdate).toBe(orderStatusMsg);
+
+ // :snippet-start: getCloseReasonJS
+ const isSuccessful = close.data.success;
+ const reasonForClose = close.data.reason;
+ // :snippet-end:
+ expect(reasonForClose).toBe(closeReason);
+ expect(isSuccessful).toBe(true);
+ });
+});
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/receiveQuote.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/receiveQuote.test.js
new file mode 100644
index 0000000..4900b99
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/receiveQuote.test.js
@@ -0,0 +1,124 @@
+import { test, expect, describe, beforeAll, afterAll } from 'vitest';
+import { TbdexHttpClient, DevTools, Quote, Close, Message, Rfq } from '@tbdex/http-client';
+import { DidDht } from '@web5/dids';
+import { setupServer } from 'msw/node'
+import { http, HttpResponse } from 'msw'
+
+let pfiDid;
+let customerDid;
+let rfq;
+let quote;
+let server;
+
+
+describe('Wallet: Receive Quote', () => {
+
+ beforeAll(async () => {
+ customerDid = await DidDht.create({
+ options: { publish: true }
+ })
+
+ pfiDid = await DidDht.create({
+ options:{
+ services : [{
+ type : 'PFI',
+ id : 'pfi',
+ serviceEndpoint : 'https://localhost:9000'
+ }]
+ }
+ })
+
+ rfq = await Rfq.create({
+ metadata: {
+ from: customerDid.uri,
+ to: pfiDid.uri,
+ protocol: '1.0'
+ },
+ data: await DevTools.createRfqData()
+ });
+ await rfq.sign(customerDid);
+
+
+ quote = Quote.create({
+ metadata: {
+ exchangeId : rfq.metadata.exchangeId,
+ from: pfiDid.uri,
+ to: customerDid.uri,
+ protocol: '1.0'
+ },
+ data: DevTools.createQuoteData()
+ })
+ await quote.sign(pfiDid);
+
+ // Mock the response from the PFI
+ server = setupServer(
+ http.get(new RegExp('https://localhost:9000/exchanges/(.+)'), () => {
+ return HttpResponse.json(
+ {data: [quote]},
+ {status: 200})
+ }),
+ http.put(new RegExp('https://localhost:9000/exchanges/(.+)'), () => {
+ return HttpResponse.json(
+ {status: 200})
+ })
+ )
+ server.listen({onUnhandledRequest: 'bypass'})
+ });
+
+ afterAll(() => {
+ server.resetHandlers()
+ server.close()
+ });
+
+ test('poll for quote message', async () => {
+ // :snippet-start: pollforQuoteJS
+ let quote;
+ let close;
+
+ //Wait for Quote message to appear in the exchange
+ while (!quote) {
+ const exchange = await TbdexHttpClient.getExchange({
+ pfiDid: rfq.metadata.to,
+ did: customerDid,
+ exchangeId: rfq.exchangeId
+ });
+
+ quote = exchange.find(msg => msg instanceof Quote);
+
+ if (!quote) {
+ // Make sure the exchange is still open
+ close = exchange.find(msg => msg instanceof Close);
+
+ if(close) { break; }
+ else {
+ // Wait 2 seconds before making another request
+ await new Promise(resolve => setTimeout(resolve, 2000));
+ }
+ }
+ }
+ // :snippet-end:
+
+ expect(quote).toBeDefined()
+ expect.soft(quote.exchangeId).toBe(rfq.exchangeId);
+ expect(close).toBe(undefined);
+ });
+
+ test('cancel exchange', async () => {
+ // :snippet-start: cancelExchangeJS
+ const close = Close.create({
+ metadata: {
+ from: customerDid.uri,
+ to: quote.metadata.from,
+ exchangeId: quote.exchangeId,
+ protocol: '1.0'
+ },
+ data: { reason: 'Canceled by customer'}
+ });
+
+ await close.sign(customerDid);
+ await TbdexHttpClient.submitClose(close);
+ // :snippet-end:
+
+ expect(close.exchangeId).toBe(quote.exchangeId);
+ });
+});
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/required-sdks.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/required-sdks.js
new file mode 100644
index 0000000..ce5cc0b
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/required-sdks.js
@@ -0,0 +1,4 @@
+// :snippet-start: walletSdkImportJs
+import { TbdexHttpClient, Rfq, Quote, Order, OrderStatus, Close, Message } from '@tbdex/http-client';
+import { VerifiableCredential, PresentationExchange } from '@web5/credentials';
+// :snippet-end:
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/required.sdks.bash b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/required.sdks.bash
new file mode 100644
index 0000000..481ff73
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/required.sdks.bash
@@ -0,0 +1,5 @@
+# :snippet-start: walletSdkInstallJs
+npm i @web5/dids
+npm i @web5/credentials
+npm i @tbdex/http-client
+# :snippet-end:
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/sendRfq.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/sendRfq.test.js
new file mode 100644
index 0000000..ba0dddc
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/sendRfq.test.js
@@ -0,0 +1,224 @@
+import { test, expect, describe, beforeAll, afterAll } from 'vitest';
+import { TbdexHttpClient, DevTools, Rfq, Offering } from '@tbdex/http-client';
+import { DidDht } from '@web5/dids';
+import { setupServer } from 'msw/node'
+import { http, HttpResponse } from 'msw'
+
+let pfiDid;
+let customerDid;
+let server;
+let rfq;
+let offering;
+let selectedOffering;
+
+describe('Wallet: Send RFQ', () => {
+
+ beforeAll(async () => {
+ customerDid = await DidDht.create({
+ options: { publish: true }
+ })
+
+ pfiDid = await DidDht.create({
+ options:{
+ publish: true,
+ services : [{
+ type : 'PFI',
+ id : 'pfi',
+ serviceEndpoint : 'https://localhost:9000'
+ }]
+ }
+ })
+
+ // Offering with claims (non-replyTo test)
+ selectedOffering = DevTools.createOffering({
+ from: pfiDid.uri
+ });
+ await selectedOffering.sign(pfiDid)
+
+ // Offering and RFQ (without claims) for replyTo tests
+ offering = Offering.create({
+ metadata: { from: pfiDid.uri },
+ data: {
+ id: '1234',
+ description: 'A test offering',
+ payin: {currencyCode: 'USD', methods: [{kind: 'DEBIT_CARD'}]},
+ payout: {currencyCode: 'BTC', methods: [{kind: 'BTC_ADDRESS', estimatedSettlementTime: 60}]},
+ payoutUnitsPerPayinUnit: '0.0001'
+ }
+ });
+ await offering.sign(pfiDid)
+
+ rfq = Rfq.create({
+ metadata: {
+ to: pfiDid.uri,
+ from: customerDid.uri,
+ protocol: '1.0'
+ },
+ data: {
+ offeringId: offering.metadata.id,
+ payin: {amount: '500.65', kind: 'DEBIT_CARD'},
+ payout: {kind: 'BTC_ADDRESS'},
+ }
+ })
+ await rfq.sign(customerDid)
+
+
+ // Mock the response from the PFI
+ server = setupServer(
+ http.post(new RegExp('https://localhost:9000/exchanges'), () => {
+ return HttpResponse.json({
+ status: 202
+ })
+ })
+ )
+ server.listen({onUnhandledRequest: 'bypass'})
+ });
+
+ afterAll(() => {
+ server.resetHandlers()
+ server.close()
+ });
+
+ test('skeleton RFQ: properties', async () => {
+ try{
+ // :snippet-start: skeletonRfqMessageJS
+ const rfq = Rfq.create({
+ metadata: {},
+ data: {},
+ });
+ // :snippet-end:
+
+ } catch (e) {
+ //no assertions needed; this is just showing how to structure a RFQ
+ }
+ });
+
+ test('skeleton RFQ: metadata', async () => {
+ try{
+ // :snippet-start: rfqMetadataJS
+ const rfq = Rfq.create({
+ //highlight-start
+ metadata: {
+ to: selectedOffering.metadata.from, // PFI's DID
+ from: customerDid.uri, // Customer's DID
+ protocol: '1.0' // Version of tbDEX protocol you're using
+ },
+ //highlight-end
+ data: {}
+ });
+ // :snippet-end:
+
+ } catch (e) {
+ //no assertions needed; this is just showing how to structure a RFQ
+ }
+ });
+
+ test('create signed RFQ message and send to PFI', async () => {
+ const BTC_ADDRESS = 'bc1q52csjdqa6cq5d2ntkkyz8wk7qh2qevy04dyyfd'
+ const yoloCredential = "eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpqd2s6ZXlKamNuWWlPaUpGWkRJMU5URTVJaXdpYTNSNUlqb2lUMHRRSWl3aWVDSTZJalJ2WTE5eGRuVkZPVzEyUldkNFpXRmZlbVJYY1MxUlZVUlJRemswZWpGTlZVbFhaa1F6V1V4b2JVa2lMQ0pyYVdRaU9pSmtZazF3V25OT1ZHcE9ZbmQ2WW5OMFZXOVVTbU5aZFRKS1RIQkNhR2xCUnpRd1JYcDRORXRHVWsxbklpd2lZV3huSWpvaVJXUkVVMEVpZlEjMCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiWW9sb0NyZWRlbnRpYWwiXSwiaWQiOiJ1cm46dXVpZDo4YjBmNjA3Zi1mMTdlLTRjNDktODczNS02YzU2MmU2N2U1NDEiLCJpc3N1ZXIiOiJkaWQ6andrOmV5SmpjbllpT2lKRlpESTFOVEU1SWl3aWEzUjVJam9pVDB0UUlpd2llQ0k2SWpSdlkxOXhkblZGT1cxMlJXZDRaV0ZmZW1SWGNTMVJWVVJSUXprMGVqRk5WVWxYWmtReldVeG9iVWtpTENKcmFXUWlPaUprWWsxd1duTk9WR3BPWW5kNlluTjBWVzlVU21OWmRUSktUSEJDYUdsQlJ6UXdSWHA0TkV0R1VrMW5JaXdpWVd4bklqb2lSV1JFVTBFaWZRIiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wNS0wMlQwNDoyNTo0NFoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpqd2s6ZXlKamNuWWlPaUpGWkRJMU5URTVJaXdpYTNSNUlqb2lUMHRRSWl3aWVDSTZJalJ2WTE5eGRuVkZPVzEyUldkNFpXRmZlbVJYY1MxUlZVUlJRemswZWpGTlZVbFhaa1F6V1V4b2JVa2lMQ0pyYVdRaU9pSmtZazF3V25OT1ZHcE9ZbmQ2WW5OMFZXOVVTbU5aZFRKS1RIQkNhR2xCUnpRd1JYcDRORXRHVWsxbklpd2lZV3huSWpvaVJXUkVVMEVpZlEiLCJiZWVwIjoiYm9vcCJ9fSwibmJmIjoxNzE0NjIzOTQ0LCJqdGkiOiJ1cm46dXVpZDo4YjBmNjA3Zi1mMTdlLTRjNDktODczNS02YzU2MmU2N2U1NDEiLCJpc3MiOiJkaWQ6andrOmV5SmpjbllpT2lKRlpESTFOVEU1SWl3aWEzUjVJam9pVDB0UUlpd2llQ0k2SWpSdlkxOXhkblZGT1cxMlJXZDRaV0ZmZW1SWGNTMVJWVVJSUXprMGVqRk5WVWxYWmtReldVeG9iVWtpTENKcmFXUWlPaUprWWsxd1duTk9WR3BPWW5kNlluTjBWVzlVU21OWmRUSktUSEJDYUdsQlJ6UXdSWHA0TkV0R1VrMW5JaXdpWVd4bklqb2lSV1JFVTBFaWZRIiwic3ViIjoiZGlkOmp3azpleUpqY25ZaU9pSkZaREkxTlRFNUlpd2lhM1I1SWpvaVQwdFFJaXdpZUNJNklqUnZZMTl4ZG5WRk9XMTJSV2Q0WldGZmVtUlhjUzFSVlVSUlF6azBlakZOVlVsWFprUXpXVXhvYlVraUxDSnJhV1FpT2lKa1lrMXdXbk5PVkdwT1luZDZZbk4wVlc5VVNtTlpkVEpLVEhCQ2FHbEJSelF3UlhwNE5FdEdVazFuSWl3aVlXeG5Jam9pUldSRVUwRWlmUSIsImlhdCI6MTcxNDYyMzk0NH0.CMZVBfNCq5aYgWmRcJVFN5fXiuPlgrwiGAsmYOZsFLHaRfqiA5gxqPDjBAQ1Ra7gK5X6_tZm5ue6kU6hN_7ZAA"
+ const selectedCredentials = [yoloCredential]
+
+ // :snippet-start: createRfqMessageJS
+ const rfq = Rfq.create({
+ metadata: {
+ to: selectedOffering.metadata.from, // PFI's DID
+ from: customerDid.uri, // Customer DID
+ protocol: '1.0' // Version of tbDEX protocol you're using
+ },
+ //highlight-start
+ data: {
+ offeringId: selectedOffering.metadata.id, // The ID of the selected offering
+ payin: {
+ kind: 'DEBIT_CARD', // The method of payment
+ amount: '500.65', // The amount of the payin currency
+ paymentDetails: {
+ cardNumber: '1234567890123456',
+ expiryDate: '05/25',
+ cardHolderName: 'Alice Doe',
+ cvv: '123'
+ }
+ },
+ payout: {
+ kind: 'BTC_ADDRESS', // The method for receiving payout
+ paymentDetails: {
+ btcAddress: BTC_ADDRESS // Recipient's BTC wallet address
+ }
+ },
+ claims: selectedCredentials // Array of signed VCs required by the PFI
+ }
+ //highlight-end
+ });
+ // :snippet-end:
+
+ expect(() => {
+ // :snippet-start: verifyOfferingRequirementsJS
+ try{
+ rfq.verifyOfferingRequirements(selectedOffering);
+ } catch (e) {
+ // handle failed verification
+ }
+ // :snippet-end:
+ }).not.toThrow();
+
+ // :snippet-start: signRfqMessageJS
+ await rfq.sign(customerDid);
+ // :snippet-end:
+
+ try{
+ // :snippet-start: sendRfqMessageJS
+ await TbdexHttpClient.createExchange(rfq);
+ // :snippet-end:
+ }
+ catch (e) {
+ expect.fail(`Failed to send RFQ message to PFI: ${e.message}`)
+ }
+ expect(rfq.signature).toBeDefined();
+ });
+
+ test('send RFQ message with URL as replyTo', async () => {
+ try{
+ // :snippet-start: rfqWithUrlReplyToJS
+ await TbdexHttpClient.createExchange(
+ rfq,
+ //highlight-next-line
+ { replyTo: 'https://example.com/callback' }
+ );
+ // :snippet-end:
+ }
+ catch (e) {
+ expect.fail(`Failed to send RFQ with URL replyTo: ${e.message}`)
+ }
+ });
+
+ test('send RFQ message with DID as replyTo', async () => {
+ // :snippet-start: createDidWithTbdexServiceJS
+ const walletDid = await DidDht.create({
+ options: {
+ publish: true,
+ services: [
+ {
+ id: 'tbdex',
+ //highlight-start
+ type: 'tbdex',
+ serviceEndpoint: 'https://example.com/callback'
+ //highlight-end
+ },
+ ],
+ },
+ });
+ // :snippet-end:
+
+ try{
+ // :snippet-start: rfqWithDidReplyToJS
+ await TbdexHttpClient.createExchange(
+ rfq,
+ //highlight-next-line
+ { replyTo: walletDid.uri }
+ );
+ // :snippet-end:
+ }
+ catch (e) {
+ expect.fail(`Failed to send RFQ message with DID as replyTo: ${e.message}`)
+ }
+ });
+});
diff --git a/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/walletQuickstart.test.js b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/walletQuickstart.test.js
new file mode 100644
index 0000000..8f0f176
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/tbdex/wallet/walletQuickstart.test.js
@@ -0,0 +1,215 @@
+import { it, expect, describe } from 'vitest';
+// :snippet-start: walletQuickstartImports
+import { TbdexHttpClient, Rfq, Quote, Order, Close } from '@tbdex/http-client';
+import { PresentationExchange } from '@web5/credentials';
+import { DidDht, DidJwk } from '@web5/dids';
+import { VerifiableCredential } from '@web5/credentials';
+// :snippet-end:
+
+// Implementation in /site/code-snippets/tbdex/wallet-quickstart.js
+
+// using https://aqf-mock-pfis.tbddev.org/ from mock-pfis
+// :snippet-start: walletQuickstartPfiDid
+const pfiDid = 'did:dht:3fkz5ssfxbriwks3iy5nwys3q5kyx64ettp9wfn1yfekfkiguj1y';
+// :snippet-end:
+
+let customerDid, customerCredentials, selectedOffering, selectedCredentials, rfq, exchangeId, quote, close;
+
+describe('Wallet: Quickstart', () => {
+
+ it('should import existing customer DID', async () => {
+ // :snippet-start: walletQuickstartDidCreate
+ customerDid = await DidDht.create({
+ options: {
+ publish: true,
+ },
+ });
+ // :snippet-end:
+ });
+
+ it('should get offerings and select one', async () => {
+ // :snippet-start: walletQuickstartGetOfferings
+ const offerings = await TbdexHttpClient.getOfferings({ pfiDid: pfiDid });
+ // :snippet-end:
+
+ //:snippet-start: walletQuickstartSelectOffering
+ if (offerings) {
+ selectedOffering = offerings.find(
+ (offering) =>
+ offering.data.payin.currencyCode === 'USD' &&
+ offering.data.payout.currencyCode === 'KES'
+ );
+ }
+ //:snippet-end:
+
+ expect(selectedOffering).toBeDefined();
+ });
+
+ it('should successfully request a verifiable credential', async () => {
+ const vcJwt = await fetch(`https://mock-idv.tbddev.org/kcc?name=angie&country=US&did=${customerDid.uri}`).then(res => res.text());
+ customerCredentials = [vcJwt];
+
+ expect(typeof vcJwt).toBe('string');
+ expect(customerCredentials).toBeDefined();
+ });
+
+ it('should select credentials', async () => {
+ // :snippet-start: walletQuickstartSelectCredentials
+ selectedCredentials = PresentationExchange.selectCredentials({
+ vcJwts: customerCredentials,
+ presentationDefinition: selectedOffering.data.requiredClaims,
+ });
+ // :snippet-end:
+
+ expect(selectedCredentials.length).toBe(1);
+ });
+
+ it('should create and send RFQ', async () => {
+ // :snippet-start: walletQuickstartCreateRfq
+ rfq = Rfq.create({
+ metadata: {
+ to: pfiDid, // PFI's DID
+ from: customerDid.uri, // Customer DID
+ protocol: '1.0', // Version of tbDEX protocol you're using
+ },
+ data: {
+ offeringId: selectedOffering.metadata.id, // The ID of the selected offering
+ payin: {
+ kind: 'USD_BANK_TRANSFER', // The method of payment
+ amount: '500.65', // The amount of the payin currency
+ paymentDetails: {
+ accountNumber: '1234567890',
+ routingNumber: '123456789',
+ },
+ },
+ payout: {
+ kind: 'KES_BANK_TRANSFER', // The method for receiving payout
+ paymentDetails: {
+ accountNumber: '3245231234', // Details required to execute payment
+ },
+ },
+ claims: selectedCredentials, // Array of signed VCs required by the PFI
+ },
+ });
+ // :snippet-end:
+
+ expect(async () => {
+ try {
+ // :snippet-start: walletQuickstartSendRfq
+ await rfq.verifyOfferingRequirements(selectedOffering);
+ await rfq.sign(customerDid);
+ await TbdexHttpClient.createExchange(rfq);
+ // :snippet-end:
+ } catch (e) {
+ throw e;
+ }
+ }).not.toThrow();
+ });
+
+ it('should process the quote', async () => {
+ // :snippet-start: walletQuickstartProcessQuote
+ // Wait for Quote message to appear in the exchange
+ exchangeId = rfq.exchangeId;
+ let attempts = 0;
+ const maxAttempts = 30;
+ const delay = 2000; // 2 seconds
+
+ while (!quote && attempts < maxAttempts) {
+ try {
+ const exchange = await TbdexHttpClient.getExchange({
+ pfiDid: pfiDid,
+ did: customerDid,
+ exchangeId: exchangeId,
+ });
+
+ quote = exchange.find((msg) => msg instanceof Quote);
+
+ if (!quote) {
+ // Make sure the exchange is still open
+ close = exchange.find((msg) => msg instanceof Close);
+
+ if (close) {
+ break;
+ } else {
+ // Wait 2 seconds before making another request
+ await new Promise((resolve) => setTimeout(resolve, delay));
+ }
+ }
+ } catch (e) {
+ if (e.statusCode === 404 || e.statusCode === 401) {
+ // Waiting on RFQ to be processed
+ } else throw e;
+ }
+ attempts++;
+ }
+ // :snippet-end:
+
+ expect(quote).toBeDefined();
+ });
+
+ it('should create and submit an order', async () => {
+ let order;
+ while (!order) {
+ // :snippet-start: walletQuickstartCreateOrder
+ order = Order.create({
+ metadata: {
+ from: customerDid.uri, // Customer's DID
+ to: pfiDid, // PFI's DID
+ exchangeId: exchangeId, // Exchange ID from the Quote
+ protocol: '1.0', // Version of tbDEX protocol you're using
+ },
+ });
+ // :snippet-end:
+
+ expect(order).toBeDefined();
+ }
+
+ expect(async () => {
+ try {
+ // :snippet-start: walletQuickstartSubmitOrder
+ await order.sign(customerDid);
+ await TbdexHttpClient.submitOrder(order);
+ // :snippet-end:
+ } catch (e) {
+ if (e.statusCode === 404) {
+ // Waiting on RFQ to be processed
+ } else throw e;
+ }
+ }).not.toThrow();
+ });
+
+ it('should process close message', async () => {
+ // :snippet-start: walletQuickstartProcessClose
+ let attempts = 0;
+ const maxAttempts = 30;
+ const delay = 2000; // 2 seconds
+
+ while (!close && attempts < maxAttempts) {
+ try {
+ const exchange = await TbdexHttpClient.getExchange({
+ pfiDid: pfiDid,
+ did: customerDid,
+ exchangeId: exchangeId,
+ });
+
+ for (const message of exchange) {
+ if (message instanceof Close) {
+ close = message;
+ }
+ }
+ } catch (e) {
+ if (e.statusCode === 404 || e.statusCode === 401) {
+ // Waiting on RFQ to be processed
+ } else throw e;
+ }
+ attempts++;
+ if (!close) await new Promise((resolve) => setTimeout(resolve, delay));
+ }
+ const reasonForClose = close.data.reason;
+ const closeSuccess = close.data.success;
+ // :snippet-end:
+
+ expect(closeSuccess).toBe(true);
+ expect(reasonForClose).toBeDefined();
+ });
+});
diff --git a/site/testsuites/testsuite-javascript/__tests__/utils/mockDataProvider.js b/site/testsuites/testsuite-javascript/__tests__/utils/mockDataProvider.js
new file mode 100644
index 0000000..7936a02
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/utils/mockDataProvider.js
@@ -0,0 +1,54 @@
+export class MockDataProvider {
+ constructor() {
+ this.responses = new Map();
+ }
+
+ // Setup can handle an arbitrary number of parametrs
+ setup(methodName, ...args) {
+ // Separate the last argument as response
+ const response = args.pop(); // Destructure the last argument as response
+ const params = args;
+
+ // Serialize parameters for key
+ const paramsKey = params.join('');
+ const key = `${methodName}:${paramsKey}`;
+ this.responses.set(key, response);
+ }
+
+ // Convenience setup methods
+
+ setupInsert(...args) {
+ this.setup("insert", args);
+ }
+
+ setupGet(collection, id, response) {
+ this.setup("get", collection, id, response);
+ }
+
+ setupQuery(collection, query, response) {
+ this.setup("query", collection, query, response);
+ }
+
+ // Method to find and return the response for the given method and parameters
+ async execute(methodName, ...params) {
+ const paramsKey = params.join('');
+ const key = `${methodName}:${paramsKey}`;
+ if (this.responses.has(key)) {
+ // Call the response function if parameters match
+ return this.responses.get(key)(...params);
+ }
+ }
+
+ // Mock methods
+ async insert(...params) {
+ return this.setup("insert", params);
+ }
+
+ async get(collection, id) {
+ return this.execute('get', collection, id);
+ }
+
+ async query(collection, query) {
+ return this.execute('query', collection, query);
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/utils/mockExchangesApiProvider.js b/site/testsuites/testsuite-javascript/__tests__/utils/mockExchangesApiProvider.js
new file mode 100644
index 0000000..e50e66f
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/utils/mockExchangesApiProvider.js
@@ -0,0 +1,101 @@
+import { Close, OrderStatus, Quote } from '@tbdex/protocol'
+import { DevTools } from '@tbdex/http-client';
+import { MockDataProvider } from './mockDataProvider'
+
+export class MockExchangesApiProvider {
+
+ constructor() {
+ this.dataProvider = new MockDataProvider()
+ }
+
+ //---------------------------------------------------------------------------//
+ // Implementation of interface
+ //---------------------------------------------------------------------------//
+
+ async getExchanges(filter) {
+ return await this.dataProvider.query("exchanges", filter)
+ }
+
+ async getExchange(id) {
+ return await this.dataProvider.get("exchanges", id)
+ }
+
+ async getRfq(exchangeId) {
+ return await this.dataProvider.get("rfq", exchangeId)
+ }
+
+ async getQuote(exchangeId) {
+ return await this.dataProvider.get("quote", exchangeId)
+ }
+
+ async getOrder(exchangeId) {
+ return await this.dataProvider.get("order", exchangeId)
+ }
+
+ async getOrderStatuses(exchangeId) {
+ return await this.dataProvider.get("orderstatus", exchangeId)
+ }
+
+ async getClose(exchangeId) {
+ return await this.dataProvider.get("close", exchangeId)
+ }
+
+ //---------------------------------------------------------------------------//
+ // Setup Methods
+ //---------------------------------------------------------------------------//
+
+ setExchanges(filter) {
+ this.dataProvider.setupQuery("exchanges", filter, () => {
+
+ })
+ }
+
+ setExchange(id) {
+ this.dataProvider.setupGet("exchanges", id, () => {
+
+ })
+ }
+
+ setRfq(exchangeId, messageOptions) {
+ this.dataProvider.setupGet("rfq", exchangeId, () => {
+ return DevTools.createRfq(messageOptions)
+ })
+ }
+
+ setQuote(exchangeId, metadata) {
+ this.dataProvider.setupGet("quote", exchangeId, () => {
+ let quoteData = DevTools.createQuoteData()
+ return Quote.create({
+ metadata: metadata,
+ data: quoteData
+ })
+ })
+ }
+
+ setOrder(exchangeId, messageOptions) {
+ this.dataProvider.setupGet("order", exchangeId, () => {
+ return DevTools.createOrder(messageOptions)
+ })
+ }
+
+ setOrderStatus(exchangeId, status, metadata) {
+ this.dataProvider.setupGet("orderstatus", exchangeId, () => {
+ return OrderStatus.create({
+ data: { orderStatus: status },
+ metadata: metadata
+ })
+ })
+ }
+
+ setClose(exchangeId, data) {
+ this.dataProvider.setupGet("close", exchangeId, () => {
+ return Close.create(data)
+ })
+ }
+
+ setWrite() {
+ this.dataProvider.setupInsert("exchange", "", () => {
+ return
+ })
+ }
+};
\ No newline at end of file
diff --git a/site/testsuites/testsuite-javascript/__tests__/utils/mockOfferingsApiProvider.js b/site/testsuites/testsuite-javascript/__tests__/utils/mockOfferingsApiProvider.js
new file mode 100644
index 0000000..b70c441
--- /dev/null
+++ b/site/testsuites/testsuite-javascript/__tests__/utils/mockOfferingsApiProvider.js
@@ -0,0 +1,61 @@
+import { MockDataProvider } from './mockDataProvider'
+import { Offering } from '@tbdex/protocol'
+import { DevTools } from '@tbdex/http-client';
+
+export class MockOfferingsApiProvider {
+
+ constructor() {
+ this.dataProvider = new MockDataProvider()
+ }
+
+ //---------------------------------------------------------------------------//
+ // Implementation of interface
+ //---------------------------------------------------------------------------//
+
+ async getOffering(id) {
+ this.dataProvider.get('offering', id).then(([result]) => {
+ return Offering.create({
+ metadata: { from: this.pfiDid },
+ data: result.data
+ })
+ });
+ }
+
+ getOfferings() {
+ this.dataProvider.query('offering', "*").then((results) => {
+ const offerings = []
+
+ for (let result of results) {
+ const offering = Offering.create({
+ metadata: { from: this.pfiDid },
+ data: result.data
+ })
+ offerings.push(offering)
+ }
+
+ return offerings
+ });
+ }
+
+ //---------------------------------------------------------------------------//
+ // Setup Methods
+ //---------------------------------------------------------------------------//
+
+ setOffering(id, offering) {
+console.log('called setOffering', id, offering)
+ this.dataProvider.setupGet('offering', id, () => {
+ return offering
+ })
+ }
+
+ setOfferings(offeringData) {
+ this.dataProvider.setupQuery('offering', "*", () => {
+ const offerings = []
+ offeringData.forEach(offering => {
+ offerings.push(DevTools.createOffering(offering))
+ });
+
+ return offerings;
+ })
+ }
+ };
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/.mvn/jvm.config b/site/testsuites/testsuite-kotlin/.mvn/jvm.config
new file mode 100644
index 0000000..9186c2d
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/.mvn/jvm.config
@@ -0,0 +1,2 @@
+--add-opens=java.base/java.lang=ALL-UNNAMED
+--add-opens=java.base/java.io=ALL-UNNAMED
diff --git a/site/testsuites/testsuite-kotlin/.mvn/wrapper/MavenWrapperDownloader.java b/site/testsuites/testsuite-kotlin/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 0000000..84d1e60
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.Authenticator;
+import java.net.PasswordAuthentication;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+
+public final class MavenWrapperDownloader
+{
+ private static final String WRAPPER_VERSION = "3.2.0";
+
+ private static final boolean VERBOSE = Boolean.parseBoolean( System.getenv( "MVNW_VERBOSE" ) );
+
+ public static void main( String[] args )
+ {
+ log( "Apache Maven Wrapper Downloader " + WRAPPER_VERSION );
+
+ if ( args.length != 2 )
+ {
+ System.err.println( " - ERROR wrapperUrl or wrapperJarPath parameter missing" );
+ System.exit( 1 );
+ }
+
+ try
+ {
+ log( " - Downloader started" );
+ final URL wrapperUrl = new URL( args[0] );
+ final String jarPath = args[1].replace( "..", "" ); // Sanitize path
+ final Path wrapperJarPath = Paths.get( jarPath ).toAbsolutePath().normalize();
+ downloadFileFromURL( wrapperUrl, wrapperJarPath );
+ log( "Done" );
+ }
+ catch ( IOException e )
+ {
+ System.err.println( "- Error downloading: " + e.getMessage() );
+ if ( VERBOSE )
+ {
+ e.printStackTrace();
+ }
+ System.exit( 1 );
+ }
+ }
+
+ private static void downloadFileFromURL( URL wrapperUrl, Path wrapperJarPath )
+ throws IOException
+ {
+ log( " - Downloading to: " + wrapperJarPath );
+ if ( System.getenv( "MVNW_USERNAME" ) != null && System.getenv( "MVNW_PASSWORD" ) != null )
+ {
+ final String username = System.getenv( "MVNW_USERNAME" );
+ final char[] password = System.getenv( "MVNW_PASSWORD" ).toCharArray();
+ Authenticator.setDefault( new Authenticator()
+ {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication()
+ {
+ return new PasswordAuthentication( username, password );
+ }
+ } );
+ }
+ try ( InputStream inStream = wrapperUrl.openStream() )
+ {
+ Files.copy( inStream, wrapperJarPath, StandardCopyOption.REPLACE_EXISTING );
+ }
+ log( " - Downloader complete" );
+ }
+
+ private static void log( String msg )
+ {
+ if ( VERBOSE )
+ {
+ System.out.println( msg );
+ }
+ }
+
+}
diff --git a/site/testsuites/testsuite-kotlin/.mvn/wrapper/maven-wrapper.jar b/site/testsuites/testsuite-kotlin/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000..cb28b0e
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/site/testsuites/testsuite-kotlin/.mvn/wrapper/maven-wrapper.properties b/site/testsuites/testsuite-kotlin/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..346d645
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar
diff --git a/site/testsuites/testsuite-kotlin/mvnw b/site/testsuites/testsuite-kotlin/mvnw
new file mode 100755
index 0000000..8d937f4
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/mvnw
@@ -0,0 +1,308 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Apache Maven Wrapper startup batch script, version 3.2.0
+#
+# Required ENV vars:
+# ------------------
+# JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+# MAVEN_OPTS - parameters passed to the Java VM when running Maven
+# e.g. to debug Maven itself, use
+# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+ if [ -f /usr/local/etc/mavenrc ] ; then
+ . /usr/local/etc/mavenrc
+ fi
+
+ if [ -f /etc/mavenrc ] ; then
+ . /etc/mavenrc
+ fi
+
+ if [ -f "$HOME/.mavenrc" ] ; then
+ . "$HOME/.mavenrc"
+ fi
+
+fi
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "$(uname)" in
+ CYGWIN*) cygwin=true ;;
+ MINGW*) mingw=true;;
+ Darwin*) darwin=true
+ # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+ # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+ if [ -z "$JAVA_HOME" ]; then
+ if [ -x "/usr/libexec/java_home" ]; then
+ JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
+ else
+ JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
+ fi
+ fi
+ ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+ if [ -r /etc/gentoo-release ] ; then
+ JAVA_HOME=$(java-config --jre-home)
+ fi
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+ [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
+ JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+ javaExecutable="$(which javac)"
+ if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then
+ # readlink(1) is not available as standard on Solaris 10.
+ readLink=$(which readlink)
+ if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then
+ if $darwin ; then
+ javaHome="$(dirname "\"$javaExecutable\"")"
+ javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac"
+ else
+ javaExecutable="$(readlink -f "\"$javaExecutable\"")"
+ fi
+ javaHome="$(dirname "\"$javaExecutable\"")"
+ javaHome=$(expr "$javaHome" : '\(.*\)/bin')
+ JAVA_HOME="$javaHome"
+ export JAVA_HOME
+ fi
+ fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+ if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ else
+ JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)"
+ fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+ echo "Error: JAVA_HOME is not defined correctly." >&2
+ echo " We cannot execute $JAVACMD" >&2
+ exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+ echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+ if [ -z "$1" ]
+ then
+ echo "Path not specified to find_maven_basedir"
+ return 1
+ fi
+
+ basedir="$1"
+ wdir="$1"
+ while [ "$wdir" != '/' ] ; do
+ if [ -d "$wdir"/.mvn ] ; then
+ basedir=$wdir
+ break
+ fi
+ # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+ if [ -d "${wdir}" ]; then
+ wdir=$(cd "$wdir/.." || exit 1; pwd)
+ fi
+ # end of workaround
+ done
+ printf '%s' "$(cd "$basedir" || exit 1; pwd)"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+ if [ -f "$1" ]; then
+ # Remove \r in case we run on Windows within Git Bash
+ # and check out the repository with auto CRLF management
+ # enabled. Otherwise, we may read lines that are delimited with
+ # \r\n and produce $'-Xarg\r' rather than -Xarg due to word
+ # splitting rules.
+ tr -s '\r\n' ' ' < "$1"
+ fi
+}
+
+log() {
+ if [ "$MVNW_VERBOSE" = true ]; then
+ printf '%s\n' "$1"
+ fi
+}
+
+BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
+if [ -z "$BASE_DIR" ]; then
+ exit 1;
+fi
+
+MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
+log "$MAVEN_PROJECTBASEDIR"
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
+if [ -r "$wrapperJarPath" ]; then
+ log "Found $wrapperJarPath"
+else
+ log "Couldn't find $wrapperJarPath, downloading it ..."
+
+ if [ -n "$MVNW_REPOURL" ]; then
+ wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
+ else
+ wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
+ fi
+ while IFS="=" read -r key value; do
+ # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' )
+ safeValue=$(echo "$value" | tr -d '\r')
+ case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
+ esac
+ done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
+ log "Downloading from: $wrapperUrl"
+
+ if $cygwin; then
+ wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
+ fi
+
+ if command -v wget > /dev/null; then
+ log "Found wget ... using wget"
+ [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
+ if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+ wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
+ else
+ wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
+ fi
+ elif command -v curl > /dev/null; then
+ log "Found curl ... using curl"
+ [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
+ if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+ curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
+ else
+ curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
+ fi
+ else
+ log "Falling back to using Java to download"
+ javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
+ javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
+ # For Cygwin, switch paths to Windows format before running javac
+ if $cygwin; then
+ javaSource=$(cygpath --path --windows "$javaSource")
+ javaClass=$(cygpath --path --windows "$javaClass")
+ fi
+ if [ -e "$javaSource" ]; then
+ if [ ! -e "$javaClass" ]; then
+ log " - Compiling MavenWrapperDownloader.java ..."
+ ("$JAVA_HOME/bin/javac" "$javaSource")
+ fi
+ if [ -e "$javaClass" ]; then
+ log " - Running MavenWrapperDownloader.java ..."
+ ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
+ fi
+ fi
+ fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+# If specified, validate the SHA-256 sum of the Maven wrapper jar file
+wrapperSha256Sum=""
+while IFS="=" read -r key value; do
+ case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;
+ esac
+done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
+if [ -n "$wrapperSha256Sum" ]; then
+ wrapperSha256Result=false
+ if command -v sha256sum > /dev/null; then
+ if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then
+ wrapperSha256Result=true
+ fi
+ elif command -v shasum > /dev/null; then
+ if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then
+ wrapperSha256Result=true
+ fi
+ else
+ echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available."
+ echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties."
+ exit 1
+ fi
+ if [ $wrapperSha256Result = false ]; then
+ echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2
+ echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2
+ echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2
+ exit 1
+ fi
+fi
+
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
+ [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+ MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+# shellcheck disable=SC2086 # safe args
+exec "$JAVACMD" \
+ $MAVEN_OPTS \
+ $MAVEN_DEBUG_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/site/testsuites/testsuite-kotlin/mvnw.cmd b/site/testsuites/testsuite-kotlin/mvnw.cmd
new file mode 100644
index 0000000..f80fbad
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/mvnw.cmd
@@ -0,0 +1,205 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Apache Maven Wrapper startup batch script, version 3.2.0
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
+if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
+
+FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+ IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Found %WRAPPER_JAR%
+ )
+) else (
+ if not "%MVNW_REPOURL%" == "" (
+ SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
+ )
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Couldn't find %WRAPPER_JAR%, downloading it ...
+ echo Downloading from: %WRAPPER_URL%
+ )
+
+ powershell -Command "&{"^
+ "$webclient = new-object System.Net.WebClient;"^
+ "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+ "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+ "}"^
+ "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
+ "}"
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Finished downloading %WRAPPER_JAR%
+ )
+)
+@REM End of extension
+
+@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file
+SET WRAPPER_SHA_256_SUM=""
+FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+ IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B
+)
+IF NOT %WRAPPER_SHA_256_SUM%=="" (
+ powershell -Command "&{"^
+ "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^
+ "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^
+ " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^
+ " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^
+ " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^
+ " exit 1;"^
+ "}"^
+ "}"
+ if ERRORLEVEL 1 goto error
+)
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% ^
+ %JVM_CONFIG_MAVEN_PROPS% ^
+ %MAVEN_OPTS% ^
+ %MAVEN_DEBUG_OPTS% ^
+ -classpath %WRAPPER_JAR% ^
+ "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
+ %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
+if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%"=="on" pause
+
+if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
+
+cmd /C exit /B %ERROR_CODE%
diff --git a/site/testsuites/testsuite-kotlin/pom.xml b/site/testsuites/testsuite-kotlin/pom.xml
new file mode 100644
index 0000000..a28f848
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/pom.xml
@@ -0,0 +1,247 @@
+
+
+
+ 4.0.0
+ website.tbd.developer.site
+ kotlin-testsuite
+ 0.1.0-SNAPSHOT
+ kotlin-testsuite
+ http://developer.tbd.website
+
+ UTF-8
+ 17
+ true
+ 4.11.0
+ 2.3.7
+ 3.25.2
+ 5.10.1
+ 2.0.1
+
+ 2.0.0
+ 1.9.22
+ true
+
+
+
+
+
+
+ xyz.block
+ tbdex-parent
+ ${version.xyz.block.tbdex}
+ pom
+ import
+
+
+
+ xyz.block
+ tbdex
+ ${version.xyz.block.tbdex}
+ pom
+
+
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib
+ ${version.kotlin}
+
+
+
+
+ org.assertj
+ assertj-core
+ ${version.org.assertj}
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${version.org.junit.jupiter}
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${version.org.junit.jupiter}
+ test
+
+
+
+ com.squareup.okhttp3
+ mockwebserver
+ ${version.com.squareup.okhttp3}
+ test
+
+
+
+ io.ktor
+ ktor-server-test-host
+ ${version.io.ktor}
+ test
+
+
+
+
+
+
+
+
+ xyz.block
+ tbdex
+ pom
+
+
+
+ xyz.block
+ web5-keymanager-aws
+
+ ${version.xyz.block.web5.keymanager.aws}
+
+
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib
+
+
+
+
+
+ org.assertj
+ assertj-core
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+
+
+
+ com.squareup.okhttp3
+ mockwebserver
+
+
+
+ io.ktor
+ ktor-server-test-host
+
+
+
+ io.ktor
+ ktor-server-content-negotiation-jvm
+ test
+
+
+
+
+
+ ${project.basedir}/src/test/kotlin
+
+
+
+ maven-clean-plugin
+ 3.1.0
+
+
+ maven-resources-plugin
+ 3.0.2
+
+
+ maven-compiler-plugin
+ 3.8.0
+
+
+ maven-surefire-plugin
+ 2.22.1
+
+
+ maven-jar-plugin
+ 3.0.2
+
+
+ maven-install-plugin
+ 2.5.2
+
+
+ maven-deploy-plugin
+ 2.8.2
+
+
+ maven-site-plugin
+ 3.7.1
+
+
+ maven-project-info-reports-plugin
+ 3.0.0
+
+
+ kotlin-maven-plugin
+ org.jetbrains.kotlin
+ ${version.kotlin}
+
+
+
+
+
+ kotlin-maven-plugin
+ org.jetbrains.kotlin
+ true
+
+ ${kotlin.jvm.target}
+
+
+
+
+
+
+
+
+ tbd-oss-thirdparty
+ tbd-oss-thirdparty
+
+ true
+
+
+ false
+
+ https://blockxyz.jfrog.io/artifactory/tbd-oss-thirdparty-maven2/
+
+
+
+
+ tbd-oss-snapshots
+ tbd-oss-snapshots
+
+ false
+
+
+ true
+
+ https://blockxyz.jfrog.io/artifactory/tbd-oss-snapshots-maven2/
+
+
+
+
+ sonatype-oss-snapshots
+ sonatype-oss-snapshots
+ https://s01.oss.sonatype.org/content/repositories/snapshots/
+
+
+
+
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/CredentialIssuance.gradle b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/CredentialIssuance.gradle
new file mode 100644
index 0000000..abe3f6c
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/CredentialIssuance.gradle
@@ -0,0 +1,11 @@
+// :snippet-start:credentialIssuanceGradlePackage
+// Configure repositories
+repositories {
+ mavenCentral()
+ maven("https://jitpack.io")
+}
+// Configure dependencies
+dependencies {
+ implementation("xyz.block:web5-credentials:0.0.11")
+}
+// :snippet-end:
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/CredentialIssuance.xml b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/CredentialIssuance.xml
new file mode 100644
index 0000000..cf1787a
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/CredentialIssuance.xml
@@ -0,0 +1,16 @@
+// :snippet-start: credentialIssuanceMavenPackage
+
+
+ mavenCentral
+ https://repo1.maven.org/maven2/
+
+
+
+
+
+ xyz.block
+ web5-credentials
+ 0.0.11
+
+
+// :snippet-end:
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/CredentialIssuanceTest.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/CredentialIssuanceTest.kt
new file mode 100644
index 0000000..baded2e
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/CredentialIssuanceTest.kt
@@ -0,0 +1,226 @@
+package website.tbd.developer.site.docs.tbdex
+
+import com.nimbusds.jwt.JWTClaimsSet
+import org.junit.jupiter.api.Assertions.*
+import com.nimbusds.jwt.JWTParser
+import io.ktor.server.routing.*
+import io.ktor.server.application.*
+import io.ktor.server.response.*
+import io.ktor.server.request.*
+import io.ktor.http.*
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.assertDoesNotThrow
+import web5.sdk.dids.did.BearerDid
+import web5.sdk.credentials.VerifiableCredential
+import web5.sdk.crypto.InMemoryKeyManager
+import web5.sdk.dids.methods.dht.CreateDidDhtOptions
+import web5.sdk.dids.methods.dht.DidDht
+import java.security.SignatureException
+import io.ktor.server.routing.*
+import io.ktor.server.application.*
+import io.ktor.server.response.*
+import io.ktor.server.request.*
+import io.ktor.http.*
+import kotlinx.coroutines.runBlocking
+
+import web5.sdk.dids.didcore.Service
+
+
+
+// :snippet-start: sanctionsCredentialClassKt
+data class SanctionsCredential(val listsCleared: List)
+// :snippet-end:
+// :snippet-start: checkSanctionsListsFunctionAndSanctionsListResultClassKt
+fun checkSanctionsList(): SanctionsListResult {
+ // Implement sanctions list check logic
+ return SanctionsListResult(
+ isSanctioned = false,
+ listsCleared = listOf(
+ "FBI's Most Wanted", "USA Watchlist", "EU Watchlist"
+ )
+ )
+}
+
+// sanctionsListResult class
+data class SanctionsListResult(val isSanctioned: Boolean, val listsCleared: List)
+// :snippet-end:
+
+private fun createADid() = runBlocking {
+ // :snippet-start: createADidWithAServiceEndpointKT
+ val idvService = Service(
+ id = "idv",
+ type = "IDV",
+ serviceEndpoint = listOf("https://exampleIdvEndpoint.com/idv/siopv2/initiate")
+ )
+
+ val options = CreateDidDhtOptions(
+ services = listOf(idvService),
+ publish = true
+ )
+
+ val issuerBearerDid = DidDht.create(InMemoryKeyManager(), options)
+ // :snippet-end:
+}
+
+
+class CredentialIssuanceTest {
+
+ @Test
+ fun `create() creates a credential with expected fields`() {
+ val issuerDid = generateTestDid()
+ val subjectDid = "did:dht:aq5ek9jbf8kota7ufcbgnnc4ikkfpd8b1u9on1b1n7k7wdcapbgo"
+
+ val sanctionsListResult = SanctionsListResult(
+ isSanctioned = false,
+ listsCleared = listOf("FBI's Most Wanted", "USA Watchlist", "EU Watchlist")
+ )
+
+ val createdCredential = VerifiableCredential.create(
+ type = "SanctionsCredential",
+ issuer = issuerDid.uri.toString(),
+ subject = subjectDid,
+ data = sanctionsListResult
+ )
+
+ assertNotNull(createdCredential, "The created credential should not be null.")
+ assertEquals("SanctionsCredential", createdCredential.type, "The credential type should match.")
+ assertEquals(issuerDid.uri.toString(), createdCredential.issuer, "The issuer should match.")
+ }
+
+ @Test
+ fun `sign() method signs the credential and returns a non-empty string`() {
+ val issuerDid = generateTestDid()
+ val subjectDid = "did:dht:aq5ek9jbf8kota7ufcbgnnc4ikkfpd8b1u9on1b1n7k7wdcapbgo"
+
+ val sanctionsListResult = SanctionsListResult(
+ isSanctioned = false,
+ listsCleared = listOf("FBI's Most Wanted, USA Watchlist", "EU Watchlist")
+ )
+
+ val sanctionsCredential = VerifiableCredential.create(
+ type = "SanctionsCredential",
+ issuer = issuerDid.uri.toString(),
+ subject = subjectDid,
+ data = sanctionsListResult
+ )
+
+ val signedCredential = sanctionsCredential.sign(issuerDid)
+
+ assertTrue(signedCredential.isNotEmpty(), "The signed credential should not be an empty string.")
+ }
+
+ @Test
+ fun `verify() does not throw an exception for a valid JWT`() {
+ val validJwt = "eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa3djSmkzeVVONDJFZ1N2cmNHRlFyQzRKY1pkenlWWkhQOVdmMXFRZWRuVlRQI3o2TWt3Y0ppM3lVTjQyRWdTdnJjR0ZRckM0SmNaZHp5VlpIUDlXZjFxUWVkblZUUCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiSWRlbnRpZmljYXRpb25DcmVkZW50aWFsIl0sImlkIjoidXJuOnV1aWQ6MDQ3ZTg0ZWItY2NhMS00NjFlLWFjZjAtMGMyZGE5ZDczOTNhIiwiaXNzdWVyIjoiZGlkOmtleTp6Nk1rd2NKaTN5VU40MkVnU3ZyY0dGUXJDNEpjWmR6eVZaSFA5V2YxcVFlZG5WVFAiLCJpc3N1YW5jZURhdGUiOiIyMDI0LTAyLTE1VDE5OjMyOjE2WiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6Nk1rd2NKaTN5VU40MkVnU3ZyY0dGUXJDNEpjWmR6eVZaSFA5V2YxcVFlZG5WVFAiLCJuYW1lIjoiam9obiJ9fSwiaXNzIjoiZGlkOmtleTp6Nk1rd2NKaTN5VU40MkVnU3ZyY0dGUXJDNEpjWmR6eVZaSFA5V2YxcVFlZG5WVFAiLCJzdWIiOiJkaWQ6a2V5Ono2TWt3Y0ppM3lVTjQyRWdTdnJjR0ZRckM0SmNaZHp5VlpIUDlXZjFxUWVkblZUUCJ9.7oFAPckx-vxCbbzKSk9bU7eXlnjBFvMborl9woHCbcvWaLt0LvTRuDfvGDPC24V9D1K5OFpTnnBiN5jtIOmbBg"
+
+ assertDoesNotThrow {
+ VerifiableCredential.verify(validJwt)
+ }
+ }
+
+
+ private fun generateTestDid(): BearerDid {
+ val issuerDid = DidDht.create(InMemoryKeyManager(), CreateDidDhtOptions(publish = true))
+ return issuerDid
+ }
+
+ private fun Application.configureRouting() {
+ val issuerDid = generateTestDid()
+ // :snippet-start: checkSanctionsEndpointKt
+ routing {
+ get("/check-sanctions") {
+ try {
+
+ /***********************************************
+ * Accepts a JWT in the Authorization header
+ * and parse to get the signer DID
+ ************************************************/
+ val authHeader = call.request.header("Authorization")
+
+ if (authHeader == null || !authHeader.startsWith("Bearer ")) {
+ call.respond(
+ HttpStatusCode.Unauthorized,
+ "Authorization header required"
+ )
+ return@get
+ }
+
+ val compactJwt = authHeader.removePrefix("Bearer ")
+ var signerDid: String? = null
+
+ try {
+ VerifiableCredential.verify(compactJwt)
+
+ val claimsSet: JWTClaimsSet = JWTParser.parse(compactJwt).jwtClaimsSet
+ signerDid = claimsSet.subject
+ } catch (e: SignatureException) {
+ println("JWT Verification failed: ${e.message}")
+ call.respond(HttpStatusCode.Unauthorized, "Invalid token")
+ return@get
+ }
+
+ signerDid?.let { did ->
+
+ /***********************************************
+ * Perform the sanctions check and get the result
+ ************************************************/
+ val sanctionsListResult = checkSanctionsList()
+
+ if (sanctionsListResult.isSanctioned) {
+ call.respond(
+ HttpStatusCode.Forbidden,
+ "User is not eligible for a credential due to sanctions"
+ )
+ return@get
+ }
+
+ /***********************************************
+ * Create credential
+ ************************************************/
+ val sanctionsCredential = VerifiableCredential.create(
+ type = "SanctionsCredential",
+ issuer = issuerDid.uri.toString(),
+ subject = did,
+ data = SanctionsCredential(sanctionsListResult.listsCleared)
+ )
+
+ /***********************************************
+ * To secure the VC, you must sign it
+ ************************************************/
+ val credentialToken = sanctionsCredential.sign(issuerDid)
+
+ call.respond(
+ HttpStatusCode.OK,
+ "Signed Credential Token: $credentialToken"
+ )
+ } ?: run {
+ call.respond(
+ HttpStatusCode.BadRequest,
+ "Signer DID could not be determined from the JWT"
+ )
+ }
+
+ } catch (e: Exception) {
+ // Generic error handling
+ call.respond(
+ HttpStatusCode.InternalServerError,
+ "An unexpected error occurred: ${e.message}"
+ )
+ }
+ }
+ }
+ //:snippet-end:
+ }
+
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/KnownCustomerCredential.gradle b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/KnownCustomerCredential.gradle
new file mode 100644
index 0000000..4b4358d
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/KnownCustomerCredential.gradle
@@ -0,0 +1,15 @@
+// :snippet-start: knownCustomerCredentialGradlePackage
+// Configure repositories
+repositories {
+ mavenCentral()
+ maven("https://jitpack.io")
+ maven("https://repo.danubetech.com/repository/maven-public/")
+}
+// Configure dependencies
+dependencies {
+ implementation("xyz.block:web5-credentials:0.0.11")
+ implementation("xyz.block:web5-dids:0.0.11")
+ implementation("io.ktor:ktor-client-core:2.3.9")
+ implementation("io.ktor:ktor-client-cio:2.3.9")
+}
+// :snippet-end:
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/KnownCustomerCredential.xml b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/KnownCustomerCredential.xml
new file mode 100644
index 0000000..f4d2a0c
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/KnownCustomerCredential.xml
@@ -0,0 +1,40 @@
+// :snippet-start: knownCustomerCredentialMavenPackage
+
+
+ mavenCentral
+ https://repo1.maven.org/maven2/
+
+
+ danubetech-maven-public
+ https://repo.danubetech.com/repository/maven-public/
+
+
+
+
+
+ xyz.block
+ web5-credentials
+ 0.0.11
+
+
+ xyz.block
+ web5-dids
+ 0.0.11
+
+
+ io.ktor
+ ktor-client-core
+ 2.3.9
+
+
+ io.ktor
+ ktor-client-cio
+ 2.3.9
+
+
+ com.nimbusds
+ nimbus-jose-jwt
+ 9.15.2
+
+
+// :snippet-end:
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/KnownCustomerCredentialWalletTest.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/KnownCustomerCredentialWalletTest.kt
new file mode 100644
index 0000000..cb0af6e
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/KnownCustomerCredentialWalletTest.kt
@@ -0,0 +1,615 @@
+package website.tbd.developer.site.docs.tbdex
+
+
+import org.junit.jupiter.api.Assertions.*
+import com.nimbusds.jwt.JWTParser
+import io.ktor.server.routing.*
+import io.ktor.server.application.*
+import io.ktor.server.response.*
+import io.ktor.http.*
+import io.ktor.client.*
+import io.ktor.client.request.*
+import io.ktor.client.statement.*
+import io.ktor.http.*
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.assertDoesNotThrow
+import web5.sdk.dids.did.BearerDid
+import java.net.URL
+import com.nimbusds.jwt.JWTClaimsSet
+import java.net.HttpURLConnection
+import web5.sdk.credentials.VerifiableCredential
+
+// :prepend-start: knownCustomerCredentialhandleSiopRequestWalletKT
+import web5.sdk.credentials.PresentationExchange
+import web5.sdk.jose.jwt.Jwt
+import web5.sdk.credentials.VerifiablePresentation
+import web5.sdk.credentials.model.PresentationDefinitionV2
+import web5.sdk.jose.jwt.JwtClaimsSet
+// :prepend-end:
+
+import web5.sdk.crypto.InMemoryKeyManager
+import web5.sdk.dids.methods.dht.CreateDidDhtOptions
+
+// :prepend-start: knownCustomerCredentialResolveIssuerDidKT
+import web5.sdk.dids.methods.dht.DidDht
+import web5.sdk.dids.methods.jwk.DidJwk
+import web5.sdk.dids.DidResolvers
+// :prepend-end:
+
+import kotlinx.coroutines.delay
+import java.security.SignatureException
+import io.ktor.server.routing.*
+import io.ktor.server.application.*
+import io.ktor.server.response.*
+import io.ktor.server.request.*
+import io.ktor.client.statement.*
+import kotlinx.serialization.json.jsonPrimitive
+
+import java.util.concurrent.ConcurrentHashMap
+import java.text.SimpleDateFormat
+import java.util.Date
+import java.net.URLEncoder
+import kotlinx.serialization.json.Json
+import kotlinx.serialization.json.JsonObject
+import kotlinx.serialization.json.add
+import kotlinx.serialization.json.addJsonObject
+import kotlinx.serialization.json.buildJsonArray
+import kotlinx.serialization.json.buildJsonObject
+import kotlinx.serialization.json.put
+import kotlinx.serialization.Serializable
+import java.util.UUID
+import kotlinx.serialization.json.*
+import java.net.URLDecoder
+import java.util.*
+import io.ktor.http.HttpStatusCode
+import kotlinx.coroutines.async
+import kotlinx.coroutines.coroutineScope
+import kotlinx.serialization.encodeToString
+import java.io.OutputStreamWriter
+
+import web5.sdk.credentials.model.FieldV2
+import web5.sdk.credentials.model.ConstraintsV2
+
+import web5.sdk.credentials.model.InputDescriptorV2
+import web5.sdk.credentials.model.PresentationSubmission
+import com.fasterxml.jackson.databind.ObjectMapper
+
+class KnownCustomerCredentialWalletTest {
+ val userBearerDid = DidDht.create(InMemoryKeyManager())
+ val issuerDid = DidDht.create(InMemoryKeyManager())
+ val issuerDidUri = issuerDid.uri
+
+ val nameCredentialJwt =
+ "eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byMwIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiSURDYXJkQ3JlZGVudGlhbFBhcnQxIl0sImlkIjoidXJuOnV1aWQ6NTdhNWU4ZWUtYmZlMC00YjQwLWJmMDAtZTA4MTY5ZDk5Y2Q1IiwiaXNzdWVyIjoiZGlkOmRodDpmYzZyNmJnNjl0Nms4dTl1OXN1NTNhYWY2anUxeGRwd2R6dXcza2p1OHNzYW1iM3Bwc3VvIiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMy0yMVQyMToyMTo1MVoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byIsImdpdmVuX25hbWUiOiJBbGljZSIsImZhbWlseV9uYW1lIjoiU21pdGgifX0sImlzcyI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byIsInN1YiI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byJ9.kt0rKEgZ1_U4eTUNDgUU9LzmFViHsx_1z6llfFAqCdpzwIsKKYbqfbtgckJDsoV9xqgG5TYAVPxeLo5hCAguDA";
+
+ val idCredentialJwt =
+ "eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byMwIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiSURDYXJkQ3JlZGVudGlhbFBhcnQyIl0sImlkIjoidXJuOnV1aWQ6YTM5ZmQ3NjgtNjVjMy00MDZhLWIwMGItMTg1MjIxM2ExYzhjIiwiaXNzdWVyIjoiZGlkOmRodDpmYzZyNmJnNjl0Nms4dTl1OXN1NTNhYWY2anUxeGRwd2R6dXcza2p1OHNzYW1iM3Bwc3VvIiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMy0yMVQyMToyMTo1MVoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byIsImJpcnRoZGF0ZSI6IjE5OTAtMDEtMDEiLCJuYXRpb25hbF9pZGVudGlmaWVyIjoiMTIzLTQ1LTY3ODkifX0sImlzcyI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byIsInN1YiI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byJ9.lQOBdE3LGQ_rLz69SQoI_auOsFpsOESBIbHNf9HpYTGYTT2aYw8WrKd1rXQuRqzgELcv92iWQRpWoVm193x3CQ";
+
+ val userVcJwts = listOf(nameCredentialJwt, idCredentialJwt)
+
+ val presentationDefinition = PresentationDefinitionV2(
+ id = "IDCardCredentials",
+ inputDescriptors = listOf(
+ // Given Name Verification
+ InputDescriptorV2(
+ id = "givenNameVerification",
+ purpose = "We need to verify your given name.",
+ constraints = ConstraintsV2(
+ fields = listOf(FieldV2(
+ path = listOf("$.vc.credentialSubject.given_name"),
+ filterJson = ObjectMapper().readTree("""{"type": "string"}""")
+ ))
+ )
+ ),
+ // Family Name Verification
+ InputDescriptorV2(
+ id = "familyNameVerification",
+ purpose = "We need to verify your family name.",
+ constraints = ConstraintsV2(
+ fields = listOf(FieldV2(
+ path = listOf("$.vc.credentialSubject.family_name"),
+ filterJson = ObjectMapper().readTree("""{"type": "string"}""")
+ ))
+ )
+ ),
+ // Birthdate Verification
+ InputDescriptorV2(
+ id = "birthdateVerification",
+ purpose = "We need to verify your birthdate.",
+ constraints = ConstraintsV2(
+ fields = listOf(FieldV2(
+ path = listOf("$.vc.credentialSubject.birthdate"),
+ filterJson = ObjectMapper().readTree("""{"type": "string", "format": "date"}""")
+ ))
+ )
+ ),
+ // National Identifier Verification
+ InputDescriptorV2(
+ id = "nationalIdentifierVerification",
+ purpose = "We need to verify your national identifier.",
+ constraints = ConstraintsV2(
+ fields = listOf(FieldV2(
+ path = listOf("$.vc.credentialSubject.national_identifier"),
+ filterJson = ObjectMapper().readTree("""{"type": "string"}""")
+ ))
+ )
+ )
+ )
+ )
+
+ @Test
+ fun `presentation exchange selects(), satisfies() and creates() VP`() {
+ val selectedCredentials = PresentationExchange.selectCredentials(
+ vcJwts = userVcJwts,
+ presentationDefinition = presentationDefinition
+ )
+ val presentationResult = PresentationExchange.createPresentationFromCredentials(
+ vcJwts = selectedCredentials,
+ presentationDefinition = presentationDefinition
+ )
+
+ val vp = VerifiablePresentation.create(
+ vcJwts = selectedCredentials,
+ holder = userBearerDid.uri,
+ additionalData = mapOf("presentation_submission" to presentationResult)
+ )
+
+ assertNotNull(selectedCredentials, "Selected credentials should not be null")
+ assertTrue(selectedCredentials is List<*>, "Selected credentials should be a list")
+ assertEquals(2, selectedCredentials.size, "Selected credentials should contain 2 items")
+ assertNotNull(vp, "Verifiable Presentation should not be null")
+ assertEquals(userBearerDid.uri, vp.holder, "Holder DID should match")
+ }
+
+ @Test
+ fun `JwtUtil sign() works with a valid payload and bearer DID`() {
+ val idTokenPayload = JwtClaimsSet.Builder()
+ .subject(userBearerDid.uri.toString())
+ .issuer(issuerDidUri)
+ .issueTime(System.currentTimeMillis() / 1000) // Issued time
+ .expirationTime((System.currentTimeMillis() / 1000) + 86400) // Expiration time
+ .build()
+
+ try {
+ val idToken = Jwt.sign(userBearerDid, idTokenPayload)
+
+ assertNotNull(idToken, "idtoken should not be null")
+ assertTrue(idToken.isNotEmpty(), "idtoken should not be empty")
+ } catch (e: Exception) {
+ fail("Signing should not throw an exception")
+ }
+ }
+
+ // :snippet-start: knownCustomerCredentialResolveIssuerDidKT
+ private suspend fun resolveIssuerDid(issuerDidUri: String): String {
+ try {
+ /****************************************
+ * Resolve DID & Get IDV Service Endpoint
+ ****************************************/
+ val resolvedDid = DidResolvers.resolve(issuerDidUri)
+ val didDocument = resolvedDid.didDocument ?: throw Exception(
+ "DID Document is null"
+ )
+
+ val idvService = didDocument.service?.find { service ->
+ service.type == "IDV"
+ } ?: throw Exception("IDV service not found in DID Document")
+
+ return idvService.serviceEndpoint.firstOrNull() ?: throw Exception(
+ "Service endpoint not found in IDV service"
+ )
+ } catch (error: Exception) {
+ throw Exception("Error resolving DID: ${error.message}")
+ }
+ }
+ // :snippet-end:
+
+ // :snippet-start: knownCustomerCredentialSendRequestToIdvServiceEndpointKT
+ private suspend fun sendRequestToIdvServiceEndpoint(idvServiceEndpoint: String)
+ = coroutineScope {
+ val client = HttpClient()
+
+ try {
+ val response: HttpResponse = client.get(idvServiceEndpoint)
+
+ if (response.status.value !in 200..299) {
+ throw Exception("Network response was not ok: ${response.status}")
+ }
+
+ val encodedSiopRequest = response.bodyAsText()
+ handleSiopRequest(encodedSiopRequest) // function shown in next step
+ } catch (error: Exception) {
+ throw Exception("There was a problem with the fetch operation: ${error.message}")
+ } finally {
+ client.close()
+ }
+ }
+ // :snippet-end:
+
+ // :snippet-start: knownCustomerCredentialhandleSiopRequestWalletKT
+ private suspend fun handleSiopRequest(encodedSiopRequest: String) {
+ /*******************************************************
+ * Decode the JAR from the encoded URI string
+ *******************************************************/
+ val params = encodedSiopRequest.split("&").associate {
+ val (key, value) = it.split("=")
+ key to URLDecoder.decode(value, "UTF-8")
+ }
+
+ val jwtRequest = params["request"] ?: throw Exception("JWT request missing in SIOP request")
+
+ /************************************************************
+ // Verify the JWT, decode its payload & Process SIOP Request
+ ************************************************************/
+ try {
+ VerifiableCredential.verify(jwtRequest)
+ } catch (e: Exception) {
+ throw Exception("Failed to verify JWT: ${e.message}")
+ }
+
+ val claimsSet = JWTParser.parse(jwtRequest).jwtClaimsSet
+ val payloadJson = Json.parseToJsonElement(claimsSet.toJSONObject().toString()).jsonObject
+
+ val siopRequest = payloadJson["request"]?.jsonObject ?: throw Exception("Request data not found in JWT payload")
+
+ val clientId = siopRequest["client_id"]?.jsonPrimitive?.content ?: throw Exception("Client ID missing in SIOP request")
+ val nonce = siopRequest["nonce"]?.jsonPrimitive?.content ?: throw Exception("Nonce missing in SIOP request")
+
+ /*******************************************************
+ * Generate & sign id_token
+ *******************************************************/
+ val idTokenPayload = JwtClaimsSet.Builder()
+ .subject(userBearerDid.uri) // user's DID string
+ .issuer(userBearerDid.uri)
+ .audience(clientId)
+ .issueTime(System.currentTimeMillis() / 1000) // Issued time
+ .expirationTime((System.currentTimeMillis() / 1000) + 86400) // Expiration time
+ .misc("nonce", nonce)
+ .build()
+
+ val idToken = try {
+ Jwt.sign(userBearerDid, idTokenPayload)
+ } catch (e: Exception) {
+ throw Exception("Failed to sign id_token: ${e.message}")
+ }
+
+ var vpToken: String? = null
+ if ("vp_token" in siopRequest["response_type"].toString()) {
+ /*******************************************************
+ * Parse the presentation definition from SIOP request
+ *******************************************************/
+ val presentationDefinition = Json.decodeFromString(
+ siopRequest["presentation_definition"].toString()
+ )
+
+ /*******************************************************
+ * Select Credentials based on the Presentation Definition
+ *******************************************************/
+ val selectedCredentials = PresentationExchange.selectCredentials(
+ vcJwts = userVcJwts, // Array of VC JWTs stored in the user's Wallet
+ presentationDefinition = presentationDefinition
+ )
+ try {
+ PresentationExchange.satisfiesPresentationDefinition(
+ vcJwts = selectedCredentials,
+ presentationDefinition = presentationDefinition
+ )
+ } catch (e: Exception) {
+ throw Exception("Presentation definition not satisfied: ${e.message}")
+ }
+
+ /*******************************************************
+ * Generate & sign vp_token
+ *******************************************************/
+ val presentationResult = PresentationExchange.createPresentationFromCredentials(
+ vcJwts = selectedCredentials,
+ presentationDefinition = presentationDefinition
+ )
+
+ val vp = VerifiablePresentation.create(
+ vcJwts = selectedCredentials,
+ holder = userBearerDid.uri,
+ additionalData = mapOf("presentation_submission" to presentationResult)
+ )
+
+ val vpClaims = JwtClaimsSet.Builder()
+ .subject(userBearerDid.uri)
+ .issuer(userBearerDid.uri)
+ .issueTime(System.currentTimeMillis() / 1000) // Issued time
+ .expirationTime((System.currentTimeMillis() / 1000) + 86400) // Expiration time
+ .misc("holder", vp.holder)
+ .misc("presentation_submission", presentationResult)
+ .build()
+
+ vpToken = try {
+ Jwt.sign(userBearerDid, vpClaims)
+ } catch (e: Exception) {
+ throw Exception("Failed to sign vp_token: ${e.message}")
+ }
+ }
+
+ /*******************************************************
+ * POST SIOPv2 Authorization response to the response_uri
+ *******************************************************/
+ val responsePayload = buildJsonObject {
+ put("id_token", idToken)
+ vpToken?.let { put("vp_token", it) }
+ }
+
+ val responseUri = siopRequest["response_uri"]?.jsonPrimitive?.content ?: throw Exception(
+ "Response URI missing in SIOP request"
+ )
+ postSiopResponse(responseUri, responsePayload.toString()) // function shown in next step
+ }
+// :snippet-end:
+
+ // :snippet-start: knownCustomerCredentialIssuerResponseClassKT
+ @Serializable
+ data class IssuerResponse(
+ val credential_offer: CredentialOffer? = null,
+ val url: String? = null
+ )
+
+ @Serializable
+ data class CredentialOffer(
+ val credential_issuer: String,
+ val credential_configuration_ids: List,
+ val grants: JsonObject
+ )
+ // :snippet-end:
+
+
+ // :snippet-start: knownCustomerCredentialpostSiopResponseKT
+ private suspend fun postSiopResponse(responseUri: String, responsePayload: String) {
+ val url = URL(responseUri)
+ val connection = url.openConnection() as HttpURLConnection
+ connection.requestMethod = "POST"
+ connection.setRequestProperty("Content-Type", "application/json; utf-8")
+ connection.setRequestProperty("Accept", "application/json")
+ connection.doOutput = true
+
+ try {
+ OutputStreamWriter(connection.outputStream).use { outputStreamWriter ->
+ outputStreamWriter.write(responsePayload)
+ outputStreamWriter.flush()
+ }
+
+ // Check for successful response code or throw error
+ if (connection.responseCode == HttpURLConnection.HTTP_OK) {
+ val response = connection.inputStream.bufferedReader().use { it.readText() }
+ val responseData = Json.decodeFromString(response)
+
+ handleIssuerResponse(responseData) // function shown in next step
+ } else {
+ throw Exception("Failed to send SIOP response. HTTP error code: ${connection.responseCode}")
+ }
+ } finally {
+ connection.disconnect()
+ }
+ }
+ // :snippet-end:
+
+ // :snippet-start: knownCustomerCredentialHandleIssuerResponseWalletKT
+ object WalletStorage {
+ var credentialIssuer: String? = null
+ var preAuthorizedCode: String? = null
+ var credentialEndpoint: String? = null
+ var tokenEndpoint: String? = null
+ var accessToken: String? = null
+ var cNonce: String? = null
+ }
+
+ private suspend fun handleIssuerResponse(issuerResponse: IssuerResponse) {
+ issuerResponse.credential_offer?.let { credentialOffer ->
+ val credentialIssuer = credentialOffer.credential_issuer
+ val preAuthorizedCode = credentialOffer.grants[
+ "urn:ietf:params:oauth:grant-type:pre-authorized_code"
+ ]?.jsonPrimitive?.content
+
+
+ /***********************************************************************
+ * Store the credential_issuer URL and pre_authorized_code for future use
+ ************************************************************************/
+ WalletStorage.credentialIssuer = credentialIssuer
+ WalletStorage.preAuthorizedCode = preAuthorizedCode
+
+ // Direct the user to this URL to complete their Identity Verification
+ issuerResponse.url?.let { url ->
+ openIdvForm(url)
+ } ?: fetchIssuerMetadata() // function shown in next step
+ }
+ }
+ // :snippet-end:
+
+ // dummy function for testing
+ private fun openIdvForm(url: String) {
+ println("Opening IDV form at URL: $url")
+ }
+
+ // :snippet-start: knownCustomerCredentialFetchIssuerMetadataWalletKT
+ private suspend fun fetchIssuerMetadata() {
+ val client = HttpClient()
+ val issuerMetadataUrl = "${WalletStorage.credentialIssuer}/.well-known/openid-credential-issuer"
+
+ try {
+ val httpResponse: HttpResponse = client.get(issuerMetadataUrl)
+ val responseText: String = httpResponse.bodyAsText()
+
+ val issuerMetadata = Json.parseToJsonElement(responseText).jsonObject
+ /**********************************************
+ * Store the credential endpoint for future use
+ **********************************************/
+ WalletStorage.credentialEndpoint = issuerMetadata[
+ "credential_endpoint"
+ ]?.jsonPrimitive?.content
+ ?: throw Exception("credential_endpoint is missing in issuer metadata")
+
+ fetchAuthServerMetadata() // function shown in next step
+ } catch (e: Exception) {
+ println("Error in fetching issuer metadata: ${e.message}")
+ } finally {
+ client.close()
+ }
+ }
+ // :snippet-end:
+
+ // :snippet-start: knownCustomerCredentialFetchAuthServerMetadataWalletKT
+ private suspend fun fetchAuthServerMetadata() {
+ val client = HttpClient()
+ val authServerMetadataUrl = "${WalletStorage.credentialIssuer}/.well-known/oauth-authorization-server"
+ try {
+ val httpResponse: HttpResponse = client.get(authServerMetadataUrl)
+ val responseText: String = httpResponse.bodyAsText()
+
+ val json = Json.parseToJsonElement(responseText).jsonObject
+ val tokenEndpoint = json["token_endpoint"]?.jsonPrimitive?.content
+
+ if (tokenEndpoint != null) {
+ /****************************************************
+ * Extract and store the token_endpoint for future use
+ *****************************************************/
+ WalletStorage.tokenEndpoint = tokenEndpoint
+
+ fetchAccessToken(
+ WalletStorage.preAuthorizedCode,
+ WalletStorage.tokenEndpoint) // function shown in next step
+ } else {
+ println("Token endpoint not found in the authorization server's metadata.")
+ }
+ } catch (e: Exception) {
+ println("Error in fetching authorization server metadata: ${e.message}")
+ } finally {
+ client.close()
+ }
+ }
+ // :snippet-end:
+
+ // :snippet-start: knownCustomerCredentialFetchAccessTokenWalletKT
+ private suspend fun fetchAccessToken(preAuthorizationCode: String?, tokenEndpoint: String?, retryDelay: Long = 10000L) {
+ val client = HttpClient()
+
+ val requestBody = buildJsonObject {
+ put("grant_type", "urn:ietf:params:oauth:grant-type:pre-authorized_code")
+ put("code", preAuthorizationCode)
+ put("client_id", userBearerDid.uri) // user's DID string
+ }
+
+ try {
+ val httpResponse: HttpResponse = client.post(tokenEndpoint ?:
+ throw IllegalArgumentException("tokenEndpoint cannot be null")
+ ) {
+ contentType(ContentType.Application.Json)
+ setBody(requestBody.toString())
+ }
+
+ if (!httpResponse.status.isSuccess()) {
+ throw Exception("HTTP error! Status: ${httpResponse.status}")
+ }
+
+ val responseText: String = httpResponse.bodyAsText()
+ val json = Json.parseToJsonElement(responseText).jsonObject
+
+ /*******************************************
+ * Handle the "authorization_pending" error
+ ********************************************/
+ json["error"]?.jsonPrimitive?.content?.let { error ->
+ if (error == "authorization_pending") {
+ displayNotification("Hang tight, we're still waiting for IDV to complete.")
+ delay(retryDelay)
+
+ return fetchAccessToken(preAuthorizationCode, tokenEndpoint, retryDelay)
+ } else {
+ throw Exception("Error from server: $error")
+ }
+ } ?: run {
+ /*************************************************
+ * Store the access token & c_nonce for future use
+ **************************************************/
+ WalletStorage.accessToken = json["access_token"]?.jsonPrimitive?.content
+ WalletStorage.cNonce = json["c_nonce"]?.jsonPrimitive?.content
+ WalletStorage.credentialEndpoint?.let { credentialEndpoint ->
+ WalletStorage.accessToken?.let { accessToken ->
+ requestKnownCustomerCredential(
+ credentialEndpoint,
+ accessToken) // function shown in next step
+ }
+ }
+
+ }
+ } catch (e: Exception) {
+ println("Error fetching access token: ${e.message}")
+ } finally {
+ client.close()
+ }
+ }
+ // :snippet-end:
+
+ private fun displayNotification(message: String) {
+ println(message)
+ }
+ private fun secureStoreCredential(credential: String) {
+ println("Credential securely stored: $credential")
+ }
+
+ // :snippet-start: knownCustomerCredentialRequestCredentialWalletKT
+ private suspend fun requestKnownCustomerCredential(credentialEndpoint: String?, accessToken: String?) {
+ val client = HttpClient()
+
+ val cNonce = WalletStorage.cNonce
+ if (cNonce == null) {
+ throw Exception("cNonce is missing in Wallet storage")
+ }
+
+ /*************************************************
+ * Construct & sign the JWT payload
+ **************************************************/
+ val jwtPayload = JwtClaimsSet.Builder()
+ .issuer(userBearerDid.uri) // user's DID string
+ .audience(issuerDidUri) // Issuer's DID string
+ .issueTime(System.currentTimeMillis() / 1000) // Issued time
+ .misc("nonce", cNonce)
+ .build()
+
+ credentialEndpoint?.let { endpoint ->
+ accessToken?.let { token ->
+ try {
+ val signedJwt = Jwt.sign(userBearerDid, jwtPayload)
+
+ val requestBody = buildJsonObject {
+ putJsonObject("proof") {
+ put("proof_type", "jwt")
+ put("jwt", signedJwt)
+ }
+ }
+
+ /*************************************************
+ * Request & securely store KCC
+ **************************************************/
+ val response: HttpResponse = client.post(endpoint) {
+ // Include the access token in the Authorization header
+ header(HttpHeaders.Authorization, "Bearer $token")
+ contentType(ContentType.Application.Json)
+ setBody(requestBody.toString())
+ }
+
+ if (!response.status.isSuccess()) {
+ throw Exception(
+ "Network response was not ok: ${response.status.description}"
+ )
+ }
+
+ val responseData = Json.parseToJsonElement(response.bodyAsText()).jsonObject
+ responseData["credential"]?.jsonPrimitive?.content?.let { signedKccJwt ->
+ secureStoreCredential(signedKccJwt)
+ } ?: throw Exception("Signed credential not found in the response")
+
+ } catch (e: Exception) {
+ println("Error requesting KCC: ${e.message}")
+ } finally {
+ client.close()
+ }
+ } ?: throw IllegalArgumentException("accessToken cannot be null")
+ } ?: throw IllegalArgumentException("credentialEndpoint cannot be null")
+ }
+ // :snippet-end:
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/kbc/KnownBusinessCredentialIssuerTest.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/kbc/KnownBusinessCredentialIssuerTest.kt
new file mode 100644
index 0000000..d288b10
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/kbc/KnownBusinessCredentialIssuerTest.kt
@@ -0,0 +1,157 @@
+package website.tbd.developer.site.docs.web5.build.verifiablecredentials
+
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.Assertions.*
+import web5.sdk.credentials.VerifiableCredential
+import web5.sdk.crypto.InMemoryKeyManager
+import web5.sdk.dids.methods.dht.DidDht
+import web5.sdk.dids.methods.dht.CreateDidDhtOptions
+import web5.sdk.dids.didcore.Service
+import java.time.Instant
+import web5.sdk.credentials.CredentialSchema
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import org.junit.jupiter.api.*
+import tbdex.sdk.protocol.Parser
+import tbdex.sdk.protocol.Validator
+import tbdex.sdk.protocol.models.*
+import web5.sdk.credentials.model.*
+import java.util.*
+
+
+/**
+ * Tests backing the KBC Issuance Guide
+ */
+internal class KbcIssuanceTest {
+ private val objectMapper = ObjectMapper()
+
+ val serviceToAdd = Service.Builder()
+ .id("pfi")
+ .type("PFI")
+ .serviceEndpoint(listOf("https://example.com/"))
+ .build()
+
+ val options = CreateDidDhtOptions(
+ publish = true,
+ services = listOf(serviceToAdd),
+ )
+
+ val pfiDid = DidDht.create(InMemoryKeyManager(), options)
+
+ @Test
+ fun `issue KBC`() {
+ val subjectDid = DidDht.create(InMemoryKeyManager(),options)
+ val subjectDidUri = subjectDid.uri
+ data class AdditionalData(
+ val exampleField: String = "exampleValue"
+ )
+ // :snippet-start: issueKbcKt
+ val kbc = VerifiableCredential.create(
+ issuer = pfiDid.uri, // Issuer's DID URI
+ subject = subjectDidUri, // Wallet app's DID URI
+ expirationDate = Date.from(Instant.parse("2025-09-30T12:34:56Z")), // Date the KBC should expire
+ data = AdditionalData(), // Custom attributes for the KBC
+ credentialSchema = CredentialSchema(
+ type = "JsonSchema", // Format type of the schema used for the KBC
+ id = "https://vc.schemas.host/kbc.schema.json" // URL to the schema used for the KBC
+ )
+ )
+ val signedKbc = kbc.sign(pfiDid)
+ // :snippet-end:
+ assertNotNull(kbc)
+ assertEquals(pfiDid.uri, kbc.issuer)
+ assertEquals(subjectDidUri, kbc.subject)
+
+ assertNotNull(signedKbc)
+ assertTrue(signedKbc.matches(Regex("^[a-zA-Z0-9-_]+\\.[a-zA-Z0-9-_]+\\.[a-zA-Z0-9-_]+$")))
+ }
+ @Test
+ fun `Required claims in Known Business Credential`() {
+ // :snippet-start: kbcPresentationDefinitionKt
+ val pd = PresentationDefinitionV2(
+ id = "presentation-definition-kbc", // required unique id for presentation definition
+ name = "KYB Verification",
+ purpose = "Verifying your business status.",
+ format = Format(
+ jwtVc = JwtObject(
+ alg = listOf("ES256K", "EdDSA")
+ )
+ ),
+ inputDescriptors = listOf(
+ InputDescriptorV2(
+ id = "known-business-credential_1", // required unique id for the input descriptor
+ name = "Known Business Credential",
+ purpose = "Please present your Known Business Credential for verification.",
+ constraints = ConstraintsV2(
+ fields = listOf(
+ FieldV2(
+ path = listOf("$.credentialSchema.id"),
+ filterJson = objectMapper.readTree(
+ """
+ {
+ "type": "string",
+ "const": "https://vc.schemas.host/kbc.schema.json"
+ }
+ """.trimIndent()
+ ),
+ ),
+ FieldV2(
+ path = listOf("$.issuer"),
+ filterJson = objectMapper.readTree(
+ """
+ {
+ "type": "string",
+ "const": "${pfiDid.uri}"
+ }
+ """.trimIndent()
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ // :snippet-end:
+
+ try {
+ // :snippet-start: kbcCreateOfferingKt
+ val offering = Offering.create(
+ from = pfiDid.uri,
+ data = OfferingData(
+ description = "Selling BTC for USD",
+ payin = PayinDetails(
+ currencyCode = "USD",
+ max = "100.00",
+ methods = listOf(
+ PayinMethod(
+ description = "Pay in via Debit Card, Apple Pay, or CashApp Pay",
+ kind = "PAYMENT_LINK",
+ name = "Debit Card, ApplePay, CashApp Pay"
+ )
+ )
+ ),
+ payout = PayoutDetails(
+ currencyCode = "BTC",
+ methods = listOf(
+ PayoutMethod(
+ kind = "BTC_ADDRESS",
+ estimatedSettlementTime = 60,
+ fee = "0.25"
+ )
+ )
+ ),
+ payoutUnitsPerPayinUnit = "0.00003826",
+ // highlight-next-line
+ requiredClaims = pd
+ )
+ )
+
+ offering.sign(pfiDid)
+ Validator.validate(Parser.parseResourceToJsonNode(offering.toString()), "resource")
+ // :snippet-end:
+ } catch (e: Exception) {
+ Assertions.fail(e.message)
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/kcc/KnownCustomerCredentialIssuerTest.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/kcc/KnownCustomerCredentialIssuerTest.kt
new file mode 100644
index 0000000..1f8156c
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/issuer/kcc/KnownCustomerCredentialIssuerTest.kt
@@ -0,0 +1,666 @@
+package website.tbd.developer.site.docs.tbdex
+
+
+import web5.sdk.jose.jwt.JwtClaimsSet
+import org.junit.jupiter.api.Assertions.*
+import com.nimbusds.jwt.JWTParser
+import io.ktor.server.routing.*
+import io.ktor.server.application.*
+import io.ktor.server.response.*
+import io.ktor.server.request.*
+import io.ktor.http.*
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.assertDoesNotThrow
+import web5.sdk.dids.did.BearerDid
+import web5.sdk.credentials.VerifiableCredential
+// :prepend-start: KnownCustomerCredentialsClassKT
+import web5.sdk.credentials.CredentialSchema
+// :prepend-end:
+import web5.sdk.jose.jwt.Jwt
+import web5.sdk.crypto.InMemoryKeyManager
+import web5.sdk.dids.methods.dht.CreateDidDhtOptions
+import web5.sdk.dids.methods.dht.DidDht
+import java.security.SignatureException
+import io.ktor.server.routing.*
+import io.ktor.server.application.*
+import io.ktor.server.response.*
+import io.ktor.server.request.*
+import io.ktor.http.*
+
+import kotlinx.serialization.json.*
+import java.util.concurrent.ConcurrentHashMap
+import java.text.SimpleDateFormat
+import java.util.Date
+import java.net.URLEncoder
+import kotlinx.serialization.json.Json
+import kotlinx.serialization.json.JsonObject
+import kotlinx.serialization.json.add
+import kotlinx.serialization.json.addJsonObject
+import kotlinx.serialization.json.buildJsonArray
+import kotlinx.serialization.json.buildJsonObject
+import kotlinx.serialization.json.put
+import java.util.UUID
+import io.ktor.http.HttpStatusCode
+
+
+class KnownCustomerCredentialIssuerTest {
+
+ // :snippet-start: KnownCustomerCredentialsClassKT
+ data class KccCredential(val countryOfResidence: String, val tier: String?, val jurisdiction: String?)
+ data class Evidence(val kind: String, val checks: List)
+ // :snippet-end:
+
+ /*
+ Have to add tests separately because the big snippets are
+ contained within the ktor app and the objects within
+ are outside of the function's scope to be tested
+ */
+
+ @Test
+ fun `create() creates credential & sign() creates JWT`() {
+ val issuerBearerDid = generateTestDid()
+ val customerBearerDid = generateTestDid()
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
+ val expirationDate: Date = dateFormat.parse("2026-05-19T08:02:04Z")
+ val evidence = listOf(
+ Evidence(
+ kind = "document_verification",
+ checks = listOf("passport", "utility_bill")
+ ),
+ Evidence(
+ kind = "sanction_screening",
+ checks = listOf("PEP")
+ )
+ )
+
+ val knownCustomerCredential = VerifiableCredential.create(
+ type = "VerifiableCredential",
+ issuer = issuerBearerDid.uri.toString(),
+ subject = customerBearerDid.uri.toString(),
+ expirationDate = expirationDate,
+ data = KccCredential("US" , "Gold", "US"),
+ evidence = evidence,
+ credentialSchema = CredentialSchema(
+ id = "https://vc.schemas.host/kcc.schema.json",
+ type = "JsonSchema"
+ ),
+ )
+
+ val credentialToken = knownCustomerCredential.sign(issuerBearerDid)
+
+ assertTrue(credentialToken.isNotEmpty(), "The signed credential should not be an empty string.")
+ }
+
+ @Test
+ fun `JwtUtil sign() works with a valid payload and bearer DID`() {
+ val issuerBearerDid = generateTestDid()
+ val customerBearerDid = generateTestDid()
+ val currentTimeInSeconds = System.currentTimeMillis() / 1000
+ val expirationTimeInSeconds = currentTimeInSeconds + 86400
+
+ val accessTokenPayload = JwtClaimsSet.Builder()
+ .subject(customerBearerDid.uri.toString())
+ .issuer(issuerBearerDid.uri.toString())
+ .issueTime(currentTimeInSeconds)
+ .expirationTime(expirationTimeInSeconds)
+ .build()
+
+ try {
+ val accessToken = Jwt.sign(issuerBearerDid, accessTokenPayload)
+
+ assertNotNull(accessToken, "Access token should not be null")
+ assertTrue(accessToken.isNotEmpty(), "Access token should not be empty")
+ } catch (e: Exception) {
+ fail("Signing should not throw an exception")
+ }
+ }
+
+ @Test
+ fun `verify() does not throw an exception for a valid JWT`() {
+ val validJwt = "eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa3djSmkzeVVONDJFZ1N2cmNHRlFyQzRKY1pkenlWWkhQOVdmMXFRZWRuVlRQI3o2TWt3Y0ppM3lVTjQyRWdTdnJjR0ZRckM0SmNaZHp5VlpIUDlXZjFxUWVkblZUUCJ9.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiSWRlbnRpZmljYXRpb25DcmVkZW50aWFsIl0sImlkIjoidXJuOnV1aWQ6MDQ3ZTg0ZWItY2NhMS00NjFlLWFjZjAtMGMyZGE5ZDczOTNhIiwiaXNzdWVyIjoiZGlkOmtleTp6Nk1rd2NKaTN5VU40MkVnU3ZyY0dGUXJDNEpjWmR6eVZaSFA5V2YxcVFlZG5WVFAiLCJpc3N1YW5jZURhdGUiOiIyMDI0LTAyLTE1VDE5OjMyOjE2WiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImlkIjoiZGlkOmtleTp6Nk1rd2NKaTN5VU40MkVnU3ZyY0dGUXJDNEpjWmR6eVZaSFA5V2YxcVFlZG5WVFAiLCJuYW1lIjoiam9obiJ9fSwiaXNzIjoiZGlkOmtleTp6Nk1rd2NKaTN5VU40MkVnU3ZyY0dGUXJDNEpjWmR6eVZaSFA5V2YxcVFlZG5WVFAiLCJzdWIiOiJkaWQ6a2V5Ono2TWt3Y0ppM3lVTjQyRWdTdnJjR0ZRckM0SmNaZHp5VlpIUDlXZjFxUWVkblZUUCJ9.7oFAPckx-vxCbbzKSk9bU7eXlnjBFvMborl9woHCbcvWaLt0LvTRuDfvGDPC24V9D1K5OFpTnnBiN5jtIOmbBg"
+
+ assertDoesNotThrow {
+ VerifiableCredential.verify(validJwt)
+ }
+ }
+
+ private fun generateTestDid(): BearerDid {
+ val issuerDid = DidDht.create(InMemoryKeyManager(), CreateDidDhtOptions(publish = true))
+ return issuerDid
+ }
+
+ private fun validateSignedCNonce(jwt: String, expectedNonce: String, customersDidUri: String): Boolean {
+ return true
+ }
+
+ private fun checkIDVStatus(customersDidUri: String): Boolean {
+ return true
+ }
+
+ private fun generateUniquePreAuthCode(): String {
+ return UUID.randomUUID().toString()
+ }
+
+ private fun generateCNonce(): String {
+ return UUID.randomUUID().toString()
+ }
+
+ private fun Application.configureRouting() {
+ val issuerBearerDid = generateTestDid()
+ val customerBearerDid = generateTestDid()
+
+ routing {
+ // :snippet-start: siopv2InitiateId_tokenEndpointIssuerKT
+ get("/idv/siopv2/initiate") {
+ val siopRequestOnlyIdToken = mapOf(
+ "client_id" to "did:dht:issuer7ufcbgnnc4ikkfpd8b1u9on1b1n7k7wdcapbgo", // Issuer's Decentralized Identifier
+ "scope" to "openid", // Standard OpenID Connect scope
+ "response_type" to "id_token", // Only requesting an ID Token
+ "response_uri" to "https://issuer.example.com/siopv2/response", // Endpoint for SIOP response delivery
+ "response_mode" to "direct_post", // Delivery method of the SIOP response
+ "nonce" to "n-0S6_WzA2Mj" // Unique string to link the request and response
+ // Note: No presentation_definition is included, as we're not requesting a vp_token
+ )
+
+ // Encode and send the SIOPv2 Authorization Request
+ call.respondText(
+ "SIOP Request: $siopRequestOnlyIdToken",
+ contentType = ContentType.Application.Json
+ )
+ }
+ // :snippet-end:
+
+ // :snippet-start: siopv2InitiateId_tokenAndVp_tokenEndpointIssuerKT
+ get("/idv/siopv2/initiate") {
+ // Construct the SIOPv2 Authorization Request
+ val siopRequest = buildJsonObject {
+ put("client_id", "did:dht:issuer7ufcbgnnc4ikkfpd8b1u9on1b1n7k7wdcapbgo") // Issuer's Decentralized Identifier
+ put("scope", "openid") // Standard OpenID Connect scope
+ put("response_type", "id_token vp_token") // Expected response formats
+ put("response_uri", "https://issuer.example.com/siopv2/response") // Endpoint for SIOP response
+ put("response_mode", "direct_post") // Delivery method of the SIOP response
+ put("nonce", "n-0S6_WzA2Mj") // Unique string to link the request and response
+
+ val clientMetadata = buildJsonObject {
+ put("subject_syntax_types_supported", "did:dht did:jwk")
+ put("client_name", "Issuance Service Name")
+ put("client_uri", "https://issuer.example.com")
+ put("logo_uri", "https://issuer.example.com/logo.png")
+ put("tos_uri", "https://issuer.example.com/tos")
+ put("policy_uri", "https://issuer.example.com/privacy")
+ }
+
+ val inputDescriptors = buildJsonArray {
+ addJsonObject {
+ put("id", "IDCardCredential")
+ val schema = buildJsonObject {
+ put("uri", buildJsonArray {
+ add("https://www.w3.org/2018/credentials#VerifiableCredential")
+ add("https://www.w3.org/2018/credentials/examples/v1#IDCardCredential")
+ })
+ put("name", "ID Card Credential")
+ put("purpose", "We need to verify your identity.")
+ }
+ put("schema", schema)
+ val constraints = buildJsonObject {
+ val fields = buildJsonArray {
+ addJsonObject {
+ put("path", buildJsonArray {
+ add("$.vc.credentialSubject.given_name")
+ })
+ put("purpose", "The given name on your ID card.")
+ }
+ addJsonObject {
+ put("path", buildJsonArray {
+ add("$.vc.credentialSubject.family_name")
+ })
+ put("purpose", "The family name on your ID card.")
+ }
+ addJsonObject {
+ put("path", buildJsonArray {
+ add("$.vc.credentialSubject.birthdate")
+ })
+ put("purpose", "Your birth date.")
+ }
+ addJsonObject {
+ put("path", buildJsonArray {
+ add("$.vc.credentialSubject.national_identifier")
+ })
+ put("purpose", "Your national identifier.")
+ }
+ }
+ put("fields", fields)
+ }
+ put("constraints", constraints)
+ }
+ }
+ val presentationDefinition = buildJsonObject {
+ put("id", "IDCardCredentials")
+ put("input_descriptors", inputDescriptors)
+ }
+ put("presentation_definition", presentationDefinition)
+ put("client_metadata", clientMetadata)
+ }
+
+ // Encode and send the SIOPv2 Authorization Request
+ }
+ // :snippet-end:
+
+ // :snippet-start: encodeSiopv2AuthRequestIssuerKT
+ get("/idv/siopv2/initiate") {
+ // Construct the SIOPv2 Authorization Request
+ val siopRequest = buildJsonObject {
+ put("client_id", "did:dht:issuer7ufcbgnnc4ikkfpd8b1u9on1b1n7k7wdcapbgo") // Issuer's Decentralized Identifier
+ put("scope", "openid") // Standard OpenID Connect scope
+ put("response_type", "id_token vp_token") // Expected response formats
+ put("response_uri", "https://issuer.example.com/siopv2/response") // Endpoint for SIOP response
+ put("response_mode", "direct_post") // Delivery method of the SIOP response
+ put("nonce", "n-0S6_WzA2Mj") // Unique string to link the request and response
+
+ val clientMetadata = buildJsonObject {
+ put("subject_syntax_types_supported", "did:dht did:jwk")
+ put("client_name", "Issuance Service Name")
+ put("client_uri", "https://issuer.example.com")
+ put("logo_uri", "https://issuer.example.com/logo.png")
+ put("tos_uri", "https://issuer.example.com/tos")
+ put("policy_uri", "https://issuer.example.com/privacy")
+ }
+
+ val inputDescriptors = buildJsonArray {
+ addJsonObject {
+ put("id", "IDCardCredential")
+ val schema = buildJsonObject {
+ put("uri", buildJsonArray {
+ add("https://www.w3.org/2018/credentials#VerifiableCredential")
+ add("https://www.w3.org/2018/credentials/examples/v1#IDCardCredential")
+ })
+ put("name", "ID Card Credential")
+ put("purpose", "We need to verify your identity.")
+ }
+ put("schema", schema)
+ val constraints = buildJsonObject {
+ val fields = buildJsonArray {
+ addJsonObject {
+ put("path", buildJsonArray {
+ add("$.vc.credentialSubject.given_name")
+ })
+ put("purpose", "The given name on your ID card.")
+ }
+ addJsonObject {
+ put("path", buildJsonArray {
+ add("$.vc.credentialSubject.family_name")
+ })
+ put("purpose", "The family name on your ID card.")
+ }
+ addJsonObject {
+ put("path", buildJsonArray {
+ add("$.vc.credentialSubject.birthdate")
+ })
+ put("purpose", "Your birth date.")
+ }
+ addJsonObject {
+ put("path", buildJsonArray {
+ add("$.vc.credentialSubject.national_identifier")
+ })
+ put("purpose", "Your national identifier.")
+ }
+ }
+ put("fields", fields)
+ }
+ put("constraints", constraints)
+ }
+ }
+ val presentationDefinition = buildJsonObject {
+ put("id", "IDCardCredentials")
+ put("input_descriptors", inputDescriptors)
+ }
+ put("presentation_definition", presentationDefinition)
+ put("client_metadata", clientMetadata)
+ }
+ //highlight-start
+ // Sign the SIOPv2 Auth Request
+ val siopRequestJwtPayload = JwtClaimsSet.Builder()
+ .subject(issuerBearerDid.uri) // Issuer's DID
+ .issuer(issuerBearerDid.uri) // Issuer's DID
+ .issueTime(System.currentTimeMillis() / 1000) // Issued time
+ .expirationTime((System.currentTimeMillis() / 1000) + 86400) // Expiration time
+ .misc("request", siopRequest.toString()) // Embed the SIOPv2 Auth request payload
+ .build()
+
+ try {
+ val jwtToken = Jwt.sign(issuerBearerDid, siopRequestJwtPayload)
+ // Send the SIOPv2 Auth Request in JAR format
+ val queryString = "client_id=${URLEncoder.encode(issuerBearerDid.uri.toString(), "UTF-8")}&request=${URLEncoder.encode(jwtToken, "UTF-8")}"
+
+ call.respondText(queryString, ContentType.Text.Plain)
+ } catch (err: Exception) {
+ println("Error signing the SIOPv2 request: ${err.message}")
+ call.respond(HttpStatusCode.InternalServerError, "Failed to generate JWT for SIOPv2 Authorization Request")
+ }
+ //highlight-end
+ }
+ // :snippet-end:
+
+ // :snippet-start: siopv2ResponseEndpointIssuerKT
+ val preAuthCodeToDidMap = ConcurrentHashMap()
+
+ post("/siopv2/response") {
+ val walletResponse = call.receive() // The SIOPv2 Authorization Response from the Wallet
+
+ /************************************************************************
+ * Extract and verify the ID Token from the Wallet's response
+ ************************************************************************/
+ try {
+ val compactIdToken = walletResponse["id_token"]?.jsonPrimitive?.content
+ if (compactIdToken == null) {
+ call.respond(HttpStatusCode.BadRequest, mapOf("message" to "Missing ID Token"))
+ return@post
+ }
+ VerifiableCredential.verify(compactIdToken)
+
+ /************************************************************************
+ * Extract customer's DID from verification result
+ ************************************************************************/
+ val claimsSet = JWTParser.parse(compactIdToken).jwtClaimsSet
+ val customersDidUri = claimsSet.subject ?: run {
+ call.respond(HttpStatusCode.BadRequest, mapOf("error" to "Invalid ID Token"))
+ return@post
+ }
+ // Perform additional checks (e.g., nonce, audience, expiration)
+
+ val preAuthCode = generateUniquePreAuthCode()
+ preAuthCodeToDidMap[preAuthCode] = customersDidUri // needed for subsequent '/token' endpoint
+
+ /********************************************************************
+ * Define the initial structure for the Identity Verification Request
+ ********************************************************************/
+
+ var idvRequest = buildJsonObject {
+ putJsonObject("credential_offer") {
+ put("credential_issuer", "https://issuer.example.com")
+ putJsonArray("credential_configuration_ids") {
+ add("knownCustomerCredential-basic")
+ add("knownCustomerCredential-extended")
+ }
+ putJsonObject("grants") {
+ put(
+ "urn:ietf:params:oauth:grant-type:pre-authorized_code",
+ preAuthCode
+ )
+ }
+ }
+ }
+
+ var isVPValidIDV = false
+ if (walletResponse.containsKey("vp_token")) {
+ val compactVpToken = walletResponse["vp_token"]?.jsonPrimitive?.content
+ val vpTokenVerificationResult = VerifiableCredential.verify(
+ compactVpToken ?: ""
+ )
+
+ isVPValidIDV = true
+ }
+
+ /********************************************************************
+ * If vp_token is not present include `url` for IDV form
+ ********************************************************************/
+
+ if (!isVPValidIDV) {
+ idvRequest = idvRequest.toMutableMap().apply {
+ put("url", JsonPrimitive("https://issuer.example.com/idv/form"))
+ }.let { buildJsonObject { it.forEach { key, value -> put(key, value) } } }
+ }
+
+ call.respond(HttpStatusCode.OK, idvRequest)
+ } catch (error: Exception) {
+ /************************************************************************
+ * Handle verification errors
+ ************************************************************************/
+ call.respond(HttpStatusCode.Unauthorized, mapOf(
+ "errors" to listOf("Invalid token", error.message)
+ ))
+ }
+ }
+ // :snippet-end:
+
+ // :snippet-start: wellKnownIssuerMetadataEndpointIssuerKT
+ get("/.well-known/openid-credential-issuer") {
+ val issuerMetadata = buildJsonObject {
+ put("credential_issuer", "https://issuer.example.com")
+ put("credential_endpoint", "https://issuer.example.com/credentials")
+ // type of credentials Issuer supports and what credential will look like
+ putJsonObject("credential_configurations_supported") {
+ putJsonObject("KnownCustomerCredential") {
+ put("format", "jwt_vc_json")
+ put("scope", "CustomerIdentity")
+ putJsonArray("cryptographic_binding_methods_supported") {
+ add("did:example")
+ }
+ putJsonArray("credential_signing_alg_values_supported") {
+ add("ES256")
+ }
+ putJsonObject("credential_definition") {
+ putJsonArray("type") {
+ add("VerifiableCredential")
+ add("KnownCustomerCredential")
+ }
+ putJsonObject("credentialSubject") {
+ putJsonObject("country") {
+ putJsonArray("display") {
+ addJsonObject {
+ put("name", "Country")
+ put("locale", "en-US")
+ }
+ }
+ }
+ }
+ }
+ putJsonObject("proof_types_supported") {
+ putJsonObject("jwt") {
+ putJsonArray("proof_signing_alg_values_supported") {
+ add("ES256")
+ }
+ }
+ }
+ putJsonArray("display") {
+ addJsonObject {
+ put("name", "Known Customer Credential")
+ put("locale", "en-US")
+ putJsonObject("logo") {
+ put("url", "https://issuer.example.com/public/logo.png")
+ put("alt_text", "Issuer Logo")
+ }
+ put("background_color", "#FFFFFF")
+ put("text_color", "#000000")
+ }
+ }
+ }
+ }
+ }
+ call.respond(HttpStatusCode.OK, issuerMetadata)
+ }
+ // :snippet-end:
+
+ // :snippet-start: wellKnownAuthorizationServerEndpointIssuerKT
+ get("/.well-known/oauth-authorization-server") {
+ val oauthAuthorizationServerMetadata = buildJsonObject {
+ put("issuer", "https://issuer.example.com") // URL of the Credential Issuer
+ put("token_endpoint", "https://issuer.example.com/token") // URL for the Access Token Request
+ }
+ call.respond(HttpStatusCode.OK, oauthAuthorizationServerMetadata)
+ }
+ // :snippet-end:
+
+ // :snippet-start:accessTokenEndpointIssuerKT
+ val accessTokenToCNonceMap = ConcurrentHashMap()
+
+ post("/token") {
+ val requestBody = call.receive()
+ val grantType = requestBody["grant_type"]
+ val code = requestBody["code"]
+
+ if (grantType != "urn:ietf:params:oauth:grant-type:pre-authorized_code") {
+ call.respond(HttpStatusCode.BadRequest, mapOf("error" to "unsupported_grant_type"))
+ return@post
+ }
+
+ val customersDidUri = preAuthCodeToDidMap[code]
+ if (customersDidUri == null) {
+ call.respond(HttpStatusCode.BadRequest, mapOf("error" to "invalid_grant"))
+ return@post
+ }
+
+ // Check the status of the IDV
+ val idvCompleted = checkIDVStatus(customersDidUri)
+ if (!idvCompleted) {
+ call.respond(HttpStatusCode.BadRequest, mapOf("error" to "authorization_pending"))
+ return@post
+ }
+
+ /*******************************************
+ Create the payload for the access token
+ ********************************************/
+ val accessTokenPayload = JwtClaimsSet.Builder()
+ .subject("did:dht:customer7ufcbgnnc4ikkfpd8b1u9on1b1n7k7wdcapbgo") // Customer's DID string
+ .issuer(issuerBearerDid.uri) // Issuer's DID string
+ .issueTime(System.currentTimeMillis() / 1000) // Issued time
+ .expirationTime((System.currentTimeMillis() / 1000) + 86400) // Expiration time
+ .build()
+
+ /*******************************************
+ sign accessToken and generate a c_nonce
+ ********************************************/
+ try {
+ val accessToken = Jwt.sign(issuerBearerDid, accessTokenPayload)
+ val cNonce = generateCNonce()
+ accessTokenToCNonceMap[accessToken] = cNonce
+
+ preAuthCodeToDidMap.remove(code)
+
+ call.respond(mapOf(
+ "access_token" to accessToken,
+ "token_type" to "bearer",
+ "expires_in" to 86400, // Token expiration time
+ "c_nonce" to cNonce, // Challenge nonce to be signed
+ "c_nonce_expires_in" to 86400 // cNonce expiration time
+ ))
+ } catch (error: Exception) {
+ call.respond(HttpStatusCode.InternalServerError, mapOf(
+ "error" to "internal_server_error",
+ "message" to error.message.toString()
+ ))
+ }
+ }
+ // :snippet-end:
+
+ // :snippet-start: knownCustomerCredentialEndpointIssuerKT
+ post("/credentials") {
+ try {
+ /*****************************************************************
+ * Extract and validate the access token from Authorization header
+ ******************************************************************/
+ val authHeader = call.request.headers["Authorization"]
+ if (authHeader.isNullOrEmpty()) {
+ call.respond(HttpStatusCode.Unauthorized, mapOf(
+ "errors" to listOf("Authorization header required")
+ ))
+ return@post
+ }
+
+ val tokenParts = authHeader.split("Bearer ")
+ if (tokenParts.size != 2) {
+ call.respond(HttpStatusCode.Unauthorized, mapOf(
+ "errors" to listOf("Authorization header format is Bearer ")
+ ))
+ return@post
+ }
+
+ val accessToken = tokenParts[1]
+ val storedCNonce = accessTokenToCNonceMap[accessToken]
+ if (storedCNonce == null) {
+ call.respond(HttpStatusCode.Unauthorized, mapOf(
+ "errors" to listOf("Invalid or expired access token")
+ ))
+ return@post
+ }
+
+ /********************************************************
+ * Extract and validate the JWT from the proof object
+ *********************************************************/
+ val requestBody = call.receive()
+ val proof = requestBody["proof"]?.jsonObject
+ val proofJwt = proof?.get("jwt")?.jsonPrimitive?.content
+
+ if (proof == null ||
+ proof["proof_type"]?.jsonPrimitive?.content != "jwt" ||
+ proofJwt.isNullOrEmpty()
+ ) {
+ call.respond(HttpStatusCode.BadRequest, mapOf("errors" to listOf("Invalid proof provided")))
+ return@post
+ }
+
+ VerifiableCredential.verify(proofJwt)
+ val claimsSet = JWTParser.parse(proofJwt).jwtClaimsSet
+ val customersDidUri = claimsSet.subject ?: ""
+ val nonceInProof = claimsSet.getStringClaim("nonce")
+
+ /***********************************************
+ * Validate the signed c_nonce
+ ************************************************/
+ if (storedCNonce == nonceInProof) {
+ accessTokenToCNonceMap.remove(accessToken)
+ } else {
+ call.respond(HttpStatusCode.Unauthorized, mapOf("errors" to listOf("Invalid nonce in proof")))
+ return@post
+ }
+
+ /***********************************************
+ * Create and sign the credential
+ ************************************************/
+ val evidence = listOf(
+ Evidence(
+ kind = "document_verification",
+ checks = listOf("passport", "utility_bill")
+ ),
+ Evidence(
+ kind = "sanction_screening",
+ checks = listOf("PEP")
+ )
+ )
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
+ val expirationDate: Date = dateFormat.parse("2026-05-19T08:02:04Z")
+
+ val knownCustomerCredential = VerifiableCredential.create(
+ type = "VerifiableCredential",
+ issuer = issuerBearerDid.uri, // Issuer's DID string
+ subject = customersDidUri, // Customer's DID string from the verified JWT
+ expirationDate = expirationDate,
+ evidence = evidence,
+ data = KccCredential(countryOfResidence = "US", tier = "Gold", jurisdiction = "US"),
+ credentialSchema = CredentialSchema(
+ id = "https://vc.schemas.host/kcc.schema.json",
+ type = "JsonSchema"
+ ),
+ )
+
+ val credentialToken = knownCustomerCredential.sign(
+ issuerBearerDid // Signing with the issuer's bearer DID
+ )
+
+ /***********************************************
+ * Respond with the signed credential
+ ************************************************/
+ call.respond(HttpStatusCode.OK, mapOf("credential" to credentialToken))
+ } catch (error: Exception) {
+ /***********************************************
+ * Generic error handling
+ ************************************************/
+ call.respond(HttpStatusCode.InternalServerError, mapOf(
+ "errors" to listOf("An unexpected error occurred: ${error.message}")
+ ))
+ }
+ }
+ // :snippet-end:
+ }
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/CreatingOfferingsTest.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/CreatingOfferingsTest.kt
new file mode 100644
index 0000000..7fc4b83
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/CreatingOfferingsTest.kt
@@ -0,0 +1,164 @@
+package website.tbd.developer.site.docs.tbdex.pfi
+
+import com.fasterxml.jackson.core.JsonParseException
+import com.fasterxml.jackson.databind.ObjectMapper
+import org.junit.jupiter.api.*
+import tbdex.sdk.protocol.Parser
+import tbdex.sdk.protocol.Validator
+import tbdex.sdk.protocol.models.*
+import tbdex.sdk.protocol.serialization.Json
+import web5.sdk.credentials.PresentationExchange
+import web5.sdk.credentials.model.*
+import website.tbd.developer.site.docs.utils.TestData
+
+class CreatingOfferingsTest {
+
+ private val pfiDid = TestData.PFI_DID
+ private lateinit var pd: PresentationDefinitionV2
+
+ @BeforeEach
+ fun setup() {
+ // :snippet-start: kccPresentationDefintionKt
+ val objectMapper = ObjectMapper()
+ pd = PresentationDefinitionV2(
+ id = "presentation-definition-kcc",
+ name = "KYC Verification",
+ purpose = "We need to verify your customer status and necessary checks.",
+ format = Format(
+ jwtVc = JwtObject(
+ alg = listOf( "ES256K", "EdDSA")
+ )
+ ),
+ inputDescriptors = listOf(
+ InputDescriptorV2(
+ id = "known-customer-credential",
+ name = "Known Customer Credential",
+ purpose = "Please present your Known Customer Credential for verification.",
+ constraints = ConstraintsV2(
+ fields = listOf(
+ FieldV2(
+ path = listOf("$.type[*]"),
+ filterJson = objectMapper.readTree(
+ """{"type": "string", "pattern": "KnownCustomerCredential"}"""
+ ),
+ ),
+ FieldV2(
+ path = listOf("$.evidence[*].kind"),
+ filterJson = objectMapper.readTree(
+ """{"type": "string", "pattern": "sanction_screening"}"""
+ )
+ ),
+ FieldV2(
+ path = listOf("$.credentialSubject.countryOfResidence"),
+ filterJson = objectMapper.readTree(
+ """{"type": "string", "const": "US"}"""
+ )
+ ),
+ FieldV2(
+ path = listOf("$.issuer"),
+ filterJson = objectMapper.readTree(
+ """{"type": "string", "const": "did:dht:d4sgiggd3dwimo4ubki7spo45q5dazxphrizbxhcgapapcnzpouy"}"""
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ // :snippet-end:
+ }
+
+ @Test
+ fun `Create Offering`() {
+ try {
+ // :snippet-start: pfiCreateOfferingKt
+ val offering = Offering.create(
+ from = pfiDid.uri,
+ protocol = "1.0",
+ data = OfferingData(
+ description = "Selling BTC for USD",
+ payin = PayinDetails(
+ currencyCode = "USD",
+ methods = listOf(
+ PayinMethod(
+ kind = "DEBIT_CARD",
+ requiredPaymentDetails = try {
+ Json.jsonMapper.readTree(
+ """
+ {
+ "${'$'}schema": "http://json-schema.org/draft-07/schema",
+ "type": "object",
+ "properties": {
+ "cardNumber": {
+ "type": "string",
+ "description": "The 16-digit debit card number",
+ "minLength": 16,
+ "maxLength": 16
+ },
+ "expiryDate": {
+ "type": "string",
+ "description": "The expiry date of the card in MM/YY format",
+ "pattern": "^(0[1-9]|1[0-2])\\/([0-9]{2})${'$'}"
+ },
+ "cardHolderName": {
+ "type": "string",
+ "description": "Name of the cardholder as it appears on the card"
+ },
+ "cvv": {
+ "type": "string",
+ "description": "The 3-digit CVV code",
+ "minLength": 3,
+ "maxLength": 3
+ }
+ }
+ }
+ """.trimIndent()
+ )
+ } catch (e: JsonParseException) {
+ throw IllegalArgumentException("unexpected character at offset ${e.location.charOffset}")
+ }
+ )
+ )
+ ),
+ payout = PayoutDetails(
+ currencyCode = "BTC",
+ methods = listOf(
+ PayoutMethod(
+ kind = "BTC_ADDRESS",
+ estimatedSettlementTime = 60,
+ fee = "0.25"
+ )
+ )
+ ),
+ payoutUnitsPerPayinUnit = "0.00003826",
+ requiredClaims = pd
+ )
+ )
+ // :snippet-end:
+
+ // :snippet-start: pfiSignOfferingKt
+ offering.sign(pfiDid)
+ // :snippet-end:
+
+ // :snippet-start: pfiValidateOfferingKt
+ Validator.validate(Parser.parseResourceToJsonNode(offering.toString()), "resource")
+ // :snippet-end:
+ }
+ catch (e: Exception){
+ Assertions.fail(e)
+ }
+ }
+
+ @Test
+ fun `Validate KCC PD`() {
+ try {
+ // :snippet-start: kccValidatePdKt
+ PresentationExchange.validateDefinition(
+ presentationDefinition = pd
+ )
+ // :snippet-end:
+ } catch (e: Exception) {
+ Assertions.fail(e)
+ }
+ }
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/CreatingQuotesTest.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/CreatingQuotesTest.kt
new file mode 100644
index 0000000..f912f04
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/CreatingQuotesTest.kt
@@ -0,0 +1,106 @@
+package website.tbd.developer.site.docs.tbdex.pfi
+
+import tbdex.sdk.protocol.models.Rfq
+import tbdex.sdk.protocol.models.Quote
+import tbdex.sdk.protocol.models.*
+import web5.sdk.dids.methods.dht.DidDht
+import web5.sdk.crypto.InMemoryKeyManager
+import web5.sdk.dids.did.BearerDid
+import java.time.OffsetDateTime
+import website.tbd.developer.site.docs.utils.*
+import web5.sdk.dids.didcore.Service
+import web5.sdk.dids.methods.dht.CreateDidDhtOptions
+import org.junit.jupiter.api.Assertions.*
+import org.junit.jupiter.api.*
+import java.time.OffsetDateTime.*
+
+class CreatingQuotesTest {
+
+ private lateinit var offeringsApiProvider: OfferingsApiProvider
+ private lateinit var exchangesApiProvider: ExchangesApiProvider
+ private lateinit var dataProvider: MockDataProvider
+ private lateinit var pfiDid: BearerDid
+ private lateinit var message: Message
+
+ @BeforeEach
+ fun setup() {
+ offeringsApiProvider = OfferingsApiProvider()
+ exchangesApiProvider = ExchangesApiProvider()
+ dataProvider = MockDataProvider()
+
+ val serviceToAdd = Service.Builder()
+ .id("pfi")
+ .type("PFI")
+ .serviceEndpoint(listOf("https://example.com/"))
+ .build()
+
+ val options = CreateDidDhtOptions(
+ publish = true,
+ services = listOf(serviceToAdd),
+ )
+
+ pfiDid = DidDht.create(InMemoryKeyManager(), options)
+
+ message = TestData.getRfq(to = pfiDid.uri)
+ }
+
+ @Test
+ fun `PFI creates and signs quote`() {
+ dataProvider.setupInsert("exchange", "") { arrayOf() }
+ offeringsApiProvider.setOffering(message.metadata.id, pfiDid)
+
+ // :snippet-start: pfiWriteOfferingKt
+ // Write the message to your exchanges database
+ val data = mapOf(
+ "exchangeid" to message.metadata.exchangeId,
+ "messagekind" to message.metadata.kind,
+ "messageid" to message.metadata.id,
+ "subject" to message.metadata.from,
+ "message" to message.data
+ )
+
+ dataProvider.insert("exchange", data)
+ //highlight-start
+ val offering = offeringsApiProvider.getOffering(message.metadata.id)
+ //highlight-end
+ // :snippet-end:
+
+ // :snippet-start: pfiCreateQuoteKt
+ val quote = Quote.create(
+ to = message.metadata.from,
+ from = pfiDid.uri,
+ exchangeId = message.metadata.exchangeId,
+ protocol = "1.0",
+ quoteData = QuoteData(
+ expiresAt = now().plusDays(10),
+ payin = QuoteDetails(
+ currencyCode = offering.data.payin.currencyCode,
+ amount = "250",
+ fee = "0.001",
+ paymentInstruction = PaymentInstruction(
+ link = "https://example.com/paymentInstructions",
+ instruction = "Detailed payout instructions"
+ )
+ ),
+ payout = QuoteDetails(
+ currencyCode = offering.data.payout.currencyCode,
+ amount = "1248.22",
+ paymentInstruction = PaymentInstruction(
+ link = "https://example.com/paymentInstructions",
+ instruction = "Detailed payout instructions"
+ )
+ )
+ )
+ )
+ // :snippet-end:
+
+ exchangesApiProvider.setWrite()
+
+ // :snippet-start: pfiSignQuoteKt
+ quote.sign(pfiDid)
+ exchangesApiProvider.write(quote)
+ // :snippet-end:
+
+ assertNotNull(quote.verify(), "Quote signature is invalid")
+ }
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/ExchangesApiProvider.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/ExchangesApiProvider.kt
new file mode 100644
index 0000000..b7fd78c
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/ExchangesApiProvider.kt
@@ -0,0 +1,27 @@
+package website.tbd.developer.site.docs.tbdex.pfi
+
+import website.tbd.developer.site.docs.utils.MockExchangesApiProvider
+import tbdex.sdk.protocol.models.Message
+
+class ExchangesApiProvider: MockExchangesApiProvider() {
+ // :snippet-start: pfiOverviewWriteKt
+ fun write(message: Message, replyTo: String = "") {
+ val data = mapOf(
+ "exchangeid" to message.metadata.exchangeId,
+ "messagekind" to message.metadata.kind,
+ "messageid" to message.metadata.id,
+ "subject" to message.metadata.from,
+ "message" to message.data
+ )
+ dataProvider.insert("exchange", data)
+
+ if (replyTo.isNotEmpty()) {
+ val callbackData = mapOf(
+ "exchangeId" to message.metadata.exchangeId,
+ "uri" to replyTo
+ )
+ dataProvider.insert("callbacks", replyTo)
+ }
+ }
+ // :snippet-end:
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/OfferingsApiProvider.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/OfferingsApiProvider.kt
new file mode 100644
index 0000000..2ddfbf0
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/OfferingsApiProvider.kt
@@ -0,0 +1,36 @@
+package website.tbd.developer.site.docs.tbdex.pfi
+
+import tbdex.sdk.protocol.models.*
+import website.tbd.developer.site.docs.utils.*
+
+class OfferingsApiProvider: MockOfferingsApiProvider() {
+
+ // :snippet-start: pfiOverviewReadOfferingsKt
+ override fun getOffering(id: String): Offering {
+ val result = dataProvider.get("offering", id) as String
+ return Offering.parse(result)
+ }
+
+ override fun getOfferings(): List {
+ val results = dataProvider.query("offering", "*")
+ val offerings = mutableListOf()
+
+ for (result in results) {
+ val offering = Offering.parse(result as String)
+ offerings.add(offering)
+ }
+
+ return offerings
+ }
+
+ fun setOffering(offering: Offering) {
+ val resource = mapOf(
+ "offeringid" to offering.metadata.id,
+ "payoutcurrency" to offering.data.payout.currencyCode,
+ "payincurrency" to offering.data.payin.currencyCode,
+ "offering" to offering.toString()
+ )
+ dataProvider.insert("offering", resource)
+ }
+ // :snippet-end:
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/PfiOnboardingTest.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/PfiOnboardingTest.kt
new file mode 100644
index 0000000..bed1099
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/PfiOnboardingTest.kt
@@ -0,0 +1,38 @@
+package website.tbd.developer.site.docs.tbdex.pfi
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Assertions.*
+
+// :snippet-start: pfiOnboardingImportsKt
+import web5.sdk.dids.methods.dht.CreateDidDhtOptions
+import web5.sdk.dids.methods.dht.DidDht
+import web5.sdk.dids.didcore.Service
+// :snippet-end:
+import web5.sdk.crypto.InMemoryKeyManager
+
+/**
+ * Tests for PFI Onboarding guide
+ */
+class PfiOnboardingTest {
+
+ @Test
+ fun `create PFI DID`() {
+ val keyManager = InMemoryKeyManager()
+ // :snippet-start: pfiOnboardingCreateDidKt
+ val serviceToAdd = Service.Builder()
+ .id("pfi")
+ .type("PFI")
+ .serviceEndpoint(listOf("https://example.com/"))
+ .build()
+
+ val options = CreateDidDhtOptions(
+ publish = true,
+ services = listOf(serviceToAdd),
+ )
+
+ val pfiDid = DidDht.create(keyManager, options)
+ // :snippet-end:
+
+ assertEquals("PFI", pfiDid.document.service?.get(0)?.type, "DID should start with 'did:dht'")
+ }
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/PfiStructureTest.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/PfiStructureTest.kt
new file mode 100644
index 0000000..4b7bb41
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/PfiStructureTest.kt
@@ -0,0 +1,91 @@
+package website.tbd.developer.site.docs.tbdex.pfi
+
+import tbdex.sdk.httpserver.TbdexHttpServer
+import tbdex.sdk.httpserver.TbdexHttpServerConfig
+import java.net.HttpURLConnection
+import java.net.URI
+import kotlin.concurrent.thread
+import website.tbd.developer.site.docs.utils.*
+import io.ktor.http.*
+import io.ktor.server.response.*
+import org.junit.jupiter.api.*
+import org.junit.jupiter.api.Assertions.*
+
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+class PfiStructureTest {
+
+ private val pfiDid = TestData.PFI_DID
+ private lateinit var tbDexServer: TbdexHttpServer
+ private lateinit var exchangesApiProvider: ExchangesApiProvider
+ private lateinit var offeringsApiProvider: OfferingsApiProvider
+
+ @BeforeAll
+ fun setup(): Unit {
+ // :snippet-start: pfiOverviewConfigKt
+ exchangesApiProvider = ExchangesApiProvider()
+ offeringsApiProvider = OfferingsApiProvider()
+
+ tbDexServer = TbdexHttpServer(TbdexHttpServerConfig(
+ port = 8080,
+ pfiDid = pfiDid.uri,
+ exchangesApi = exchangesApiProvider,
+ offeringsApi = offeringsApiProvider
+ ))
+ // :snippet-end:
+ }
+
+ @AfterAll
+ fun tearDown(): Unit {
+ tbDexServer.stop()
+ }
+
+ @Test
+ fun `PFI server is initialized`() {
+ assertNotNull(tbDexServer, "Server should not be null")
+ }
+
+ @Test
+ fun `PFI initializes routes`() {
+ // :snippet-start: pfiOverviewServerRoutesKt
+ tbDexServer.onCreateExchange { call, message, offering, replyTo ->
+ exchangesApiProvider.write(message, replyTo ?: "")
+ call.respond(HttpStatusCode.Accepted)
+ }
+
+ tbDexServer.onSubmitOrder { call, order ->
+ exchangesApiProvider.write(order)
+ call.respond(HttpStatusCode.Accepted)
+ }
+
+ tbDexServer.onSubmitClose { call, close ->
+ exchangesApiProvider.write(close)
+ call.respond(HttpStatusCode.Accepted)
+ }
+ // :snippet-end:
+
+ val actualCallbacks = tbDexServer.callbacks
+ assertNotNull(actualCallbacks.createExchange, "Should contain createExchange callback.")
+ assertNotNull(actualCallbacks.submitOrder, "Should contain submitOrder callback.")
+ assertNotNull(actualCallbacks.submitClose, "Should contain submitClose callback.")
+ }
+
+ @Test
+ fun `PFI server is started`() {
+ thread {
+ // :snippet-start: pfiOverviewServerStartKt
+ tbDexServer.start()
+ // :snippet-end:
+ }
+
+ // Delay to ensure the server has started
+ Thread.sleep(1000)
+
+ // Test calls against the server
+ val url = URI.create("http://localhost:8080/").toURL()
+ val connection = url.openConnection() as HttpURLConnection
+ connection.requestMethod = "GET"
+ connection.disconnect()
+
+ assertEquals(connection.responseCode, HttpURLConnection.HTTP_OK, "Server should be running")
+ }
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/ProcessingOrdersTest.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/ProcessingOrdersTest.kt
new file mode 100644
index 0000000..d7695e7
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/ProcessingOrdersTest.kt
@@ -0,0 +1,86 @@
+package website.tbd.developer.site.docs.tbdex.pfi
+
+import tbdex.sdk.protocol.models.Order
+import tbdex.sdk.protocol.models.OrderStatus
+import tbdex.sdk.protocol.models.OrderStatusData
+import tbdex.sdk.protocol.models.Close
+import tbdex.sdk.protocol.models.CloseData
+import website.tbd.developer.site.docs.utils.*
+import org.junit.jupiter.api.Assertions.*
+import org.junit.jupiter.api.*
+
+class ProcessingOrdersTest {
+
+ private lateinit var dataProvider: MockDataProvider
+ private val pfiDid = TestData.PFI_DID
+ private val customerDid = TestData.ALICE_DID
+ private lateinit var exchangesApiProvider: ExchangesApiProvider
+ private lateinit var orderMessage: Order
+
+ @BeforeEach
+ fun setup() {
+ dataProvider = MockDataProvider()
+ exchangesApiProvider = ExchangesApiProvider()
+
+ orderMessage = TestData.getOrder(
+ to = pfiDid.uri,
+ from = customerDid.uri
+ )
+ }
+
+ @Test
+ fun `PFI Accesses Private Data`() {
+ val rfq = TestData.getRfq()
+
+ // :snippet-start: pfiAccessPrivateDataKt
+ val creditCardNumber = rfq.privateData!!.payin!!.paymentDetails!!["cardNumber"]
+ // :snippet-end:
+
+ assertNotNull(creditCardNumber)
+ }
+ @Test
+ fun `PFI creates orderStatus and verifies it`() {
+ exchangesApiProvider.setWrite()
+
+ // :snippet-start: pfiOrderStatusKt
+ val orderStatus = OrderStatus.create(
+ from = pfiDid.uri,
+ to = orderMessage.metadata.from,
+ exchangeId = orderMessage.metadata.exchangeId,
+ protocol = "1.0",
+ orderStatusData = OrderStatusData("PROCESSING")
+ )
+
+ orderStatus.sign(pfiDid)
+ exchangesApiProvider.write(orderStatus)
+ // :snippet-end:
+
+ assertEquals(orderStatus.data.orderStatus, "PROCESSING", "OrderStatus was not correctly set")
+ assertNotNull(orderStatus.verify(), "OrderStatus signature is invalid")
+ }
+
+
+ @Test
+ fun `PFI creates Close and verifies it`() {
+ exchangesApiProvider.setWrite()
+
+ // :snippet-start: pfiCloseOrderKt
+ val closeMessage = Close.create(
+ to = orderMessage.metadata.from,
+ from = pfiDid.uri,
+ exchangeId = orderMessage.metadata.exchangeId,
+ protocol = "1.0",
+ closeData = CloseData(
+ reason = "COMPLETED",
+ success = true // Indicates the transaction was successful
+ )
+ )
+
+ closeMessage.sign(pfiDid)
+ exchangesApiProvider.write(closeMessage)
+ // :snippet-end:
+
+ assertEquals(closeMessage.data.reason, "COMPLETED", "Close reason was not correctly set")
+ assertNotNull(closeMessage.verify(), "Close signature is invalid")
+ }
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/required-sdks.gradle b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/required-sdks.gradle
new file mode 100644
index 0000000..52c00c6
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/required-sdks.gradle
@@ -0,0 +1,8 @@
+// :snippet-start: pfiSdkInstallGradle
+repositories {
+ mavenCentral()
+}
+dependencies {
+ implementation("xyz.block:tbdex:0.10.0-beta")
+}
+// :snippet-end:
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/required-sdks.xml b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/required-sdks.xml
new file mode 100644
index 0000000..2734be5
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/pfi/required-sdks.xml
@@ -0,0 +1,16 @@
+// :snippet-start: pfiSdkInstallPom
+
+
+ mavenCentral
+ https://repo1.maven.org/maven2/
+
+
+
+
+
+ xyz.block
+ tbdex
+ 0.10.0-beta
+
+
+// :snippet-end:
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/GetOfferingsTest.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/GetOfferingsTest.kt
new file mode 100644
index 0000000..fdc3782
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/GetOfferingsTest.kt
@@ -0,0 +1,78 @@
+
+package website.tbd.developer.site.docs.tbdex.wallet
+
+import okhttp3.mockwebserver.MockResponse
+import okhttp3.mockwebserver.MockWebServer
+import tbdex.sdk.httpclient.TbdexHttpClient
+import tbdex.sdk.protocol.models.Offering
+import tbdex.sdk.protocol.serialization.Json
+import java.net.HttpURLConnection
+import website.tbd.developer.site.docs.utils.*
+
+import org.junit.jupiter.api.*
+import org.junit.jupiter.api.Assertions.*
+
+/**
+ * Tests for Wallet: Get Offerings guide
+ */
+class GetOfferingsTest {
+
+ private lateinit var server: MockWebServer
+ private val pfi = TestData.PFI_DID
+ private val pfiDid = pfi.uri
+
+ @BeforeEach
+ fun setup() {
+ server = MockWebServer()
+ server.start(9000) // pfiDid resolves to http://localhost:9000
+
+ val offering = TestData.getOffering(pfiDid, TestData.getPresentationDefinition())
+ offering.sign(pfi)
+ val mockOfferings = listOf(offering)
+ val mockResponseString = Json.jsonMapper.writeValueAsString(mapOf("data" to mockOfferings))
+ server.enqueue(MockResponse().setBody(mockResponseString).setResponseCode(HttpURLConnection.HTTP_OK))
+ }
+
+ @AfterEach
+ fun tearDown() {
+ server.shutdown()
+ }
+
+ @Test
+ fun `get all offerings`() {
+ // :snippet-start: walletGetOfferingsKt
+ val offerings = TbdexHttpClient.getOfferings(pfiDid)
+ // :snippet-end:
+
+ assertNotEquals(0, offerings.size, "No offerings found from PFI")
+ }
+
+ @Test
+ fun `find matching offerings`() {
+ val pfiDids = arrayOf(pfiDid)
+
+ // :snippet-start: walletFindMatchingOfferingsKt
+ val payinCurrencyCode = "USD"; // Desired payin currency code
+ val payoutCurrencyCode = "KES"; // Desired payout currency code
+
+ val matchedOfferings = ArrayList() // Array to store the matched offerings
+
+ // Loop through the all PFIs in your network
+ for (pfiDid in pfiDids) {
+
+ // Makes a request to the PFI to get their offerings
+ val offerings = TbdexHttpClient.getOfferings(pfiDid)
+
+ // Filter offerings based on the currency pair
+ val filteredOfferings = offerings.filter { offering ->
+ offering.data.payin.currencyCode == payinCurrencyCode &&
+ offering.data.payout.currencyCode == payoutCurrencyCode
+ }
+
+ matchedOfferings.addAll(filteredOfferings)
+ }
+ // :snippet-end:
+
+ assertNotEquals(0, matchedOfferings.size, "No matching offerings found")
+ }
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/ManageCredentialsTest.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/ManageCredentialsTest.kt
new file mode 100644
index 0000000..939dcbc
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/ManageCredentialsTest.kt
@@ -0,0 +1,139 @@
+package website.tbd.developer.site.docs.tbdex.wallet
+
+import okhttp3.mockwebserver.MockResponse
+import okhttp3.mockwebserver.MockWebServer
+import tbdex.sdk.httpclient.TbdexHttpClient
+import tbdex.sdk.protocol.models.Offering
+import tbdex.sdk.protocol.serialization.Json
+import java.net.HttpURLConnection
+import website.tbd.developer.site.docs.utils.*
+import web5.sdk.credentials.PresentationExchange
+import web5.sdk.credentials.model.ConstraintsV2
+import web5.sdk.credentials.model.FieldV2
+import web5.sdk.credentials.model.InputDescriptorV2
+import web5.sdk.credentials.model.PresentationDefinitionV2
+
+import org.junit.jupiter.api.*
+import org.junit.jupiter.api.Assertions.*
+
+/**
+ * Tests for Wallet: Manage Credentials guide
+ */
+class GetMatchedOfferingsTest {
+
+ private lateinit var server: MockWebServer
+ private val pfi = TestData.PFI_DID
+ private val pfiDid = pfi.uri
+ private val vcJwtResidence = "eyJraWQiOiJkaWQ6ZGh0OnA5cW5idDRrd3lrenF6Znp5eXN0ZDY5Zjhnb3N0YnAzbmY3dGRyczRyd3FqaW16MWsxY3kjMCIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6ZGh0OnA5cW5idDRrd3lrenF6Znp5eXN0ZDY5Zjhnb3N0YnAzbmY3dGRyczRyd3FqaW16MWsxY3kiLCJzdWIiOiJkaWQ6ZGh0OnV1b3J6ZHRqOXgzYTM1OTNtZjlleXNxaHM0NWRrZXpqdzZqYXBkdWRjMXpicjc4aXNnZXkiLCJpYXQiOjE3MDc3NjM4NDgsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJSZXNpZGVuY2VDcmVkZW50aWFsIl0sImlkIjoidXJuOnV1aWQ6ODc5N2VkZDgtNzE2Mi00YTliLWEyMjgtNGRkZTA4NjFlNzZmIiwiaXNzdWVyIjoiZGlkOmRodDpwOXFuYnQ0a3d5a3pxemZ6eXlzdGQ2OWY4Z29zdGJwM25mN3RkcnM0cndxamltejFrMWN5IiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMi0xMlQxODo1MDo0OFoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6dXVvcnpkdGo5eDNhMzU5M21mOWV5c3FoczQ1ZGtlemp3NmphcGR1ZGMxemJyNzhpc2dleSIsImFkZHJlc3MiOiIxMCBPcmNoYXJkIHN0In19fQ.Uvq5jHJbhe7mcPXAMNtfBoD7yez6GXP0GYNuyiZI0_pyfK_mKPjrbkJPXd3LbOtYvB06XxY6tGLMTo7tiMRFDQ"
+ private val vcJwtSanctions = "eyJraWQiOiJkaWQ6ZGh0Onc4bThxNXFja21vZXRzaWlrajR3ZXFhYWRjeGtjNjFkNjh6cnk3aHBpZmdveXE4dG1zb28jMCIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6ZGh0Onc4bThxNXFja21vZXRzaWlrajR3ZXFhYWRjeGtjNjFkNjh6cnk3aHBpZmdveXE4dG1zb28iLCJzdWIiOiJkaWQ6ZGh0OmtkMzVlNmN4M3pueXp1ajR3ejF1ZmRjeGs4ODlzYXVrYXRhYWc3YmNrM2NwY2I3cGM4NW8iLCJpYXQiOjE3MDc0OTEzODcsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTYW5jdGlvbnNDcmVkZW50aWFsIl0sImlkIjoidXJuOnV1aWQ6MGU4YWJhMWYtMmMwZS00MDhlLWIxOWMtZjY0NzZiYTU3NDVhIiwiaXNzdWVyIjoiZGlkOmRodDp3OG04cTVxY2ttb2V0c2lpa2o0d2VxYWFkY3hrYzYxZDY4enJ5N2hwaWZnb3lxOHRtc29vIiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMi0wOVQxNTowOTo0N1oiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6a2QzNWU2Y3gzem55enVqNHd6MXVmZGN4azg4OXNhdWthdGFhZzdiY2szY3BjYjdwYzg1byIsInN0YXR1cyI6ImFwcHJvdmVkIn19fQ.Wc-qV2L3Z5WJYvUYirznpDsyk1Ntcw0kt_bhuXZDqNVXAn-d9Wta67eta-yu7V1C1T74yv6pQaqjgf2rDLxCAg"
+ private lateinit var mockOfferings: List
+
+ @BeforeEach
+ fun setup() {
+ server = MockWebServer()
+ server.start(9000) // pfiDid resolves to http://localhost:9000
+
+ val customPresentationDefinition = PresentationDefinitionV2(
+ id = "custom-pd-id",
+ inputDescriptors = listOf(
+ InputDescriptorV2(
+ id = "sanctionsVerification",
+ purpose = "Confirm the individual is not sanctioned",
+ constraints = ConstraintsV2(
+ fields = listOf(FieldV2(path = listOf("$.vc.credentialSubject.status")))
+ )
+ ),
+ InputDescriptorV2(
+ id = "residenceVerification",
+ purpose = "Confirm the individual's residence address",
+ constraints = ConstraintsV2(
+ fields = listOf(FieldV2(path = listOf("$.vc.credentialSubject.address")))
+ )
+ )
+ )
+ )
+ mockOfferings = listOf(
+ TestData.getOffering(pfiDid, customPresentationDefinition).apply { sign(pfi) }
+ )
+ val mockResponseString = Json.jsonMapper.writeValueAsString(mapOf("data" to mockOfferings))
+ server.enqueue(MockResponse().setBody(mockResponseString).setResponseCode(HttpURLConnection.HTTP_OK))
+ }
+
+ @AfterEach
+ fun tearDown() {
+ server.shutdown()
+ }
+
+ @Test
+ fun `presentation definition is correctly extracted from offering`() {
+ val offering = mockOfferings.first()
+
+ // :snippet-start: retrievePresentationDefinitionFromOfferingsRequiredClaimsKt
+ val presentationDefinition = offering.data.requiredClaims
+ // :snippet-end:
+ ?: fail("Presentation definition should not be null")
+
+ assertEquals("custom-pd-id", presentationDefinition.id, "Presentation definition ID mismatch")
+ assertEquals(2, presentationDefinition.inputDescriptors.size, "Input descriptors size mismatch")
+ }
+
+ @Test
+ fun `match offerings with specific criteria`() {
+ val pfiDids = listOf(pfiDid)
+ // :snippet-start: findMatchingOfferingsWithCredentialValidationKt
+ val payinCurrencyCode = "USD" // Desired payin currency code
+ val payoutCurrencyCode = "KES" // Desired payout currency code
+
+ // Customer's signed credentials in JWT format
+ val credentials = listOf(vcJwtResidence, vcJwtSanctions)
+
+ // Array to store the matched offerings
+ val matchedOfferings = ArrayList()
+
+ for (pfiDid in pfiDids) {
+ val offerings = TbdexHttpClient.getOfferings(pfiDid)
+
+ // Filter offerings based on the desired currency pair
+ offerings.filter { offering ->
+ offering.data.payin.currencyCode == payinCurrencyCode && offering.data.payout.currencyCode == payoutCurrencyCode
+ }.forEach { offering ->
+
+ // Extract the presentation definition from the offering
+ offering.data.requiredClaims?.let { presentationDefinition ->
+ try {
+ //highlight-start
+ // Validate customer's VCs against the offering's presentation definition
+ PresentationExchange.satisfiesPresentationDefinition(
+ credentials, presentationDefinition
+ )
+ //highlight-end
+
+ // Add offerings that match the customer's needs and qualifications
+ matchedOfferings.add(offering)
+ } catch (e: Exception) {
+ // Offerings where the customer's VCs do not meet the requirements are skipped
+ }
+ }
+ }
+ }
+ // :snippet-end:
+ assertNotEquals(0, matchedOfferings.size, "No matching offerings found")
+ }
+
+ @Test
+ fun `selects credentials based on required claims from offering`() {
+ val credentials = listOf(vcJwtResidence, vcJwtSanctions)
+ val selectedOffering = mockOfferings.get(0)
+ // :snippet-start: getSelectedCredentialsKt
+ // Select the credentials to be used for the exchange
+ val selectedCredentials = PresentationExchange.selectCredentials(
+ credentials,
+ selectedOffering.data.requiredClaims!!
+ )
+ // :snippet-end:
+
+ assertEquals(2, selectedCredentials.size)
+ assertTrue(selectedCredentials.containsAll(listOf(vcJwtResidence, vcJwtSanctions)))
+ }
+
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/PfiAllowListTest.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/PfiAllowListTest.kt
new file mode 100644
index 0000000..03cbc5d
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/PfiAllowListTest.kt
@@ -0,0 +1,32 @@
+
+package website.tbd.developer.site.docs.tbdex.wallet
+
+import website.tbd.developer.site.docs.utils.TestData
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Assertions.*
+
+// :prepend-start: isPFIKt
+import web5.sdk.dids.DidResolvers
+// :prepend-end:
+
+/**
+ * Tests for Wallet AllowList guide
+ */
+class PfiAllowListTest {
+
+ @Test
+ fun `check if DID has PFI service`() {
+ val pfiDid = TestData.PFI_DID.uri
+
+ // :snippet-start: isPFIKt
+ val isPFI = DidResolvers
+ .resolve(pfiDid)
+ .didDocument
+ ?.service
+ ?.any { it.type == "PFI" }
+ ?: false
+ // :snippet-end:
+
+ assertTrue(isPFI, "DID should have a PFI service")
+ }
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/PlaceOrderTest.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/PlaceOrderTest.kt
new file mode 100644
index 0000000..77d545c
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/PlaceOrderTest.kt
@@ -0,0 +1,114 @@
+package website.tbd.developer.site.docs.tbdex.wallet
+
+import okhttp3.mockwebserver.MockResponse
+import okhttp3.mockwebserver.MockWebServer
+import org.junit.jupiter.api.*
+import org.junit.jupiter.api.Assertions.*
+import tbdex.sdk.httpclient.TbdexHttpClient
+import tbdex.sdk.httpclient.models.TbdexResponseException
+import tbdex.sdk.protocol.models.Close
+import tbdex.sdk.protocol.models.Order
+import tbdex.sdk.protocol.models.OrderStatus
+import tbdex.sdk.protocol.serialization.Json
+import java.net.HttpURLConnection
+import website.tbd.developer.site.docs.utils.*
+
+
+/**
+ * Tests for Wallet: Placing Orders guide
+ */
+class PlaceOrderTest {
+
+ private val pfi = TestData.PFI_DID
+ private val customerDid = TestData.ALICE_DID
+ private lateinit var server: MockWebServer
+ private lateinit var getExchangeResponse: String
+
+ @BeforeEach
+ fun setup(){
+ server = MockWebServer()
+ server.start(9000)
+ }
+
+ @AfterEach
+ fun tearDown() {
+ server.shutdown()
+ }
+
+ @Test
+ fun `send Order message`() {
+ server.enqueue(MockResponse().setResponseCode(HttpURLConnection.HTTP_OK))
+
+ val quote = TestData.getQuote()
+ // :snippet-start: createOrderKt
+ val order = Order.create(
+ from = customerDid.uri, // Customer's DID
+ to = quote.metadata.from, // PFI's DID
+ exchangeId = quote.metadata.exchangeId, // Exchange ID from the Quote
+ protocol= "1.0" // Version of tbDEX protocol you're using
+ )
+ // :snippet-end:
+
+ // :snippet-start: signOrderKt
+ order.sign(customerDid)
+ // :snippet-end:
+
+ try {
+ // :snippet-start: sendOrderKt
+ TbdexHttpClient.submitOrder(order)
+ // :snippet-end:
+ } catch (e: TbdexResponseException) {
+ Assertions.fail("Failed to send Order message to PFI: $e")
+ }
+ }
+
+ @Test
+ fun `listen for Order Status updates`() {
+ val order = TestData.getOrder().apply { sign(customerDid) }
+ val orderStatus = TestData.getOrderStatus().apply { sign(pfi) }
+ val closeMessage = TestData.getClose().apply { sign(pfi) }
+
+ val orderStatusMsg = orderStatus.data.orderStatus;
+ val closeReason = closeMessage.data.reason
+
+ val mockExchange = listOf(orderStatus, closeMessage)
+ getExchangeResponse = Json.jsonMapper.writeValueAsString(mapOf("data" to mockExchange))
+ server.enqueue(MockResponse().setBody(getExchangeResponse).setResponseCode(HttpURLConnection.HTTP_OK))
+
+ // :snippet-start: listenForOrderStatusKt
+ var orderStatusUpdate: String? = ""
+ var close: Close? = null
+
+ while (close == null) {
+ val exchange = TbdexHttpClient.getExchange(
+ pfiDid = order.metadata.to,
+ requesterDid = customerDid,
+ exchangeId = order.metadata.exchangeId.toString()
+ )
+
+ for (message in exchange) {
+ when (message) {
+ is OrderStatus -> {
+ // a status update to display to your customer
+ orderStatusUpdate = message.data.orderStatus
+ }
+ is Close -> {
+ // final message of exchange has been written
+ close = message
+ }
+ else -> {}
+ }
+ }
+ }
+ // :snippet-end:
+ assertEquals(orderStatusMsg, orderStatusUpdate, "Order Status message is incorrect")
+
+ // :snippet-start: getCloseReasonKt
+ val isSuccessful = close.data.success
+ val reasonForClose = close.data.reason
+ // :snippet-end:
+
+ assertTrue(isSuccessful == true, "Close was not successful")
+ assertEquals(closeReason, reasonForClose, "Close reason is incorrect")
+ }
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/ReceiveQuoteTest.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/ReceiveQuoteTest.kt
new file mode 100644
index 0000000..8758898
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/ReceiveQuoteTest.kt
@@ -0,0 +1,102 @@
+package website.tbd.developer.site.docs.tbdex.wallet
+
+import okhttp3.mockwebserver.MockResponse
+import okhttp3.mockwebserver.MockWebServer
+import org.junit.jupiter.api.AfterEach
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Assertions.assertNull
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
+import tbdex.sdk.httpclient.TbdexHttpClient
+import tbdex.sdk.protocol.models.*
+import tbdex.sdk.protocol.serialization.Json
+import java.net.HttpURLConnection
+import website.tbd.developer.site.docs.utils.*
+/**
+ * Tests for Wallet: Receiving Quotes guide
+ */
+class ReceiveQuoteTest {
+
+ private val pfi = TestData.PFI_DID
+ private val customerDid = TestData.ALICE_DID
+ private lateinit var rfq: Rfq
+ private lateinit var quote: Quote
+ private lateinit var server: MockWebServer
+
+ @BeforeEach
+ fun setup() {
+ server = MockWebServer()
+ server.start(9000)
+
+ rfq = TestData.getRfq()
+ rfq.sign(customerDid)
+
+ quote = Quote.create(
+ exchangeId = rfq.metadata.exchangeId,
+ from = pfi.uri,
+ to = customerDid.uri,
+ quoteData = TestData.getQuote().data
+ )
+ quote.sign(pfi)
+
+ val mockExchange = listOf(rfq, quote)
+ val mockRfqResponse = Json.jsonMapper.writeValueAsString(mapOf("data" to mockExchange))
+ server.enqueue(MockResponse().setBody(mockRfqResponse).setResponseCode(HttpURLConnection.HTTP_OK))
+ server.enqueue(MockResponse().setResponseCode(HttpURLConnection.HTTP_OK))
+ }
+
+ @AfterEach
+ fun tearDown() {
+ server.shutdown()
+ }
+
+ @Test
+ fun `poll for quote message`() {
+ // :snippet-start: pollforQuoteKt
+ var quote: Quote? = null
+ var close: Close? = null
+
+ //Wait for Quote message to appear in the exchange
+ while (quote == null) {
+ val exchange = TbdexHttpClient.getExchange(
+ pfiDid = rfq.metadata.to,
+ requesterDid = customerDid,
+ exchangeId = rfq.metadata.exchangeId
+ )
+
+ quote = exchange.find { it is Quote } as Quote?
+
+ if (quote == null) {
+ // Make sure the exchange is still open
+ close = exchange.find { it is Close } as Close?
+
+ if (close != null) { break }
+ else {
+ // Wait 2 seconds before making another request
+ Thread.sleep(2000)
+ }
+ }
+ // :snippet-end:
+ }
+
+ assertEquals(rfq.metadata.exchangeId, quote?.metadata?.exchangeId)
+ assertNull(close)
+ }
+
+ @Test
+ fun `cancel exchange`() {
+ // :snippet-start: cancelExchangeKt
+ val close = Close.create(
+ from = customerDid.uri,
+ to = quote.metadata.from,
+ exchangeId = quote.metadata.exchangeId,
+ closeData = CloseData(reason = "Canceled by customer")
+ )
+
+ close.sign(customerDid)
+ TbdexHttpClient.submitClose(close)
+ // :snippet-end:
+
+ assertEquals(close.metadata.exchangeId, quote.metadata.exchangeId)
+ }
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/RequiredWalletImports.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/RequiredWalletImports.kt
new file mode 100644
index 0000000..ae85dff
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/RequiredWalletImports.kt
@@ -0,0 +1,10 @@
+package website.tbd.developer.site.docs.tbdex.wallet
+
+// :snippet-start: walletSdkImportsKt
+import tbdex.sdk.httpclient.TbdexHttpClient
+import tbdex.sdk.protocol.models.Rfq
+import tbdex.sdk.protocol.models.Quote
+import tbdex.sdk.protocol.models.Order
+import web5.sdk.credentials.VerifiableCredential
+import web5.sdk.credentials.PresentationExchange
+// :snippet-end:
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/SendRfqTest.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/SendRfqTest.kt
new file mode 100644
index 0000000..6fa9d40
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/SendRfqTest.kt
@@ -0,0 +1,188 @@
+package website.tbd.developer.site.docs.tbdex.wallet
+
+import okhttp3.mockwebserver.MockResponse
+import okhttp3.mockwebserver.MockWebServer
+import org.junit.jupiter.api.AfterEach
+import org.junit.jupiter.api.Assertions.assertNotNull
+import org.junit.jupiter.api.Assertions.fail
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
+import tbdex.sdk.httpclient.TbdexHttpClient
+import tbdex.sdk.httpclient.models.TbdexResponseException
+import tbdex.sdk.protocol.models.*
+import web5.sdk.crypto.InMemoryKeyManager
+import web5.sdk.dids.didcore.Service
+import web5.sdk.dids.methods.dht.CreateDidDhtOptions
+import web5.sdk.dids.methods.dht.DidDht
+import java.net.HttpURLConnection
+import website.tbd.developer.site.docs.utils.TestData
+
+/**
+ * Tests for Wallet: Sending RFQs guide
+ */
+class SendRfqTest {
+
+ private val pfi = TestData.PFI_DID
+ private val customerDid = TestData.ALICE_DID
+ private lateinit var selectedOffering: Offering
+ private lateinit var server: MockWebServer
+ private lateinit var rfq: Rfq
+
+ @BeforeEach
+ fun setup() {
+ selectedOffering = TestData.getOfferingWithNoClaims(pfi.uri)
+ selectedOffering.sign(pfi)
+
+ rfq = TestData.getRfq()
+ rfq.sign(customerDid)
+
+ //Mock PFI Server
+ server = MockWebServer()
+ server.start(9000) // pfiDid resolves to https://localhost:9000
+ server.enqueue(MockResponse().setResponseCode(HttpURLConnection.HTTP_OK))
+ }
+
+ @AfterEach
+ fun tearDown() {
+ server.shutdown()
+ }
+
+ @Test
+ fun `get all skeleton RFQ - properties`() {
+ val skeleton = """
+ // :snippet-start: skeletonRfqMessageKt
+ val rfq = Rfq.create(
+ to, //metadata
+ from, //metadata
+ rfqData = RfqData() //data
+ )
+ // :snippet-end:
+ """
+
+ //no assertions needed; this is just showing how to structure a RFQ
+ }
+
+ @Test
+ fun `skeleton RFQ - metadata`() {
+ val skeleton = """
+ // :snippet-start: rfqMetadataKt
+ val rfq = Rfq.create(
+ //metadata
+ //highlight-start
+ to = selectedOffering.metadata.from, // PFI's DID
+ from = customerDid.uri, // Customer DID
+ //highlight-end
+ //data
+ rfqData = RfqData()
+ )
+ // :snippet-end:
+ """
+
+ //no assertions needed; this is just showing how to structure a RFQ
+ }
+
+ @Test
+ fun `create signed RFQ message and send to PFI`() {
+ val BTC_ADDRESS = "bc1q52csjdqa6cq5d2ntkkyz8wk7qh2qevy04dyyfd"
+ val selectedCredentials = emptyList()
+
+ // :snippet-start: createRfqMessageKt
+ val rfq = Rfq.create(
+ to = selectedOffering.metadata.from, // PFI's DID
+ from = customerDid.uri, // Customer DID
+ //highlight-start
+ rfqData = CreateRfqData(
+ offeringId = selectedOffering.metadata.id, // The ID of the selected offering
+ payin = CreateSelectedPayinMethod(
+ kind = "DEBIT_CARD", // The method of payment
+ paymentDetails = mapOf(
+ "cvv" to "123",
+ "cardNumber" to "1234567890123456",
+ "expiryDate" to "05/25",
+ "cardHolderName" to "Alice Doe"
+ ),
+ amount = "500.65", // The amount of the payin currency
+ ),
+ payout = CreateSelectedPayoutMethod(
+ kind = "BTC_ADDRESS", // The method for receiving payout
+ paymentDetails = mapOf("btcAddress" to BTC_ADDRESS), // Recipient's BTC wallet address
+ ),
+ claims = selectedCredentials // List of signed VCs required by the PFI
+ )
+ //highlight-end
+ )
+ // :snippet-end:
+
+ // :snippet-start: verifyOfferingRequirementsKt
+ try{
+ rfq.verifyOfferingRequirements(selectedOffering)
+ }catch (e: Exception){
+ // handle failed verification
+ }
+ // :snippet-end:
+
+ // :snippet-start: signRfqMessageKt
+ rfq.sign(customerDid);
+ // :snippet-end:
+
+ try{
+ // :snippet-start: sendRfqMessageKt
+ TbdexHttpClient.createExchange(rfq)
+ // :snippet-end:
+
+ }catch(e: TbdexResponseException){
+ fail("Failed to send RFQ message to PFI: $e")
+ }
+ assertNotNull(rfq.signature, "RFQ is not signed")
+ }
+
+ @Test
+ fun `send RFQ message with URL as replyTo`(){
+ try {
+ // :snippet-start: rfqWithUrlReplyToKt
+ TbdexHttpClient.createExchange(
+ rfq,
+ //highlight-next-line
+ "https://example.com/callback"
+ )
+ // :snippet-end:
+ }catch(e: TbdexResponseException){
+ fail("Failed to send RFQ with URL replyTo: $e")
+ }
+ }
+
+
+ @Test
+ fun `send RFQ message with DID as replyTo`(){
+ val keyManager = InMemoryKeyManager()
+
+ // :snippet-start: createDidWithTbdexServiceKt
+ val serviceToAdd = Service.Builder()
+ .id("tbdex")
+ //highlight-start
+ .type("tbdex")
+ .serviceEndpoint(listOf("https://example.com/callback"))
+ //highlight-end
+ .build()
+
+ val options = CreateDidDhtOptions(
+ publish = true,
+ services = listOf(serviceToAdd),
+ )
+
+ val walletDid = DidDht.create(keyManager, options)
+ // :snippet-end:
+
+ try {
+ // :snippet-start: rfqWithDidReplyToKt
+ TbdexHttpClient.createExchange(
+ rfq,
+ //highlight-next-line
+ walletDid.uri
+ )
+ // :snippet-end:
+ }catch(e: TbdexResponseException){
+ fail("Failed to send RFQ with DID replyTo: $e")
+ }
+ }
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/required-sdks.gradle b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/required-sdks.gradle
new file mode 100644
index 0000000..0e0e69e
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/required-sdks.gradle
@@ -0,0 +1,10 @@
+// :snippet-start: walletSdkInstallGradle
+repositories {
+ mavenCentral()
+}
+dependencies {
+ implementation("xyz.block:web5-credentials:0.0.9-delta")
+ implementation("xyz.block:web5-dids:0.0.9-delta")
+ implementation("xyz.block:tbdex:0.10.0-beta")
+}
+// :snippet-end:
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/required-sdks.xml b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/required-sdks.xml
new file mode 100644
index 0000000..9ef09e6
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/tbdex/wallet/required-sdks.xml
@@ -0,0 +1,16 @@
+// :snippet-start: walletSdkInstallPom
+
+
+ mavenCentral
+ https://repo1.maven.org/maven2/
+
+
+
+
+
+ xyz.block
+ tbdex
+ 0.10.0-beta
+
+
+// :snippet-end:
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/utils/MockDataProvider.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/utils/MockDataProvider.kt
new file mode 100644
index 0000000..43f3e31
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/utils/MockDataProvider.kt
@@ -0,0 +1,51 @@
+package website.tbd.developer.site.docs.utils
+
+import tbdex.sdk.protocol.models.Offering
+
+class MockDataProvider {
+ private val responses: MutableMap) -> Any?> = mutableMapOf()
+
+ // Setup can handle an arbitrary number of parameters
+ fun setup(methodName: String, vararg args: Any?, response: (Array) -> T) {
+ val paramsKey = args.joinToString(prefix = "[", postfix = "]") { it.toString() } // Serialize parameters for key
+ val key = "$methodName:$paramsKey"
+
+ responses[key] = response as (Array) -> Any?
+ }
+
+ // Convenience setup methods
+ fun setupInsert(vararg args: Any?, response: (Array) -> Any?) {
+ setup("insert", *args, response = response)
+ }
+
+ fun setupGet(vararg args: Any?, response: (Array) -> Any?) {
+ setup("get", *args, response = response)
+ }
+
+ fun setupQuery(vararg args: Any?, response: (Array) -> List) {
+ setup("query", *args, response = response)
+ }
+
+ // Method to find and return the response for the given method and parameters
+ fun execute(methodName: String, vararg params: Any?): Any {
+ val paramsKey = params.joinToString(prefix = "[", postfix = "]") { it.toString() }
+ val key = "$methodName:$paramsKey"
+
+ return responses[key]?.invoke(params)
+ ?: throw Error("No response found for method $methodName with the given parameters.")
+ }
+
+ // Mock methods
+ fun insert(collection: String, data: Any): Any {
+ return execute("insert", collection, "")
+ }
+
+ fun get(collection: String, id: String): Any {
+ val result = execute("get", collection, id)
+ return if(result is Offering) result.toString() else result
+ }
+
+ fun query(collection: String, query: String): List {
+ return execute("query", collection, query) as List
+ }
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/utils/MockExchangesApiProvider.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/utils/MockExchangesApiProvider.kt
new file mode 100644
index 0000000..645e9fa
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/utils/MockExchangesApiProvider.kt
@@ -0,0 +1,128 @@
+package website.tbd.developer.site.docs.utils
+
+import tbdex.sdk.httpserver.models.*
+import tbdex.sdk.protocol.models.*
+import de.fxlae.typeid.TypeId
+
+open class MockExchangesApiProvider: ExchangesApi {
+ val dataProvider = MockDataProvider()
+
+ //---------------------------------------------------------------------------//
+ // Implementation of interface
+ //---------------------------------------------------------------------------//
+
+ override fun getExchanges(filter: GetExchangesFilter?): List> {
+ val messages = mutableListOf>()
+ val exchangeIds = filter?.exchangeIds ?: listOf()
+ for (exchange in exchangeIds) {
+ val exchange = dataProvider.query("exchanges", exchange) as List ?: listOf()
+ messages.toMutableList().apply { set(0, exchange) }
+ }
+ return messages
+ }
+
+ override fun getExchange(id: String, requesterDid: String): List {
+ return dataProvider.get("exchanges", id) as? List ?: emptyList()
+ }
+
+ override fun getRfq(exchangeId: String): Rfq {
+ return dataProvider.get("rfq", exchangeId) as Rfq ?: TestData.getRfq()
+ }
+
+ override fun getQuote(exchangeId: String): Quote {
+ return dataProvider.get("quote", exchangeId) as? Quote ?: TestData.getQuote()
+ }
+
+ override fun getOrder(exchangeId: String): Order {
+ return dataProvider.get("order", exchangeId) as? Order ?: TestData.getOrder()
+ }
+
+ override fun getOrderStatuses(exchangeId: String): List {
+ return dataProvider.query("orderstatus", exchangeId) as? List ?: listOf(TestData.getOrderStatus())
+ }
+
+ override fun getClose(exchangeId: String): Close {
+ return dataProvider.get("close", exchangeId) as? Close ?: TestData.getClose()
+ }
+
+ //---------------------------------------------------------------------------//
+ // Setup Methods
+ //---------------------------------------------------------------------------//
+
+ fun setExchanges(filter: GetExchangesFilter?) {
+ dataProvider.setupQuery("exchanges", filter) { listOf(listOf()) }
+ }
+
+ fun setExchange(id: String) {
+ dataProvider.setupGet("exchanges", id) { listOf() }
+ }
+
+ fun setRfq(
+ exchangeId: String,
+ to: String,
+ from: String,
+ offeringId: TypeId = TypeId.generate(ResourceKind.offering.name),
+ claims: List = emptyList()) {
+ dataProvider.setupGet("rfq", exchangeId) {
+ TestData.getRfq(
+ to = to,
+ from = from,
+ offeringId = offeringId,
+ claims = claims)
+ }
+ }
+
+ fun setQuote(
+ exchangeId: String,
+ to: String,
+ from: String) {
+ dataProvider.setupGet("quote", exchangeId) {
+ TestData.getQuote(
+ to = to,
+ from = from)
+ }
+ }
+
+ fun setOrder(
+ exchangeId: String,
+ to: String,
+ from: String) {
+ dataProvider.setupGet("order", exchangeId) {
+ TestData.getOrder(
+ to = to,
+ from = from)
+ }
+ }
+
+ fun setOrderStatus(
+ exchangeId: String,
+ to: String,
+ from: String,
+ orderStatus: String
+ ) {
+ dataProvider.setupGet("orderstatus", exchangeId) {
+ TestData.getOrderStatus(
+ to = to,
+ from = from,
+ orderStatus = orderStatus)
+ }
+ }
+
+ fun setClose(
+ exchangeId: String,
+ to: String,
+ from: String,
+ closeData: String
+ ) {
+ dataProvider.setupGet("close", exchangeId) {
+ TestData.getClose(
+ to = to,
+ from = from,
+ closeData = closeData)
+ }
+ }
+
+ fun setWrite() {
+ dataProvider.setupInsert("exchange", "") { listOf() }
+ }
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/utils/MockOfferingsApiProvider.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/utils/MockOfferingsApiProvider.kt
new file mode 100644
index 0000000..0f6e39c
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/utils/MockOfferingsApiProvider.kt
@@ -0,0 +1,47 @@
+package website.tbd.developer.site.docs.utils
+
+import tbdex.sdk.httpserver.models.*
+import tbdex.sdk.protocol.models.*
+import web5.sdk.dids.did.BearerDid
+
+open class MockOfferingsApiProvider: OfferingsApi {
+
+ val dataProvider = MockDataProvider()
+
+ //---------------------------------------------------------------------------//
+ // Implementation of interface
+ //---------------------------------------------------------------------------//
+
+ override fun getOffering(id: String): Offering {
+ val result = dataProvider.get("offering", id ?: "")
+ return Offering.parse(result as String)
+ }
+
+ override fun getOfferings(): List {
+ val results = dataProvider.query("offering", "*")
+ val offerings = mutableListOf()
+
+ for (result in results) {
+ val offering = Offering.parse(result as String)
+ offerings.add(offering)
+ }
+
+ return offerings
+ }
+
+ //---------------------------------------------------------------------------//
+ // Setup Methods
+ //---------------------------------------------------------------------------//
+
+ fun setOffering(id: String, pfiDid: BearerDid) {
+ val offering = TestData.getOffering(pfiDid.uri, TestData.getPresentationDefinition())
+ offering.sign(pfiDid)
+ dataProvider.setupGet("offering", id) {offering }
+ }
+
+ fun setOfferings(offeringDids: List) {
+ dataProvider.setupGet("offering", "*") {
+ offeringDids.map { did -> TestData.getOffering(did, TestData.getPresentationDefinition()) }
+ }
+ }
+}
diff --git a/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/utils/TestData.kt b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/utils/TestData.kt
new file mode 100644
index 0000000..7528687
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/src/test/kotlin/docs/utils/TestData.kt
@@ -0,0 +1,255 @@
+package website.tbd.developer.site.docs.utils
+
+import com.danubetech.verifiablecredentials.CredentialSubject
+import de.fxlae.typeid.TypeId
+import web5.sdk.dids.didcore.Service
+import tbdex.sdk.protocol.models.*
+import tbdex.sdk.protocol.serialization.Json
+import web5.sdk.credentials.VcDataModel
+import web5.sdk.credentials.VerifiableCredential
+import web5.sdk.credentials.model.ConstraintsV2
+import web5.sdk.credentials.model.FieldV2
+import web5.sdk.credentials.model.InputDescriptorV2
+import web5.sdk.credentials.model.PresentationDefinitionV2
+import web5.sdk.crypto.InMemoryKeyManager
+import web5.sdk.dids.did.BearerDid
+import web5.sdk.dids.methods.dht.CreateDidDhtOptions
+import web5.sdk.dids.methods.dht.DidDht
+import java.net.URI
+import java.time.OffsetDateTime
+import java.time.OffsetDateTime.*
+import java.util.*
+
+object TestData {
+ const val ALICE = "alice"
+ const val PFI = "pfi"
+ private val aliceKeyManager = InMemoryKeyManager()
+ val ALICE_DID: BearerDid = DidDht.create(aliceKeyManager)
+
+ val serviceToAdd = Service.Builder()
+ .id("pfi")
+ .type("PFI")
+ .serviceEndpoint(listOf("http://localhost:9000"))
+ .build()
+
+ val options = CreateDidDhtOptions(
+ publish = true,
+ services = listOf(serviceToAdd),
+ )
+
+ val PFI_DID = DidDht.create(InMemoryKeyManager(), options)
+
+ fun getPresentationDefinition(): PresentationDefinitionV2 {
+ return buildPresentationDefinition(
+ inputDescriptors = listOf(
+ buildInputDescriptor(fields = listOf(buildField(paths = arrayOf("$.credentialSubject.btcAddress"))))
+ )
+ )
+ }
+
+ fun getVC(): VerifiableCredential {
+ val credentialSubject = CredentialSubject.builder()
+ .id(URI.create(ALICE_DID.uri))
+ .claims(mutableMapOf().apply { this["btcAddress"] = "btcAddress123" })
+ .build()
+
+ val vc = VcDataModel.builder()
+ .id(URI.create(UUID.randomUUID().toString()))
+ .credentialSubject(credentialSubject)
+ .issuer(URI.create(ALICE_DID.uri))
+ .issuanceDate(Date())
+ .build()
+
+ return VerifiableCredential.create("test type", ALICE_DID.uri, ALICE_DID.uri, vc)
+ }
+
+ fun getOffering(
+ from: String = PFI_DID.uri,
+ requiredClaims: PresentationDefinitionV2 = getPresentationDefinition()
+ ) = Offering.create(
+ from = from,
+ OfferingData(
+ description = "A sample offering",
+ payoutUnitsPerPayinUnit = "1",
+ payin = PayinDetails("USD", "0.01", "100.00", listOf(PayinMethod(
+ kind = "BANK_ACCOUNT",
+ requiredPaymentDetails = requiredPaymentDetailsSchema()
+ ))),
+ payout = PayoutDetails(
+ currencyCode = "KES",
+ methods = listOf(PayoutMethod(
+ kind = "MOMO",
+ requiredPaymentDetails = requiredPaymentDetailsSchema(),
+ estimatedSettlementTime = 3600
+ )
+ )
+ ),
+ requiredClaims = requiredClaims
+ )
+ )
+
+ fun getOfferingWithNoClaims(
+ from: String = PFI_DID.uri
+ ) = Offering.create(
+ from = from,
+ OfferingData(
+ description = "A sample offering",
+ payoutUnitsPerPayinUnit = "1",
+ payin = PayinDetails("USD", "0.01", "100.00", listOf(PayinMethod(
+ kind = "DEBIT_CARD",
+ requiredPaymentDetails = requiredPaymentDetailsSchema()
+ ))),
+ payout = PayoutDetails(
+ currencyCode = "BTC",
+ methods = listOf(PayoutMethod(
+ kind = "BTC_ADDRESS",
+ requiredPaymentDetails = requiredPaymentDetailsSchema(),
+ estimatedSettlementTime = 3600
+ )
+ )
+ ),
+ requiredClaims = null
+ )
+ )
+
+
+ fun getRfq(
+ to: String = PFI_DID.uri,
+ from: String = ALICE_DID.uri,
+ offeringId: TypeId = TypeId.generate(ResourceKind.offering.name),
+ claims: List = emptyList()
+ ) = Rfq.create(
+ to = PFI_DID.uri,
+ from = ALICE_DID.uri,
+ rfqData = CreateRfqData(
+ offeringId = offeringId.toString(),
+ payin = CreateSelectedPayinMethod(
+ kind = "BANK_ACCOUNT",
+ paymentDetails = mapOf(
+ "address" to "123456",
+ "cardNumber" to "1234567890123456"
+ ),
+ amount = "10.00"
+ ),
+ payout = CreateSelectedPayoutMethod(
+ kind = "MOMO",
+ paymentDetails = mapOf(
+ "phoneNumber" to "254712345678",
+ "accountHolderName" to "Alfred Holder"
+ )
+ ),
+ claims = claims
+ )
+ )
+
+ fun getQuote(
+ to: String = ALICE_DID.uri,
+ from: String = PFI_DID.uri) = Quote.create(
+ ALICE_DID.uri, PFI_DID.uri, TypeId.generate(MessageKind.rfq.name).toString(),
+ QuoteData(
+ expiresAt = now().plusDays(1),
+ payin = QuoteDetails("USD", "10.00", "0.01"),
+ payout = QuoteDetails("KES", "0.12", "0.02"),
+ )
+ )
+
+ fun getClose(
+ to: String = ALICE_DID.uri,
+ from: String = PFI_DID.uri,
+ closeData: String = "test reason"
+ ) = Close.create(
+ to = ALICE_DID.uri,
+ from = PFI_DID.uri,
+ exchangeId = TypeId.generate(MessageKind.rfq.name).toString(),
+ closeData = CloseData(closeData, true)
+ )
+
+ fun getOrder(
+ to: String = PFI_DID.uri,
+ from: String = ALICE_DID.uri) = Order.create(
+ to = PFI_DID.uri,
+ from = ALICE_DID.uri,
+ exchangeId = TypeId.generate(MessageKind.rfq.name).toString()
+ )
+
+ fun getOrderStatus(
+ to: String = ALICE_DID.uri,
+ from: String = PFI_DID.uri,
+ orderStatus: String = "PENDING"
+ ) = OrderStatus.create(
+ to = ALICE_DID.uri,
+ from = PFI_DID.uri,
+ exchangeId = TypeId.generate(MessageKind.rfq.name).toString(),
+ orderStatusData = OrderStatusData(orderStatus)
+ )
+
+ fun getOrderStatusWithInvalidDid(): OrderStatus {
+ val os = OrderStatus.create(
+ ALICE, PFI, TypeId.generate(MessageKind.rfq.name).toString(), OrderStatusData("PENDING")
+ )
+
+ os.sign(ALICE_DID)
+ return os
+ }
+
+ private fun buildField(id: String? = null, vararg paths: String): FieldV2 {
+ return FieldV2(id = id, path = paths.toList())
+ }
+
+ private fun buildPresentationDefinition(
+ id: String = "test-pd-id",
+ name: String = "simple PD",
+ purpose: String = "pd for testing",
+ inputDescriptors: List = listOf()
+ ): PresentationDefinitionV2 {
+ return PresentationDefinitionV2(
+ id = id,
+ name = name,
+ purpose = purpose,
+ inputDescriptors = inputDescriptors
+ )
+ }
+
+ private fun buildInputDescriptor(
+ id: String = "whatever",
+ purpose: String = "id for testing",
+ fields: List = listOf()
+ ): InputDescriptorV2 {
+ return InputDescriptorV2(
+ id = id,
+ purpose = purpose,
+ constraints = ConstraintsV2(fields = fields)
+ )
+ }
+
+ private fun requiredPaymentDetailsSchema() = Json.jsonMapper.readTree(
+ """
+ {
+ "${'$'}schema": "http://json-schema.org/draft-07/schema",
+ "additionalProperties": false,
+ "type": "object",
+ "properties": {
+ "phoneNumber": {
+ "minLength": 12,
+ "pattern": "^+2547[0-9]{8}${'$'}",
+ "description": "Mobile Money account number of the Recipient",
+ "type": "string",
+ "title": "Phone Number",
+ "maxLength": 12
+ },
+ "accountHolderName": {
+ "pattern": "^[A-Za-zs'-]+${'$'}",
+ "description": "Name of the account holder as it appears on the Mobile Money account",
+ "type": "string",
+ "title": "Account Holder Name",
+ "maxLength": 32
+ }
+ },
+ "required": [
+ "accountNumber",
+ "accountHolderName"
+ ]
+ }
+ """.trimIndent()
+ )
+}
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/error/NonExistentClass.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/error/NonExistentClass.java
new file mode 100644
index 0000000..73693e1
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/error/NonExistentClass.java
@@ -0,0 +1,4 @@
+package error;
+
+public final class NonExistentClass {
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest.java
new file mode 100644
index 0000000..198ebf7
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest.java
@@ -0,0 +1,16 @@
+package website.tbd.developer.site.docs.tbdex;
+
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000 \n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0000\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\b\u0010\u0003\u001a\u00020\u0004H\u0007J\b\u0010\u0005\u001a\u00020\u0006H\u0002J\b\u0010\u0007\u001a\u00020\u0004H\u0007J\b\u0010\b\u001a\u00020\u0004H\u0007J\f\u0010\t\u001a\u00020\u0004*\u00020\nH\u0002\u00a8\u0006\u000b"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/CredentialIssuanceTest;", "", "()V", "create() creates a credential with expected fields", "", "generateTestDid", "Lweb5/sdk/dids/did/BearerDid;", "sign() method signs the credential and returns a non-empty string", "verify() does not throw an exception for a valid JWT", "configureRouting", "Lio/ktor/server/application/Application;", "kotlin-testsuite"})
+public final class CredentialIssuanceTest {
+
+ public CredentialIssuanceTest() {
+ super();
+ }
+
+ private final web5.sdk.dids.did.BearerDid generateTestDid() {
+ return null;
+ }
+
+ private final void configureRouting(io.ktor.server.application.Application $this$configureRouting) {
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest.kapt_metadata
new file mode 100644
index 0000000..e0edd51
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt.java
new file mode 100644
index 0000000..da5cf76
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt.java
@@ -0,0 +1,13 @@
+package website.tbd.developer.site.docs.tbdex;
+
+@kotlin.Metadata(mv = {1, 9, 0}, k = 2, xi = 48, d1 = {"\u0000\u000e\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a\u0006\u0010\u0000\u001a\u00020\u0001\u001a\b\u0010\u0002\u001a\u00020\u0003H\u0002\u00a8\u0006\u0004"}, d2 = {"checkSanctionsList", "Lwebsite/tbd/developer/site/docs/tbdex/SanctionsListResult;", "createADid", "", "kotlin-testsuite"})
+public final class CredentialIssuanceTestKt {
+
+ @org.jetbrains.annotations.NotNull()
+ public static final website.tbd.developer.site.docs.tbdex.SanctionsListResult checkSanctionsList() {
+ return null;
+ }
+
+ private static final void createADid() {
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt.kapt_metadata
new file mode 100644
index 0000000..0ea9d71
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest.java
new file mode 100644
index 0000000..9d52e86
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest.java
@@ -0,0 +1,162 @@
+package website.tbd.developer.site.docs.tbdex;
+
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u00000\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u000b\n\u0000\n\u0002\u0010\u000e\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0002\b\u0006\n\u0002\u0018\u0002\n\u0002\b\u0003\u0018\u00002\u00020\u0001:\u0002\u0014\u0015B\u0005\u00a2\u0006\u0002\u0010\u0002J\b\u0010\u0003\u001a\u00020\u0004H\u0007J\u0010\u0010\u0005\u001a\u00020\u00062\u0006\u0010\u0007\u001a\u00020\bH\u0002J\b\u0010\t\u001a\u00020\u0004H\u0007J\b\u0010\n\u001a\u00020\bH\u0002J\b\u0010\u000b\u001a\u00020\fH\u0002J\b\u0010\r\u001a\u00020\bH\u0002J \u0010\u000e\u001a\u00020\u00062\u0006\u0010\u000f\u001a\u00020\b2\u0006\u0010\u0010\u001a\u00020\b2\u0006\u0010\u0007\u001a\u00020\bH\u0002J\b\u0010\u0011\u001a\u00020\u0004H\u0007J\f\u0010\u0012\u001a\u00020\u0004*\u00020\u0013H\u0002\u00a8\u0006\u0016"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest;", "", "()V", "JwtUtil sign() works with a valid payload and bearer DID", "", "checkIDVStatus", "", "customersDidUri", "", "create() creates credential & sign() creates JWT", "generateCNonce", "generateTestDid", "Lweb5/sdk/dids/did/BearerDid;", "generateUniquePreAuthCode", "validateSignedCNonce", "jwt", "expectedNonce", "verify() does not throw an exception for a valid JWT", "configureRouting", "Lio/ktor/server/application/Application;", "Evidence", "KccCredential", "kotlin-testsuite"})
+public final class KnownCustomerCredentialIssuerTest {
+
+ public KnownCustomerCredentialIssuerTest() {
+ super();
+ }
+
+ private final web5.sdk.dids.did.BearerDid generateTestDid() {
+ return null;
+ }
+
+ private final boolean validateSignedCNonce(java.lang.String jwt, java.lang.String expectedNonce, java.lang.String customersDidUri) {
+ return false;
+ }
+
+ private final boolean checkIDVStatus(java.lang.String customersDidUri) {
+ return false;
+ }
+
+ private final java.lang.String generateUniquePreAuthCode() {
+ return null;
+ }
+
+ private final java.lang.String generateCNonce() {
+ return null;
+ }
+
+ private final void configureRouting(io.ktor.server.application.Application $this$configureRouting) {
+ }
+
+ @kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000(\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0010 \n\u0002\b\t\n\u0002\u0010\u000b\n\u0002\b\u0002\n\u0002\u0010\b\n\u0002\b\u0002\b\u0086\b\u0018\u00002\u00020\u0001B\u001b\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\f\u0010\u0004\u001a\b\u0012\u0004\u0012\u00020\u00030\u0005\u00a2\u0006\u0002\u0010\u0006J\t\u0010\u000b\u001a\u00020\u0003H\u00c6\u0003J\u000f\u0010\f\u001a\b\u0012\u0004\u0012\u00020\u00030\u0005H\u00c6\u0003J#\u0010\r\u001a\u00020\u00002\b\b\u0002\u0010\u0002\u001a\u00020\u00032\u000e\b\u0002\u0010\u0004\u001a\b\u0012\u0004\u0012\u00020\u00030\u0005H\u00c6\u0001J\u0013\u0010\u000e\u001a\u00020\u000f2\b\u0010\u0010\u001a\u0004\u0018\u00010\u0001H\u00d6\u0003J\t\u0010\u0011\u001a\u00020\u0012H\u00d6\u0001J\t\u0010\u0013\u001a\u00020\u0003H\u00d6\u0001R\u0017\u0010\u0004\u001a\b\u0012\u0004\u0012\u00020\u00030\u0005\u00a2\u0006\b\n\u0000\u001a\u0004\b\u0007\u0010\bR\u0011\u0010\u0002\u001a\u00020\u0003\u00a2\u0006\b\n\u0000\u001a\u0004\b\t\u0010\n\u00a8\u0006\u0014"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$Evidence;", "", "kind", "", "checks", "", "(Ljava/lang/String;Ljava/util/List;)V", "getChecks", "()Ljava/util/List;", "getKind", "()Ljava/lang/String;", "component1", "component2", "copy", "equals", "", "other", "hashCode", "", "toString", "kotlin-testsuite"})
+ public static final class Evidence {
+ @org.jetbrains.annotations.NotNull()
+ private final java.lang.String kind = null;
+ @org.jetbrains.annotations.NotNull()
+ private final java.util.List checks = null;
+
+ public Evidence(@org.jetbrains.annotations.NotNull()
+ java.lang.String kind, @org.jetbrains.annotations.NotNull()
+ java.util.List checks) {
+ super();
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.lang.String getKind() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.util.List getChecks() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.lang.String component1() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.util.List component2() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialIssuerTest.Evidence copy(@org.jetbrains.annotations.NotNull()
+ java.lang.String kind, @org.jetbrains.annotations.NotNull()
+ java.util.List checks) {
+ return null;
+ }
+
+ @java.lang.Override()
+ public boolean equals(@org.jetbrains.annotations.Nullable()
+ java.lang.Object other) {
+ return false;
+ }
+
+ @java.lang.Override()
+ public int hashCode() {
+ return 0;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public java.lang.String toString() {
+ return null;
+ }
+ }
+
+ @kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000\"\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000e\n\u0002\b\f\n\u0002\u0010\u000b\n\u0002\b\u0002\n\u0002\u0010\b\n\u0002\b\u0002\b\u0086\b\u0018\u00002\u00020\u0001B!\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\b\u0010\u0004\u001a\u0004\u0018\u00010\u0003\u0012\b\u0010\u0005\u001a\u0004\u0018\u00010\u0003\u00a2\u0006\u0002\u0010\u0006J\t\u0010\u000b\u001a\u00020\u0003H\u00c6\u0003J\u000b\u0010\f\u001a\u0004\u0018\u00010\u0003H\u00c6\u0003J\u000b\u0010\r\u001a\u0004\u0018\u00010\u0003H\u00c6\u0003J+\u0010\u000e\u001a\u00020\u00002\b\b\u0002\u0010\u0002\u001a\u00020\u00032\n\b\u0002\u0010\u0004\u001a\u0004\u0018\u00010\u00032\n\b\u0002\u0010\u0005\u001a\u0004\u0018\u00010\u0003H\u00c6\u0001J\u0013\u0010\u000f\u001a\u00020\u00102\b\u0010\u0011\u001a\u0004\u0018\u00010\u0001H\u00d6\u0003J\t\u0010\u0012\u001a\u00020\u0013H\u00d6\u0001J\t\u0010\u0014\u001a\u00020\u0003H\u00d6\u0001R\u0011\u0010\u0002\u001a\u00020\u0003\u00a2\u0006\b\n\u0000\u001a\u0004\b\u0007\u0010\bR\u0013\u0010\u0005\u001a\u0004\u0018\u00010\u0003\u00a2\u0006\b\n\u0000\u001a\u0004\b\t\u0010\bR\u0013\u0010\u0004\u001a\u0004\u0018\u00010\u0003\u00a2\u0006\b\n\u0000\u001a\u0004\b\n\u0010\b\u00a8\u0006\u0015"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$KccCredential;", "", "countryOfResidence", "", "tier", "jurisdiction", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", "getCountryOfResidence", "()Ljava/lang/String;", "getJurisdiction", "getTier", "component1", "component2", "component3", "copy", "equals", "", "other", "hashCode", "", "toString", "kotlin-testsuite"})
+ public static final class KccCredential {
+ @org.jetbrains.annotations.NotNull()
+ private final java.lang.String countryOfResidence = null;
+ @org.jetbrains.annotations.Nullable()
+ private final java.lang.String tier = null;
+ @org.jetbrains.annotations.Nullable()
+ private final java.lang.String jurisdiction = null;
+
+ public KccCredential(@org.jetbrains.annotations.NotNull()
+ java.lang.String countryOfResidence, @org.jetbrains.annotations.Nullable()
+ java.lang.String tier, @org.jetbrains.annotations.Nullable()
+ java.lang.String jurisdiction) {
+ super();
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.lang.String getCountryOfResidence() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.Nullable()
+ public final java.lang.String getTier() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.Nullable()
+ public final java.lang.String getJurisdiction() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.lang.String component1() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.Nullable()
+ public final java.lang.String component2() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.Nullable()
+ public final java.lang.String component3() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialIssuerTest.KccCredential copy(@org.jetbrains.annotations.NotNull()
+ java.lang.String countryOfResidence, @org.jetbrains.annotations.Nullable()
+ java.lang.String tier, @org.jetbrains.annotations.Nullable()
+ java.lang.String jurisdiction) {
+ return null;
+ }
+
+ @java.lang.Override()
+ public boolean equals(@org.jetbrains.annotations.Nullable()
+ java.lang.Object other) {
+ return false;
+ }
+
+ @java.lang.Override()
+ public int hashCode() {
+ return 0;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public java.lang.String toString() {
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest.kapt_metadata
new file mode 100644
index 0000000..379728d
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest.java
new file mode 100644
index 0000000..7a1979d
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest.java
@@ -0,0 +1,315 @@
+package website.tbd.developer.site.docs.tbdex;
+
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000D\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000e\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0002\b\u0007\n\u0002\u0018\u0002\n\u0002\b\u0005\n\u0002\u0010 \n\u0002\b\u0003\n\u0002\u0010\u0002\n\u0002\b\u0006\n\u0002\u0010\t\n\u0002\b\u0006\n\u0002\u0018\u0002\n\u0002\b\u0017\u0018\u00002\u00020\u0001:\u0003<=>B\u0005\u00a2\u0006\u0002\u0010\u0002J\b\u0010\u0019\u001a\u00020\u001aH\u0007J\u0010\u0010\u001b\u001a\u00020\u001a2\u0006\u0010\u001c\u001a\u00020\u0004H\u0002J,\u0010\u001d\u001a\u00020\u001a2\b\u0010\u001e\u001a\u0004\u0018\u00010\u00042\b\u0010\u001f\u001a\u0004\u0018\u00010\u00042\b\b\u0002\u0010 \u001a\u00020!H\u0082@\u00a2\u0006\u0002\u0010\"J\u000e\u0010#\u001a\u00020\u001aH\u0082@\u00a2\u0006\u0002\u0010$J\u000e\u0010%\u001a\u00020\u001aH\u0082@\u00a2\u0006\u0002\u0010$J\u0016\u0010&\u001a\u00020\u001a2\u0006\u0010\'\u001a\u00020(H\u0082@\u00a2\u0006\u0002\u0010)J\u0016\u0010*\u001a\u00020\u001a2\u0006\u0010+\u001a\u00020\u0004H\u0082@\u00a2\u0006\u0002\u0010,J\u0010\u0010-\u001a\u00020\u001a2\u0006\u0010.\u001a\u00020\u0004H\u0002J\u001e\u0010/\u001a\u00020\u001a2\u0006\u00100\u001a\u00020\u00042\u0006\u00101\u001a\u00020\u0004H\u0082@\u00a2\u0006\u0002\u00102J\b\u00103\u001a\u00020\u001aH\u0007J\"\u00104\u001a\u00020\u001a2\b\u00105\u001a\u0004\u0018\u00010\u00042\b\u00106\u001a\u0004\u0018\u00010\u0004H\u0082@\u00a2\u0006\u0002\u00102J\u0016\u00107\u001a\u00020\u00042\u0006\u0010\u000b\u001a\u00020\u0004H\u0082@\u00a2\u0006\u0002\u0010,J\u0010\u00108\u001a\u00020\u001a2\u0006\u00109\u001a\u00020\u0004H\u0002J\u0016\u0010:\u001a\u00020\u001a2\u0006\u0010;\u001a\u00020\u0004H\u0082@\u00a2\u0006\u0002\u0010,R\u0014\u0010\u0003\u001a\u00020\u0004X\u0086D\u00a2\u0006\b\n\u0000\u001a\u0004\b\u0005\u0010\u0006R\u0011\u0010\u0007\u001a\u00020\b\u00a2\u0006\b\n\u0000\u001a\u0004\b\t\u0010\nR\u0011\u0010\u000b\u001a\u00020\u0004\u00a2\u0006\b\n\u0000\u001a\u0004\b\f\u0010\u0006R\u0014\u0010\r\u001a\u00020\u0004X\u0086D\u00a2\u0006\b\n\u0000\u001a\u0004\b\u000e\u0010\u0006R\u0011\u0010\u000f\u001a\u00020\u0010\u00a2\u0006\b\n\u0000\u001a\u0004\b\u0011\u0010\u0012R\u0011\u0010\u0013\u001a\u00020\b\u00a2\u0006\b\n\u0000\u001a\u0004\b\u0014\u0010\nR\u0017\u0010\u0015\u001a\b\u0012\u0004\u0012\u00020\u00040\u0016\u00a2\u0006\b\n\u0000\u001a\u0004\b\u0017\u0010\u0018\u00a8\u0006?"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest;", "", "()V", "idCredentialJwt", "", "getIdCredentialJwt", "()Ljava/lang/String;", "issuerDid", "Lweb5/sdk/dids/did/BearerDid;", "getIssuerDid", "()Lweb5/sdk/dids/did/BearerDid;", "issuerDidUri", "getIssuerDidUri", "nameCredentialJwt", "getNameCredentialJwt", "presentationDefinition", "Lweb5/sdk/credentials/model/PresentationDefinitionV2;", "getPresentationDefinition", "()Lweb5/sdk/credentials/model/PresentationDefinitionV2;", "userBearerDid", "getUserBearerDid", "userVcJwts", "", "getUserVcJwts", "()Ljava/util/List;", "JwtUtil sign() works with a valid payload and bearer DID", "", "displayNotification", "message", "fetchAccessToken", "preAuthorizationCode", "tokenEndpoint", "retryDelay", "", "(Ljava/lang/String;Ljava/lang/String;JLkotlin/coroutines/Continuation;)Ljava/lang/Object;", "fetchAuthServerMetadata", "(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;", "fetchIssuerMetadata", "handleIssuerResponse", "issuerResponse", "Lwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$IssuerResponse;", "(Lwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$IssuerResponse;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;", "handleSiopRequest", "encodedSiopRequest", "(Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;", "openIdvForm", "url", "postSiopResponse", "responseUri", "responsePayload", "(Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;", "presentation exchange selects(), satisfies() and creates() VP", "requestKnownCustomerCredential", "credentialEndpoint", "accessToken", "resolveIssuerDid", "secureStoreCredential", "credential", "sendRequestToIdvServiceEndpoint", "idvServiceEndpoint", "CredentialOffer", "IssuerResponse", "WalletStorage", "kotlin-testsuite"})
+public final class KnownCustomerCredentialWalletTest {
+ @org.jetbrains.annotations.NotNull()
+ private final web5.sdk.dids.did.BearerDid userBearerDid = null;
+ @org.jetbrains.annotations.NotNull()
+ private final web5.sdk.dids.did.BearerDid issuerDid = null;
+ @org.jetbrains.annotations.NotNull()
+ private final java.lang.String issuerDidUri = null;
+ @org.jetbrains.annotations.NotNull()
+ private final java.lang.String nameCredentialJwt = "eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byMwIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiSURDYXJkQ3JlZGVudGlhbFBhcnQxIl0sImlkIjoidXJuOnV1aWQ6NTdhNWU4ZWUtYmZlMC00YjQwLWJmMDAtZTA4MTY5ZDk5Y2Q1IiwiaXNzdWVyIjoiZGlkOmRodDpmYzZyNmJnNjl0Nms4dTl1OXN1NTNhYWY2anUxeGRwd2R6dXcza2p1OHNzYW1iM3Bwc3VvIiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMy0yMVQyMToyMTo1MVoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byIsImdpdmVuX25hbWUiOiJBbGljZSIsImZhbWlseV9uYW1lIjoiU21pdGgifX0sImlzcyI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byIsInN1YiI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byJ9.kt0rKEgZ1_U4eTUNDgUU9LzmFViHsx_1z6llfFAqCdpzwIsKKYbqfbtgckJDsoV9xqgG5TYAVPxeLo5hCAguDA";
+ @org.jetbrains.annotations.NotNull()
+ private final java.lang.String idCredentialJwt = "eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byMwIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiSURDYXJkQ3JlZGVudGlhbFBhcnQyIl0sImlkIjoidXJuOnV1aWQ6YTM5ZmQ3NjgtNjVjMy00MDZhLWIwMGItMTg1MjIxM2ExYzhjIiwiaXNzdWVyIjoiZGlkOmRodDpmYzZyNmJnNjl0Nms4dTl1OXN1NTNhYWY2anUxeGRwd2R6dXcza2p1OHNzYW1iM3Bwc3VvIiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMy0yMVQyMToyMTo1MVoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byIsImJpcnRoZGF0ZSI6IjE5OTAtMDEtMDEiLCJuYXRpb25hbF9pZGVudGlmaWVyIjoiMTIzLTQ1LTY3ODkifX0sImlzcyI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byIsInN1YiI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byJ9.lQOBdE3LGQ_rLz69SQoI_auOsFpsOESBIbHNf9HpYTGYTT2aYw8WrKd1rXQuRqzgELcv92iWQRpWoVm193x3CQ";
+ @org.jetbrains.annotations.NotNull()
+ private final java.util.List userVcJwts = null;
+ @org.jetbrains.annotations.NotNull()
+ private final web5.sdk.credentials.model.PresentationDefinitionV2 presentationDefinition = null;
+
+ public KnownCustomerCredentialWalletTest() {
+ super();
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final web5.sdk.dids.did.BearerDid getUserBearerDid() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final web5.sdk.dids.did.BearerDid getIssuerDid() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.lang.String getIssuerDidUri() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.lang.String getNameCredentialJwt() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.lang.String getIdCredentialJwt() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.util.List getUserVcJwts() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final web5.sdk.credentials.model.PresentationDefinitionV2 getPresentationDefinition() {
+ return null;
+ }
+
+ private final java.lang.Object resolveIssuerDid(java.lang.String issuerDidUri, kotlin.coroutines.Continuation super java.lang.String> $completion) {
+ return null;
+ }
+
+ private final java.lang.Object sendRequestToIdvServiceEndpoint(java.lang.String idvServiceEndpoint, kotlin.coroutines.Continuation super kotlin.Unit> $completion) {
+ return null;
+ }
+
+ private final java.lang.Object handleSiopRequest(java.lang.String encodedSiopRequest, kotlin.coroutines.Continuation super kotlin.Unit> $completion) {
+ return null;
+ }
+
+ private final java.lang.Object postSiopResponse(java.lang.String responseUri, java.lang.String responsePayload, kotlin.coroutines.Continuation super kotlin.Unit> $completion) {
+ return null;
+ }
+
+ private final java.lang.Object handleIssuerResponse(website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest.IssuerResponse issuerResponse, kotlin.coroutines.Continuation super kotlin.Unit> $completion) {
+ return null;
+ }
+
+ private final void openIdvForm(java.lang.String url) {
+ }
+
+ private final java.lang.Object fetchIssuerMetadata(kotlin.coroutines.Continuation super kotlin.Unit> $completion) {
+ return null;
+ }
+
+ private final java.lang.Object fetchAuthServerMetadata(kotlin.coroutines.Continuation super kotlin.Unit> $completion) {
+ return null;
+ }
+
+ private final java.lang.Object fetchAccessToken(java.lang.String preAuthorizationCode, java.lang.String tokenEndpoint, long retryDelay, kotlin.coroutines.Continuation super kotlin.Unit> $completion) {
+ return null;
+ }
+
+ private final void displayNotification(java.lang.String message) {
+ }
+
+ private final void secureStoreCredential(java.lang.String credential) {
+ }
+
+ private final java.lang.Object requestKnownCustomerCredential(java.lang.String credentialEndpoint, java.lang.String accessToken, kotlin.coroutines.Continuation super kotlin.Unit> $completion) {
+ return null;
+ }
+
+ @kotlinx.serialization.Serializable()
+ @kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000.\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0010 \n\u0000\n\u0002\u0018\u0002\n\u0002\b\f\n\u0002\u0010\u000b\n\u0002\b\u0002\n\u0002\u0010\b\n\u0002\b\u0002\b\u0087\b\u0018\u00002\u00020\u0001B#\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\f\u0010\u0004\u001a\b\u0012\u0004\u0012\u00020\u00030\u0005\u0012\u0006\u0010\u0006\u001a\u00020\u0007\u00a2\u0006\u0002\u0010\bJ\t\u0010\u000f\u001a\u00020\u0003H\u00c6\u0003J\u000f\u0010\u0010\u001a\b\u0012\u0004\u0012\u00020\u00030\u0005H\u00c6\u0003J\t\u0010\u0011\u001a\u00020\u0007H\u00c6\u0003J-\u0010\u0012\u001a\u00020\u00002\b\b\u0002\u0010\u0002\u001a\u00020\u00032\u000e\b\u0002\u0010\u0004\u001a\b\u0012\u0004\u0012\u00020\u00030\u00052\b\b\u0002\u0010\u0006\u001a\u00020\u0007H\u00c6\u0001J\u0013\u0010\u0013\u001a\u00020\u00142\b\u0010\u0015\u001a\u0004\u0018\u00010\u0001H\u00d6\u0003J\t\u0010\u0016\u001a\u00020\u0017H\u00d6\u0001J\t\u0010\u0018\u001a\u00020\u0003H\u00d6\u0001R\u0017\u0010\u0004\u001a\b\u0012\u0004\u0012\u00020\u00030\u0005\u00a2\u0006\b\n\u0000\u001a\u0004\b\t\u0010\nR\u0011\u0010\u0002\u001a\u00020\u0003\u00a2\u0006\b\n\u0000\u001a\u0004\b\u000b\u0010\fR\u0011\u0010\u0006\u001a\u00020\u0007\u00a2\u0006\b\n\u0000\u001a\u0004\b\r\u0010\u000e\u00a8\u0006\u0019"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$CredentialOffer;", "", "credential_issuer", "", "credential_configuration_ids", "", "grants", "Lkotlinx/serialization/json/JsonObject;", "(Ljava/lang/String;Ljava/util/List;Lkotlinx/serialization/json/JsonObject;)V", "getCredential_configuration_ids", "()Ljava/util/List;", "getCredential_issuer", "()Ljava/lang/String;", "getGrants", "()Lkotlinx/serialization/json/JsonObject;", "component1", "component2", "component3", "copy", "equals", "", "other", "hashCode", "", "toString", "kotlin-testsuite"})
+ public static final class CredentialOffer {
+ @org.jetbrains.annotations.NotNull()
+ private final java.lang.String credential_issuer = null;
+ @org.jetbrains.annotations.NotNull()
+ private final java.util.List credential_configuration_ids = null;
+ @org.jetbrains.annotations.NotNull()
+ private final kotlinx.serialization.json.JsonObject grants = null;
+
+ public CredentialOffer(@org.jetbrains.annotations.NotNull()
+ java.lang.String credential_issuer, @org.jetbrains.annotations.NotNull()
+ java.util.List credential_configuration_ids, @org.jetbrains.annotations.NotNull()
+ kotlinx.serialization.json.JsonObject grants) {
+ super();
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.lang.String getCredential_issuer() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.util.List getCredential_configuration_ids() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final kotlinx.serialization.json.JsonObject getGrants() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.lang.String component1() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.util.List component2() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final kotlinx.serialization.json.JsonObject component3() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest.CredentialOffer copy(@org.jetbrains.annotations.NotNull()
+ java.lang.String credential_issuer, @org.jetbrains.annotations.NotNull()
+ java.util.List credential_configuration_ids, @org.jetbrains.annotations.NotNull()
+ kotlinx.serialization.json.JsonObject grants) {
+ return null;
+ }
+
+ @java.lang.Override()
+ public boolean equals(@org.jetbrains.annotations.Nullable()
+ java.lang.Object other) {
+ return false;
+ }
+
+ @java.lang.Override()
+ public int hashCode() {
+ return 0;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public java.lang.String toString() {
+ return null;
+ }
+ }
+
+ @kotlinx.serialization.Serializable()
+ @kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000(\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u000e\n\u0002\b\t\n\u0002\u0010\u000b\n\u0002\b\u0002\n\u0002\u0010\b\n\u0002\b\u0002\b\u0087\b\u0018\u00002\u00020\u0001B\u001d\u0012\n\b\u0002\u0010\u0002\u001a\u0004\u0018\u00010\u0003\u0012\n\b\u0002\u0010\u0004\u001a\u0004\u0018\u00010\u0005\u00a2\u0006\u0002\u0010\u0006J\u000b\u0010\u000b\u001a\u0004\u0018\u00010\u0003H\u00c6\u0003J\u000b\u0010\f\u001a\u0004\u0018\u00010\u0005H\u00c6\u0003J!\u0010\r\u001a\u00020\u00002\n\b\u0002\u0010\u0002\u001a\u0004\u0018\u00010\u00032\n\b\u0002\u0010\u0004\u001a\u0004\u0018\u00010\u0005H\u00c6\u0001J\u0013\u0010\u000e\u001a\u00020\u000f2\b\u0010\u0010\u001a\u0004\u0018\u00010\u0001H\u00d6\u0003J\t\u0010\u0011\u001a\u00020\u0012H\u00d6\u0001J\t\u0010\u0013\u001a\u00020\u0005H\u00d6\u0001R\u0013\u0010\u0002\u001a\u0004\u0018\u00010\u0003\u00a2\u0006\b\n\u0000\u001a\u0004\b\u0007\u0010\bR\u0013\u0010\u0004\u001a\u0004\u0018\u00010\u0005\u00a2\u0006\b\n\u0000\u001a\u0004\b\t\u0010\n\u00a8\u0006\u0014"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$IssuerResponse;", "", "credential_offer", "Lwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$CredentialOffer;", "url", "", "(Lwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$CredentialOffer;Ljava/lang/String;)V", "getCredential_offer", "()Lwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$CredentialOffer;", "getUrl", "()Ljava/lang/String;", "component1", "component2", "copy", "equals", "", "other", "hashCode", "", "toString", "kotlin-testsuite"})
+ public static final class IssuerResponse {
+ @org.jetbrains.annotations.Nullable()
+ private final website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest.CredentialOffer credential_offer = null;
+ @org.jetbrains.annotations.Nullable()
+ private final java.lang.String url = null;
+
+ public IssuerResponse(@org.jetbrains.annotations.Nullable()
+ website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest.CredentialOffer credential_offer, @org.jetbrains.annotations.Nullable()
+ java.lang.String url) {
+ super();
+ }
+
+ @org.jetbrains.annotations.Nullable()
+ public final website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest.CredentialOffer getCredential_offer() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.Nullable()
+ public final java.lang.String getUrl() {
+ return null;
+ }
+
+ public IssuerResponse() {
+ super();
+ }
+
+ @org.jetbrains.annotations.Nullable()
+ public final website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest.CredentialOffer component1() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.Nullable()
+ public final java.lang.String component2() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest.IssuerResponse copy(@org.jetbrains.annotations.Nullable()
+ website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest.CredentialOffer credential_offer, @org.jetbrains.annotations.Nullable()
+ java.lang.String url) {
+ return null;
+ }
+
+ @java.lang.Override()
+ public boolean equals(@org.jetbrains.annotations.Nullable()
+ java.lang.Object other) {
+ return false;
+ }
+
+ @java.lang.Override()
+ public int hashCode() {
+ return 0;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public java.lang.String toString() {
+ return null;
+ }
+ }
+
+ @kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000\u0014\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000e\n\u0002\b\u0014\b\u00c6\u0002\u0018\u00002\u00020\u0001B\u0007\b\u0002\u00a2\u0006\u0002\u0010\u0002R\u001c\u0010\u0003\u001a\u0004\u0018\u00010\u0004X\u0086\u000e\u00a2\u0006\u000e\n\u0000\u001a\u0004\b\u0005\u0010\u0006\"\u0004\b\u0007\u0010\bR\u001c\u0010\t\u001a\u0004\u0018\u00010\u0004X\u0086\u000e\u00a2\u0006\u000e\n\u0000\u001a\u0004\b\n\u0010\u0006\"\u0004\b\u000b\u0010\bR\u001c\u0010\f\u001a\u0004\u0018\u00010\u0004X\u0086\u000e\u00a2\u0006\u000e\n\u0000\u001a\u0004\b\r\u0010\u0006\"\u0004\b\u000e\u0010\bR\u001c\u0010\u000f\u001a\u0004\u0018\u00010\u0004X\u0086\u000e\u00a2\u0006\u000e\n\u0000\u001a\u0004\b\u0010\u0010\u0006\"\u0004\b\u0011\u0010\bR\u001c\u0010\u0012\u001a\u0004\u0018\u00010\u0004X\u0086\u000e\u00a2\u0006\u000e\n\u0000\u001a\u0004\b\u0013\u0010\u0006\"\u0004\b\u0014\u0010\bR\u001c\u0010\u0015\u001a\u0004\u0018\u00010\u0004X\u0086\u000e\u00a2\u0006\u000e\n\u0000\u001a\u0004\b\u0016\u0010\u0006\"\u0004\b\u0017\u0010\b\u00a8\u0006\u0018"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$WalletStorage;", "", "()V", "accessToken", "", "getAccessToken", "()Ljava/lang/String;", "setAccessToken", "(Ljava/lang/String;)V", "cNonce", "getCNonce", "setCNonce", "credentialEndpoint", "getCredentialEndpoint", "setCredentialEndpoint", "credentialIssuer", "getCredentialIssuer", "setCredentialIssuer", "preAuthorizedCode", "getPreAuthorizedCode", "setPreAuthorizedCode", "tokenEndpoint", "getTokenEndpoint", "setTokenEndpoint", "kotlin-testsuite"})
+ public static final class WalletStorage {
+ @org.jetbrains.annotations.Nullable()
+ private static java.lang.String credentialIssuer;
+ @org.jetbrains.annotations.Nullable()
+ private static java.lang.String preAuthorizedCode;
+ @org.jetbrains.annotations.Nullable()
+ private static java.lang.String credentialEndpoint;
+ @org.jetbrains.annotations.Nullable()
+ private static java.lang.String tokenEndpoint;
+ @org.jetbrains.annotations.Nullable()
+ private static java.lang.String accessToken;
+ @org.jetbrains.annotations.Nullable()
+ private static java.lang.String cNonce;
+ @org.jetbrains.annotations.NotNull()
+ public static final website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest.WalletStorage INSTANCE = null;
+
+ private WalletStorage() {
+ super();
+ }
+
+ @org.jetbrains.annotations.Nullable()
+ public final java.lang.String getCredentialIssuer() {
+ return null;
+ }
+
+ public final void setCredentialIssuer(@org.jetbrains.annotations.Nullable()
+ java.lang.String p0) {
+ }
+
+ @org.jetbrains.annotations.Nullable()
+ public final java.lang.String getPreAuthorizedCode() {
+ return null;
+ }
+
+ public final void setPreAuthorizedCode(@org.jetbrains.annotations.Nullable()
+ java.lang.String p0) {
+ }
+
+ @org.jetbrains.annotations.Nullable()
+ public final java.lang.String getCredentialEndpoint() {
+ return null;
+ }
+
+ public final void setCredentialEndpoint(@org.jetbrains.annotations.Nullable()
+ java.lang.String p0) {
+ }
+
+ @org.jetbrains.annotations.Nullable()
+ public final java.lang.String getTokenEndpoint() {
+ return null;
+ }
+
+ public final void setTokenEndpoint(@org.jetbrains.annotations.Nullable()
+ java.lang.String p0) {
+ }
+
+ @org.jetbrains.annotations.Nullable()
+ public final java.lang.String getAccessToken() {
+ return null;
+ }
+
+ public final void setAccessToken(@org.jetbrains.annotations.Nullable()
+ java.lang.String p0) {
+ }
+
+ @org.jetbrains.annotations.Nullable()
+ public final java.lang.String getCNonce() {
+ return null;
+ }
+
+ public final void setCNonce(@org.jetbrains.annotations.Nullable()
+ java.lang.String p0) {
+ }
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest.kapt_metadata
new file mode 100644
index 0000000..345eaff
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/SanctionsCredential.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/SanctionsCredential.java
new file mode 100644
index 0000000..17d81f8
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/SanctionsCredential.java
@@ -0,0 +1,45 @@
+package website.tbd.developer.site.docs.tbdex;
+
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000&\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010 \n\u0002\u0010\u000e\n\u0002\b\u0006\n\u0002\u0010\u000b\n\u0002\b\u0002\n\u0002\u0010\b\n\u0002\b\u0002\b\u0086\b\u0018\u00002\u00020\u0001B\u0013\u0012\f\u0010\u0002\u001a\b\u0012\u0004\u0012\u00020\u00040\u0003\u00a2\u0006\u0002\u0010\u0005J\u000f\u0010\b\u001a\b\u0012\u0004\u0012\u00020\u00040\u0003H\u00c6\u0003J\u0019\u0010\t\u001a\u00020\u00002\u000e\b\u0002\u0010\u0002\u001a\b\u0012\u0004\u0012\u00020\u00040\u0003H\u00c6\u0001J\u0013\u0010\n\u001a\u00020\u000b2\b\u0010\f\u001a\u0004\u0018\u00010\u0001H\u00d6\u0003J\t\u0010\r\u001a\u00020\u000eH\u00d6\u0001J\t\u0010\u000f\u001a\u00020\u0004H\u00d6\u0001R\u0017\u0010\u0002\u001a\b\u0012\u0004\u0012\u00020\u00040\u0003\u00a2\u0006\b\n\u0000\u001a\u0004\b\u0006\u0010\u0007\u00a8\u0006\u0010"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/SanctionsCredential;", "", "listsCleared", "", "", "(Ljava/util/List;)V", "getListsCleared", "()Ljava/util/List;", "component1", "copy", "equals", "", "other", "hashCode", "", "toString", "kotlin-testsuite"})
+public final class SanctionsCredential {
+ @org.jetbrains.annotations.NotNull()
+ private final java.util.List listsCleared = null;
+
+ public SanctionsCredential(@org.jetbrains.annotations.NotNull()
+ java.util.List listsCleared) {
+ super();
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.util.List getListsCleared() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.util.List component1() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final website.tbd.developer.site.docs.tbdex.SanctionsCredential copy(@org.jetbrains.annotations.NotNull()
+ java.util.List listsCleared) {
+ return null;
+ }
+
+ @java.lang.Override()
+ public boolean equals(@org.jetbrains.annotations.Nullable()
+ java.lang.Object other) {
+ return false;
+ }
+
+ @java.lang.Override()
+ public int hashCode() {
+ return 0;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public java.lang.String toString() {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/SanctionsCredential.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/SanctionsCredential.kapt_metadata
new file mode 100644
index 0000000..161157b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/SanctionsCredential.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/SanctionsListResult.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/SanctionsListResult.java
new file mode 100644
index 0000000..1d744ef
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/SanctionsListResult.java
@@ -0,0 +1,54 @@
+package website.tbd.developer.site.docs.tbdex;
+
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000$\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000b\n\u0000\n\u0002\u0010 \n\u0002\u0010\u000e\n\u0002\b\n\n\u0002\u0010\b\n\u0002\b\u0002\b\u0086\b\u0018\u00002\u00020\u0001B\u001b\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\f\u0010\u0004\u001a\b\u0012\u0004\u0012\u00020\u00060\u0005\u00a2\u0006\u0002\u0010\u0007J\t\u0010\u000b\u001a\u00020\u0003H\u00c6\u0003J\u000f\u0010\f\u001a\b\u0012\u0004\u0012\u00020\u00060\u0005H\u00c6\u0003J#\u0010\r\u001a\u00020\u00002\b\b\u0002\u0010\u0002\u001a\u00020\u00032\u000e\b\u0002\u0010\u0004\u001a\b\u0012\u0004\u0012\u00020\u00060\u0005H\u00c6\u0001J\u0013\u0010\u000e\u001a\u00020\u00032\b\u0010\u000f\u001a\u0004\u0018\u00010\u0001H\u00d6\u0003J\t\u0010\u0010\u001a\u00020\u0011H\u00d6\u0001J\t\u0010\u0012\u001a\u00020\u0006H\u00d6\u0001R\u0011\u0010\u0002\u001a\u00020\u0003\u00a2\u0006\b\n\u0000\u001a\u0004\b\u0002\u0010\bR\u0017\u0010\u0004\u001a\b\u0012\u0004\u0012\u00020\u00060\u0005\u00a2\u0006\b\n\u0000\u001a\u0004\b\t\u0010\n\u00a8\u0006\u0013"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/SanctionsListResult;", "", "isSanctioned", "", "listsCleared", "", "", "(ZLjava/util/List;)V", "()Z", "getListsCleared", "()Ljava/util/List;", "component1", "component2", "copy", "equals", "other", "hashCode", "", "toString", "kotlin-testsuite"})
+public final class SanctionsListResult {
+ private final boolean isSanctioned = false;
+ @org.jetbrains.annotations.NotNull()
+ private final java.util.List listsCleared = null;
+
+ public SanctionsListResult(boolean isSanctioned, @org.jetbrains.annotations.NotNull()
+ java.util.List listsCleared) {
+ super();
+ }
+
+ public final boolean isSanctioned() {
+ return false;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.util.List getListsCleared() {
+ return null;
+ }
+
+ public final boolean component1() {
+ return false;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.util.List component2() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final website.tbd.developer.site.docs.tbdex.SanctionsListResult copy(boolean isSanctioned, @org.jetbrains.annotations.NotNull()
+ java.util.List listsCleared) {
+ return null;
+ }
+
+ @java.lang.Override()
+ public boolean equals(@org.jetbrains.annotations.Nullable()
+ java.lang.Object other) {
+ return false;
+ }
+
+ @java.lang.Override()
+ public int hashCode() {
+ return 0;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public java.lang.String toString() {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/SanctionsListResult.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/SanctionsListResult.kapt_metadata
new file mode 100644
index 0000000..1b9dc53
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/SanctionsListResult.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/CreatingOfferingsTest.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/CreatingOfferingsTest.java
new file mode 100644
index 0000000..9391b96
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/CreatingOfferingsTest.java
@@ -0,0 +1,16 @@
+package website.tbd.developer.site.docs.tbdex.pfi;
+
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000 \n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u0002\n\u0002\b\u0003\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\b\u0010\u0007\u001a\u00020\bH\u0007J\b\u0010\t\u001a\u00020\bH\u0007J\b\u0010\n\u001a\u00020\bH\u0007R\u000e\u0010\u0003\u001a\u00020\u0004X\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0005\u001a\u00020\u0006X\u0082\u0004\u00a2\u0006\u0002\n\u0000\u00a8\u0006\u000b"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/pfi/CreatingOfferingsTest;", "", "()V", "pd", "Lweb5/sdk/credentials/model/PresentationDefinitionV2;", "pfiDid", "Lweb5/sdk/dids/did/BearerDid;", "Create Offering", "", "Validate KCC PD", "setup", "kotlin-testsuite"})
+public final class CreatingOfferingsTest {
+ @org.jetbrains.annotations.NotNull()
+ private final web5.sdk.dids.did.BearerDid pfiDid = null;
+ private web5.sdk.credentials.model.PresentationDefinitionV2 pd;
+
+ public CreatingOfferingsTest() {
+ super();
+ }
+
+ @org.junit.jupiter.api.BeforeEach()
+ public final void setup() {
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/CreatingOfferingsTest.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/CreatingOfferingsTest.kapt_metadata
new file mode 100644
index 0000000..6ea7c9a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/CreatingOfferingsTest.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest.java
new file mode 100644
index 0000000..1186141
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest.java
@@ -0,0 +1,18 @@
+package website.tbd.developer.site.docs.tbdex.pfi;
+
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u00002\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u0002\n\u0002\b\u0002\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\b\u0010\r\u001a\u00020\u000eH\u0007J\b\u0010\u000f\u001a\u00020\u000eH\u0007R\u000e\u0010\u0003\u001a\u00020\u0004X\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0005\u001a\u00020\u0006X\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0007\u001a\u00020\bX\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\t\u001a\u00020\nX\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u000b\u001a\u00020\fX\u0082.\u00a2\u0006\u0002\n\u0000\u00a8\u0006\u0010"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest;", "", "()V", "dataProvider", "Lwebsite/tbd/developer/site/docs/utils/MockDataProvider;", "exchangesApiProvider", "Lwebsite/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider;", "message", "Ltbdex/sdk/protocol/models/Message;", "offeringsApiProvider", "Lwebsite/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider;", "pfiDid", "Lweb5/sdk/dids/did/BearerDid;", "PFI creates and signs quote", "", "setup", "kotlin-testsuite"})
+public final class CreatingQuotesTest {
+ private website.tbd.developer.site.docs.tbdex.pfi.OfferingsApiProvider offeringsApiProvider;
+ private website.tbd.developer.site.docs.tbdex.pfi.ExchangesApiProvider exchangesApiProvider;
+ private website.tbd.developer.site.docs.utils.MockDataProvider dataProvider;
+ private web5.sdk.dids.did.BearerDid pfiDid;
+ private tbdex.sdk.protocol.models.Message message;
+
+ public CreatingQuotesTest() {
+ super();
+ }
+
+ @org.junit.jupiter.api.BeforeEach()
+ public final void setup() {
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest.kapt_metadata
new file mode 100644
index 0000000..94cd328
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider.java
new file mode 100644
index 0000000..4f5fa40
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider.java
@@ -0,0 +1,14 @@
+package website.tbd.developer.site.docs.tbdex.pfi;
+
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000\u001e\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u000e\n\u0000\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\u0018\u0010\u0003\u001a\u00020\u00042\u0006\u0010\u0005\u001a\u00020\u00062\b\b\u0002\u0010\u0007\u001a\u00020\b\u00a8\u0006\t"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider;", "Lwebsite/tbd/developer/site/docs/utils/MockExchangesApiProvider;", "()V", "write", "", "message", "Ltbdex/sdk/protocol/models/Message;", "replyTo", "", "kotlin-testsuite"})
+public final class ExchangesApiProvider extends website.tbd.developer.site.docs.utils.MockExchangesApiProvider {
+
+ public ExchangesApiProvider() {
+ super();
+ }
+
+ public final void write(@org.jetbrains.annotations.NotNull()
+ tbdex.sdk.protocol.models.Message message, @org.jetbrains.annotations.NotNull()
+ java.lang.String replyTo) {
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider.kapt_metadata
new file mode 100644
index 0000000..83950b1
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider.java
new file mode 100644
index 0000000..b6c5e27
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider.java
@@ -0,0 +1,26 @@
+package website.tbd.developer.site.docs.tbdex.pfi;
+
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000&\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0010 \n\u0000\n\u0002\u0010\u0002\n\u0002\b\u0002\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\u0010\u0010\u0003\u001a\u00020\u00042\u0006\u0010\u0005\u001a\u00020\u0006H\u0016J\u000e\u0010\u0007\u001a\b\u0012\u0004\u0012\u00020\u00040\bH\u0016J\u000e\u0010\t\u001a\u00020\n2\u0006\u0010\u000b\u001a\u00020\u0004\u00a8\u0006\f"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider;", "Lwebsite/tbd/developer/site/docs/utils/MockOfferingsApiProvider;", "()V", "getOffering", "Ltbdex/sdk/protocol/models/Offering;", "id", "", "getOfferings", "", "setOffering", "", "offering", "kotlin-testsuite"})
+public final class OfferingsApiProvider extends website.tbd.developer.site.docs.utils.MockOfferingsApiProvider {
+
+ public OfferingsApiProvider() {
+ super();
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public tbdex.sdk.protocol.models.Offering getOffering(@org.jetbrains.annotations.NotNull()
+ java.lang.String id) {
+ return null;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public java.util.List getOfferings() {
+ return null;
+ }
+
+ public final void setOffering(@org.jetbrains.annotations.NotNull()
+ tbdex.sdk.protocol.models.Offering offering) {
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider.kapt_metadata
new file mode 100644
index 0000000..759a87c
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/PfiOnboardingTest.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/PfiOnboardingTest.java
new file mode 100644
index 0000000..c16d7d0
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/PfiOnboardingTest.java
@@ -0,0 +1,12 @@
+package website.tbd.developer.site.docs.tbdex.pfi;
+
+/**
+ * Tests for PFI Onboarding guide
+ */
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000\u0012\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0000\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\b\u0010\u0003\u001a\u00020\u0004H\u0007\u00a8\u0006\u0005"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/pfi/PfiOnboardingTest;", "", "()V", "create PFI DID", "", "kotlin-testsuite"})
+public final class PfiOnboardingTest {
+
+ public PfiOnboardingTest() {
+ super();
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/PfiOnboardingTest.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/PfiOnboardingTest.kapt_metadata
new file mode 100644
index 0000000..70e98ff
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/PfiOnboardingTest.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest.java
new file mode 100644
index 0000000..36c37ac
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest.java
@@ -0,0 +1,23 @@
+package website.tbd.developer.site.docs.tbdex.pfi;
+
+@org.junit.jupiter.api.TestInstance(value = org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS)
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000,\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u0002\n\u0002\b\u0005\b\u0007\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\b\u0010\u000b\u001a\u00020\fH\u0007J\b\u0010\r\u001a\u00020\fH\u0007J\b\u0010\u000e\u001a\u00020\fH\u0007J\b\u0010\u000f\u001a\u00020\fH\u0007J\b\u0010\u0010\u001a\u00020\fH\u0007R\u000e\u0010\u0003\u001a\u00020\u0004X\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0005\u001a\u00020\u0006X\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0007\u001a\u00020\bX\u0082\u0004\u00a2\u0006\u0002\n\u0000R\u000e\u0010\t\u001a\u00020\nX\u0082.\u00a2\u0006\u0002\n\u0000\u00a8\u0006\u0011"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest;", "", "()V", "exchangesApiProvider", "Lwebsite/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider;", "offeringsApiProvider", "Lwebsite/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider;", "pfiDid", "Lweb5/sdk/dids/did/BearerDid;", "tbDexServer", "Ltbdex/sdk/httpserver/TbdexHttpServer;", "PFI initializes routes", "", "PFI server is initialized", "PFI server is started", "setup", "tearDown", "kotlin-testsuite"})
+public final class PfiStructureTest {
+ @org.jetbrains.annotations.NotNull()
+ private final web5.sdk.dids.did.BearerDid pfiDid = null;
+ private tbdex.sdk.httpserver.TbdexHttpServer tbDexServer;
+ private website.tbd.developer.site.docs.tbdex.pfi.ExchangesApiProvider exchangesApiProvider;
+ private website.tbd.developer.site.docs.tbdex.pfi.OfferingsApiProvider offeringsApiProvider;
+
+ public PfiStructureTest() {
+ super();
+ }
+
+ @org.junit.jupiter.api.BeforeAll()
+ public final void setup() {
+ }
+
+ @org.junit.jupiter.api.AfterAll()
+ public final void tearDown() {
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest.kapt_metadata
new file mode 100644
index 0000000..68ef3d1
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/ProcessingOrdersTest.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/ProcessingOrdersTest.java
new file mode 100644
index 0000000..ef61054
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/ProcessingOrdersTest.java
@@ -0,0 +1,20 @@
+package website.tbd.developer.site.docs.tbdex.pfi;
+
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000.\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0002\b\u0004\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\b\u0010\f\u001a\u00020\rH\u0007J\b\u0010\u000e\u001a\u00020\rH\u0007J\b\u0010\u000f\u001a\u00020\rH\u0007J\b\u0010\u0010\u001a\u00020\rH\u0007R\u000e\u0010\u0003\u001a\u00020\u0004X\u0082\u0004\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0005\u001a\u00020\u0006X\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0007\u001a\u00020\bX\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\t\u001a\u00020\nX\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u000b\u001a\u00020\u0004X\u0082\u0004\u00a2\u0006\u0002\n\u0000\u00a8\u0006\u0011"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/pfi/ProcessingOrdersTest;", "", "()V", "customerDid", "Lweb5/sdk/dids/did/BearerDid;", "dataProvider", "Lwebsite/tbd/developer/site/docs/utils/MockDataProvider;", "exchangesApiProvider", "Lwebsite/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider;", "orderMessage", "Ltbdex/sdk/protocol/models/Order;", "pfiDid", "PFI Accesses Private Data", "", "PFI creates Close and verifies it", "PFI creates orderStatus and verifies it", "setup", "kotlin-testsuite"})
+public final class ProcessingOrdersTest {
+ private website.tbd.developer.site.docs.utils.MockDataProvider dataProvider;
+ @org.jetbrains.annotations.NotNull()
+ private final web5.sdk.dids.did.BearerDid pfiDid = null;
+ @org.jetbrains.annotations.NotNull()
+ private final web5.sdk.dids.did.BearerDid customerDid = null;
+ private website.tbd.developer.site.docs.tbdex.pfi.ExchangesApiProvider exchangesApiProvider;
+ private tbdex.sdk.protocol.models.Order orderMessage;
+
+ public ProcessingOrdersTest() {
+ super();
+ }
+
+ @org.junit.jupiter.api.BeforeEach()
+ public final void setup() {
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/ProcessingOrdersTest.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/ProcessingOrdersTest.kapt_metadata
new file mode 100644
index 0000000..0bba415
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/pfi/ProcessingOrdersTest.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/GetMatchedOfferingsTest.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/GetMatchedOfferingsTest.java
new file mode 100644
index 0000000..7d05fe6
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/GetMatchedOfferingsTest.java
@@ -0,0 +1,30 @@
+package website.tbd.developer.site.docs.tbdex.wallet;
+
+/**
+ * Tests for Wallet: Manage Credentials guide
+ */
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u00002\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010 \n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0010\u0002\n\u0002\b\u0005\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\b\u0010\u000e\u001a\u00020\u000fH\u0007J\b\u0010\u0010\u001a\u00020\u000fH\u0007J\b\u0010\u0011\u001a\u00020\u000fH\u0007J\b\u0010\u0012\u001a\u00020\u000fH\u0007J\b\u0010\u0013\u001a\u00020\u000fH\u0007R\u0014\u0010\u0003\u001a\b\u0012\u0004\u0012\u00020\u00050\u0004X\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0006\u001a\u00020\u0007X\u0082\u0004\u00a2\u0006\u0002\n\u0000R\u000e\u0010\b\u001a\u00020\tX\u0082\u0004\u00a2\u0006\u0002\n\u0000R\u000e\u0010\n\u001a\u00020\u000bX\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\f\u001a\u00020\tX\u0082D\u00a2\u0006\u0002\n\u0000R\u000e\u0010\r\u001a\u00020\tX\u0082D\u00a2\u0006\u0002\n\u0000\u00a8\u0006\u0014"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/wallet/GetMatchedOfferingsTest;", "", "()V", "mockOfferings", "", "Ltbdex/sdk/protocol/models/Offering;", "pfi", "Lweb5/sdk/dids/did/BearerDid;", "pfiDid", "", "server", "Lokhttp3/mockwebserver/MockWebServer;", "vcJwtResidence", "vcJwtSanctions", "match offerings with specific criteria", "", "presentation definition is correctly extracted from offering", "selects credentials based on required claims from offering", "setup", "tearDown", "kotlin-testsuite"})
+public final class GetMatchedOfferingsTest {
+ private okhttp3.mockwebserver.MockWebServer server;
+ @org.jetbrains.annotations.NotNull()
+ private final web5.sdk.dids.did.BearerDid pfi = null;
+ @org.jetbrains.annotations.NotNull()
+ private final java.lang.String pfiDid = null;
+ @org.jetbrains.annotations.NotNull()
+ private final java.lang.String vcJwtResidence = "eyJraWQiOiJkaWQ6ZGh0OnA5cW5idDRrd3lrenF6Znp5eXN0ZDY5Zjhnb3N0YnAzbmY3dGRyczRyd3FqaW16MWsxY3kjMCIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6ZGh0OnA5cW5idDRrd3lrenF6Znp5eXN0ZDY5Zjhnb3N0YnAzbmY3dGRyczRyd3FqaW16MWsxY3kiLCJzdWIiOiJkaWQ6ZGh0OnV1b3J6ZHRqOXgzYTM1OTNtZjlleXNxaHM0NWRrZXpqdzZqYXBkdWRjMXpicjc4aXNnZXkiLCJpYXQiOjE3MDc3NjM4NDgsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJSZXNpZGVuY2VDcmVkZW50aWFsIl0sImlkIjoidXJuOnV1aWQ6ODc5N2VkZDgtNzE2Mi00YTliLWEyMjgtNGRkZTA4NjFlNzZmIiwiaXNzdWVyIjoiZGlkOmRodDpwOXFuYnQ0a3d5a3pxemZ6eXlzdGQ2OWY4Z29zdGJwM25mN3RkcnM0cndxamltejFrMWN5IiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMi0xMlQxODo1MDo0OFoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6dXVvcnpkdGo5eDNhMzU5M21mOWV5c3FoczQ1ZGtlemp3NmphcGR1ZGMxemJyNzhpc2dleSIsImFkZHJlc3MiOiIxMCBPcmNoYXJkIHN0In19fQ.Uvq5jHJbhe7mcPXAMNtfBoD7yez6GXP0GYNuyiZI0_pyfK_mKPjrbkJPXd3LbOtYvB06XxY6tGLMTo7tiMRFDQ";
+ @org.jetbrains.annotations.NotNull()
+ private final java.lang.String vcJwtSanctions = "eyJraWQiOiJkaWQ6ZGh0Onc4bThxNXFja21vZXRzaWlrajR3ZXFhYWRjeGtjNjFkNjh6cnk3aHBpZmdveXE4dG1zb28jMCIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6ZGh0Onc4bThxNXFja21vZXRzaWlrajR3ZXFhYWRjeGtjNjFkNjh6cnk3aHBpZmdveXE4dG1zb28iLCJzdWIiOiJkaWQ6ZGh0OmtkMzVlNmN4M3pueXp1ajR3ejF1ZmRjeGs4ODlzYXVrYXRhYWc3YmNrM2NwY2I3cGM4NW8iLCJpYXQiOjE3MDc0OTEzODcsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTYW5jdGlvbnNDcmVkZW50aWFsIl0sImlkIjoidXJuOnV1aWQ6MGU4YWJhMWYtMmMwZS00MDhlLWIxOWMtZjY0NzZiYTU3NDVhIiwiaXNzdWVyIjoiZGlkOmRodDp3OG04cTVxY2ttb2V0c2lpa2o0d2VxYWFkY3hrYzYxZDY4enJ5N2hwaWZnb3lxOHRtc29vIiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMi0wOVQxNTowOTo0N1oiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6a2QzNWU2Y3gzem55enVqNHd6MXVmZGN4azg4OXNhdWthdGFhZzdiY2szY3BjYjdwYzg1byIsInN0YXR1cyI6ImFwcHJvdmVkIn19fQ.Wc-qV2L3Z5WJYvUYirznpDsyk1Ntcw0kt_bhuXZDqNVXAn-d9Wta67eta-yu7V1C1T74yv6pQaqjgf2rDLxCAg";
+ private java.util.List mockOfferings;
+
+ public GetMatchedOfferingsTest() {
+ super();
+ }
+
+ @org.junit.jupiter.api.BeforeEach()
+ public final void setup() {
+ }
+
+ @org.junit.jupiter.api.AfterEach()
+ public final void tearDown() {
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/GetMatchedOfferingsTest.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/GetMatchedOfferingsTest.kapt_metadata
new file mode 100644
index 0000000..a7c47eb
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/GetMatchedOfferingsTest.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/GetOfferingsTest.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/GetOfferingsTest.java
new file mode 100644
index 0000000..4a7ecd7
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/GetOfferingsTest.java
@@ -0,0 +1,25 @@
+package website.tbd.developer.site.docs.tbdex.wallet;
+
+/**
+ * Tests for Wallet: Get Offerings guide
+ */
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000&\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u0002\n\u0002\b\u0004\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\b\u0010\t\u001a\u00020\nH\u0007J\b\u0010\u000b\u001a\u00020\nH\u0007J\b\u0010\f\u001a\u00020\nH\u0007J\b\u0010\r\u001a\u00020\nH\u0007R\u000e\u0010\u0003\u001a\u00020\u0004X\u0082\u0004\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0005\u001a\u00020\u0006X\u0082\u0004\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0007\u001a\u00020\bX\u0082.\u00a2\u0006\u0002\n\u0000\u00a8\u0006\u000e"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/wallet/GetOfferingsTest;", "", "()V", "pfi", "Lweb5/sdk/dids/did/BearerDid;", "pfiDid", "", "server", "Lokhttp3/mockwebserver/MockWebServer;", "find matching offerings", "", "get all offerings", "setup", "tearDown", "kotlin-testsuite"})
+public final class GetOfferingsTest {
+ private okhttp3.mockwebserver.MockWebServer server;
+ @org.jetbrains.annotations.NotNull()
+ private final web5.sdk.dids.did.BearerDid pfi = null;
+ @org.jetbrains.annotations.NotNull()
+ private final java.lang.String pfiDid = null;
+
+ public GetOfferingsTest() {
+ super();
+ }
+
+ @org.junit.jupiter.api.BeforeEach()
+ public final void setup() {
+ }
+
+ @org.junit.jupiter.api.AfterEach()
+ public final void tearDown() {
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/GetOfferingsTest.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/GetOfferingsTest.kapt_metadata
new file mode 100644
index 0000000..0c28265
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/GetOfferingsTest.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/PfiAllowListTest.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/PfiAllowListTest.java
new file mode 100644
index 0000000..20f54c1
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/PfiAllowListTest.java
@@ -0,0 +1,12 @@
+package website.tbd.developer.site.docs.tbdex.wallet;
+
+/**
+ * Tests for Wallet AllowList guide
+ */
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000\u0012\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0000\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\b\u0010\u0003\u001a\u00020\u0004H\u0007\u00a8\u0006\u0005"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/wallet/PfiAllowListTest;", "", "()V", "check if DID has PFI service", "", "kotlin-testsuite"})
+public final class PfiAllowListTest {
+
+ public PfiAllowListTest() {
+ super();
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/PfiAllowListTest.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/PfiAllowListTest.kapt_metadata
new file mode 100644
index 0000000..5f604cd
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/PfiAllowListTest.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/PlaceOrderTest.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/PlaceOrderTest.java
new file mode 100644
index 0000000..fd07787
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/PlaceOrderTest.java
@@ -0,0 +1,26 @@
+package website.tbd.developer.site.docs.tbdex.wallet;
+
+/**
+ * Tests for Wallet: Placing Orders guide
+ */
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000(\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u000e\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u0002\n\u0002\b\u0004\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\b\u0010\n\u001a\u00020\u000bH\u0007J\b\u0010\f\u001a\u00020\u000bH\u0007J\b\u0010\r\u001a\u00020\u000bH\u0007J\b\u0010\u000e\u001a\u00020\u000bH\u0007R\u000e\u0010\u0003\u001a\u00020\u0004X\u0082\u0004\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0005\u001a\u00020\u0006X\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0007\u001a\u00020\u0004X\u0082\u0004\u00a2\u0006\u0002\n\u0000R\u000e\u0010\b\u001a\u00020\tX\u0082.\u00a2\u0006\u0002\n\u0000\u00a8\u0006\u000f"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/wallet/PlaceOrderTest;", "", "()V", "customerDid", "Lweb5/sdk/dids/did/BearerDid;", "getExchangeResponse", "", "pfi", "server", "Lokhttp3/mockwebserver/MockWebServer;", "listen for Order Status updates", "", "send Order message", "setup", "tearDown", "kotlin-testsuite"})
+public final class PlaceOrderTest {
+ @org.jetbrains.annotations.NotNull()
+ private final web5.sdk.dids.did.BearerDid pfi = null;
+ @org.jetbrains.annotations.NotNull()
+ private final web5.sdk.dids.did.BearerDid customerDid = null;
+ private okhttp3.mockwebserver.MockWebServer server;
+ private java.lang.String getExchangeResponse;
+
+ public PlaceOrderTest() {
+ super();
+ }
+
+ @org.junit.jupiter.api.BeforeEach()
+ public final void setup() {
+ }
+
+ @org.junit.jupiter.api.AfterEach()
+ public final void tearDown() {
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/PlaceOrderTest.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/PlaceOrderTest.kapt_metadata
new file mode 100644
index 0000000..9126b24
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/PlaceOrderTest.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/ReceiveQuoteTest.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/ReceiveQuoteTest.java
new file mode 100644
index 0000000..853dc41
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/ReceiveQuoteTest.java
@@ -0,0 +1,27 @@
+package website.tbd.developer.site.docs.tbdex.wallet;
+
+/**
+ * Tests for Wallet: Receiving Quotes guide
+ */
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000.\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u0002\n\u0002\b\u0004\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\b\u0010\f\u001a\u00020\rH\u0007J\b\u0010\u000e\u001a\u00020\rH\u0007J\b\u0010\u000f\u001a\u00020\rH\u0007J\b\u0010\u0010\u001a\u00020\rH\u0007R\u000e\u0010\u0003\u001a\u00020\u0004X\u0082\u0004\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0005\u001a\u00020\u0004X\u0082\u0004\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0006\u001a\u00020\u0007X\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\b\u001a\u00020\tX\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\n\u001a\u00020\u000bX\u0082.\u00a2\u0006\u0002\n\u0000\u00a8\u0006\u0011"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/wallet/ReceiveQuoteTest;", "", "()V", "customerDid", "Lweb5/sdk/dids/did/BearerDid;", "pfi", "quote", "Ltbdex/sdk/protocol/models/Quote;", "rfq", "Ltbdex/sdk/protocol/models/Rfq;", "server", "Lokhttp3/mockwebserver/MockWebServer;", "cancel exchange", "", "poll for quote message", "setup", "tearDown", "kotlin-testsuite"})
+public final class ReceiveQuoteTest {
+ @org.jetbrains.annotations.NotNull()
+ private final web5.sdk.dids.did.BearerDid pfi = null;
+ @org.jetbrains.annotations.NotNull()
+ private final web5.sdk.dids.did.BearerDid customerDid = null;
+ private tbdex.sdk.protocol.models.Rfq rfq;
+ private tbdex.sdk.protocol.models.Quote quote;
+ private okhttp3.mockwebserver.MockWebServer server;
+
+ public ReceiveQuoteTest() {
+ super();
+ }
+
+ @org.junit.jupiter.api.BeforeEach()
+ public final void setup() {
+ }
+
+ @org.junit.jupiter.api.AfterEach()
+ public final void tearDown() {
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/ReceiveQuoteTest.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/ReceiveQuoteTest.kapt_metadata
new file mode 100644
index 0000000..6bb974b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/ReceiveQuoteTest.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/SendRfqTest.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/SendRfqTest.java
new file mode 100644
index 0000000..987cdf2
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/SendRfqTest.java
@@ -0,0 +1,27 @@
+package website.tbd.developer.site.docs.tbdex.wallet;
+
+/**
+ * Tests for Wallet: Sending RFQs guide
+ */
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000.\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u0002\n\u0002\b\u0007\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\b\u0010\f\u001a\u00020\rH\u0007J\b\u0010\u000e\u001a\u00020\rH\u0007J\b\u0010\u000f\u001a\u00020\rH\u0007J\b\u0010\u0010\u001a\u00020\rH\u0007J\b\u0010\u0011\u001a\u00020\rH\u0007J\b\u0010\u0012\u001a\u00020\rH\u0007J\b\u0010\u0013\u001a\u00020\rH\u0007R\u000e\u0010\u0003\u001a\u00020\u0004X\u0082\u0004\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0005\u001a\u00020\u0004X\u0082\u0004\u00a2\u0006\u0002\n\u0000R\u000e\u0010\u0006\u001a\u00020\u0007X\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\b\u001a\u00020\tX\u0082.\u00a2\u0006\u0002\n\u0000R\u000e\u0010\n\u001a\u00020\u000bX\u0082.\u00a2\u0006\u0002\n\u0000\u00a8\u0006\u0014"}, d2 = {"Lwebsite/tbd/developer/site/docs/tbdex/wallet/SendRfqTest;", "", "()V", "customerDid", "Lweb5/sdk/dids/did/BearerDid;", "pfi", "rfq", "Ltbdex/sdk/protocol/models/Rfq;", "selectedOffering", "Ltbdex/sdk/protocol/models/Offering;", "server", "Lokhttp3/mockwebserver/MockWebServer;", "create signed RFQ message and send to PFI", "", "get all skeleton RFQ - properties", "send RFQ message with DID as replyTo", "send RFQ message with URL as replyTo", "setup", "skeleton RFQ - metadata", "tearDown", "kotlin-testsuite"})
+public final class SendRfqTest {
+ @org.jetbrains.annotations.NotNull()
+ private final web5.sdk.dids.did.BearerDid pfi = null;
+ @org.jetbrains.annotations.NotNull()
+ private final web5.sdk.dids.did.BearerDid customerDid = null;
+ private tbdex.sdk.protocol.models.Offering selectedOffering;
+ private okhttp3.mockwebserver.MockWebServer server;
+ private tbdex.sdk.protocol.models.Rfq rfq;
+
+ public SendRfqTest() {
+ super();
+ }
+
+ @org.junit.jupiter.api.BeforeEach()
+ public final void setup() {
+ }
+
+ @org.junit.jupiter.api.AfterEach()
+ public final void tearDown() {
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/SendRfqTest.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/SendRfqTest.kapt_metadata
new file mode 100644
index 0000000..5e51fea
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/tbdex/wallet/SendRfqTest.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockDataProvider.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockDataProvider.java
new file mode 100644
index 0000000..5ba1c7f
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockDataProvider.java
@@ -0,0 +1,60 @@
+package website.tbd.developer.site.docs.utils;
+
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000.\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010%\n\u0002\u0010\u000e\n\u0002\u0018\u0002\n\u0002\u0010\u0011\n\u0002\b\n\n\u0002\u0010 \n\u0000\n\u0002\u0010\u0002\n\u0002\b\t\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J+\u0010\b\u001a\u00020\u00012\u0006\u0010\t\u001a\u00020\u00052\u0016\u0010\n\u001a\f\u0012\b\b\u0001\u0012\u0004\u0018\u00010\u00010\u0007\"\u0004\u0018\u00010\u0001\u00a2\u0006\u0002\u0010\u000bJ\u0016\u0010\f\u001a\u00020\u00012\u0006\u0010\r\u001a\u00020\u00052\u0006\u0010\u000e\u001a\u00020\u0005J\u0016\u0010\u000f\u001a\u00020\u00012\u0006\u0010\r\u001a\u00020\u00052\u0006\u0010\u0010\u001a\u00020\u0001J\u001e\u0010\u0011\u001a\n\u0012\u0006\u0012\u0004\u0018\u00010\u00010\u00122\u0006\u0010\r\u001a\u00020\u00052\u0006\u0010\u0011\u001a\u00020\u0005JO\u0010\u0013\u001a\u00020\u0014\"\u0004\b\u0000\u0010\u00152\u0006\u0010\t\u001a\u00020\u00052\u0016\u0010\u0016\u001a\f\u0012\b\b\u0001\u0012\u0004\u0018\u00010\u00010\u0007\"\u0004\u0018\u00010\u00012\u001c\u0010\u0017\u001a\u0018\u0012\u000e\u0012\f\u0012\b\b\u0001\u0012\u0004\u0018\u00010\u00010\u0007\u0012\u0004\u0012\u0002H\u00150\u0006\u00a2\u0006\u0002\u0010\u0018JC\u0010\u0019\u001a\u00020\u00142\u0016\u0010\u0016\u001a\f\u0012\b\b\u0001\u0012\u0004\u0018\u00010\u00010\u0007\"\u0004\u0018\u00010\u00012\u001e\u0010\u0017\u001a\u001a\u0012\u000e\u0012\f\u0012\b\b\u0001\u0012\u0004\u0018\u00010\u00010\u0007\u0012\u0006\u0012\u0004\u0018\u00010\u00010\u0006\u00a2\u0006\u0002\u0010\u001aJC\u0010\u001b\u001a\u00020\u00142\u0016\u0010\u0016\u001a\f\u0012\b\b\u0001\u0012\u0004\u0018\u00010\u00010\u0007\"\u0004\u0018\u00010\u00012\u001e\u0010\u0017\u001a\u001a\u0012\u000e\u0012\f\u0012\b\b\u0001\u0012\u0004\u0018\u00010\u00010\u0007\u0012\u0006\u0012\u0004\u0018\u00010\u00010\u0006\u00a2\u0006\u0002\u0010\u001aJI\u0010\u001c\u001a\u00020\u00142\u0016\u0010\u0016\u001a\f\u0012\b\b\u0001\u0012\u0004\u0018\u00010\u00010\u0007\"\u0004\u0018\u00010\u00012$\u0010\u0017\u001a \u0012\u000e\u0012\f\u0012\b\b\u0001\u0012\u0004\u0018\u00010\u00010\u0007\u0012\f\u0012\n\u0012\u0006\u0012\u0004\u0018\u00010\u00010\u00120\u0006\u00a2\u0006\u0002\u0010\u001aR2\u0010\u0003\u001a&\u0012\u0004\u0012\u00020\u0005\u0012\u001c\u0012\u001a\u0012\u000e\u0012\f\u0012\b\b\u0001\u0012\u0004\u0018\u00010\u00010\u0007\u0012\u0006\u0012\u0004\u0018\u00010\u00010\u00060\u0004X\u0082\u0004\u00a2\u0006\u0002\n\u0000\u00a8\u0006\u001d"}, d2 = {"Lwebsite/tbd/developer/site/docs/utils/MockDataProvider;", "", "()V", "responses", "", "", "Lkotlin/Function1;", "", "execute", "methodName", "params", "(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object;", "get", "collection", "id", "insert", "data", "query", "", "setup", "", "T", "args", "response", "(Ljava/lang/String;[Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V", "setupGet", "([Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V", "setupInsert", "setupQuery", "kotlin-testsuite"})
+public final class MockDataProvider {
+ @org.jetbrains.annotations.NotNull()
+ private final java.util.Map> responses = null;
+
+ public MockDataProvider() {
+ super();
+ }
+
+ public final void setup(@org.jetbrains.annotations.NotNull()
+ java.lang.String methodName, @org.jetbrains.annotations.NotNull()
+ java.lang.Object[] args, @org.jetbrains.annotations.NotNull()
+ kotlin.jvm.functions.Function1 super java.lang.Object[], ? extends T> response) {
+ }
+
+ public final void setupInsert(@org.jetbrains.annotations.NotNull()
+ java.lang.Object[] args, @org.jetbrains.annotations.NotNull()
+ kotlin.jvm.functions.Function1 super java.lang.Object[], ? extends java.lang.Object> response) {
+ }
+
+ public final void setupGet(@org.jetbrains.annotations.NotNull()
+ java.lang.Object[] args, @org.jetbrains.annotations.NotNull()
+ kotlin.jvm.functions.Function1 super java.lang.Object[], ? extends java.lang.Object> response) {
+ }
+
+ public final void setupQuery(@org.jetbrains.annotations.NotNull()
+ java.lang.Object[] args, @org.jetbrains.annotations.NotNull()
+ kotlin.jvm.functions.Function1 super java.lang.Object[], ? extends java.util.List extends java.lang.Object>> response) {
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.lang.Object execute(@org.jetbrains.annotations.NotNull()
+ java.lang.String methodName, @org.jetbrains.annotations.NotNull()
+ java.lang.Object... params) {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.lang.Object insert(@org.jetbrains.annotations.NotNull()
+ java.lang.String collection, @org.jetbrains.annotations.NotNull()
+ java.lang.Object data) {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.lang.Object get(@org.jetbrains.annotations.NotNull()
+ java.lang.String collection, @org.jetbrains.annotations.NotNull()
+ java.lang.String id) {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final java.util.List query(@org.jetbrains.annotations.NotNull()
+ java.lang.String collection, @org.jetbrains.annotations.NotNull()
+ java.lang.String query) {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockDataProvider.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockDataProvider.kapt_metadata
new file mode 100644
index 0000000..9f3c0b3
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockDataProvider.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockExchangesApiProvider.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockExchangesApiProvider.java
new file mode 100644
index 0000000..7028cf7
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockExchangesApiProvider.java
@@ -0,0 +1,111 @@
+package website.tbd.developer.site.docs.utils;
+
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000Z\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0010 \n\u0002\u0018\u0002\n\u0002\b\u0004\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u0002\n\u0002\b\u000b\n\u0002\u0018\u0002\n\u0002\b\u0003\b\u0016\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\u0010\u0010\u0007\u001a\u00020\b2\u0006\u0010\t\u001a\u00020\nH\u0016J\u001e\u0010\u000b\u001a\b\u0012\u0004\u0012\u00020\r0\f2\u0006\u0010\u000e\u001a\u00020\n2\u0006\u0010\u000f\u001a\u00020\nH\u0016J\u001e\u0010\u0010\u001a\u000e\u0012\n\u0012\b\u0012\u0004\u0012\u00020\r0\f0\f2\b\u0010\u0011\u001a\u0004\u0018\u00010\u0012H\u0016J\u0010\u0010\u0013\u001a\u00020\u00142\u0006\u0010\t\u001a\u00020\nH\u0016J\u0016\u0010\u0015\u001a\b\u0012\u0004\u0012\u00020\u00160\f2\u0006\u0010\t\u001a\u00020\nH\u0016J\u0010\u0010\u0017\u001a\u00020\u00182\u0006\u0010\t\u001a\u00020\nH\u0016J\u0010\u0010\u0019\u001a\u00020\u001a2\u0006\u0010\t\u001a\u00020\nH\u0016J&\u0010\u001b\u001a\u00020\u001c2\u0006\u0010\t\u001a\u00020\n2\u0006\u0010\u001d\u001a\u00020\n2\u0006\u0010\u001e\u001a\u00020\n2\u0006\u0010\u001f\u001a\u00020\nJ\u000e\u0010 \u001a\u00020\u001c2\u0006\u0010\u000e\u001a\u00020\nJ\u0010\u0010!\u001a\u00020\u001c2\b\u0010\u0011\u001a\u0004\u0018\u00010\u0012J\u001e\u0010\"\u001a\u00020\u001c2\u0006\u0010\t\u001a\u00020\n2\u0006\u0010\u001d\u001a\u00020\n2\u0006\u0010\u001e\u001a\u00020\nJ&\u0010#\u001a\u00020\u001c2\u0006\u0010\t\u001a\u00020\n2\u0006\u0010\u001d\u001a\u00020\n2\u0006\u0010\u001e\u001a\u00020\n2\u0006\u0010$\u001a\u00020\nJ\u001e\u0010%\u001a\u00020\u001c2\u0006\u0010\t\u001a\u00020\n2\u0006\u0010\u001d\u001a\u00020\n2\u0006\u0010\u001e\u001a\u00020\nJ8\u0010&\u001a\u00020\u001c2\u0006\u0010\t\u001a\u00020\n2\u0006\u0010\u001d\u001a\u00020\n2\u0006\u0010\u001e\u001a\u00020\n2\b\b\u0002\u0010\'\u001a\u00020(2\u000e\b\u0002\u0010)\u001a\b\u0012\u0004\u0012\u00020\n0\fJ\u0006\u0010*\u001a\u00020\u001cR\u0011\u0010\u0003\u001a\u00020\u0004\u00a2\u0006\b\n\u0000\u001a\u0004\b\u0005\u0010\u0006\u00a8\u0006+"}, d2 = {"Lwebsite/tbd/developer/site/docs/utils/MockExchangesApiProvider;", "Ltbdex/sdk/httpserver/models/ExchangesApi;", "()V", "dataProvider", "Lwebsite/tbd/developer/site/docs/utils/MockDataProvider;", "getDataProvider", "()Lwebsite/tbd/developer/site/docs/utils/MockDataProvider;", "getClose", "Ltbdex/sdk/protocol/models/Close;", "exchangeId", "", "getExchange", "", "Ltbdex/sdk/protocol/models/Message;", "id", "requesterDid", "getExchanges", "filter", "Ltbdex/sdk/httpserver/models/GetExchangesFilter;", "getOrder", "Ltbdex/sdk/protocol/models/Order;", "getOrderStatuses", "Ltbdex/sdk/protocol/models/OrderStatus;", "getQuote", "Ltbdex/sdk/protocol/models/Quote;", "getRfq", "Ltbdex/sdk/protocol/models/Rfq;", "setClose", "", "to", "from", "closeData", "setExchange", "setExchanges", "setOrder", "setOrderStatus", "orderStatus", "setQuote", "setRfq", "offeringId", "Lde/fxlae/typeid/TypeId;", "claims", "setWrite", "kotlin-testsuite"})
+public class MockExchangesApiProvider implements tbdex.sdk.httpserver.models.ExchangesApi {
+ @org.jetbrains.annotations.NotNull()
+ private final website.tbd.developer.site.docs.utils.MockDataProvider dataProvider = null;
+
+ public MockExchangesApiProvider() {
+ super();
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final website.tbd.developer.site.docs.utils.MockDataProvider getDataProvider() {
+ return null;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public java.util.List> getExchanges(@org.jetbrains.annotations.Nullable()
+ tbdex.sdk.httpserver.models.GetExchangesFilter filter) {
+ return null;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public java.util.List getExchange(@org.jetbrains.annotations.NotNull()
+ java.lang.String id, @org.jetbrains.annotations.NotNull()
+ java.lang.String requesterDid) {
+ return null;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public tbdex.sdk.protocol.models.Rfq getRfq(@org.jetbrains.annotations.NotNull()
+ java.lang.String exchangeId) {
+ return null;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public tbdex.sdk.protocol.models.Quote getQuote(@org.jetbrains.annotations.NotNull()
+ java.lang.String exchangeId) {
+ return null;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public tbdex.sdk.protocol.models.Order getOrder(@org.jetbrains.annotations.NotNull()
+ java.lang.String exchangeId) {
+ return null;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public java.util.List getOrderStatuses(@org.jetbrains.annotations.NotNull()
+ java.lang.String exchangeId) {
+ return null;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public tbdex.sdk.protocol.models.Close getClose(@org.jetbrains.annotations.NotNull()
+ java.lang.String exchangeId) {
+ return null;
+ }
+
+ public final void setExchanges(@org.jetbrains.annotations.Nullable()
+ tbdex.sdk.httpserver.models.GetExchangesFilter filter) {
+ }
+
+ public final void setExchange(@org.jetbrains.annotations.NotNull()
+ java.lang.String id) {
+ }
+
+ public final void setRfq(@org.jetbrains.annotations.NotNull()
+ java.lang.String exchangeId, @org.jetbrains.annotations.NotNull()
+ java.lang.String to, @org.jetbrains.annotations.NotNull()
+ java.lang.String from, @org.jetbrains.annotations.NotNull()
+ de.fxlae.typeid.TypeId offeringId, @org.jetbrains.annotations.NotNull()
+ java.util.List claims) {
+ }
+
+ public final void setQuote(@org.jetbrains.annotations.NotNull()
+ java.lang.String exchangeId, @org.jetbrains.annotations.NotNull()
+ java.lang.String to, @org.jetbrains.annotations.NotNull()
+ java.lang.String from) {
+ }
+
+ public final void setOrder(@org.jetbrains.annotations.NotNull()
+ java.lang.String exchangeId, @org.jetbrains.annotations.NotNull()
+ java.lang.String to, @org.jetbrains.annotations.NotNull()
+ java.lang.String from) {
+ }
+
+ public final void setOrderStatus(@org.jetbrains.annotations.NotNull()
+ java.lang.String exchangeId, @org.jetbrains.annotations.NotNull()
+ java.lang.String to, @org.jetbrains.annotations.NotNull()
+ java.lang.String from, @org.jetbrains.annotations.NotNull()
+ java.lang.String orderStatus) {
+ }
+
+ public final void setClose(@org.jetbrains.annotations.NotNull()
+ java.lang.String exchangeId, @org.jetbrains.annotations.NotNull()
+ java.lang.String to, @org.jetbrains.annotations.NotNull()
+ java.lang.String from, @org.jetbrains.annotations.NotNull()
+ java.lang.String closeData) {
+ }
+
+ public final void setWrite() {
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockExchangesApiProvider.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockExchangesApiProvider.kapt_metadata
new file mode 100644
index 0000000..4395990
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockExchangesApiProvider.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider.java
new file mode 100644
index 0000000..351a6d9
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider.java
@@ -0,0 +1,38 @@
+package website.tbd.developer.site.docs.utils;
+
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u00004\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0010 \n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0003\b\u0016\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\u0010\u0010\u0007\u001a\u00020\b2\u0006\u0010\t\u001a\u00020\nH\u0016J\u000e\u0010\u000b\u001a\b\u0012\u0004\u0012\u00020\b0\fH\u0016J\u0016\u0010\r\u001a\u00020\u000e2\u0006\u0010\t\u001a\u00020\n2\u0006\u0010\u000f\u001a\u00020\u0010J\u0014\u0010\u0011\u001a\u00020\u000e2\f\u0010\u0012\u001a\b\u0012\u0004\u0012\u00020\n0\fR\u0011\u0010\u0003\u001a\u00020\u0004\u00a2\u0006\b\n\u0000\u001a\u0004\b\u0005\u0010\u0006\u00a8\u0006\u0013"}, d2 = {"Lwebsite/tbd/developer/site/docs/utils/MockOfferingsApiProvider;", "Ltbdex/sdk/httpserver/models/OfferingsApi;", "()V", "dataProvider", "Lwebsite/tbd/developer/site/docs/utils/MockDataProvider;", "getDataProvider", "()Lwebsite/tbd/developer/site/docs/utils/MockDataProvider;", "getOffering", "Ltbdex/sdk/protocol/models/Offering;", "id", "", "getOfferings", "", "setOffering", "", "pfiDid", "Lweb5/sdk/dids/did/BearerDid;", "setOfferings", "offeringDids", "kotlin-testsuite"})
+public class MockOfferingsApiProvider implements tbdex.sdk.httpserver.models.OfferingsApi {
+ @org.jetbrains.annotations.NotNull()
+ private final website.tbd.developer.site.docs.utils.MockDataProvider dataProvider = null;
+
+ public MockOfferingsApiProvider() {
+ super();
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final website.tbd.developer.site.docs.utils.MockDataProvider getDataProvider() {
+ return null;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public tbdex.sdk.protocol.models.Offering getOffering(@org.jetbrains.annotations.NotNull()
+ java.lang.String id) {
+ return null;
+ }
+
+ @java.lang.Override()
+ @org.jetbrains.annotations.NotNull()
+ public java.util.List getOfferings() {
+ return null;
+ }
+
+ public final void setOffering(@org.jetbrains.annotations.NotNull()
+ java.lang.String id, @org.jetbrains.annotations.NotNull()
+ web5.sdk.dids.did.BearerDid pfiDid) {
+ }
+
+ public final void setOfferings(@org.jetbrains.annotations.NotNull()
+ java.util.List offeringDids) {
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider.kapt_metadata
new file mode 100644
index 0000000..2038cd2
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/TestData.java b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/TestData.java
new file mode 100644
index 0000000..c70fbc0
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/TestData.java
@@ -0,0 +1,128 @@
+package website.tbd.developer.site.docs.utils;
+
+@kotlin.Metadata(mv = {1, 9, 0}, k = 1, xi = 48, d1 = {"\u0000\u0096\u0001\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000e\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0006\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\u0011\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010 \n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0002\b\u0004\n\u0002\u0018\u0002\n\u0002\b\u0003\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0004\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\b\u00c6\u0002\u0018\u00002\u00020\u0001B\u0007\b\u0002\u00a2\u0006\u0002\u0010\u0002J-\u0010\u0016\u001a\u00020\u00172\n\b\u0002\u0010\u0018\u001a\u0004\u0018\u00010\u00042\u0012\u0010\u0019\u001a\n\u0012\u0006\b\u0001\u0012\u00020\u00040\u001a\"\u00020\u0004H\u0002\u00a2\u0006\u0002\u0010\u001bJ,\u0010\u001c\u001a\u00020\u001d2\b\b\u0002\u0010\u0018\u001a\u00020\u00042\b\b\u0002\u0010\u001e\u001a\u00020\u00042\u000e\b\u0002\u0010\u001f\u001a\b\u0012\u0004\u0012\u00020\u00170 H\u0002J6\u0010!\u001a\u00020\"2\b\b\u0002\u0010\u0018\u001a\u00020\u00042\b\b\u0002\u0010#\u001a\u00020\u00042\b\b\u0002\u0010\u001e\u001a\u00020\u00042\u000e\b\u0002\u0010$\u001a\b\u0012\u0004\u0012\u00020\u001d0 H\u0002J$\u0010%\u001a\u00020&2\b\b\u0002\u0010\'\u001a\u00020\u00042\b\b\u0002\u0010(\u001a\u00020\u00042\b\b\u0002\u0010)\u001a\u00020\u0004J\u001a\u0010*\u001a\u00020+2\b\b\u0002\u0010(\u001a\u00020\u00042\b\b\u0002\u0010,\u001a\u00020\"J\u0010\u0010-\u001a\u00020+2\b\b\u0002\u0010(\u001a\u00020\u0004J\u001a\u0010.\u001a\u00020/2\b\b\u0002\u0010\'\u001a\u00020\u00042\b\b\u0002\u0010(\u001a\u00020\u0004J$\u00100\u001a\u0002012\b\b\u0002\u0010\'\u001a\u00020\u00042\b\b\u0002\u0010(\u001a\u00020\u00042\b\b\u0002\u00102\u001a\u00020\u0004J\u0006\u00103\u001a\u000201J\u0006\u00104\u001a\u00020\"J\u001a\u00105\u001a\u0002062\b\b\u0002\u0010\'\u001a\u00020\u00042\b\b\u0002\u0010(\u001a\u00020\u0004J4\u00107\u001a\u0002082\b\b\u0002\u0010\'\u001a\u00020\u00042\b\b\u0002\u0010(\u001a\u00020\u00042\b\b\u0002\u00109\u001a\u00020:2\u000e\b\u0002\u0010;\u001a\b\u0012\u0004\u0012\u00020\u00040 J\u0006\u0010<\u001a\u00020=J\u0010\u0010>\u001a\n @*\u0004\u0018\u00010?0?H\u0002R\u000e\u0010\u0003\u001a\u00020\u0004X\u0086T\u00a2\u0006\u0002\n\u0000R\u0011\u0010\u0005\u001a\u00020\u0006\u00a2\u0006\b\n\u0000\u001a\u0004\b\u0007\u0010\bR\u000e\u0010\t\u001a\u00020\u0004X\u0086T\u00a2\u0006\u0002\n\u0000R\u0011\u0010\n\u001a\u00020\u0006\u00a2\u0006\b\n\u0000\u001a\u0004\b\u000b\u0010\bR\u000e\u0010\f\u001a\u00020\rX\u0082\u0004\u00a2\u0006\u0002\n\u0000R\u0011\u0010\u000e\u001a\u00020\u000f\u00a2\u0006\b\n\u0000\u001a\u0004\b\u0010\u0010\u0011R\u0011\u0010\u0012\u001a\u00020\u0013\u00a2\u0006\b\n\u0000\u001a\u0004\b\u0014\u0010\u0015\u00a8\u0006A"}, d2 = {"Lwebsite/tbd/developer/site/docs/utils/TestData;", "", "()V", "ALICE", "", "ALICE_DID", "Lweb5/sdk/dids/did/BearerDid;", "getALICE_DID", "()Lweb5/sdk/dids/did/BearerDid;", "PFI", "PFI_DID", "getPFI_DID", "aliceKeyManager", "Lweb5/sdk/crypto/InMemoryKeyManager;", "options", "Lweb5/sdk/dids/methods/dht/CreateDidDhtOptions;", "getOptions", "()Lweb5/sdk/dids/methods/dht/CreateDidDhtOptions;", "serviceToAdd", "Lweb5/sdk/dids/didcore/Service;", "getServiceToAdd", "()Lweb5/sdk/dids/didcore/Service;", "buildField", "Lweb5/sdk/credentials/model/FieldV2;", "id", "paths", "", "(Ljava/lang/String;[Ljava/lang/String;)Lweb5/sdk/credentials/model/FieldV2;", "buildInputDescriptor", "Lweb5/sdk/credentials/model/InputDescriptorV2;", "purpose", "fields", "", "buildPresentationDefinition", "Lweb5/sdk/credentials/model/PresentationDefinitionV2;", "name", "inputDescriptors", "getClose", "Ltbdex/sdk/protocol/models/Close;", "to", "from", "closeData", "getOffering", "Ltbdex/sdk/protocol/models/Offering;", "requiredClaims", "getOfferingWithNoClaims", "getOrder", "Ltbdex/sdk/protocol/models/Order;", "getOrderStatus", "Ltbdex/sdk/protocol/models/OrderStatus;", "orderStatus", "getOrderStatusWithInvalidDid", "getPresentationDefinition", "getQuote", "Ltbdex/sdk/protocol/models/Quote;", "getRfq", "Ltbdex/sdk/protocol/models/Rfq;", "offeringId", "Lde/fxlae/typeid/TypeId;", "claims", "getVC", "Lweb5/sdk/credentials/VerifiableCredential;", "requiredPaymentDetailsSchema", "Lcom/fasterxml/jackson/databind/JsonNode;", "kotlin.jvm.PlatformType", "kotlin-testsuite"})
+public final class TestData {
+ @org.jetbrains.annotations.NotNull()
+ public static final java.lang.String ALICE = "alice";
+ @org.jetbrains.annotations.NotNull()
+ public static final java.lang.String PFI = "pfi";
+ @org.jetbrains.annotations.NotNull()
+ private static final web5.sdk.crypto.InMemoryKeyManager aliceKeyManager = null;
+ @org.jetbrains.annotations.NotNull()
+ private static final web5.sdk.dids.did.BearerDid ALICE_DID = null;
+ @org.jetbrains.annotations.NotNull()
+ private static final web5.sdk.dids.didcore.Service serviceToAdd = null;
+ @org.jetbrains.annotations.NotNull()
+ private static final web5.sdk.dids.methods.dht.CreateDidDhtOptions options = null;
+ @org.jetbrains.annotations.NotNull()
+ private static final web5.sdk.dids.did.BearerDid PFI_DID = null;
+ @org.jetbrains.annotations.NotNull()
+ public static final website.tbd.developer.site.docs.utils.TestData INSTANCE = null;
+
+ private TestData() {
+ super();
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final web5.sdk.dids.did.BearerDid getALICE_DID() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final web5.sdk.dids.didcore.Service getServiceToAdd() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final web5.sdk.dids.methods.dht.CreateDidDhtOptions getOptions() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final web5.sdk.dids.did.BearerDid getPFI_DID() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final web5.sdk.credentials.model.PresentationDefinitionV2 getPresentationDefinition() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final web5.sdk.credentials.VerifiableCredential getVC() {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final tbdex.sdk.protocol.models.Offering getOffering(@org.jetbrains.annotations.NotNull()
+ java.lang.String from, @org.jetbrains.annotations.NotNull()
+ web5.sdk.credentials.model.PresentationDefinitionV2 requiredClaims) {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final tbdex.sdk.protocol.models.Offering getOfferingWithNoClaims(@org.jetbrains.annotations.NotNull()
+ java.lang.String from) {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final tbdex.sdk.protocol.models.Rfq getRfq(@org.jetbrains.annotations.NotNull()
+ java.lang.String to, @org.jetbrains.annotations.NotNull()
+ java.lang.String from, @org.jetbrains.annotations.NotNull()
+ de.fxlae.typeid.TypeId offeringId, @org.jetbrains.annotations.NotNull()
+ java.util.List claims) {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final tbdex.sdk.protocol.models.Quote getQuote(@org.jetbrains.annotations.NotNull()
+ java.lang.String to, @org.jetbrains.annotations.NotNull()
+ java.lang.String from) {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final tbdex.sdk.protocol.models.Close getClose(@org.jetbrains.annotations.NotNull()
+ java.lang.String to, @org.jetbrains.annotations.NotNull()
+ java.lang.String from, @org.jetbrains.annotations.NotNull()
+ java.lang.String closeData) {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final tbdex.sdk.protocol.models.Order getOrder(@org.jetbrains.annotations.NotNull()
+ java.lang.String to, @org.jetbrains.annotations.NotNull()
+ java.lang.String from) {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final tbdex.sdk.protocol.models.OrderStatus getOrderStatus(@org.jetbrains.annotations.NotNull()
+ java.lang.String to, @org.jetbrains.annotations.NotNull()
+ java.lang.String from, @org.jetbrains.annotations.NotNull()
+ java.lang.String orderStatus) {
+ return null;
+ }
+
+ @org.jetbrains.annotations.NotNull()
+ public final tbdex.sdk.protocol.models.OrderStatus getOrderStatusWithInvalidDid() {
+ return null;
+ }
+
+ private final web5.sdk.credentials.model.FieldV2 buildField(java.lang.String id, java.lang.String... paths) {
+ return null;
+ }
+
+ private final web5.sdk.credentials.model.PresentationDefinitionV2 buildPresentationDefinition(java.lang.String id, java.lang.String name, java.lang.String purpose, java.util.List inputDescriptors) {
+ return null;
+ }
+
+ private final web5.sdk.credentials.model.InputDescriptorV2 buildInputDescriptor(java.lang.String id, java.lang.String purpose, java.util.List fields) {
+ return null;
+ }
+
+ private final com.fasterxml.jackson.databind.JsonNode requiredPaymentDetailsSchema() {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/TestData.kapt_metadata b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/TestData.kapt_metadata
new file mode 100644
index 0000000..92ea85b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kaptStubs/test/website/tbd/developer/site/docs/utils/TestData.kapt_metadata differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/build-history.bin b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/build-history.bin
new file mode 100644
index 0000000..06b5d8c
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/build-history.bin differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab
new file mode 100644
index 0000000..1391b58
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab.keystream b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab.keystream
new file mode 100644
index 0000000..c88ee9c
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab.keystream differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab.keystream.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab.keystream.len
new file mode 100644
index 0000000..170b66a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab.keystream.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab.len
new file mode 100644
index 0000000..1b7c1f8
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab.values.at b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab.values.at
new file mode 100644
index 0000000..fff99bb
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab.values.at differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab_i b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab_i
new file mode 100644
index 0000000..cb83bc8
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab_i differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab_i.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab_i.len
new file mode 100644
index 0000000..131e265
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-snapshot.tab_i.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab
new file mode 100644
index 0000000..0f59593
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab.keystream b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab.keystream
new file mode 100644
index 0000000..c1cf70e
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab.keystream differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab.keystream.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab.keystream.len
new file mode 100644
index 0000000..170b66a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab.keystream.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab.len
new file mode 100644
index 0000000..1b7c1f8
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab.values.at b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab.values.at
new file mode 100644
index 0000000..d490dc7
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab.values.at differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab_i b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab_i
new file mode 100644
index 0000000..dbb86dc
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab_i differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab_i.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab_i.len
new file mode 100644
index 0000000..131e265
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/inputs/source-to-output.tab_i.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab
new file mode 100644
index 0000000..ede64ab
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab.keystream b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab.keystream
new file mode 100644
index 0000000..3b16457
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab.keystream differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len
new file mode 100644
index 0000000..970d88b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab.len
new file mode 100644
index 0000000..d8e0f3d
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab.values.at b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab.values.at
new file mode 100644
index 0000000..b9e1c11
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab.values.at differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab_i b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab_i
new file mode 100644
index 0000000..b7669da
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab_i differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab_i.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab_i.len
new file mode 100644
index 0000000..131e265
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-attributes.tab_i.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab
new file mode 100644
index 0000000..eeef024
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream
new file mode 100644
index 0000000..3b16457
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len
new file mode 100644
index 0000000..970d88b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len
new file mode 100644
index 0000000..d8e0f3d
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at
new file mode 100644
index 0000000..164ae32
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i
new file mode 100644
index 0000000..b7669da
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len
new file mode 100644
index 0000000..131e265
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab
new file mode 100644
index 0000000..ab89649
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab.keystream b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab.keystream
new file mode 100644
index 0000000..16ef197
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab.keystream differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab.keystream.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab.keystream.len
new file mode 100644
index 0000000..8107e24
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab.keystream.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab.len
new file mode 100644
index 0000000..2a17e6e
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab.values.at b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab.values.at
new file mode 100644
index 0000000..c1774d4
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab.values.at differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab_i b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab_i
new file mode 100644
index 0000000..f174f50
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab_i differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab_i.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab_i.len
new file mode 100644
index 0000000..131e265
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/constants.tab_i.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab
new file mode 100644
index 0000000..cf816d0
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream
new file mode 100644
index 0000000..c2c88ef
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream
@@ -0,0 +1 @@
+9website/tbd/developer/site/docs/tbdex/SanctionsCredential9website/tbd/developer/site/docs/tbdex/SanctionsListResultwebsite/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKtKwebsite/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt$createADid$1Gwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTestiwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$sendRequestToIdvServiceEndpoint$2Zwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$postSiopResponse$1]website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchIssuerMetadata$1awebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchAuthServerMetadata$1Zwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchAccessToken$1zwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$requestKnownCustomerCredential$2$1$requestBody$1$1hwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$requestKnownCustomerCredential$1Vwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$IssuerResponseWwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$CredentialOfferUwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$WalletStoragePwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/KbcIssuanceTestiwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/KbcIssuanceTest$issue KBC$AdditionalDataGwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTestwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$1website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$2Zwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1\website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$1\website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$1website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$2website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$3website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$4\website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$1website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$2website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$3website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$4\website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4kwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1mwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1$1mwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1$2bwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$2$1$1\website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5owebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1qwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1swebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$1swebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$2swebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3uwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$1uwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2wwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1ywebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1$1{website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1$1$1swebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4uwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4$1wwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4$1$1swebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5uwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5$1wwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5$1$1\website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$6\website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$7\website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$8Uwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$KccCredentialPwebsite/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$Evidence?website/tbd/developer/site/docs/tbdex/pfi/CreatingOfferingsTestwebsite/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider>website/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider;website/tbd/developer/site/docs/tbdex/pfi/PfiOnboardingTest:website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTestSwebsite/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$1Swebsite/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$2Swebsite/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$3Rwebsite/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI server is started$1>website/tbd/developer/site/docs/tbdex/pfi/ProcessingOrdersTest=website/tbd/developer/site/docs/tbdex/wallet/GetOfferingsTestDwebsite/tbd/developer/site/docs/tbdex/wallet/GetMatchedOfferingsTest=website/tbd/developer/site/docs/tbdex/wallet/PfiAllowListTest;website/tbd/developer/site/docs/tbdex/wallet/PlaceOrderTest=website/tbd/developer/site/docs/tbdex/wallet/ReceiveQuoteTest8website/tbd/developer/site/docs/tbdex/wallet/SendRfqTest6website/tbd/developer/site/docs/utils/MockDataProviderHwebsite/tbd/developer/site/docs/utils/MockDataProvider$setup$paramsKey$1Jwebsite/tbd/developer/site/docs/utils/MockDataProvider$execute$paramsKey$1>website/tbd/developer/site/docs/utils/MockExchangesApiProviderMwebsite/tbd/developer/site/docs/utils/MockExchangesApiProvider$setExchanges$1Lwebsite/tbd/developer/site/docs/utils/MockExchangesApiProvider$setExchange$1Gwebsite/tbd/developer/site/docs/utils/MockExchangesApiProvider$setRfq$1Iwebsite/tbd/developer/site/docs/utils/MockExchangesApiProvider$setQuote$1Iwebsite/tbd/developer/site/docs/utils/MockExchangesApiProvider$setOrder$1Owebsite/tbd/developer/site/docs/utils/MockExchangesApiProvider$setOrderStatus$1Iwebsite/tbd/developer/site/docs/utils/MockExchangesApiProvider$setClose$1Iwebsite/tbd/developer/site/docs/utils/MockExchangesApiProvider$setWrite$1>website/tbd/developer/site/docs/utils/MockOfferingsApiProviderLwebsite/tbd/developer/site/docs/utils/MockOfferingsApiProvider$setOffering$1Mwebsite/tbd/developer/site/docs/utils/MockOfferingsApiProvider$setOfferings$1.website/tbd/developer/site/docs/utils/TestDataVwebsite/tbd/developer/site/docs/web5/build/decentralizedidentifiers/HowToCreateDidTestWwebsite/tbd/developer/site/docs/web5/build/decentralizedidentifiers/HowToResolveDidTestVwebsite/tbd/developer/site/docs/web5/build/decentralizedidentifiers/HowToImportDidTestVwebsite/tbd/developer/site/docs/web5/build/decentralizedidentifiers/HowToUpdateDidTestUwebsite/tbd/developer/site/docs/web5/build/decentralizedidentifiers/KeyManagementTestNwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/FanClubVcTest^website/tbd/developer/site/docs/web5/build/verifiablecredentials/FanClubVcTest$SwiftiesFanClubLwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/JwtToVcTest[website/tbd/developer/site/docs/web5/build/verifiablecredentials/PresentationDefinitionTestYwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/PresentationExchangeTestnwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/PresentationExchangeTest$NameAndDobCredentialRwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/StreetCredibilityMwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/RevokeVcTestOwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/VcIssuanceTestwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/VcIssuanceTest$createEmploymentCredentialKt returns a credential$EmploymentCredentialWwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/VerifiablePresentationWwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/PresentationSubmissionRwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/DescriptorMapItemSwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/VerificationResultMwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/VerifyVcTestOwebsite/tbd/developer/site/docs/web5/build/verifiablecredentials/VerifyVcTestKt
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len
new file mode 100644
index 0000000..dc07648
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len
new file mode 100644
index 0000000..bad0daf
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at
new file mode 100644
index 0000000..ca05369
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i
new file mode 100644
index 0000000..aaa862f
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len
new file mode 100644
index 0000000..131e265
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab
new file mode 100644
index 0000000..9a28de2
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab.keystream b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab.keystream
new file mode 100644
index 0000000..748fe00
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab.keystream differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len
new file mode 100644
index 0000000..65b286b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab.len
new file mode 100644
index 0000000..01bdaa1
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab.values.at b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab.values.at
new file mode 100644
index 0000000..6fcb00a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab.values.at differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab_i b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab_i
new file mode 100644
index 0000000..bdae881
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab_i differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab_i.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab_i.len
new file mode 100644
index 0000000..131e265
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/package-parts.tab_i.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab
new file mode 100644
index 0000000..f9f2705
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab.keystream b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab.keystream
new file mode 100644
index 0000000..e268938
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab.keystream differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab.keystream.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab.keystream.len
new file mode 100644
index 0000000..b52bd21
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab.keystream.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab.len
new file mode 100644
index 0000000..48e9f9a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab.values.at b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab.values.at
new file mode 100644
index 0000000..e814bd6
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab.values.at differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab_i b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab_i
new file mode 100644
index 0000000..1869ab5
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab_i differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab_i.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab_i.len
new file mode 100644
index 0000000..131e265
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/proto.tab_i.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab
new file mode 100644
index 0000000..b2b7ba2
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream
new file mode 100644
index 0000000..a48a8d6
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len
new file mode 100644
index 0000000..170b66a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab.len
new file mode 100644
index 0000000..1b7c1f8
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at
new file mode 100644
index 0000000..26052f6
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab_i b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab_i
new file mode 100644
index 0000000..513e3f7
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab_i differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len
new file mode 100644
index 0000000..131e265
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab
new file mode 100644
index 0000000..e883ec5
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab.keystream b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab.keystream
new file mode 100644
index 0000000..84b21c9
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab.keystream differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len
new file mode 100644
index 0000000..fd5292d
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab.len
new file mode 100644
index 0000000..93a595b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab.values.at b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab.values.at
new file mode 100644
index 0000000..3e7c84c
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab.values.at differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab_i b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab_i
new file mode 100644
index 0000000..ebe721c
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab_i differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab_i.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab_i.len
new file mode 100644
index 0000000..131e265
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/subtypes.tab_i.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab
new file mode 100644
index 0000000..6eb4c0a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab.keystream b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab.keystream
new file mode 100644
index 0000000..b1b94a3
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab.keystream differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len
new file mode 100644
index 0000000..5503e98
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab.len
new file mode 100644
index 0000000..93a595b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab.values.at b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab.values.at
new file mode 100644
index 0000000..68538ac
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab.values.at differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab_i b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab_i
new file mode 100644
index 0000000..a1ab074
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab_i differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab_i.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab_i.len
new file mode 100644
index 0000000..131e265
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/jvm/kotlin/supertypes.tab_i.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/counters.tab b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/counters.tab
new file mode 100644
index 0000000..2dce5b8
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/counters.tab
@@ -0,0 +1,2 @@
+34
+0
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab
new file mode 100644
index 0000000..9385dac
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab.keystream b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab.keystream
new file mode 100644
index 0000000..7212f8c
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab.keystream differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab.keystream.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab.keystream.len
new file mode 100644
index 0000000..170b66a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab.keystream.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab.len
new file mode 100644
index 0000000..1b7c1f8
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab.values.at b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab.values.at
new file mode 100644
index 0000000..632ffbe
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab.values.at differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab_i b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab_i
new file mode 100644
index 0000000..568fbcf
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab_i differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab_i.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab_i.len
new file mode 100644
index 0000000..131e265
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/file-to-id.tab_i.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab
new file mode 100644
index 0000000..f826aa3
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab.keystream b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab.keystream
new file mode 100644
index 0000000..eee417c
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab.keystream differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab.keystream.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab.keystream.len
new file mode 100644
index 0000000..4b05c55
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab.keystream.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab.len
new file mode 100644
index 0000000..1b7c1f8
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab.values.at b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab.values.at
new file mode 100644
index 0000000..598596a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab.values.at differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab_i b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab_i
new file mode 100644
index 0000000..3056823
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab_i differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab_i.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab_i.len
new file mode 100644
index 0000000..131e265
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/id-to-file.tab_i.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab
new file mode 100644
index 0000000..aa6b9ae
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.keystream b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.keystream
new file mode 100644
index 0000000..730ee8b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.keystream differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.keystream.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.keystream.len
new file mode 100644
index 0000000..ba86160
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.keystream.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.len
new file mode 100644
index 0000000..7e9a087
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.values b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.values
new file mode 100644
index 0000000..2bfce4c
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.values differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.values.at b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.values.at
new file mode 100644
index 0000000..ae132d1
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.values.at differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.values.s b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.values.s
new file mode 100644
index 0000000..252e184
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab.values.s
@@ -0,0 +1 @@
+V
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab_i b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab_i
new file mode 100644
index 0000000..96c1c31
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab_i differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab_i.len b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab_i.len
new file mode 100644
index 0000000..4424406
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/caches-jvm/lookups/lookups.tab_i.len differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/META-INF/kotlin-testsuite.kotlin_module b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/META-INF/kotlin-testsuite.kotlin_module
new file mode 100644
index 0000000..029a3df
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/META-INF/kotlin-testsuite.kotlin_module differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$configureRouting$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$configureRouting$1$1.class
new file mode 100644
index 0000000..3a0e38b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$configureRouting$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$configureRouting$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$configureRouting$1.class
new file mode 100644
index 0000000..0347ccb
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$configureRouting$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$1.class
new file mode 100644
index 0000000..e0f9afc
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$2.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$2.class
new file mode 100644
index 0000000..6b6351a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest.class
new file mode 100644
index 0000000..3f31bce
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt$createADid$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt$createADid$1.class
new file mode 100644
index 0000000..e18b9e2
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt$createADid$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt.class
new file mode 100644
index 0000000..7a71c2a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$Evidence.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$Evidence.class
new file mode 100644
index 0000000..d4c28d2
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$Evidence.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$KccCredential.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$KccCredential.class
new file mode 100644
index 0000000..002795f
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$KccCredential.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$1.class
new file mode 100644
index 0000000..5ddb065
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$1.class
new file mode 100644
index 0000000..4dc3776
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$2.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$2.class
new file mode 100644
index 0000000..7e08ec1
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$3.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$3.class
new file mode 100644
index 0000000..14fa8fb
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$3.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$4.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$4.class
new file mode 100644
index 0000000..f580fb7
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$4.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1.class
new file mode 100644
index 0000000..0a03aea
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2.class
new file mode 100644
index 0000000..c567fb4
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$1.class
new file mode 100644
index 0000000..44ad14f
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$2.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$2.class
new file mode 100644
index 0000000..51da6ba
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$3.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$3.class
new file mode 100644
index 0000000..0f831df
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$3.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$4.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$4.class
new file mode 100644
index 0000000..269f9da
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$4.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1.class
new file mode 100644
index 0000000..3bedd8c
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3.class
new file mode 100644
index 0000000..3edc61a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$2$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$2$1$1.class
new file mode 100644
index 0000000..de34d2a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$2$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1$1.class
new file mode 100644
index 0000000..df1c549
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1$2.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1$2.class
new file mode 100644
index 0000000..772d1d1
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1.class
new file mode 100644
index 0000000..170f76b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4.class
new file mode 100644
index 0000000..9a92e73
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$1.class
new file mode 100644
index 0000000..984fb4c
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$2.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$2.class
new file mode 100644
index 0000000..f9f4d7d
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$1.class
new file mode 100644
index 0000000..dc3d08b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1$1$1.class
new file mode 100644
index 0000000..2aef233
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1$1.class
new file mode 100644
index 0000000..49ab154
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1.class
new file mode 100644
index 0000000..b7a1c63
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2.class
new file mode 100644
index 0000000..bca2ba2
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3.class
new file mode 100644
index 0000000..3453fc0
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4$1$1.class
new file mode 100644
index 0000000..7c19810
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4$1.class
new file mode 100644
index 0000000..4fa6677
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4.class
new file mode 100644
index 0000000..fdf6840
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5$1$1.class
new file mode 100644
index 0000000..353f67a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5$1.class
new file mode 100644
index 0000000..6c122e1
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5.class
new file mode 100644
index 0000000..40bf7f9
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1.class
new file mode 100644
index 0000000..7d9b375
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1.class
new file mode 100644
index 0000000..ef11c98
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5.class
new file mode 100644
index 0000000..3aa3ee8
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$6.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$6.class
new file mode 100644
index 0000000..7e4e340
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$6.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$7.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$7.class
new file mode 100644
index 0000000..3e3f642
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$7.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$8.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$8.class
new file mode 100644
index 0000000..f4148eb
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$8.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1.class
new file mode 100644
index 0000000..04c2a0b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$1.class
new file mode 100644
index 0000000..5bbc897
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$2.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$2.class
new file mode 100644
index 0000000..9a50939
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest.class
new file mode 100644
index 0000000..088f61a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$CredentialOffer.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$CredentialOffer.class
new file mode 100644
index 0000000..867325e
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$CredentialOffer.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$IssuerResponse.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$IssuerResponse.class
new file mode 100644
index 0000000..ee90fda
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$IssuerResponse.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$WalletStorage.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$WalletStorage.class
new file mode 100644
index 0000000..cd809a8
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$WalletStorage.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchAccessToken$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchAccessToken$1.class
new file mode 100644
index 0000000..265ceff
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchAccessToken$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchAuthServerMetadata$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchAuthServerMetadata$1.class
new file mode 100644
index 0000000..72b720e
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchAuthServerMetadata$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchIssuerMetadata$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchIssuerMetadata$1.class
new file mode 100644
index 0000000..e3b7889
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchIssuerMetadata$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$postSiopResponse$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$postSiopResponse$1.class
new file mode 100644
index 0000000..c2b1f2d
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$postSiopResponse$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$requestKnownCustomerCredential$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$requestKnownCustomerCredential$1.class
new file mode 100644
index 0000000..7d1f572
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$requestKnownCustomerCredential$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$requestKnownCustomerCredential$2$1$requestBody$1$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$requestKnownCustomerCredential$2$1$requestBody$1$1.class
new file mode 100644
index 0000000..4160510
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$requestKnownCustomerCredential$2$1$requestBody$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$sendRequestToIdvServiceEndpoint$2.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$sendRequestToIdvServiceEndpoint$2.class
new file mode 100644
index 0000000..93ddd83
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$sendRequestToIdvServiceEndpoint$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest.class
new file mode 100644
index 0000000..6ffcefd
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/SanctionsCredential.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/SanctionsCredential.class
new file mode 100644
index 0000000..c79d64f
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/SanctionsCredential.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/SanctionsListResult.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/SanctionsListResult.class
new file mode 100644
index 0000000..b409acd
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/SanctionsListResult.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingOfferingsTest.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingOfferingsTest.class
new file mode 100644
index 0000000..88b6343
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingOfferingsTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest$PFI creates and signs quote$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest$PFI creates and signs quote$1.class
new file mode 100644
index 0000000..2ae9e16
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest$PFI creates and signs quote$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest.class
new file mode 100644
index 0000000..186e943
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider.class
new file mode 100644
index 0000000..71ec255
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider.class
new file mode 100644
index 0000000..c013542
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiOnboardingTest.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiOnboardingTest.class
new file mode 100644
index 0000000..a36eb13
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiOnboardingTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$1.class
new file mode 100644
index 0000000..6bbaaf6
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$2.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$2.class
new file mode 100644
index 0000000..6b9ed8b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$3.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$3.class
new file mode 100644
index 0000000..4e91f69
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$3.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI server is started$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI server is started$1.class
new file mode 100644
index 0000000..de606f1
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI server is started$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest.class
new file mode 100644
index 0000000..f337a59
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/ProcessingOrdersTest.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/ProcessingOrdersTest.class
new file mode 100644
index 0000000..7f2b0ba
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/pfi/ProcessingOrdersTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/GetMatchedOfferingsTest.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/GetMatchedOfferingsTest.class
new file mode 100644
index 0000000..68ccd0a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/GetMatchedOfferingsTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/GetOfferingsTest.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/GetOfferingsTest.class
new file mode 100644
index 0000000..a8eb693
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/GetOfferingsTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/PfiAllowListTest.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/PfiAllowListTest.class
new file mode 100644
index 0000000..b69a95d
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/PfiAllowListTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/PlaceOrderTest.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/PlaceOrderTest.class
new file mode 100644
index 0000000..bd911fe
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/PlaceOrderTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/ReceiveQuoteTest.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/ReceiveQuoteTest.class
new file mode 100644
index 0000000..9ddef05
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/ReceiveQuoteTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/SendRfqTest.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/SendRfqTest.class
new file mode 100644
index 0000000..34c814f
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/tbdex/wallet/SendRfqTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockDataProvider$execute$paramsKey$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockDataProvider$execute$paramsKey$1.class
new file mode 100644
index 0000000..f6d98b5
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockDataProvider$execute$paramsKey$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockDataProvider$setup$paramsKey$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockDataProvider$setup$paramsKey$1.class
new file mode 100644
index 0000000..3e18172
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockDataProvider$setup$paramsKey$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockDataProvider.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockDataProvider.class
new file mode 100644
index 0000000..a68d6cb
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockDataProvider.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setClose$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setClose$1.class
new file mode 100644
index 0000000..1084304
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setClose$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setExchange$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setExchange$1.class
new file mode 100644
index 0000000..38cc132
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setExchange$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setExchanges$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setExchanges$1.class
new file mode 100644
index 0000000..c485a13
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setExchanges$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setOrder$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setOrder$1.class
new file mode 100644
index 0000000..362c47f
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setOrder$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setOrderStatus$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setOrderStatus$1.class
new file mode 100644
index 0000000..f25445e
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setOrderStatus$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setQuote$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setQuote$1.class
new file mode 100644
index 0000000..2ce2a76
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setQuote$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setRfq$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setRfq$1.class
new file mode 100644
index 0000000..dc59169
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setRfq$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setWrite$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setWrite$1.class
new file mode 100644
index 0000000..617e917
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setWrite$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider.class
new file mode 100644
index 0000000..0a13ab0
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider$setOffering$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider$setOffering$1.class
new file mode 100644
index 0000000..630d72a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider$setOffering$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider$setOfferings$1.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider$setOfferings$1.class
new file mode 100644
index 0000000..bc7002b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider$setOfferings$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider.class
new file mode 100644
index 0000000..eaf5464
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/TestData.class b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/TestData.class
new file mode 100644
index 0000000..29afbdb
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/classes/website/tbd/developer/site/docs/utils/TestData.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/last-build.bin b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/last-build.bin
new file mode 100644
index 0000000..f15b1d0
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/last-build.bin differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/snapshots.bin b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/snapshots.bin
new file mode 100644
index 0000000..dac36f2
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-ic/test/snapshots.bin differ
diff --git a/site/testsuites/testsuite-kotlin/target/kotlin-testsuite-0.1.0-SNAPSHOT.jar b/site/testsuites/testsuite-kotlin/target/kotlin-testsuite-0.1.0-SNAPSHOT.jar
new file mode 100644
index 0000000..3587198
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/kotlin-testsuite-0.1.0-SNAPSHOT.jar differ
diff --git a/site/testsuites/testsuite-kotlin/target/maven-archiver/pom.properties b/site/testsuites/testsuite-kotlin/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..21e9f93
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/maven-archiver/pom.properties
@@ -0,0 +1,4 @@
+#Created by Apache Maven 3.9.6
+artifactId=kotlin-testsuite
+groupId=website.tbd.developer.site
+version=0.1.0-SNAPSHOT
diff --git a/site/testsuites/testsuite-kotlin/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/site/testsuites/testsuite-kotlin/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
new file mode 100644
index 0000000..e69de29
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.CredentialIssuanceTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.CredentialIssuanceTest.xml
new file mode 100644
index 0000000..dd6d518
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.CredentialIssuanceTest.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialIssuerTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialIssuerTest.xml
new file mode 100644
index 0000000..802cf49
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialIssuerTest.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest.xml
new file mode 100644
index 0000000..54d5e96
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.pfi.CreatingOfferingsTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.pfi.CreatingOfferingsTest.xml
new file mode 100644
index 0000000..7e042c8
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.pfi.CreatingOfferingsTest.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.pfi.CreatingQuotesTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.pfi.CreatingQuotesTest.xml
new file mode 100644
index 0000000..83f1e87
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.pfi.CreatingQuotesTest.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.pfi.PfiOnboardingTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.pfi.PfiOnboardingTest.xml
new file mode 100644
index 0000000..5d14ebf
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.pfi.PfiOnboardingTest.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.pfi.PfiStructureTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.pfi.PfiStructureTest.xml
new file mode 100644
index 0000000..c32012b
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.pfi.PfiStructureTest.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.pfi.ProcessingOrdersTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.pfi.ProcessingOrdersTest.xml
new file mode 100644
index 0000000..a98b494
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.pfi.ProcessingOrdersTest.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.GetMatchedOfferingsTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.GetMatchedOfferingsTest.xml
new file mode 100644
index 0000000..148a291
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.GetMatchedOfferingsTest.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.GetOfferingsTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.GetOfferingsTest.xml
new file mode 100644
index 0000000..fb22995
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.GetOfferingsTest.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.PfiAllowListTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.PfiAllowListTest.xml
new file mode 100644
index 0000000..28dcc60
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.PfiAllowListTest.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.PlaceOrderTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.PlaceOrderTest.xml
new file mode 100644
index 0000000..7ec900b
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.PlaceOrderTest.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.ReceiveQuoteTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.ReceiveQuoteTest.xml
new file mode 100644
index 0000000..efc8459
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.ReceiveQuoteTest.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.SendRfqTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.SendRfqTest.xml
new file mode 100644
index 0000000..ddb6d94
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.tbdex.wallet.SendRfqTest.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToCreateDidTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToCreateDidTest.xml
new file mode 100644
index 0000000..4557a83
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToCreateDidTest.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToImportDidTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToImportDidTest.xml
new file mode 100644
index 0000000..0b26794
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToImportDidTest.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToResolveDidTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToResolveDidTest.xml
new file mode 100644
index 0000000..841f010
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToResolveDidTest.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToUpdateDidTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToUpdateDidTest.xml
new file mode 100644
index 0000000..8f69f56
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToUpdateDidTest.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.KeyManagementTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.KeyManagementTest.xml
new file mode 100644
index 0000000..dd91a2a
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.KeyManagementTest.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.FanClubVcTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.FanClubVcTest.xml
new file mode 100644
index 0000000..4e90b35
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.FanClubVcTest.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.JwtToVcTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.JwtToVcTest.xml
new file mode 100644
index 0000000..9e68333
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.JwtToVcTest.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.KbcIssuanceTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.KbcIssuanceTest.xml
new file mode 100644
index 0000000..4552a8d
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.KbcIssuanceTest.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationDefinitionTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationDefinitionTest.xml
new file mode 100644
index 0000000..29259b2
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationDefinitionTest.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationExchangeTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationExchangeTest.xml
new file mode 100644
index 0000000..2526b30
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationExchangeTest.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.RevokeVcTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.RevokeVcTest.xml
new file mode 100644
index 0000000..912d888
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.RevokeVcTest.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.VcIssuanceTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.VcIssuanceTest.xml
new file mode 100644
index 0000000..d00c1ca
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.VcIssuanceTest.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.VerifyVcTest.xml b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.VerifyVcTest.xml
new file mode 100644
index 0000000..5ddfdcf
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/TEST-website.tbd.developer.site.docs.web5.build.verifiablecredentials.VerifyVcTest.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.CredentialIssuanceTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.CredentialIssuanceTest.txt
new file mode 100644
index 0000000..85adf7a
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.CredentialIssuanceTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.tbdex.CredentialIssuanceTest
+-------------------------------------------------------------------------------
+Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.189 s - in website.tbd.developer.site.docs.tbdex.CredentialIssuanceTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialIssuerTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialIssuerTest.txt
new file mode 100644
index 0000000..9a07276
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialIssuerTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialIssuerTest
+-------------------------------------------------------------------------------
+Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.377 s - in website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialIssuerTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest.txt
new file mode 100644
index 0000000..08d8d2c
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest
+-------------------------------------------------------------------------------
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.357 s - in website.tbd.developer.site.docs.tbdex.KnownCustomerCredentialWalletTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.pfi.CreatingOfferingsTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.pfi.CreatingOfferingsTest.txt
new file mode 100644
index 0000000..03f3011
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.pfi.CreatingOfferingsTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.tbdex.pfi.CreatingOfferingsTest
+-------------------------------------------------------------------------------
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.35 s - in website.tbd.developer.site.docs.tbdex.pfi.CreatingOfferingsTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.pfi.CreatingQuotesTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.pfi.CreatingQuotesTest.txt
new file mode 100644
index 0000000..8d5ef05
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.pfi.CreatingQuotesTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.tbdex.pfi.CreatingQuotesTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.296 s - in website.tbd.developer.site.docs.tbdex.pfi.CreatingQuotesTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.pfi.PfiOnboardingTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.pfi.PfiOnboardingTest.txt
new file mode 100644
index 0000000..8f77e66
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.pfi.PfiOnboardingTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.tbdex.pfi.PfiOnboardingTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.084 s - in website.tbd.developer.site.docs.tbdex.pfi.PfiOnboardingTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.pfi.PfiStructureTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.pfi.PfiStructureTest.txt
new file mode 100644
index 0000000..5df361d
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.pfi.PfiStructureTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.tbdex.pfi.PfiStructureTest
+-------------------------------------------------------------------------------
+Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.344 s - in website.tbd.developer.site.docs.tbdex.pfi.PfiStructureTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.pfi.ProcessingOrdersTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.pfi.ProcessingOrdersTest.txt
new file mode 100644
index 0000000..b82d374
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.pfi.ProcessingOrdersTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.tbdex.pfi.ProcessingOrdersTest
+-------------------------------------------------------------------------------
+Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.174 s - in website.tbd.developer.site.docs.tbdex.pfi.ProcessingOrdersTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.GetMatchedOfferingsTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.GetMatchedOfferingsTest.txt
new file mode 100644
index 0000000..05d7463
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.GetMatchedOfferingsTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.tbdex.wallet.GetMatchedOfferingsTest
+-------------------------------------------------------------------------------
+Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.195 s - in website.tbd.developer.site.docs.tbdex.wallet.GetMatchedOfferingsTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.GetOfferingsTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.GetOfferingsTest.txt
new file mode 100644
index 0000000..af1499a
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.GetOfferingsTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.tbdex.wallet.GetOfferingsTest
+-------------------------------------------------------------------------------
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.343 s - in website.tbd.developer.site.docs.tbdex.wallet.GetOfferingsTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.PfiAllowListTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.PfiAllowListTest.txt
new file mode 100644
index 0000000..12ec4b7
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.PfiAllowListTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.tbdex.wallet.PfiAllowListTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.088 s - in website.tbd.developer.site.docs.tbdex.wallet.PfiAllowListTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.PlaceOrderTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.PlaceOrderTest.txt
new file mode 100644
index 0000000..770d4ad
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.PlaceOrderTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.tbdex.wallet.PlaceOrderTest
+-------------------------------------------------------------------------------
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.571 s - in website.tbd.developer.site.docs.tbdex.wallet.PlaceOrderTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.ReceiveQuoteTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.ReceiveQuoteTest.txt
new file mode 100644
index 0000000..70d7a95
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.ReceiveQuoteTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.tbdex.wallet.ReceiveQuoteTest
+-------------------------------------------------------------------------------
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.536 s - in website.tbd.developer.site.docs.tbdex.wallet.ReceiveQuoteTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.SendRfqTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.SendRfqTest.txt
new file mode 100644
index 0000000..f94204c
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.tbdex.wallet.SendRfqTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.tbdex.wallet.SendRfqTest
+-------------------------------------------------------------------------------
+Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.789 s - in website.tbd.developer.site.docs.tbdex.wallet.SendRfqTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToCreateDidTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToCreateDidTest.txt
new file mode 100644
index 0000000..dcc17e5
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToCreateDidTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToCreateDidTest
+-------------------------------------------------------------------------------
+Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.078 s - in website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToCreateDidTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToImportDidTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToImportDidTest.txt
new file mode 100644
index 0000000..9ce4d07
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToImportDidTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToImportDidTest
+-------------------------------------------------------------------------------
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.167 s - in website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToImportDidTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToResolveDidTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToResolveDidTest.txt
new file mode 100644
index 0000000..a7ee29d
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToResolveDidTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToResolveDidTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.332 s - in website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToResolveDidTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToUpdateDidTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToUpdateDidTest.txt
new file mode 100644
index 0000000..92ea2a1
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToUpdateDidTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToUpdateDidTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 1, Time elapsed: 0 s - in website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.HowToUpdateDidTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.KeyManagementTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.KeyManagementTest.txt
new file mode 100644
index 0000000..9d4eac1
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.KeyManagementTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.KeyManagementTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.083 s - in website.tbd.developer.site.docs.web5.build.decentralizedidentifiers.KeyManagementTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.FanClubVcTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.FanClubVcTest.txt
new file mode 100644
index 0000000..02bc13f
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.FanClubVcTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.web5.build.verifiablecredentials.FanClubVcTest
+-------------------------------------------------------------------------------
+Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.831 s - in website.tbd.developer.site.docs.web5.build.verifiablecredentials.FanClubVcTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.JwtToVcTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.JwtToVcTest.txt
new file mode 100644
index 0000000..da21ae0
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.JwtToVcTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.web5.build.verifiablecredentials.JwtToVcTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - in website.tbd.developer.site.docs.web5.build.verifiablecredentials.JwtToVcTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.KbcIssuanceTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.KbcIssuanceTest.txt
new file mode 100644
index 0000000..37a9e8b
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.KbcIssuanceTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.web5.build.verifiablecredentials.KbcIssuanceTest
+-------------------------------------------------------------------------------
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.426 s - in website.tbd.developer.site.docs.web5.build.verifiablecredentials.KbcIssuanceTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationDefinitionTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationDefinitionTest.txt
new file mode 100644
index 0000000..d64bea5
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationDefinitionTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationDefinitionTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - in website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationDefinitionTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationExchangeTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationExchangeTest.txt
new file mode 100644
index 0000000..c351108
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationExchangeTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationExchangeTest
+-------------------------------------------------------------------------------
+Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.834 s - in website.tbd.developer.site.docs.web5.build.verifiablecredentials.PresentationExchangeTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.RevokeVcTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.RevokeVcTest.txt
new file mode 100644
index 0000000..b15fb89
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.RevokeVcTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.web5.build.verifiablecredentials.RevokeVcTest
+-------------------------------------------------------------------------------
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.012 s - in website.tbd.developer.site.docs.web5.build.verifiablecredentials.RevokeVcTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.VcIssuanceTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.VcIssuanceTest.txt
new file mode 100644
index 0000000..bae5fb1
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.VcIssuanceTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.web5.build.verifiablecredentials.VcIssuanceTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.601 s - in website.tbd.developer.site.docs.web5.build.verifiablecredentials.VcIssuanceTest
diff --git a/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.VerifyVcTest.txt b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.VerifyVcTest.txt
new file mode 100644
index 0000000..5e17747
--- /dev/null
+++ b/site/testsuites/testsuite-kotlin/target/surefire-reports/website.tbd.developer.site.docs.web5.build.verifiablecredentials.VerifyVcTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: website.tbd.developer.site.docs.web5.build.verifiablecredentials.VerifyVcTest
+-------------------------------------------------------------------------------
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.045 s - in website.tbd.developer.site.docs.web5.build.verifiablecredentials.VerifyVcTest
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/META-INF/kotlin-testsuite.kotlin_module b/site/testsuites/testsuite-kotlin/target/test-classes/META-INF/kotlin-testsuite.kotlin_module
new file mode 100644
index 0000000..029a3df
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/META-INF/kotlin-testsuite.kotlin_module differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$configureRouting$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$configureRouting$1$1.class
new file mode 100644
index 0000000..3a0e38b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$configureRouting$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$configureRouting$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$configureRouting$1.class
new file mode 100644
index 0000000..0347ccb
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$configureRouting$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$1.class
new file mode 100644
index 0000000..e0f9afc
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$2.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$2.class
new file mode 100644
index 0000000..6b6351a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest.class
new file mode 100644
index 0000000..3f31bce
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt$createADid$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt$createADid$1.class
new file mode 100644
index 0000000..e18b9e2
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt$createADid$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt.class
new file mode 100644
index 0000000..7a71c2a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/CredentialIssuanceTestKt.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$Evidence.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$Evidence.class
new file mode 100644
index 0000000..d4c28d2
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$Evidence.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$KccCredential.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$KccCredential.class
new file mode 100644
index 0000000..002795f
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$KccCredential.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$1.class
new file mode 100644
index 0000000..5ddb065
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$1.class
new file mode 100644
index 0000000..4dc3776
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$2.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$2.class
new file mode 100644
index 0000000..7e08ec1
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$3.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$3.class
new file mode 100644
index 0000000..14fa8fb
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$3.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$4.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$4.class
new file mode 100644
index 0000000..f580fb7
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$4.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1.class
new file mode 100644
index 0000000..0a03aea
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2$siopRequest$1$inputDescriptors$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2.class
new file mode 100644
index 0000000..c567fb4
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$1.class
new file mode 100644
index 0000000..44ad14f
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$2.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$2.class
new file mode 100644
index 0000000..51da6ba
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$3.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$3.class
new file mode 100644
index 0000000..0f831df
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$3.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$4.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$4.class
new file mode 100644
index 0000000..269f9da
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1$constraints$1$fields$1$4.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1.class
new file mode 100644
index 0000000..3bedd8c
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3$siopRequest$1$inputDescriptors$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3.class
new file mode 100644
index 0000000..3edc61a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$3.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$2$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$2$1$1.class
new file mode 100644
index 0000000..de34d2a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$2$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1$1.class
new file mode 100644
index 0000000..df1c549
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1$2.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1$2.class
new file mode 100644
index 0000000..772d1d1
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1.class
new file mode 100644
index 0000000..170f76b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4$idvRequest$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4.class
new file mode 100644
index 0000000..9a92e73
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$4.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$1.class
new file mode 100644
index 0000000..984fb4c
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$2.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$2.class
new file mode 100644
index 0000000..f9f4d7d
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$1.class
new file mode 100644
index 0000000..dc3d08b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1$1$1.class
new file mode 100644
index 0000000..2aef233
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1$1.class
new file mode 100644
index 0000000..49ab154
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1.class
new file mode 100644
index 0000000..b7a1c63
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2.class
new file mode 100644
index 0000000..bca2ba2
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3.class
new file mode 100644
index 0000000..3453fc0
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$3.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4$1$1.class
new file mode 100644
index 0000000..7c19810
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4$1.class
new file mode 100644
index 0000000..4fa6677
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4.class
new file mode 100644
index 0000000..fdf6840
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$4.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5$1$1.class
new file mode 100644
index 0000000..353f67a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5$1.class
new file mode 100644
index 0000000..6c122e1
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5.class
new file mode 100644
index 0000000..40bf7f9
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1$5.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1.class
new file mode 100644
index 0000000..7d9b375
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1.class
new file mode 100644
index 0000000..ef11c98
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5$issuerMetadata$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5.class
new file mode 100644
index 0000000..3aa3ee8
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$5.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$6.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$6.class
new file mode 100644
index 0000000..7e4e340
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$6.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$7.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$7.class
new file mode 100644
index 0000000..3e3f642
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$7.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$8.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$8.class
new file mode 100644
index 0000000..f4148eb
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1$8.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1.class
new file mode 100644
index 0000000..04c2a0b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$configureRouting$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$1.class
new file mode 100644
index 0000000..5bbc897
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$2.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$2.class
new file mode 100644
index 0000000..9a50939
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest$verify() does not throw an exception for a valid JWT$$inlined$assertDoesNotThrow$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest.class
new file mode 100644
index 0000000..088f61a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialIssuerTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$CredentialOffer.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$CredentialOffer.class
new file mode 100644
index 0000000..867325e
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$CredentialOffer.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$IssuerResponse.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$IssuerResponse.class
new file mode 100644
index 0000000..ee90fda
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$IssuerResponse.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$WalletStorage.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$WalletStorage.class
new file mode 100644
index 0000000..cd809a8
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$WalletStorage.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchAccessToken$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchAccessToken$1.class
new file mode 100644
index 0000000..265ceff
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchAccessToken$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchAuthServerMetadata$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchAuthServerMetadata$1.class
new file mode 100644
index 0000000..72b720e
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchAuthServerMetadata$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchIssuerMetadata$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchIssuerMetadata$1.class
new file mode 100644
index 0000000..e3b7889
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$fetchIssuerMetadata$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$postSiopResponse$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$postSiopResponse$1.class
new file mode 100644
index 0000000..c2b1f2d
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$postSiopResponse$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$requestKnownCustomerCredential$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$requestKnownCustomerCredential$1.class
new file mode 100644
index 0000000..7d1f572
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$requestKnownCustomerCredential$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$requestKnownCustomerCredential$2$1$requestBody$1$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$requestKnownCustomerCredential$2$1$requestBody$1$1.class
new file mode 100644
index 0000000..4160510
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$requestKnownCustomerCredential$2$1$requestBody$1$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$sendRequestToIdvServiceEndpoint$2.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$sendRequestToIdvServiceEndpoint$2.class
new file mode 100644
index 0000000..93ddd83
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest$sendRequestToIdvServiceEndpoint$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest.class
new file mode 100644
index 0000000..6ffcefd
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/KnownCustomerCredentialWalletTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/SanctionsCredential.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/SanctionsCredential.class
new file mode 100644
index 0000000..c79d64f
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/SanctionsCredential.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/SanctionsListResult.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/SanctionsListResult.class
new file mode 100644
index 0000000..b409acd
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/SanctionsListResult.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingOfferingsTest.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingOfferingsTest.class
new file mode 100644
index 0000000..88b6343
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingOfferingsTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest$PFI creates and signs quote$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest$PFI creates and signs quote$1.class
new file mode 100644
index 0000000..2ae9e16
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest$PFI creates and signs quote$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest.class
new file mode 100644
index 0000000..186e943
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/CreatingQuotesTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider.class
new file mode 100644
index 0000000..71ec255
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/ExchangesApiProvider.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider.class
new file mode 100644
index 0000000..c013542
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/OfferingsApiProvider.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiOnboardingTest.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiOnboardingTest.class
new file mode 100644
index 0000000..a36eb13
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiOnboardingTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$1.class
new file mode 100644
index 0000000..6bbaaf6
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$2.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$2.class
new file mode 100644
index 0000000..6b9ed8b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$2.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$3.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$3.class
new file mode 100644
index 0000000..4e91f69
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI initializes routes$3.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI server is started$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI server is started$1.class
new file mode 100644
index 0000000..de606f1
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest$PFI server is started$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest.class
new file mode 100644
index 0000000..f337a59
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/PfiStructureTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/ProcessingOrdersTest.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/ProcessingOrdersTest.class
new file mode 100644
index 0000000..7f2b0ba
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/pfi/ProcessingOrdersTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/GetMatchedOfferingsTest.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/GetMatchedOfferingsTest.class
new file mode 100644
index 0000000..68ccd0a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/GetMatchedOfferingsTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/GetOfferingsTest.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/GetOfferingsTest.class
new file mode 100644
index 0000000..a8eb693
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/GetOfferingsTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/PfiAllowListTest.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/PfiAllowListTest.class
new file mode 100644
index 0000000..b69a95d
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/PfiAllowListTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/PlaceOrderTest.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/PlaceOrderTest.class
new file mode 100644
index 0000000..bd911fe
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/PlaceOrderTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/ReceiveQuoteTest.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/ReceiveQuoteTest.class
new file mode 100644
index 0000000..9ddef05
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/ReceiveQuoteTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/SendRfqTest.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/SendRfqTest.class
new file mode 100644
index 0000000..34c814f
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/tbdex/wallet/SendRfqTest.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockDataProvider$execute$paramsKey$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockDataProvider$execute$paramsKey$1.class
new file mode 100644
index 0000000..f6d98b5
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockDataProvider$execute$paramsKey$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockDataProvider$setup$paramsKey$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockDataProvider$setup$paramsKey$1.class
new file mode 100644
index 0000000..3e18172
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockDataProvider$setup$paramsKey$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockDataProvider.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockDataProvider.class
new file mode 100644
index 0000000..a68d6cb
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockDataProvider.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setClose$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setClose$1.class
new file mode 100644
index 0000000..1084304
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setClose$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setExchange$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setExchange$1.class
new file mode 100644
index 0000000..38cc132
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setExchange$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setExchanges$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setExchanges$1.class
new file mode 100644
index 0000000..c485a13
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setExchanges$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setOrder$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setOrder$1.class
new file mode 100644
index 0000000..362c47f
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setOrder$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setOrderStatus$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setOrderStatus$1.class
new file mode 100644
index 0000000..f25445e
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setOrderStatus$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setQuote$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setQuote$1.class
new file mode 100644
index 0000000..2ce2a76
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setQuote$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setRfq$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setRfq$1.class
new file mode 100644
index 0000000..dc59169
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setRfq$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setWrite$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setWrite$1.class
new file mode 100644
index 0000000..617e917
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider$setWrite$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider.class
new file mode 100644
index 0000000..0a13ab0
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockExchangesApiProvider.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider$setOffering$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider$setOffering$1.class
new file mode 100644
index 0000000..630d72a
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider$setOffering$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider$setOfferings$1.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider$setOfferings$1.class
new file mode 100644
index 0000000..bc7002b
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider$setOfferings$1.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider.class
new file mode 100644
index 0000000..eaf5464
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/MockOfferingsApiProvider.class differ
diff --git a/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/TestData.class b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/TestData.class
new file mode 100644
index 0000000..29afbdb
Binary files /dev/null and b/site/testsuites/testsuite-kotlin/target/test-classes/website/tbd/developer/site/docs/utils/TestData.class differ
diff --git a/site/testsuites/testsuite-rust/Cargo.lock b/site/testsuites/testsuite-rust/Cargo.lock
new file mode 100644
index 0000000..4489c4c
--- /dev/null
+++ b/site/testsuites/testsuite-rust/Cargo.lock
@@ -0,0 +1,7 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "testsuite-rust"
+version = "0.1.0"
diff --git a/site/testsuites/testsuite-rust/Cargo.toml b/site/testsuites/testsuite-rust/Cargo.toml
new file mode 100644
index 0000000..61f9f92
--- /dev/null
+++ b/site/testsuites/testsuite-rust/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "testsuite-rust"
+version = "0.1.0"
+edition = "2021"
+rust-version = "1.75"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
diff --git a/site/testsuites/testsuite-rust/src/lib.rs b/site/testsuites/testsuite-rust/src/lib.rs
new file mode 100644
index 0000000..ec66a0e
--- /dev/null
+++ b/site/testsuites/testsuite-rust/src/lib.rs
@@ -0,0 +1,16 @@
+// Autogenerated from ALR project creation command "cargo new $projectName --library"
+// @see docs https://doc.rust-lang.org/beta/book/ch11-01-writing-tests.html
+pub fn add(left: usize, right: usize) -> usize {
+ left + right
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn it_works() {
+ let result = add(2, 2);
+ assert_eq!(result, 4);
+ }
+}
diff --git a/site/testsuites/testsuite-swift/.gitignore b/site/testsuites/testsuite-swift/.gitignore
new file mode 100644
index 0000000..0023a53
--- /dev/null
+++ b/site/testsuites/testsuite-swift/.gitignore
@@ -0,0 +1,8 @@
+.DS_Store
+/.build
+/Packages
+xcuserdata/
+DerivedData/
+.swiftpm/configuration/registries.json
+.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
+.netrc
diff --git a/site/testsuites/testsuite-swift/Package.resolved b/site/testsuites/testsuite-swift/Package.resolved
new file mode 100644
index 0000000..791ce1d
--- /dev/null
+++ b/site/testsuites/testsuite-swift/Package.resolved
@@ -0,0 +1,140 @@
+{
+ "pins" : [
+ {
+ "identity" : "anycodable",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/flight-school/anycodable.git",
+ "state" : {
+ "revision" : "862808b2070cd908cb04f9aafe7de83d35f81b05",
+ "version" : "0.6.7"
+ }
+ },
+ {
+ "identity" : "chronometer",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/KittyMac/Chronometer.git",
+ "state" : {
+ "revision" : "b4808d59a175b1f764cc3d7e2e927e5476b10427",
+ "version" : "0.1.11"
+ }
+ },
+ {
+ "identity" : "dns",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/Bouke/DNS.git",
+ "state" : {
+ "revision" : "78bbd1589890a90b202d11d5f9e1297050cf0eb2",
+ "version" : "1.2.0"
+ }
+ },
+ {
+ "identity" : "hitch",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/KittyMac/Hitch.git",
+ "state" : {
+ "revision" : "cb638ce61942f3d26bc0ca80d765846a43fa4409",
+ "version" : "0.2.8"
+ }
+ },
+ {
+ "identity" : "jsonschema.swift",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/kylef/JSONSchema.swift.git",
+ "state" : {
+ "revision" : "d14de4b2d9205068c9db89c00d097ca43c897000",
+ "version" : "0.6.0"
+ }
+ },
+ {
+ "identity" : "mocker",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/WeTransfer/Mocker.git",
+ "state" : {
+ "revision" : "95fa785c751f6bc40c49e112d433c3acf8417a97",
+ "version" : "3.0.2"
+ }
+ },
+ {
+ "identity" : "pathkit",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/kylef/PathKit.git",
+ "state" : {
+ "revision" : "3bfd2737b700b9a36565a8c94f4ad2b050a5e574",
+ "version" : "1.0.1"
+ }
+ },
+ {
+ "identity" : "secp256k1.swift",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/GigaBitcoin/secp256k1.swift.git",
+ "state" : {
+ "revision" : "347b84ed2aad2305a7233f2a48d76f41e52062a1",
+ "version" : "0.16.0"
+ }
+ },
+ {
+ "identity" : "sextant",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/KittyMac/Sextant.git",
+ "state" : {
+ "revision" : "df94791f329beddf82abf76d682f11823beccd1c",
+ "version" : "0.4.0"
+ }
+ },
+ {
+ "identity" : "spanker",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/KittyMac/Spanker.git",
+ "state" : {
+ "revision" : "f883c21f80f003f8db29c2d45ae7be636fce305a",
+ "version" : "0.1.17"
+ }
+ },
+ {
+ "identity" : "spectre",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/kylef/Spectre.git",
+ "state" : {
+ "revision" : "26cc5e9ae0947092c7139ef7ba612e34646086c7",
+ "version" : "0.10.1"
+ }
+ },
+ {
+ "identity" : "swift-extras-base64",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/swift-extras/swift-extras-base64.git",
+ "state" : {
+ "revision" : "97237cf1bc1feebaeb0febec91c1e1b9e4d839b3",
+ "version" : "0.7.0"
+ }
+ },
+ {
+ "identity" : "swift-typeid",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/Frizlab/swift-typeid.git",
+ "state" : {
+ "revision" : "7f4ef8d41c5bf0f381742d2d91df413c4d659faa",
+ "version" : "0.3.0"
+ }
+ },
+ {
+ "identity" : "tbdex-swift",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/TBD54566975/tbdex-swift.git",
+ "state" : {
+ "revision" : "741a2c6a9220b5b7822309ea4120618429b1fc89",
+ "version" : "1.0.0"
+ }
+ },
+ {
+ "identity" : "web5-swift",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/TBD54566975/web5-swift.git",
+ "state" : {
+ "revision" : "1353f59e105ef09b4705f8675ce329f0f7e4c104",
+ "version" : "1.0.0"
+ }
+ }
+ ],
+ "version" : 2
+}
diff --git a/site/testsuites/testsuite-swift/Package.swift b/site/testsuites/testsuite-swift/Package.swift
new file mode 100644
index 0000000..8f712bd
--- /dev/null
+++ b/site/testsuites/testsuite-swift/Package.swift
@@ -0,0 +1,42 @@
+// swift-tools-version: 5.9
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+
+import PackageDescription
+
+let package = Package(
+ name: "DevSiteTestSuite",
+ platforms: [
+ .iOS(.v13),
+ .macOS(.v10_15), // Web5 and tbDEX require minimum 'v10_15'
+ ],
+ products: [
+ // Products define the executables and libraries a package produces, making them visible to other packages.
+ .library(
+ name: "DevSiteTestSuite",
+ targets: ["DevSiteTestSuite"]),
+ ],
+ dependencies: [
+ // Dependencies declare other packages that this package depends on.
+ .package(url: "https://github.com/TBD54566975/web5-swift.git", exact: "1.0.0"),
+ .package(url: "https://github.com/TBD54566975/tbdex-swift.git", exact: "1.0.0"),
+ .package(url: "https://github.com/WeTransfer/Mocker.git", .upToNextMajor(from: "3.0.2")),
+ ],
+ targets: [
+ // Targets are the basic building blocks of a package, defining a module or a test suite.
+ // Targets can depend on other targets in this package and products from dependencies.
+ .target(
+ name: "DevSiteTestSuite",
+ dependencies: [
+ .product(name: "Web5", package: "web5-swift"),
+ .product(name: "tbDEX", package: "tbdex-swift"),
+ ]),
+ .testTarget(
+ name: "DevSiteTestSuiteTests",
+ dependencies: [
+ "DevSiteTestSuite",
+ "Mocker",
+ .product(name: "Web5", package: "web5-swift"),
+ .product(name: "tbDEX", package: "tbdex-swift"),
+ ]),
+ ]
+)
diff --git a/site/testsuites/testsuite-swift/Sources/DevSiteTestSuite/DevSiteTestSuite.swift b/site/testsuites/testsuite-swift/Sources/DevSiteTestSuite/DevSiteTestSuite.swift
new file mode 100644
index 0000000..24b5f73
--- /dev/null
+++ b/site/testsuites/testsuite-swift/Sources/DevSiteTestSuite/DevSiteTestSuite.swift
@@ -0,0 +1,9 @@
+// The Swift Programming Language
+// https://docs.swift.org/swift-book
+
+// :snippet-start: web5ImportSwift
+import Web5
+// :snippet-end:
+// :snippet-start: tbDEXImportSwift
+import tbDEX
+// :snippet-end:
\ No newline at end of file
diff --git a/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/DevSiteTestSuiteTests.swift b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/DevSiteTestSuiteTests.swift
new file mode 100644
index 0000000..b45acf6
--- /dev/null
+++ b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/DevSiteTestSuiteTests.swift
@@ -0,0 +1,37 @@
+import XCTest
+@testable import DevSiteTestSuite
+
+final class DevSiteTestSuiteTests: XCTestCase {
+
+ override class func setUp() {
+ super.setUp()
+ // Your setup code here, executed before any tests are run in this class
+ }
+
+ override func setUp() {
+ super.setUp()
+ // This is run before each test method in the class
+ }
+
+ override func tearDown() {
+ // This is run after each test method in the class
+ super.tearDown()
+ }
+
+ override class func tearDown() {
+ // Your teardown code here, executed after all tests in this class are done
+ super.tearDown()
+ }
+
+ func testExample() throws {
+ // XCTest Documentation
+ // https://developer.apple.com/documentation/xctest
+
+ // ALR Added to validate test completion and error failures
+ XCTAssert(true);
+ // XCTAssert(false); // Uncomment to fail this suite
+
+ // Defining Test Cases and Test Methods
+ // https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods
+ }
+}
diff --git a/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/ExampleTests.swift b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/ExampleTests.swift
new file mode 100644
index 0000000..d650b3d
--- /dev/null
+++ b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/ExampleTests.swift
@@ -0,0 +1,51 @@
+import XCTest
+@testable import DevSiteTestSuite
+import Mocker
+@testable import Web5
+
+final class ExampleTests: XCTestCase {
+ func testExample() throws {
+ // XCTest Documentation
+ // https://developer.apple.com/documentation/xctest
+
+ // ALR Added to validate test completion and error failures
+ XCTAssert(true);
+ // XCTAssert(false); // Uncomment to fail this suite
+
+ // Defining Test Cases and Test Methods
+ // https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods
+ }
+
+
+ func testExampleAPIFetchNames() {
+
+ // Setting up a mock
+ let url = URL(string: "https://example.com/names")!
+ // let expectedData = "{\"key\":\"value\"}".data(using: .utf8)!
+ let mockNames = ["John", "Jane", "Doe"]
+ let expectedData = try! JSONEncoder().encode(mockNames)
+
+ // Configure the mock for the specific URL and HTTP method.
+ let mock = Mock(url: url, contentType: .json, statusCode: 200, data: [.get: expectedData])
+ mock.register()
+
+ // End of setting up a mock.
+
+ // Create a URLSession configuration that uses the protocol class of Mocker.
+ let configuration = URLSessionConfiguration.ephemeral
+ configuration.protocolClasses = [MockingURLProtocol.self]
+ let session = URLSession(configuration: configuration)
+
+ let expectation = self.expectation(description: "Names fetch completed")
+
+ // Perform the network request.
+ session.dataTask(with: url) { data, response, error in
+ XCTAssertNil(error)
+ XCTAssertEqual(data, expectedData)
+ expectation.fulfill()
+ }.resume()
+
+ waitForExpectations(timeout: 5, handler: nil)
+ }
+
+}
diff --git a/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/MockData.swift b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/MockData.swift
new file mode 100644
index 0000000..a0f1b7a
--- /dev/null
+++ b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/MockData.swift
@@ -0,0 +1,255 @@
+@testable import Web5
+@testable import tbDEX
+import Foundation
+import XCTest
+import Mocker
+import TypeID
+
+public struct MockData {
+ public static let pfiDid: String = "did:dht:ac7uj566xgmhypniw1cb96dyhod51inwp98o8ugyb9ygikig6coy"
+ public static var exchangeID: String = "exchange_123"
+ public static let customerBearerDid: BearerDID? = try? DIDJWK.create(keyManager: InMemoryKeyManager())
+ public static let BTC_ADDRESS = "bc1q52csjdqa6cq5d2ntkkyz8wk7qh2qevy04dyyfd"
+
+ public static var selectedOffering: Offering {
+ return Offering(
+ from: pfiDid,
+ data: OfferingData(
+ description: "test offering",
+ payoutUnitsPerPayinUnit: "1",
+ payin: PayinDetails(
+ currencyCode: "USD",
+ methods: []
+ ),
+ payout: PayoutDetails(
+ currencyCode: "KES",
+ methods: []
+ ),
+ requiredClaims: PresentationDefinitionV2(
+ id: "7ce4004c-3c38-4853-968b-e411bafcd945",
+ name: nil,
+ purpose: nil,
+ format: nil,
+ submissionRequirements: nil,
+ inputDescriptors: [
+ InputDescriptorV2(
+ id: "bbdb9b7c-5754-4f46-b63b-590bada959e0",
+ name: nil,
+ purpose: nil,
+ format: nil,
+ constraints: ConstraintsV2(
+ fields: [
+ FieldV2(
+ path: ["$.type"],
+ filter: [
+ "type": "string",
+ "const": "YoloCredential"
+ ]
+ )
+ ],
+ limitDisclosure: nil
+ )
+ )
+ ]
+ )),
+ protocol: "1.0"
+ )
+ }
+
+ public static var rfq: RFQ? {
+ guard let customerBearerDid = customerBearerDid else {
+ return nil
+ }
+
+ let offeringId: TypeID = TypeID(rawValue: selectedOffering.metadata.id.rawValue) ?? TypeID(rawValue: "default")!
+ do {
+ let mock_rfq: RFQ = try RFQ(
+ to: selectedOffering.metadata.from,
+ from: customerBearerDid.uri,
+ data: CreateRFQData(
+ offeringId: offeringId,
+ payin: CreateRFQPayinMethod(
+ amount: "0.012",
+ kind: "BTC_WALLET_ADDRESS",
+ paymentDetails: [
+ "btc_address": BTC_ADDRESS
+ ]
+ ),
+ payout: CreateRFQPayoutMethod(
+ kind: "DEBIT_CARD",
+ paymentDetails: [
+ "cvv": "123",
+ "cardNumber": "1234567890123456789",
+ "expiryDate": "05/25",
+ "cardHolderName": "Alice Doe"
+ ]
+ ),
+ claims: []
+ ),
+ protocol: "1.0"
+ )
+
+ exchangeID = mock_rfq.metadata.exchangeID
+ return mock_rfq
+ } catch {
+ fatalError("Failed to create RFQ: \(error)")
+ }
+ }
+
+ public static var mockQuote: Quote? {
+ guard let customerUri = customerBearerDid?.uri else {
+ return nil
+ }
+
+ return Quote(
+ from: pfiDid,
+ to: customerUri,
+ exchangeID: exchangeID,
+ data: QuoteData(
+ expiresAt: Date().addingTimeInterval(60),
+ payin: QuoteDetails(
+ currencyCode: "USD",
+ amount: "1.00",
+ paymentInstruction: PaymentInstruction(
+ link: "https://example.com/pay",
+ instruction: "Pay here"
+ )
+ ),
+ payout: QuoteDetails(
+ currencyCode: "AUD",
+ amount: "2.00",
+ fee: "0.50"
+ )
+ ),
+ protocol: "1.0"
+ )
+ }
+
+ public static func createOrder(
+ from: String = customerBearerDid!.uri,
+ to: String = pfiDid,
+ exchangeId: String = exchangeID
+ ) -> Order {
+ Order(
+ from: from,
+ to: to,
+ exchangeID: exchangeId,
+ data: .init(),
+ protocol: "1.0"
+ )
+ }
+
+ public static func createOrderStatus(
+ from: String = customerBearerDid!.uri,
+ to: String = pfiDid,
+ exchangeId: String = exchangeID,
+ status: String = ""
+ ) -> OrderStatus {
+ OrderStatus(
+ from: from,
+ to: to,
+ exchangeID: exchangeId,
+ data: .init(
+ orderStatus: status
+ ),
+ protocol: "1.0"
+ )
+ }
+
+ public static func createClose(
+ from: String = customerBearerDid!.uri,
+ to: String = pfiDid,
+ exchangeId: String = exchangeID,
+ reason: String = ""
+ ) -> Close {
+ Close(
+ from: from,
+ to: to,
+ exchangeID: exchangeId,
+ data: .init(
+ reason: reason,
+ success: true
+ ),
+ protocol: "1.0"
+ )
+ }
+
+ public static func createQuote(
+ from: String = customerBearerDid!.uri,
+ to: String = pfiDid,
+ exchangeId: String = exchangeID
+ ) -> Quote {
+ let now = Date()
+ let expiresAt = now.addingTimeInterval(60)
+
+ return Quote(
+ from: from,
+ to: to,
+ exchangeID: exchangeId,
+ data: .init(
+ expiresAt: expiresAt,
+ payin: .init(
+ currencyCode: "USD",
+ amount: "1.00",
+ paymentInstruction: .init(
+ link: "https://example.com",
+ instruction: "test instruction"
+ )
+ ),
+ payout: .init(
+ currencyCode: "AUD",
+ amount: "2.00",
+ fee: "0.50"
+ )
+ ),
+ protocol: "1.0"
+ )
+ }
+
+ public static func mockGetExchangeWithClose(
+ from: String = customerBearerDid!.uri,
+ to: String = pfiDid,
+ exchangeId: String = exchangeID,
+ closeReason: String = "") {
+ let url = URL(string: "https://localhost:9000/exchanges/\(exchangeId)")!
+ let close = MockData.createClose(from: from, to: to, exchangeId: exchangeId, reason: closeReason)
+ var exchange: [Close] = [Close]()
+ exchange.append(close)
+ let exchangeJson: [String: [Close]] = ["data": exchange]
+
+ MockData.setupMockGetCall(url: url, data: exchangeJson)
+ }
+
+ public static func mockSendOrderMessage(exchangeId: String) {
+ let url = URL(string: "https://localhost:9000/exchanges/\(exchangeId)")!
+ Mocker.register(Mock(url: url, contentType: .json, statusCode: 200, data: [.put: Data()]))
+ }
+
+ public static func mockExchangeWithQuote(
+ to: String = pfiDid,
+ from: String = customerBearerDid!.uri,
+ exchangeId: String = exchangeID) {
+ let url = URL(string: "https://localhost:9000/exchanges/\(exchangeId)")!
+ let quote = MockData.createQuote(from: from, to: to, exchangeId: exchangeId)
+ var exchange: [Quote] = [Quote]()
+ exchange.append(quote)
+ let exchangeJson: [String: [Quote]] = ["data": exchange]
+
+ MockData.setupMockGetCall(url: url, data: exchangeJson)
+ }
+
+ //Force Mock to ignore the request so that resolve endpoint is called for real
+ public static func allowDidResolution(didUri: String) {
+ let id = didUri.components(separatedBy: ":").last
+ let ignoredURL = URL(string: "https://diddht.tbddev.org/" + id!)!
+ Mocker.ignore(ignoredURL)
+ }
+
+ public static func setupMockGetCall(url: URL, data: Encodable) {
+ let encoder = tbDEXJSONEncoder()
+ encoder.outputFormatting = .prettyPrinted
+ let jsonData = try! encoder.encode(data)
+
+ Mocker.register(Mock(url: url, contentType: .json, statusCode: 200, data: [.get: jsonData]))
+ }
+}
diff --git a/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/issuer/knownCustomerCredentialWalletTest.swift b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/issuer/knownCustomerCredentialWalletTest.swift
new file mode 100644
index 0000000..87baab9
--- /dev/null
+++ b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/issuer/knownCustomerCredentialWalletTest.swift
@@ -0,0 +1,573 @@
+import XCTest
+import AnyCodable
+// :prepend-start: knownCustomerCredentialResolveIssuerDidSwift
+import Web5
+import Foundation
+// :prepend-end:
+@testable import Web5
+@testable import DevSiteTestSuite
+
+final class KnownCustomerCredentialWalletTest: XCTestCase {
+ let nameCredentialJwt =
+ "eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byMwIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiSURDYXJkQ3JlZGVudGlhbFBhcnQxIl0sImlkIjoidXJuOnV1aWQ6NTdhNWU4ZWUtYmZlMC00YjQwLWJmMDAtZTA4MTY5ZDk5Y2Q1IiwiaXNzdWVyIjoiZGlkOmRodDpmYzZyNmJnNjl0Nms4dTl1OXN1NTNhYWY2anUxeGRwd2R6dXcza2p1OHNzYW1iM3Bwc3VvIiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMy0yMVQyMToyMTo1MVoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byIsImdpdmVuX25hbWUiOiJBbGljZSIsImZhbWlseV9uYW1lIjoiU21pdGgifX0sImlzcyI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byIsInN1YiI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byJ9.kt0rKEgZ1_U4eTUNDgUU9LzmFViHsx_1z6llfFAqCdpzwIsKKYbqfbtgckJDsoV9xqgG5TYAVPxeLo5hCAguDA"
+ let idCredentialJwt =
+ "eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byMwIn0.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiSURDYXJkQ3JlZGVudGlhbFBhcnQyIl0sImlkIjoidXJuOnV1aWQ6YTM5ZmQ3NjgtNjVjMy00MDZhLWIwMGItMTg1MjIxM2ExYzhjIiwiaXNzdWVyIjoiZGlkOmRodDpmYzZyNmJnNjl0Nms4dTl1OXN1NTNhYWY2anUxeGRwd2R6dXcza2p1OHNzYW1iM3Bwc3VvIiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMy0yMVQyMToyMTo1MVoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byIsImJpcnRoZGF0ZSI6IjE5OTAtMDEtMDEiLCJuYXRpb25hbF9pZGVudGlmaWVyIjoiMTIzLTQ1LTY3ODkifX0sImlzcyI6ImRpZDpkaHQ6ZmM2cjZiZzY5dDZrOHU5dTlzdTUzYWFmNmp1MXhkcHdkenV3M2tqdThzc2FtYjNwcHN1byIsInN1YiI6ImRpZDpkaHQ6ejU0Z3U0NnU5Y2VxYjQ4dzM0dGVvNGdxMzR3Z2FvNHJvNzVjd3VyZTk1YWNlNXNpOGR0byJ9.lQOBdE3LGQ_rLz69SQoI_auOsFpsOESBIbHNf9HpYTGYTT2aYw8WrKd1rXQuRqzgELcv92iWQRpWoVm193x3CQ"
+
+ let issuerBearerDid = try! DIDJWK.create(keyManager: InMemoryKeyManager())
+ let userBearerDid = try! DIDJWK.create(keyManager: InMemoryKeyManager())
+
+ let presentationDefinition = PresentationDefinitionV2(
+ id: "IDCardCredentials",
+ name: nil,
+ purpose: nil,
+ format: nil,
+ submissionRequirements: nil,
+ inputDescriptors: [
+ InputDescriptorV2(
+ id: "givenNameVerification",
+ name: "Given Name Verification",
+ purpose: "We need to verify your given name.",
+ format: "jwt_vc",
+ constraints: ConstraintsV2(
+ fields: [
+ FieldV2(
+ path: ["$.credentialSubject.given_name", "$.vc.credentialSubject.given_name"],
+ filter: ["type": "string"]
+ )
+ ],
+ limitDisclosure: nil
+ )
+ ),
+ InputDescriptorV2(
+ id: "familyNameVerification",
+ name: "Family Name Verification",
+ purpose: "We need to verify your family name.",
+ format: nil,
+ constraints: ConstraintsV2(
+ fields: [
+ FieldV2(
+ path: ["$.credentialSubject.family_name", "$.vc.credentialSubject.family_name"],
+ filter: ["type": "string"]
+ )
+ ],
+ limitDisclosure: nil
+ )
+ ),
+ InputDescriptorV2(
+ id: "birthdateVerification",
+ name: "Birthdate Verification",
+ purpose: "We need to verify your birthdate.",
+ format: nil,
+ constraints: ConstraintsV2(
+ fields: [
+ FieldV2(
+ path: ["$.credentialSubject.birthdate", "$.vc.credentialSubject.birthdate"],
+ filter: ["type": "string", "format": "date"]
+ )
+ ],
+ limitDisclosure: nil
+ )
+ ),
+ InputDescriptorV2(
+ id: "nationalIdentifierVerification",
+ name: "National Identifier Verification",
+ purpose: "We need to verify your national identifier.",
+ format: nil,
+ constraints: ConstraintsV2(
+ fields: [
+ FieldV2(
+ path: ["$.credentialSubject.national_identifier", "$.vc.credentialSubject.national_identifier"],
+ filter: ["type": "string"]
+ )
+ ],
+ limitDisclosure: nil
+ )
+ )
+ ]
+ )
+
+ func testSelectsCredentialsAndSatisfiesPD() async throws {
+ let credentials = [nameCredentialJwt, idCredentialJwt]
+ let selectedCredentials = try! PresentationExchange.selectCredentials(
+ vcJWTs: credentials,
+ presentationDefinition: presentationDefinition
+ )
+ XCTAssertEqual(selectedCredentials.count, 2)
+ }
+
+ func testJWTSignWithValidPayloadAndBearerDid() async throws {
+ let expirationDate = Date().addingTimeInterval(86400)
+ let issuedAtDate = Date()
+
+ let accessTokenPayload = JWT.Claims(
+ issuer: issuerBearerDid.uri,
+ subject: userBearerDid.uri,
+ expiration: expirationDate,
+ issuedAt: issuedAtDate
+ )
+
+ do {
+ // Act
+ let accessToken = try JWT.sign(did: userBearerDid, claims: accessTokenPayload)
+
+ // Assert
+ XCTAssertFalse(accessToken.isEmpty, "Access token should not be empty.")
+ } catch {
+ XCTFail("JWT.sign() threw an unexpected error: \(error)")
+ }
+ }
+
+ enum ResolverError: Error {
+ case idvServiceNotFound
+ case didResolutionFailed(String)
+ }
+
+ // :snippet-start: knownCustomerCredentialResolveIssuerDidSwift
+ func getIDVServiceEndpoint(issuerDidUri: String,
+ usingResolvers resolvers: [DIDMethodResolver]
+ ) async -> String? {
+ /****************************************
+ * Resolve DID & Get IDV Service Endpoint
+ ****************************************/
+ for resolver in resolvers where issuerDidUri.starts(
+ with: "did:\(resolver.methodName):"
+ ) {
+ let resolutionResult = await resolver.resolve(didURI: issuerDidUri)
+ if let service = resolutionResult.didDocument?.service?.first(
+ where: { $0.type == "IDV" }
+ ) {
+ switch service.serviceEndpoint {
+ case let .one(uri):
+ return uri
+ case let .many(uris):
+ return uris.first
+ }
+ }
+ }
+ return nil
+ }
+ // :snippet-end:
+
+ enum NetworkError: Error {
+ case badResponse
+ case requestFailed(String)
+ }
+
+ // :snippet-start: knownCustomerCredentialSendRequestToIdvServiceEndpointSwift
+ func sendRequestToIdvServiceEndpoint(idvServiceEndpoint: String) async throws {
+ guard let url = URL(string: idvServiceEndpoint) else {
+ throw NetworkError.requestFailed("Invalid URL")
+ }
+
+ do {
+ let (data, response) = try await URLSession.shared.data(from: url)
+
+ guard let httpResponse = response as? HTTPURLResponse,
+ httpResponse.statusCode == 200 else
+ {
+ throw NetworkError.badResponse
+ }
+
+ if let encodedSiopRequest = String(data: data, encoding: .utf8) {
+ try await handleSiopRequest(encodedSiopRequest: encodedSiopRequest) // function shown in next step
+ } else {
+ throw NetworkError.requestFailed("Failed to decode response")
+ }
+ } catch {
+ throw NetworkError.requestFailed(error.localizedDescription)
+ }
+ }
+ // :snippet-end:
+
+ public func presentationDefinition(value: String?) throws -> PresentationDefinitionV2 {
+ let encodedPresentation = try JSONEncoder().encode(value)
+
+ return try JSONDecoder().decode(PresentationDefinitionV2.self, from: encodedPresentation)
+ }
+
+ enum PresentationError: Error {
+ case serializationError
+ case signingError
+ }
+
+
+
+ // :snippet-start: knownCustomerCredentialhandleSiopRequestWalletSwift
+ func handleSiopRequest(encodedSiopRequest: String) async throws {
+ /*******************************************************
+ * Decode the SIOP request from the encoded string
+ *******************************************************/
+ guard let siopRequestURL = URL(string: "https://dummy.com?\(encodedSiopRequest)"),
+ let components = URLComponents(url: siopRequestURL, resolvingAgainstBaseURL: true) else {
+ throw URLError(.badURL)
+ }
+
+ var siopRequest: [String: String] = [:]
+ for queryItem in components.queryItems ?? [] {
+ if let value = queryItem.value {
+ siopRequest[queryItem.name] = value.removingPercentEncoding ?? value
+ }
+ }
+
+ /*******************************************************
+ * Generate & sign id_token
+ *******************************************************/
+ let expirationDate = Date().addingTimeInterval(3600) // 1 hour from now
+ let issuedAtDate = Date()
+ let idTokenClaims = JWT.Claims(
+ issuer: userBearerDid.uri,
+ subject: userBearerDid.uri,
+ audience: siopRequest["client_id"],
+ expiration: expirationDate,
+ issuedAt: issuedAtDate
+ )
+
+ let idToken = try JWT.sign(did: userBearerDid, claims: idTokenClaims)
+
+ let vpToken: String?
+ if let responseType = siopRequest["response_type"], responseType.contains("vp_token") {
+ /*********************************************************
+ * Select Credentials based on the Presentation Definition
+ *********************************************************/
+ let pd = siopRequest["presentation_definition"]
+ let pdEncoded = try presentationDefinition(value: pd)
+ let selectedCredentials = try PresentationExchange.selectCredentials(vcJWTs: [nameCredentialJwt, idCredentialJwt], presentationDefinition: pdEncoded)
+
+ try PresentationExchange.satisfiesPresentationDefinition(vcJWTs: selectedCredentials, presentationDefinition: pdEncoded)
+
+ /*******************************************************
+ * Generate & sign vp_token
+ *******************************************************/
+ let vp = try PresentationExchange.createPresentationFromCredentials(vcJWTs: selectedCredentials, presentationDefinition: pdEncoded)
+
+ let vpJsonObject: [String: Any] = [
+ "context": ["https://www.w3.org/2018/credentials/v1"],
+ "type": ["VerifiablePresentation"],
+ "verifiableCredential": selectedCredentials, // The array of credential JWTs
+ "presentationSubmission": vp // The presentation submission
+ ]
+
+ if let jsonData = try? JSONSerialization.data(withJSONObject: vpJsonObject),
+ let jsonString = String(data: jsonData, encoding: .utf8){
+ let jsonCodable = AnyCodable(jsonString)
+ let claims = JWT.Claims(
+ issuer: userBearerDid.uri,
+ subject: userBearerDid.uri,
+ expiration: Date().addingTimeInterval(3600),
+ issuedAt: Date(),
+ misc: ["vp": jsonCodable]
+ )
+
+ vpToken = try JWT.sign(did: userBearerDid, claims: claims)
+ }else{
+ throw PresentationError.serializationError
+ }
+ }else{
+ vpToken = nil
+ }
+
+ /*******************************************************
+ * POST SIOPv2 Authorization response to the response_uri
+ *******************************************************/
+ guard let responseUri = URL(string: siopRequest["response_uri"]!) else {
+ throw URLError(.badURL)
+ }
+
+ var responsePayload: [String: Any] = ["id_token": idToken]
+ if let vp = vpToken {
+ responsePayload["vp_token"] = vp
+ }
+
+ var request = URLRequest(url: responseUri)
+ request.httpMethod = "POST"
+ request.setValue("application/json", forHTTPHeaderField: "Content-Type")
+ request.httpBody = try JSONSerialization.data(withJSONObject: responsePayload)
+
+ let (data, response) = try await URLSession.shared.data(for: request)
+ guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
+ throw URLError(.badServerResponse)
+ }
+
+ guard let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any] else {
+ throw URLError(.cannotParseResponse)
+ }
+
+ try await handleIssuerResponse(issuerResponse: json) // function shown in next step
+ }
+ // :snippet-end:
+
+ // :snippet-start: knownCustomerCredentialHandleIssuerResponseWalletSwift
+ struct WalletStorage {
+ var credentialIssuer: URL?
+ var preAuthorizedCode: String?
+ var credentialEndpoint: URL?
+ var tokenEndpoint: URL?
+ var accessToken: String?
+ var cNonce: String?
+ }
+
+ var walletStorage = WalletStorage()
+
+ func handleIssuerResponse(issuerResponse: [String: Any]) async throws {
+ guard let credentialOffer = issuerResponse["credential_offer"] as? [String: Any],
+ let credentialIssuerString = credentialOffer["credential_issuer"] as? String,
+ let credentialIssuerURL = URL(string: credentialIssuerString),
+ let grants = credentialOffer["grants"] as? [String: Any],
+ let preAuthorizedCode = grants["urn:ietf:params:oauth:grant-type:pre-authorized_code"] as? String else {
+ print("Invalid issuer response format")
+ return
+ }
+
+ /***********************************************************************
+ * Store the credential_issuer URL and pre_authorized_code for future use
+ ************************************************************************/
+ walletStorage.credentialIssuer = credentialIssuerURL
+ walletStorage.preAuthorizedCode = preAuthorizedCode
+
+ if let urlString = issuerResponse["url"] as? String {
+ // Direct the user to this URL to complete their Identity Verification
+ openIdvForm(urlString: urlString)
+ } else {
+ try await fetchIssuerMetadata() // function shown in next step
+ }
+ }
+ // :snippet-end:
+
+ func openIdvForm(urlString: String) {
+ print("IDV Form would open at URL: \(urlString)")
+ }
+
+
+
+
+ enum MetadataError: Error {
+ case credentialIssuerURLNotSet
+ case networkError(String)
+ case noData
+ case dataParsingError(String)
+ case missingCredentialEndpoint
+ case missingData
+ }
+
+ // :snippet-start: knownCustomerCredentialFetchIssuerMetadataWalletSwift
+ func fetchIssuerMetadata() async throws {
+ guard let credentialIssuerURL = walletStorage.credentialIssuer else {
+ throw MetadataError.credentialIssuerURLNotSet
+ }
+
+ let issuerMetadataUrl = credentialIssuerURL.appendingPathComponent(".well-known/openid-credential-issuer")
+
+ let (data, response) = try await URLSession.shared.data(from: issuerMetadataUrl)
+ guard (response as? HTTPURLResponse)?.statusCode == 200 else {
+ throw MetadataError.networkError("Non-200 response from the server")
+ }
+
+ guard let issuerMetadata = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
+ let credentialEndpointString = issuerMetadata["credential_endpoint"] as? String,
+ let credentialEndpointURL = URL(string: credentialEndpointString) else {
+ throw MetadataError.dataParsingError("Failed to parse JSON or missing 'credential_endpoint'")
+ }
+ /**********************************************
+ * Store the credential endpoint for future use
+ **********************************************/
+
+ walletStorage.credentialEndpoint = credentialEndpointURL
+
+ try await fetchAuthServerMetadata() // function shown in next steps
+ }
+ // :snippet-end:
+
+ // :snippet-start: knownCustomerCredentialFetchAuthServerMetadataWalletSwift
+ func fetchAuthServerMetadata() async throws {
+ guard let credentialIssuerURL = walletStorage.credentialIssuer else {
+ throw MetadataError.credentialIssuerURLNotSet
+ }
+
+ let authServerMetadataUrl = credentialIssuerURL.appendingPathComponent(".well-known/oauth-authorization-server")
+
+ let (data, response) = try await URLSession.shared.data(from: authServerMetadataUrl)
+ guard (response as? HTTPURLResponse)?.statusCode == 200 else {
+ throw MetadataError.networkError("Non-200 response from the server")
+ }
+
+ guard let authServerMetadata = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
+ let tokenEndpointString = authServerMetadata["token_endpoint"] as? String,
+ let tokenEndpointURL = URL(string: tokenEndpointString) else {
+ throw MetadataError.dataParsingError("Failed to parse JSON or missing 'token_endpoint'")
+ }
+ /****************************************************
+ * Extract and store the token_endpoint for future use
+ *****************************************************/
+
+ walletStorage.tokenEndpoint = tokenEndpointURL
+
+ guard let preAuthorizedCode = walletStorage.preAuthorizedCode else {
+ throw MetadataError.missingData
+ }
+
+ try await fetchAccessToken(preAuthorizationCode: preAuthorizedCode, tokenEndpoint: tokenEndpointString) // function shown in next step
+ }
+ // :snippet-end:
+
+ enum AccessTokenError: Error {
+ case badURL
+ case httpRequestFailed(String)
+ case authorizationPending
+ case missingData
+ case missingAccessToken
+ case unknownError(String)
+ }
+
+ struct AccessTokenRequestBody: Codable {
+ let grantType: String
+ let code: String
+ let clientId: String
+
+ enum CodingKeys: String, CodingKey {
+ case grantType = "grant_type"
+ case code
+ case clientId = "client_id"
+ }
+ }
+
+ // :snippet-start: knownCustomerCredentialFetchAccessTokenWalletSwift
+ func fetchAccessToken(preAuthorizationCode: String,
+ tokenEndpoint: String, retryDelay: TimeInterval = 10.0)
+ async throws {
+ guard let url = URL(string: tokenEndpoint) else {
+ throw AccessTokenError.badURL
+ }
+
+ let requestBody = AccessTokenRequestBody(
+ grantType: "urn:ietf:params:oauth:grant-type:pre-authorized_code",
+ code: preAuthorizationCode,
+ clientId: userBearerDid.uri
+ )
+
+ /*********************************************
+ * Send the POST request to the token endpoint
+ **********************************************/
+ let encoder = JSONEncoder()
+ let requestData = try encoder.encode(requestBody)
+ var request = URLRequest(url: url)
+ request.httpMethod = "POST"
+ request.setValue("application/json", forHTTPHeaderField: "Content-Type")
+ request.httpBody = requestData
+
+ let (data, response) = try await URLSession.shared.data(for: request)
+ guard let httpResponse = response as? HTTPURLResponse,
+ httpResponse.statusCode == 200 else
+ {
+ throw AccessTokenError.httpRequestFailed("HTTP error! Status: \(response)")
+ }
+
+ let decoder = JSONDecoder()
+ let responseData = try decoder.decode([String: String].self, from: data)
+
+ /*******************************************
+ * Handle the "authorization_pending" error
+ ********************************************/
+
+ if let error = responseData["error"], error == "authorization_pending" {
+ displayNotification("Hang tight, we're still waiting for IDV to complete.")
+ try await Task.sleep(nanoseconds: UInt64(retryDelay * 1_000_000_000))
+ try await fetchAccessToken(preAuthorizationCode: preAuthorizationCode, tokenEndpoint: tokenEndpoint, retryDelay: retryDelay)
+ } else if let accessToken = responseData["access_token"], let cNonce = responseData["c_nonce"] {
+ /*************************************************
+ * Store the access token & c_nonce for future use
+ **************************************************/
+ walletStorage.accessToken = accessToken
+ walletStorage.cNonce = cNonce
+
+ guard let credentialEndpoint = walletStorage.credentialEndpoint else {
+ throw AccessTokenError.missingData
+ }
+
+ try await requestKnownCustomerCredential(credentialEndpoint: credentialEndpoint, accessToken: accessToken) // function shown in next step
+ } else {
+ throw AccessTokenError.missingAccessToken
+ }
+ }
+ // :snippet-end:
+
+ func displayNotification(_ message: String) {
+ print("Notification: \(message)")
+ }
+
+ enum RequestCredentialError: Error {
+ case cNonceMissing
+ case networkResponseNotOK(String)
+ case signedCredentialNotFound
+ case jwtSigningFailed(String)
+ }
+
+ class SecureStorage {
+ static let shared = SecureStorage()
+
+ private init() {}
+
+ func setItem(_ key: String, credential: String) {
+ UserDefaults.standard.set(credential, forKey: key)
+ }
+
+ func getItem(_ key: String) -> String? {
+ return UserDefaults.standard.string(forKey: key)
+ }
+ }
+
+ // :snippet-start: knownCustomerCredentialRequestCredentialWalletSwift
+ func requestKnownCustomerCredential(credentialEndpoint: URL, accessToken: String) async throws {
+ guard let cNonce = walletStorage.cNonce else {
+ throw RequestCredentialError.cNonceMissing
+ }
+
+ /*************************************************
+ * Construct & sign the JWT payload
+ **************************************************/
+ let issuedAtDate = Date()
+ let jsonCodable = AnyCodable(cNonce)
+ let jwtClaims = JWT.Claims(
+ issuer: userBearerDid.uri, // user's DID string
+ audience: issuerBearerDid.uri, // Issuer's DID string
+ issuedAt: issuedAtDate,
+ misc: ["nonce": jsonCodable]
+ )
+
+ do {
+ let signedJwt = try JWT.sign(did: userBearerDid, claims: jwtClaims)
+
+ let requestBody: [String: Any] = [
+ "proof": [
+ "proof_type": "jwt",
+ "jwt": signedJwt
+ ]
+ ]
+
+ /*************************************************
+ * Request & securely store KCC
+ **************************************************/
+ var request = URLRequest(url: credentialEndpoint)
+ request.httpMethod = "POST"
+ // Include the access token in the Authorization header
+ request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
+ request.setValue("application/json", forHTTPHeaderField: "Content-Type")
+ request.httpBody = try JSONSerialization.data(withJSONObject: requestBody)
+
+ let (data, response) = try await URLSession.shared.data(for: request)
+
+ guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
+ throw RequestCredentialError.networkResponseNotOK("Network response was not ok: \(response)")
+ }
+
+ if let data = try JSONSerialization.jsonObject(with: data) as? [String: Any], let credential = data["credential"] as? String {
+ SecureStorage.shared.setItem("signedCredential", credential: credential)
+ } else {
+ throw RequestCredentialError.signedCredentialNotFound
+ }
+
+ } catch {
+ throw RequestCredentialError.jwtSigningFailed(error.localizedDescription)
+ }
+ }
+ // :snippet-end:
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/GetOfferingsTests.swift b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/GetOfferingsTests.swift
new file mode 100644
index 0000000..d82079e
--- /dev/null
+++ b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/GetOfferingsTests.swift
@@ -0,0 +1,60 @@
+import XCTest
+import Mocker
+import Web5
+import tbDEX
+
+final class GetOfferingsTests: XCTestCase {
+
+ let pfiDid = "did:dht:tra4qegipqa4af1fzcifw9uuinkse179ct58be6sceyeg61k1fho"
+ let mockURL = URL(string: "https://localhost:9000/offerings")!
+ let offeringJson = "{\"data\":[{\"metadata\":{\"from\":\"did:dht:tra4qegipqa4af1fzcifw9uuinkse179ct58be6sceyeg61k1fho\",\"kind\":\"offering\",\"id\":\"offering_01htjbtbwye92t9gxm8cer2rrn\",\"createdAt\":\"2024-04-03T16:14:05.727Z\",\"protocol\":\"1.0\"},\"data\":{\"description\":\"Selling KES for USD\",\"payin\":{\"currencyCode\":\"USD\",\"min\":\"0.0\",\"max\":\"999999.99\",\"methods\":[{\"kind\":\"DEBIT_CARD\",\"requiredPaymentDetails\":{\"$schema\":\"http://json-schema.org/draft-07/schema\",\"type\":\"object\",\"properties\":{\"cardNumber\":{\"type\":\"string\",\"description\":\"The 16-digit debit card number\",\"minLength\":16,\"maxLength\":16},\"expiryDate\":{\"type\":\"string\",\"description\":\"The expiry date of the card in MM/YY format\",\"pattern\":\"^(0[1-9]|1[0-2])\\\\/([0-9]{2})$\"},\"cardHolderName\":{\"type\":\"string\",\"description\":\"Name of the cardholder as it appears on the card\"},\"cvv\":{\"type\":\"string\",\"description\":\"The 3-digit CVV code\",\"minLength\":3,\"maxLength\":3}},\"required\":[\"cardNumber\",\"expiryDate\",\"cardHolderName\",\"cvv\"],\"additionalProperties\":false}}]},\"payout\":{\"currencyCode\":\"KES\",\"max\":\"999526.11\",\"methods\":[{\"kind\":\"BTC_ADDRESS\",\"requiredPaymentDetails\":{\"$schema\":\"http://json-schema.org/draft-07/schema\",\"type\":\"object\",\"properties\":{\"btcAddress\":{\"type\":\"string\",\"description\":\"your Bitcoin wallet address\"}},\"required\":[\"btcAddress\"],\"additionalProperties\":false},\"estimatedSettlementTime\":10}]},\"payoutUnitsPerPayinUnit\":\"0.00003826\",\"requiredClaims\":{\"id\":\"7ce4004c-3c38-4853-968b-e411bafcd945\",\"input_descriptors\":[{\"id\":\"bbdb9b7c-5754-4f46-b63b-590bada959e0\",\"constraints\":{\"fields\":[{\"path\":[\"$.type[*]\"],\"filter\":{\"type\":\"string\",\"pattern\":\"^YoloCredential$\"}}]}}]}},\"signature\":\"eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpkaHQ6dHJhNHFlZ2lwcWE0YWYxZnpjaWZ3OXV1aW5rc2UxNzljdDU4YmU2c2NleWVnNjFrMWZobyMwIn0..dhiY49OpIF5SsLDsEtgWDJXUqSmjYxIbhNt_Kn7q1CqcZQOIEoWmH6He2mzEafFO6TVLCq7IaOQCocuRwLfGBg\"}]}"
+
+
+ override func setUp() {
+ super.setUp()
+ MockData.allowDidResolution(didUri: pfiDid)
+
+ let mockOffering = offeringJson
+ let mock = Mock(url: mockURL, contentType: .json, statusCode: 200, data: [.get: Data(mockOffering.utf8)])
+ mock.register()
+ }
+
+ func testGetOfferings() async throws {
+ do {
+ // :snippet-start: walletGetOfferingsSwift
+ let offerings = try await tbDEXHttpClient.getOfferings(pfiDIDURI: pfiDid)
+ // :snippet-end:
+ XCTAssertEqual(offerings.count, 1, "Exactly 1 offering should be returned")
+ } catch {
+ XCTFail("Failed to fetch offerings: \(error)")
+ }
+ }
+
+ func testGetAllOfferings() async throws {
+ let pfiDids = [pfiDid]
+
+ // :snippet-start: walletFindMatchingOfferingsSwift
+ let payinCurrencyCode = "USD" // Desired payin currency code
+ let payoutCurrencyCode = "KES" // Desired payout currency code
+
+ var matchedOfferings = [Offering]() // Array to store the matched offerings
+
+ // Loop through the all PFIs in your network
+ for pfiDid in pfiDids {
+
+ //Makes a request to the PFI to get their offerings
+ let offerings = try await tbDEXHttpClient.getOfferings(pfiDIDURI: pfiDid)
+
+ // Filter offerings based on the currency pair
+ let filteredOfferings = offerings.filter { offering in
+ offering.data.payin.currencyCode == payinCurrencyCode &&
+ offering.data.payout.currencyCode == payoutCurrencyCode
+ }
+
+ matchedOfferings.append(contentsOf: filteredOfferings)
+ }
+ // :snippet-end:
+
+ XCTAssertEqual(matchedOfferings.count, 1, "Exactly 1 offering should be returned")
+ }
+}
diff --git a/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/ManagingCredentialsTest.swift b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/ManagingCredentialsTest.swift
new file mode 100644
index 0000000..7ba80aa
--- /dev/null
+++ b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/ManagingCredentialsTest.swift
@@ -0,0 +1,101 @@
+import XCTest
+import Mocker
+import Web5
+import TypeID
+import tbDEX
+
+final class ManagingCredentialsTest: XCTestCase {
+ let pfiDid = MockData.pfiDid
+ let mockURL = URL(string: "http://localhost:9000/offerings")!
+ private let vcJwtResidence = "eyJraWQiOiJkaWQ6ZGh0OnA5cW5idDRrd3lrenF6Znp5eXN0ZDY5Zjhnb3N0YnAzbmY3dGRyczRyd3FqaW16MWsxY3kjMCIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6ZGh0OnA5cW5idDRrd3lrenF6Znp5eXN0ZDY5Zjhnb3N0YnAzbmY3dGRyczRyd3FqaW16MWsxY3kiLCJzdWIiOiJkaWQ6ZGh0OnV1b3J6ZHRqOXgzYTM1OTNtZjlleXNxaHM0NWRrZXpqdzZqYXBkdWRjMXpicjc4aXNnZXkiLCJpYXQiOjE3MDc3NjM4NDgsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJSZXNpZGVuY2VDcmVkZW50aWFsIl0sImlkIjoidXJuOnV1aWQ6ODc5N2VkZDgtNzE2Mi00YTliLWEyMjgtNGRkZTA4NjFlNzZmIiwiaXNzdWVyIjoiZGlkOmRodDpwOXFuYnQ0a3d5a3pxemZ6eXlzdGQ2OWY4Z29zdGJwM25mN3RkcnM0cndxamltejFrMWN5IiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMi0xMlQxODo1MDo0OFoiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6dXVvcnpkdGo5eDNhMzU5M21mOWV5c3FoczQ1ZGtlemp3NmphcGR1ZGMxemJyNzhpc2dleSIsImFkZHJlc3MiOiIxMCBPcmNoYXJkIHN0In19fQ.Uvq5jHJbhe7mcPXAMNtfBoD7yez6GXP0GYNuyiZI0_pyfK_mKPjrbkJPXd3LbOtYvB06XxY6tGLMTo7tiMRFDQ"
+ private let vcJwtSanctions = "eyJraWQiOiJkaWQ6ZGh0Onc4bThxNXFja21vZXRzaWlrajR3ZXFhYWRjeGtjNjFkNjh6cnk3aHBpZmdveXE4dG1zb28jMCIsInR5cCI6IkpXVCIsImFsZyI6IkVkRFNBIn0.eyJpc3MiOiJkaWQ6ZGh0Onc4bThxNXFja21vZXRzaWlrajR3ZXFhYWRjeGtjNjFkNjh6cnk3aHBpZmdveXE4dG1zb28iLCJzdWIiOiJkaWQ6ZGh0OmtkMzVlNmN4M3pueXp1ajR3ejF1ZmRjeGs4ODlzYXVrYXRhYWc3YmNrM2NwY2I3cGM4NW8iLCJpYXQiOjE3MDc0OTEzODcsInZjIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJTYW5jdGlvbnNDcmVkZW50aWFsIl0sImlkIjoidXJuOnV1aWQ6MGU4YWJhMWYtMmMwZS00MDhlLWIxOWMtZjY0NzZiYTU3NDVhIiwiaXNzdWVyIjoiZGlkOmRodDp3OG04cTVxY2ttb2V0c2lpa2o0d2VxYWFkY3hrYzYxZDY4enJ5N2hwaWZnb3lxOHRtc29vIiwiaXNzdWFuY2VEYXRlIjoiMjAyNC0wMi0wOVQxNTowOTo0N1oiLCJjcmVkZW50aWFsU3ViamVjdCI6eyJpZCI6ImRpZDpkaHQ6a2QzNWU2Y3gzem55enVqNHd6MXVmZGN4azg4OXNhdWthdGFhZzdiY2szY3BjYjdwYzg1byIsInN0YXR1cyI6ImFwcHJvdmVkIn19fQ.Wc-qV2L3Z5WJYvUYirznpDsyk1Ntcw0kt_bhuXZDqNVXAn-d9Wta67eta-yu7V1C1T74yv6pQaqjgf2rDLxCAg"
+
+ override func setUp() {
+ super.setUp()
+ MockData.allowDidResolution(didUri: pfiDid)
+
+ var offerings = [Offering]()
+ offerings.append(MockData.selectedOffering)
+ let data: [String: [Offering]] = ["data": offerings]
+ MockData.setupMockGetCall(url: mockURL, data: data)
+ }
+
+ func testExtractPresentationDefinition() async throws {
+ do {
+ let offerings = try await tbDEXHttpClient.getOfferings(pfiDIDURI: pfiDid)
+ let offering = offerings[0]
+
+ // :snippet-start: retrievePresentationDefinitionFromOfferingsRequiredClaimsSwift
+ let presentationDefinition = offering.data.requiredClaims
+ // :snippet-end:
+
+ XCTAssertNotNil(presentationDefinition)
+ XCTAssertNotNil(presentationDefinition?.id)
+ XCTAssertNotNil(presentationDefinition?.inputDescriptors)
+ } catch {
+ XCTFail("Failed to fetch offerings: \(error)")
+ }
+ }
+
+ func testMatchOfferingsWithSpecificCriteria() async throws {
+ let pfiDids = [pfiDid]
+ // :snippet-start: findMatchingOfferingsWithCredentialValidationSwift
+ let payinCurrencyCode = "USD" // Desired payin currency code
+ let payoutCurrencyCode = "KES" // Desired payout currency code
+
+ // Customer's signed credentials in JWT format
+ let credentials = [vcJwtResidence, vcJwtSanctions]
+
+ // Array to store the matched offerings
+ var matchedOfferings = [Offering]()
+
+ for pfiDid in pfiDids {
+ let offerings = try await tbDEXHttpClient.getOfferings(pfiDIDURI:pfiDid)
+
+ // Filter offerings based on the desired currency pair
+ let filteredOfferings = offerings.filter { offering in
+ offering.data.payin.currencyCode == payinCurrencyCode &&
+ offering.data.payout.currencyCode == payoutCurrencyCode
+ }
+ for offering in filteredOfferings {
+ // Extract the presentation definition from the offering
+ do {
+ // Validate customer's VCs against the offering's presentation definition
+ try PresentationExchange.satisfiesPresentationDefinition(
+ vcJWTs: credentials,
+ presentationDefinition: offering.data.requiredClaims!
+ )
+
+ // Add offerings that match the customer's needs and qualifications
+ matchedOfferings.append(offering)
+ } catch {
+ // Offerings where the customer's VCs do not meet the requirements are skipped
+ continue
+ }
+ }
+ }
+ // :snippet-end:
+ //TODO: Update this test to NotEqual to ensure matchedOfferings are > 0.
+ XCTAssertEqual(matchedOfferings.count, 0)
+
+ }
+
+ func testSelectCredentialFromRequiredClaims() async throws {
+ let offerings = try await tbDEXHttpClient.getOfferings(pfiDIDURI: pfiDid)
+ let offering = offerings[0]
+ let credentials = [vcJwtResidence, vcJwtSanctions]
+ // :snippet-start: getSelectedCredentialsSwift
+ let selectedCredentials = try! PresentationExchange.selectCredentials(
+ vcJWTs: credentials,
+ presentationDefinition: offering.data.requiredClaims!
+ )
+ // :snippet-end:
+
+
+ // TODO: Update this test to validate the two credentials are selected.
+ XCTAssertEqual(selectedCredentials.count, 0)
+// XCTAssertTrue(selectedCredentials.contains(vcJwtResidence))
+// XCTAssertTrue(selectedCredentials.contains(vcJwtSanctions))
+
+ }
+}
diff --git a/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/PfiAllowListTests.swift b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/PfiAllowListTests.swift
new file mode 100644
index 0000000..4d11702
--- /dev/null
+++ b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/PfiAllowListTests.swift
@@ -0,0 +1,28 @@
+import XCTest
+import Mocker
+// :prepend-start: isPFISwift
+import Web5
+// :prepend-end:
+@testable import DevSiteTestSuite
+
+
+
+final class PfiAllowListTests: XCTestCase {
+
+ func testPfiDidHasPfiService() async throws {
+ let pfiDid = "did:dht:ac7uj566xgmhypniw1cb96dyhod51inwp98o8ugyb9ygikig6coy"
+ MockData.allowDidResolution(didUri: pfiDid)
+
+ // :snippet-start: isPFISwift
+ let isPfi: Bool = await DIDDHT.Resolver()
+ .resolve(didURI: pfiDid)
+ .didDocument?
+ .service?
+ .contains { service in
+ service.type == "PFI"
+ } ?? false
+ // :snippet-end:
+
+ XCTAssert(isPfi, "PFI DID should have a PFI service")
+ }
+}
\ No newline at end of file
diff --git a/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/PlaceOrderTests.swift b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/PlaceOrderTests.swift
new file mode 100644
index 0000000..eee793e
--- /dev/null
+++ b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/PlaceOrderTests.swift
@@ -0,0 +1,93 @@
+import XCTest
+import Web5
+import tbDEX
+
+final class PlaceOrderTests: XCTestCase {
+
+ var customerDid: BearerDID?
+ let pfiDid: String = "did:dht:ac7uj566xgmhypniw1cb96dyhod51inwp98o8ugyb9ygikig6coy"
+ var quote: Quote?
+ var close: Close?
+ let closeReason: String = "Transaction complete"
+ let exchangeId: String = "testExchange"
+
+ override func setUp() {
+ super.setUp()
+ MockData.allowDidResolution(didUri: pfiDid)
+
+ customerDid = try! DIDJWK.create(keyManager: InMemoryKeyManager())
+
+ quote = MockData.createQuote(
+ from: pfiDid,
+ to: customerDid!.uri,
+ exchangeId: exchangeId
+ )
+ }
+
+ func testSendOrderMessage() async throws {
+ // :snippet-start: createOrderSwift
+ var order = Order(
+ from: customerDid!.uri, // Customer's DID
+ to: pfiDid, // PFI's DID
+ exchangeID: quote!.metadata.exchangeID, // Exchange ID from the Quote
+ data: .init(),
+ protocol: "1.0" // Version of tbDEX protocol you're using
+ )
+ // :snippet-end:
+
+ // :snippet-start: signOrderSwift
+ try! order.sign(did: customerDid!)
+ // :snippet-end:
+
+ MockData.mockSendOrderMessage(exchangeId: exchangeId)
+
+ // :snippet-start: sendOrderSwift
+ try! await tbDEXHttpClient.submitOrder(order: order)
+ // :snippet-end:
+ }
+
+ func testStatusUpdate() async throws {
+ MockData.mockGetExchangeWithClose(
+ from: pfiDid,
+ to: customerDid!.uri,
+ exchangeId: exchangeId,
+ closeReason: closeReason
+ )
+
+ // :snippet-start: listenForOrderStatusSwift
+ var orderStatusUpdate: String?
+ var close: Close?
+
+ while close == nil {
+ let exchange = try await tbDEXHttpClient.getExchange(
+ pfiDIDURI: quote!.metadata.from,
+ requesterDID: customerDid!,
+ exchangeId: quote!.metadata.exchangeID
+ )
+
+ for message in exchange {
+ if case .orderStatus(let orderStatus) = message {
+ // a status update to display to your customer
+ orderStatusUpdate = orderStatus.data.orderStatus
+ }
+ else if case .close(let closeMessage) = message {
+ // final message of exchange has been written
+ close = closeMessage
+ break
+ }
+ }
+ }
+ // :snippet-end:
+
+ // :snippet-start: getCloseReasonSwift
+ let isSuccessful = close!.data.success!
+ let reasonForClose = close!.data.reason
+ // :snippet-end:
+
+ XCTAssertTrue(isSuccessful)
+ XCTAssertEqual(reasonForClose, closeReason)
+
+ //removing warning from console
+ _ = orderStatusUpdate
+ }
+}
diff --git a/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/ReceiveQuoteTests.swift b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/ReceiveQuoteTests.swift
new file mode 100644
index 0000000..a0dabad
--- /dev/null
+++ b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/ReceiveQuoteTests.swift
@@ -0,0 +1,94 @@
+import XCTest
+import Mocker
+import Web5
+import TypeID
+@testable import tbDEX
+
+final class ReceiveQuotes: XCTestCase {
+ var customerDid: BearerDID?
+ let pfiDid: String = "did:dht:ac7uj566xgmhypniw1cb96dyhod51inwp98o8ugyb9ygikig6coy"
+ var exchangeID: String?
+ var rfq: RFQ?
+ var initialQuote: Quote?
+
+ override func setUp() {
+ super.setUp()
+ MockData.allowDidResolution(didUri: pfiDid)
+
+ do {
+ customerDid = try DIDJWK.create(keyManager: InMemoryKeyManager())
+ } catch {
+ XCTFail("Failed to create customerDid: \(error)")
+ }
+
+ rfq = MockData.rfq
+ exchangeID = rfq?.metadata.exchangeID
+ }
+
+ func mockSendCloseMessage() {
+ let closeEndpoint = "https://localhost:9000/exchanges/\(exchangeID!)"
+ let url = URL(string: closeEndpoint)!
+ Mocker.register(Mock(url: url, contentType: .json, statusCode: 200, data: [.put: Data()]))
+ }
+
+ func testPollForQuotes() async throws {
+ MockData.mockExchangeWithQuote()
+
+ // :snippet-start: pollForQuoteSwift
+ var quote: Quote? = nil
+ var close: Close? = nil
+
+ // Wait for Quote message to appear in the exchange
+ while quote == nil {
+ let exchange = try! await tbDEXHttpClient.getExchange(
+ pfiDIDURI: (rfq?.metadata.to)!,
+ requesterDID: customerDid!,
+ exchangeId: (rfq?.metadata.exchangeID)!
+ )
+
+ for message in exchange {
+ if case let .quote(quoteMessage) = message {
+ quote = quoteMessage
+ break
+ } else if case let .close(closeMessage) = message {
+ close = closeMessage
+ break
+ }
+ }
+
+ if quote == nil {
+ // Make sure the exchange is still open
+ if close != nil { break }
+ else {
+ // Wait 2 seconds before making another request
+ try await Task.sleep(nanoseconds: 2_000_000_000)
+ }
+ }
+ }
+
+ // :snippet-end:
+ XCTAssertNotNil(quote)
+ XCTAssertEqual(quote?.metadata.exchangeID, exchangeID)
+ XCTAssertNil(close)
+ }
+
+ func testCloseExchange() async throws {
+ let quote = MockData.mockQuote
+ mockSendCloseMessage()
+
+ // :snippet-start: cancelExchangeSwift
+ var closeMessage = Close(
+ from: customerDid!.uri,
+ to: quote!.metadata.from,
+ exchangeID: quote!.metadata.exchangeID,
+ data: CloseData(reason: "Canceled by customer"),
+ protocol: "1.0"
+ )
+ try! closeMessage.sign(did: customerDid!)
+ try! await tbDEXHttpClient.submitClose(close: closeMessage)
+ // :snippet-end:
+
+ XCTAssertNotNil(closeMessage, "No closeMessage found")
+ XCTAssertEqual(closeMessage.metadata.exchangeID, exchangeID, "The exchangeID of the found quote does not match")
+ }
+}
diff --git a/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/SendingRfqTests.swift b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/SendingRfqTests.swift
new file mode 100644
index 0000000..b8f784b
--- /dev/null
+++ b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/SendingRfqTests.swift
@@ -0,0 +1,103 @@
+import XCTest
+import Mocker
+import Web5
+import TypeID
+@testable import tbDEX
+
+
+final class SendingRfqTests: XCTestCase {
+ var customerDid: BearerDID?
+ let pfiDid: String = "did:dht:ac7uj566xgmhypniw1cb96dyhod51inwp98o8ugyb9ygikig6coy"
+ var selectedOffering = MockData.selectedOffering
+
+ override func setUp() {
+ super.setUp()
+ do {
+ customerDid = try DIDJWK.create(keyManager: InMemoryKeyManager())
+ } catch {
+ XCTFail("Failed to create customerDid: \(error)")
+ }
+ }
+
+ //no assertions needed; this is just showing how to structure a RFQ
+ func testSkeletonRfqProperties() {
+ let _ = """
+ // :snippet-start: skeletonRfqMessageSwift
+ var rfq = RFQ(
+ to, //metadata
+ from, //metadata
+ data
+ )
+ // :snippet-end:
+ """
+ }
+
+ //no assertions needed; this is just showing how to structure a RFQ
+ func testSkeletonRfqMetadata() {
+ let _ = """
+ // :snippet-start: rfqMetadataSwift
+ var rfq = RFQ(
+ //highlight-start
+ to: (selectedOffering?.metadata.from)!, // PFI's DID
+ from: customerDid!.uri, // Customer's DID
+ //highlight-end
+ data
+ )
+ // :snippet-end:
+ """
+ }
+
+ func testCreateAndSendRfq() async throws {
+ let BTC_ADDRESS = "bc1q52csjdqa6cq5d2ntkkyz8wk7qh2qevy04dyyfd"
+ let selectedCredentials: [String] = []
+ do {
+ // :snippet-start: createRfqMessageSwift
+ var rfq: RFQ = try RFQ(
+ to: selectedOffering.metadata.from, // PFI's DID
+ from: customerDid!.uri, // Customer's DID
+ //highlight-start
+ data: CreateRFQData(
+ offeringId: selectedOffering.metadata.id, // The ID of the selected offering
+ payin: CreateRFQPayinMethod(
+ amount: "500.65", // The amount of the payin currency
+ kind: "DEBIT_CARD", // The method for sending payment
+ paymentDetails: [
+ "cvv": "123",
+ "cardNumber": "1234567890123456",
+ "expiryDate": "05/25",
+ "cardHolderName": "Alice Doe"
+ ]
+ ),
+ payout: CreateRFQPayoutMethod(
+ kind: "BTC_ADDRESS", // The method for receiving payout
+ paymentDetails: [
+ "btc_address": BTC_ADDRESS // Recipient's BTC wallet address
+ ]
+ ),
+ claims: selectedCredentials
+ ),
+ protocol: "1.0"
+ //highlight-end
+ )
+ // :snippet-end:
+ XCTAssertNotNil(rfq.metadata.exchangeID)
+
+ // :snippet-start: signRfqMessageSwift
+ try rfq.sign(did: customerDid!)
+ // :snippet-end:
+ XCTAssertNotNil(rfq.signature)
+
+ // Setup Mock PFI (minimal) response
+ let url = URL(string: "https://localhost:9000/exchanges")!
+ let mock = Mock(url: url, contentType: .json, statusCode: 200, data: [.post: Data()])
+ mock.register()
+
+ // :snippet-start: sendRfqMessageSwift
+ try await tbDEXHttpClient.createExchange(rfq: rfq)
+ // :snippet-end:
+
+ } catch {
+ XCTFail("Failed to create and send RFQ: \(error)")
+ }
+ }
+}
diff --git a/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/WalletSdkImport.swift b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/WalletSdkImport.swift
new file mode 100644
index 0000000..72114f4
--- /dev/null
+++ b/site/testsuites/testsuite-swift/Tests/DevSiteTestSuiteTests/tbdex/wallet/WalletSdkImport.swift
@@ -0,0 +1,7 @@
+// The Swift Programming Language
+// https://docs.swift.org/swift-book
+
+// :snippet-start: walletSdkImportSwift
+import Web5
+import tbDEX
+// :snippet-end:
\ No newline at end of file
diff --git a/site/vite.config.ts b/site/vite.config.ts
new file mode 100644
index 0000000..c2303a2
--- /dev/null
+++ b/site/vite.config.ts
@@ -0,0 +1,29 @@
+import { defineConfig, configDefaults } from "vitest/config";
+
+export default defineConfig({
+ test: {
+ testTimeout: 40000,
+ hookTimeout: 40000,
+ teardownTimeout: 40000,
+ exclude: [
+ ...configDefaults.exclude,
+ "apps/**",
+ "**/*.spec.{js,ts,jsx,tsx}",
+ "site-new/**",
+ ],
+ //TODO: Investigate coverage options later for output files
+ // coverage: {
+ // provider: 'istanbul',
+ // enabled: true,
+ // reporter: 'html'
+ // },
+ // browser: {
+ // name: "chrome",
+ // enabled: true,
+ // headless: true,
+ // },
+ setupFiles: [
+ "./site/testsuites/testsuite-javascript/__tests__/setup-web5.js",
+ ],
+ },
+});
diff --git a/site/webpackPlugin.js b/site/webpackPlugin.js
new file mode 100644
index 0000000..60f04f0
--- /dev/null
+++ b/site/webpackPlugin.js
@@ -0,0 +1,55 @@
+import webpack from 'webpack';
+import path from 'path';
+
+export default function (context, options) {
+ console.log('>>> adding polyfills for webpack');
+ return {
+ name: 'docusaurus-plugin-custom-webpack',
+ configureWebpack(config, isServer, utils) {
+ return {
+ module: {
+ rules: [
+ {
+ test: /\.js$/,
+ include: path.resolve(__dirname, 'snippets/testsuite-javascript'),
+ type: 'asset/source',
+ },
+ {
+ test: /\.js$/,
+ exclude: path.resolve(__dirname, 'snippets/testsuite-javascript'), // Exclude the directory
+ },
+ ],
+ },
+ resolve: {
+ fallback: {
+ stream: require.resolve('stream-browserify'),
+ crypto: require.resolve('crypto-browserify'),
+ // buffer: require.resolve("buffer"),
+ },
+ },
+ plugins: [
+ // TODO: #66 - needed when we want to get rid of the `@web5/api/site`
+ // new webpack.ProvidePlugin({
+ // process: "process/browser.js",
+ // }),
+ new webpack.NormalModuleReplacementPlugin(
+ /node:crypto/,
+ (resource) => {
+ resource.request = resource.request.replace(/^node:/, '');
+ },
+ ),
+ new webpack.ProvidePlugin({
+ process: 'process/browser.js',
+ }),
+ new webpack.DefinePlugin({
+ /*
+ IMPORTANT: To fix debug library‘s bug
+ {}.DEBUG = namespaces; // SyntaxError: Unexpected token '.'
+ */
+ 'process.env.DEBUG': 'process.env.DEBUG',
+ }),
+ ],
+ };
+ },
+ };
+}