From d18bbf116b50ee5015dbc938d04c06d498d19ea0 Mon Sep 17 00:00:00 2001 From: Peter Majchrak Date: Tue, 19 Dec 2023 16:29:53 +0100 Subject: [PATCH 01/48] fix: typo Merkel => Merkle (#133) --- docs/guides/merkle-crdt.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guides/merkle-crdt.md b/docs/guides/merkle-crdt.md index 63f3f3f..150e35f 100644 --- a/docs/guides/merkle-crdt.md +++ b/docs/guides/merkle-crdt.md @@ -32,9 +32,9 @@ To create a Merkle CRDT, we take an existing Merkle clock and embed any CRDT tha Merkle clocks are a type of clock used in distributed systems to solve the issue of tracking metadata for each peer that an actor interacts with. They are based on Merkle DAGs that function like hash chains, similar to a blockchain. These graphs are made up of nodes and edges, where the edges are directed, meaning that one node points to another. The head of a Merkle DAG is the most recent node added to the graph, and the entire graph can be referred to by the CID of the head node. The size of the CID hash does not grow with the number of nodes in the graph, making it a useful tool for high churn networks with a large number of peers. -The Merkle clock is created by adding an additional metadata field to each node of the Merkel DAG, called the height value, which acts as an incremental counter that increases with each new node added to the system. This allows the Merkle clock to provide a rough sense of causality, meaning that it can determine if one event happened before, at the same time, or after another event. The inherent causality of the Merkel DAG ensures that events are recorded in the correct order, making it a useful tool for tracking changes in a distributed system. +The Merkle clock is created by adding an additional metadata field to each node of the Merkle DAG, called the height value, which acts as an incremental counter that increases with each new node added to the system. This allows the Merkle clock to provide a rough sense of causality, meaning that it can determine if one event happened before, at the same time, or after another event. The inherent causality of the Merkle DAG ensures that events are recorded in the correct order, making it a useful tool for tracking changes in a distributed system. -The embedding of CID into the parent node that produces the hash chain provides a causality guarantee that, for example a B is pointed to by node A, node C is pointed to by node B and so on till the node Z, A had to exist before B, because the value of A is embedded inside B, and B could not exist before A, otherwise it would result in breaking the causality of time because the value of A is embedded inside the value of B which then gets embedded inside the value of C, which means that C has to come after B and so on, all the way till the user gets back to Z. And hence if the user has constructed a Merkel DAG correctly, then A has to happen before B, B has to happen before C, C has to happen before D, all the way until they get to Z. This inherent causality of time with respect to CIDs and Merkel DAG provides the user with a causality-adhering system. +The embedding of CID into the parent node that produces the hash chain provides a causality guarantee that, for example a B is pointed to by node A, node C is pointed to by node B and so on till the node Z, A had to exist before B, because the value of A is embedded inside B, and B could not exist before A, otherwise it would result in breaking the causality of time because the value of A is embedded inside the value of B which then gets embedded inside the value of C, which means that C has to come after B and so on, all the way till the user gets back to Z. And hence if the user has constructed a Merkle DAG correctly, then A has to happen before B, B has to happen before C, C has to happen before D, all the way until they get to Z. This inherent causality of time with respect to CIDs and Merkle DAG provides the user with a causality-adhering system. ## Delta State Semantics @@ -60,8 +60,8 @@ Branching in a Merkle CRDT system occurs when two peers make independent changes ### Merging of Merkle CRDTs -Merging in a Merkle CRDT system involves bringing two divergent states back together into a single, canonical graph. This is done by adding a new head node, known as a merge node, to the history of the graph. The merge node has two or more previous parents, as opposed to the traditional single parent of most nodes. To merge these states, merge semantics must be applied to the new system. The Merkel clock provides two pieces of information that facilitate this process: the use of a CID for each parent and the ability to go back in time through both branches of the divergent state, parent by parent, before officially merging the state. Each type of CRDT defines its own merge semantics. +Merging in a Merkle CRDT system involves bringing two divergent states back together into a single, canonical graph. This is done by adding a new head node, known as a merge node, to the history of the graph. The merge node has two or more previous parents, as opposed to the traditional single parent of most nodes. To merge these states, merge semantics must be applied to the new system. The Merkle clock provides two pieces of information that facilitate this process: the use of a CID for each parent and the ability to go back in time through both branches of the divergent state, parent by parent, before officially merging the state. Each type of CRDT defines its own merge semantics. -The process begins by finding a common ancestral node between the two divergent states. Each node in the system includes a height parameter, which is the number of nodes preceding it. This, along with the CID of the ancestral node, is provided to the embedded CRDT's merge system to facilitate the merging process. The Merkel CRDT coordinates the logistics of the Merkle DAG and passes information about the multiple parents of the merge node to the embedded CRDT's merge system, which is responsible for defining the merge semantics. As long as the CRDT and the Merkel DAG are functioning correctly, the resulting Merkel clock will also operate correctly. +The process begins by finding a common ancestral node between the two divergent states. Each node in the system includes a height parameter, which is the number of nodes preceding it. This, along with the CID of the ancestral node, is provided to the embedded CRDT's merge system to facilitate the merging process. The Merkle CRDT coordinates the logistics of the Merkle DAG and passes information about the multiple parents of the merge node to the embedded CRDT's merge system, which is responsible for defining the merge semantics. As long as the CRDT and the Merkle DAG are functioning correctly, the resulting Merkle clock will also operate correctly. From 6e72aed99804d917cf5f861a6a846f4a068e4da8 Mon Sep 17 00:00:00 2001 From: PavneetSource <97215213+PavneetSource@users.noreply.github.com> Date: Wed, 10 Jan 2024 20:03:15 -0500 Subject: [PATCH 02/48] fix: testnet1doc (#134) Co-authored-by: Pavneet Kaur --- docs/BSL-License.md | 2 +- docs/Testnet1.md | 157 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 docs/Testnet1.md diff --git a/docs/BSL-License.md b/docs/BSL-License.md index 0e4c848..a5018a4 100644 --- a/docs/BSL-License.md +++ b/docs/BSL-License.md @@ -1,5 +1,5 @@ --- -sidebar_position: 6 +sidebar_position: 7 title: BSL 1.1 License --- diff --git a/docs/Testnet1.md b/docs/Testnet1.md new file mode 100644 index 0000000..621c21c --- /dev/null +++ b/docs/Testnet1.md @@ -0,0 +1,157 @@ +--- +sidebar_position: 6 +title: Testnet1 +--- +# Testnet1 + +## Introduction +Testnets are essential for developing and testing blockchain networks before they go live on the mainnet. They consist of nodes running specific blockchain protocols and modules that enhance the functionality of the DefraDB. + +The SourceHub protocol operates continuously, with decentralized and cryptographically designed API endpoints. Its purpose is to offer developers a condensed representation of the complete stack. This article explores key aspects of Source's Testnet1, its significance, deployment, and management. + +## Core Components of the Protocol +The Source Network ecosystem protocol, based on CosmosSDK and utilizing CometBFT as its consensus mechanism in the SourceHub Testnet is driven by two interconnected components: + +1. **Database**: Tailored for off-chain data querying, featuring a graph-like topple structure. + +2. **Trust Protocol**: Operating on-chain, complementing the database with specific features. + +These components form the foundational core of Source Network and comprise of four essential modules: + +1. **Access control**: A general-purpose black box for the off-chain database, using a graph-like topple. + +2. **Secret management**: Authorizing nodes through encryption and cryptography, with the Orbis secret management engine utilizing decentralized key pairs. + +3. **Anchoring**: Facilitating strict event authoring for timestamping data, essential for blockchain's time-stamping service. + +4. **Auditing**: Ensuring transparency and integrity within the protocol. + +## Core Features and Goals of Testnet1 + +SourceHub Testnet1 serves as the initial MVP, featuring fundamental components necessary for application development. It provides an early-stage interaction with the protocol, excluding aspects like Tokenomics and advanced functionalities such as Secret Management and Authoring. +  + +Key Points: + +1. **Comprehensive MVP** - Testnet1 has limitations in ACP, Orbis, and Anchoring, alongside the absence of token economics, serving as a comprehensive MVP for the complete Source Network Stack. + +2. **Permissioned Nature**: The network's permissioned nature, limited validator count, and the need for whitelisting underscore Testnet1's exclusive participation criteria. + +3. **Developer Engagement**: Active developer participation is encouraged, with an emphasis on feedback and monitoring system performance metrics. + +4. **Public Fairly Permissioned Network**: Testnet1 is positioned as a public fairly permissioned network, requiring whitelisting for SourceHub participation. + +5. **Chain Independence**: The absence of IPC chains or connections to the chain highlights Testnet1's independent operational framework. + +6. **Interoperability Focus**: The emphasis is on enhancing interoperability beyond the initial Testnet1 phase. This enables the Source ecosystem to interact and exchange information with other blockchain networks. And also provide a more connected and decentralized ecosystem. + +The ultimate goal is the seamless progression through Testnet1 and towards the Mainnet, with ongoing evolution in core components, exposed features, and adjusted node requirements. + +This progression involves considerations such as gRPCs (Mainnet) endpoints, P2P connectivity, and dependencies on the BFT-based CosmosSDK protocol. + +``` +grpc: +  grpcURL: "0.0.0.0:8081" +  restURL: "0.0.0.0:8091" +  logging: true +``` + +## Token Distribution and Developer Support +For testing purposes, developers require tokens in their local wallets, obtained through a faucet. These tokens, not actual coins, facilitate transactions within the testnet and cover gas fees. A user-friendly faucet serves as an API endpoint/tool for accessing dummy money. + +## Running a Node + +### Hardware Requirements +For effective participation in the Testnet, certain hardware specifications are essential for running a node as a validator. The key considerations encompass network capability, persistence, and connections. The specified hardware requirements include: + +* x86-64 (amd64) multi-core CPU (AMD / Intel) +* 64GB RAM +* 1TB NVMe SSD Storage +* 100Mbps bi-directional Internet connection + +### Installation +The installation is divided into two components: + +1. SourceHub Daemon (SourceHub D): This is also referred to as node software, and is interchangeable with the SourceHub Daemon. The binaries for SourceHub D are named `sourcehubd`. + +2. Orbis Daemon (Orbis D): The binaries for Orbis D are named `orbisd`. + +  + +There are different options for installation, they are: + +* **Build from Source Network**: To install with this method, follow these steps: + + ``` + git clone [repo] + git checkout [specific version tag] + make build [this does all compilation necessary for the chain] + run orbis d version [to test if the installation works] + ``` +  + +* **Pre-compiled Binaries**: The released binaries are available on the GitHub release pages. + +* **Docker Image**: This method of installing involves building a Docker image. + +### Configuration +Configuration for running SourceHub and Orbis includes settings for the daemon and requires matching local machine IP addresses for Node and RPC addresses. + +Specific values like address prefix and account name must be obtained from local configurations. + +  + +**Note**: + +* Specific values for address prefix and account name need to be obtained from your local configuration. + + ``` + bulletin: + p2p: +    rendezvous: "orbis-bulletin" + sourcehub: +     accountName: "" +     addressPrefix: "" +     nodeAddress: "" +     rpcAddress: "" + ``` + +  + + +* Remove the crypto section (specifically host_crypto_seed) from the config file. + ``` + host: +   crypto: +     seed: 1 +   listenAddresses: +     - /ip4/0.0.0.0/tcp/9001 + ``` + +  + +* Update the config file accordingly. + +## Public Bootstrapping Nodes and RPC Endpoints +Public bootstrapping nodes and RPC endpoints are essential components for network initiation. For SourceHub, the hardware requirements align with those for CosmosSDK chains, making CometBFT compatible. + +## Validators + +### Validator Role and Requirements +Validators play a crucial role in the blockchain by committing new blocks through an automated voting process. If a validator becomes unavailable or sign blocks at the same height, their stake faces the risk of being slashed. + +Maintaining and monitoring validator nodes is crucial for optimal performance. Interested participants can join the waitlist to become a validator. + +### How to Become a Testnet Validator +To become a Testnet validator, follow these steps: + +* Run a Full Node - Ensure synchronization with the network. +* Fund Your Wallet - Use project tokens to delegate funds to your validator. +* Create a Validator - Execute the relevant command. +* Confirm Validator Creation - Verify the successful creation of the validator. +* Import CLI Commands - Follow the necessary CLI commands for continued participation. + +## Conclusion +Source's Testnet1 serves as a foundational MVP, offering developers a preview of core components—Access Control, Secret Management, Document Anchoring and Auditing—while acknowledging limitations and emphasizing the network's permissioned nature. + +The outlined hardware requirements and steps for becoming a validator provide a clear pathway for interested participants. \ No newline at end of file From 8391a974c9e655618464ddf027aed519d81eb33a Mon Sep 17 00:00:00 2001 From: Pavneet Kaur Date: Fri, 26 Jan 2024 03:16:03 -0500 Subject: [PATCH 03/48] fix: schema-migration --- docs/guides/schema-migration.md | 248 ++++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+) create mode 100644 docs/guides/schema-migration.md diff --git a/docs/guides/schema-migration.md b/docs/guides/schema-migration.md new file mode 100644 index 0000000..870195d --- /dev/null +++ b/docs/guides/schema-migration.md @@ -0,0 +1,248 @@ +--- +sidebar_label: Schema Migration Guide +sidebar_position: 60 +--- +# A Guide to Schema Migration in DefraDB + +## Overview +In a database system, an application’s requirements can change at any given time, to meet this change, Schema migrations are necessary. This is where Lens comes in, as a migration engine that produces effective schema migration. + +This guide will provide an understanding of schema migrations, focusing on the Lens migration engine. Let’s dive in! + +Lens is a pipeline for user-defined transformations. It enables users to write their transformations in any programming language and run them through the Lens pipeline, which transforms the cached representation of the data. + +## Goals of the Lens Migration System + +Here are some of the goals of the Lens schema migration system: + +- **Presenting a consistent view of data across nodes**: The Lens schema migration system can present data across nodes consistently, regardless of the schema version being used. + +- **Verifiability of data**: Schema migration in the Lens migration system is presented as data, this preserves the user-defined mutations without corrupting system-defined mutations and also allows migrating from one schema version to another. + +- **A language-agnostic way of writing schema migrations**: Schema migrations can be written in any programming language and executed properly as Lens is language-agnostic. + +- **Safe usage of migrations by others through a sandbox**: Migrations written in Lens are run in a sandbox, which ensures safety and eliminates the concern for remote code executions (RCE). + +- **Peer-to-peer sync of schema migrations**: Lens allows peers to write their migrations in different application versions and sync without worrying about the versions other peers are using. + +- **Local autonomy of schema migrations**: Lens enables local autonomy in writing schema migrations by giving users control of the schema version they choose to use. The users can stay in a particular schema version and still communicate with peers on different versions, as Lens is not restricted to a particular schema version. + +- **Reproducibility and deterministic nature of executing migrations**: When using the Lens migration system, changes to schemas can be written, tagged and shared with other peers regardless of their infrastructure and requirements for deployments. + + +## Mechanism + +In this section, we’ll look at the mechanism behind the Lens migration system and explain how it works. + +Lens migration system functions as a bi-directional transformation engine, enabling the migration of data documents in both forward and reverse directions. It allows for the transformation of documents from schema X to Y in the forward direction and Y to X in the reverse direction. + +The above process is done foundationally, through a verifiable system powered by WebAssembly (Wasm). Wasm also enables the sandbox safety and language-agnostic feature of Lens. + +Internally, schema migrations are evaluated lazily. This avoids the upfront cost of doing a massive migration at once. + +*Lazy evaluation is a technique in programming where an expression is only evaluated when its value is needed.* + +Adopting lazy evaluation in the migration system also allows rapid toggling between schema versions and representations. + +## Usage + +The Lens migration system addresses critical use cases related to schema migrations in peer-to-peer, eventually consistent databases. These use cases include: + +  + +- **Safe Schema Progression**: Ensuring the seamless progression of database schemas is vital for accommodating changing application requirements. Lens facilitates the modification, upgrade, or reversion of schemas while upholding data integrity. + +- **Handling Peer-to-Peer Complexity**: In environments where different clients operate on varying application and database versions, Lens offers a solution to address the complexity of schema migrations. It ensures coherence and effectiveness across different networks. + +- **Language-Agnostic Flexibility**: Functions in Lens are designed to be language-agnostic, offering the versatility to define schema changes in the preferred programming language. This adaptability makes Lens suitable for diverse development environments and preferences. + +- **Lazy Evaluation**: Lens employs a lazy evaluation mechanism, initiating migrations without immediate execution. Schema changes are applied only when documents are read, queried, or updated. This approach reduces the upfront cost of extensive schema migrations while maintaining data consistency. + +- **On-Demand Schema Selection**: Lens supports on-demand schema selection during data queries. Users can specify the schema version they wish to work with, facilitating A/B testing and the seamless transition between different schema versions. + + + +These use cases highlight how Lens empowers users to manage schema migrations effectively, ensuring data consistency and adaptability in evolving database systems. + + +## Example + +In this example we will define a collection using a schema with an `emailAddress` field. We will then patch the schema to add a new field `email`, then define a bi-directional Lens to migrate data to/from the new field. + +**Step One**, define the `Users` collection/schema: + +```graphql +defradb client schema add ' + type Users { + emailAddress: String + } +' +``` + +**Step Two**, patch the `Users` schema, adding the new field, here we pass in `--set-default=true` to automatically apply the schema change to the `Users` collection: + +```graphql +defradb client schema patch ' + [ + { "op": "add", "path": "/Users/Fields/-", "value": {"Name": "email", "Kind": "String"} } + ] +' --set-default=true +``` + +**Step Three**, fetch the schema ids so that we can later tell Defra which schema versions we wish to migrate to/from: + +```graphql +defradb client schema describe --name="Users" +``` + +**Step Four**, in order to define our Lens module - we need to define 4 functions: + + - `alloc(size: unsignedInteger64) unsignedInteger8`​, this is required by all lens modules regardless of language or content - this function should allocate a block of memory of the given `size` , it is used by the Lens engine to pass stuff in to the wasm instance. The memory needs to remain reserved until the next wasm call, e.g. until `transform` or `set_param` has been called. It's implementation will be different depending on which language you are working with, but it should not need to differ between modules of the same language. The Rust SDK contains an alloc function that you can call. + +- `set_param(ptr: unsignedInteger8) unsignedInteger8`​, this function is only required by modules that accept a set of parameters. As an input parameter it receives a single pointer that will point to the start of a json byte array containing the parameters defined in the configuration file. It returns a pointer to either nil, or an error message. It will be called once, when the the migration is defined in Defra (and on restart of the database). How it is implemented is up to you. + +- `transform(ptr: unsignedInteger8) unsignedInteger8`​, this function is required by all Lens modules - it is the migration, and within this function you should define what the migration should do, in this example it will copy the data from the `emailAddress` field into the `email` field. It receives a single input parameter, a pointer to the start of a json byte array containing the Defra document to migrate. It returns a pointer to either the json byte array of the transformed document, or an error message. + +- `inverse(ptr: unsignedInteger8) unsignedInteger8`​, this function is optional, you only need to define it if you wish to define the inverse migration. It follows the same pattern as the `transform` function, only you should implement it to do the reverse. In this example we want this to copy the value from the `email` field into the `emailAddress`​ field. + +Here is what our migration would look like if we were to write it in Rust: + +```graphql +#[derive(Deserialize, Clone)] +pub struct Parameters { + pub src: String, + pub dst: String, +} + +static PARAMETERS: RwLock> = RwLock::new(None); + +#[no_mangle] +pub extern fn alloc(size: usize) -> *mut u8 { + lens_sdk::alloc(size) +} + +#[no_mangle] +pub extern fn set_param(ptr: *mut u8) -> *mut u8 { + match try_set_param(ptr) { + Ok(_) => lens_sdk::nil_ptr(), + Err(e) => lens_sdk::to_mem(lens_sdk::ERROR_TYPE_ID, &e.to_string().as_bytes()) + } +} + +#[no_mangle] +pub extern fn transform(ptr: *mut u8) -> *mut u8 { + match try_transform(ptr) { + Ok(o) => match o { + Some(result_json) => lens_sdk::to_mem(lens_sdk::JSON_TYPE_ID, &result_json), + None => lens_sdk::nil_ptr(), + }, + Err(e) => lens_sdk::to_mem(lens_sdk::ERROR_TYPE_ID, &e.to_string().as_bytes()) + } +} + +fn try_transform(ptr: *mut u8) -> Result>, Box> { + let mut input = match lens_sdk::try_from_mem::>(ptr)? + + let params = PARAMETERS.read()? + + let value = input.get_mut(¶ms.src)?; + + input.insert(params.dst, value); + + let result_json = serde_json::to_vec(&input.clone())?; + Ok(Some(result_json)) +} + +#[no_mangle] +pub extern fn inverse(ptr: *mut u8) -> *mut u8 { + match try_inverse(ptr) { + Ok(o) => match o { + Some(result_json) => lens_sdk::to_mem(lens_sdk::JSON_TYPE_ID, &result_json), + None => lens_sdk::nil_ptr(), + }, + Err(e) => lens_sdk::to_mem(lens_sdk::ERROR_TYPE_ID, &e.to_string().as_bytes()) + } +} + +fn try_inverse(ptr: *mut u8) -> Result>, Box> { + let mut input = match lens_sdk::try_from_mem::>(ptr)? + + let params = PARAMETERS.read()? + + // Note: In this example `inverse` is exactly the same as `transform`, only the useage + // of `params.dst` and `params.src` is reversed. + let value = input.get_mut(¶ms.dst)?; + + input.insert(params.src, value); + + let result_json = serde_json::to_vec(&input.clone())?; + Ok(Some(result_json)) +} +``` + + + + +More fully coded example modules, including an AssemblyScript example can be found in our integration tests here: https://github.com/sourcenetwork/defradb/tree/develop/tests/lenses + +and here: https://github.com/lens-vm/lens/tree/main/tests/modules + +We should then compile it to wasm, and copy the resultant `.wasm` file to a location that the Defra node has access to. Make sure that the file is safe there, at the moment Defra will not copy it and will refer back to that location on database restart. + +**Step Five**, now that we have updated the collection, and defined our migration, we need to tell Defra to use it, by providing it the source and destination schema IDs from our earlier `defradb client schema describe`​ call, and a configuration file defining the parameters we wish to pass it: + +```graphql +defradb client schema migration set ' + { + "lenses": [ + { + "path": , + "arguments": { + "src": "emailAddress", + "dst": "email" + } + } + ] + } +' +``` + + +Now the migration has been configured! Any documents committed under the original schema version will now be returned as if they were committed using the newer schema version. + +As we have defined an inverse migration, we can give this migration to other nodes in our peer network still on the original schema version, and they will be able to query our documents committed using the new schema version applying the inverse. + +We can also change our default schema version on this node back to the original to see the inverse in action: + +```graphql +defradb client schema set-default +``` + +Now when we query Defra, any documents committed after the schema update will be rendered as if they were committed on the original schema version, with `email` field values being copied to the `emailAddress` field at query time. + +## Advantages  + +Here are some advantages of Lens as a schema migration system: + +- Lens is not bound to a particular deployment, programming language, or interaction method. It can be used globally and is accessible to clients regardless of their location or infrastructure. +- Users can query on-demand even with different schema versions. +- Migration between different schemas is a seamless process. + +## Disadvantages + +The Lens migration system also has some downsides to schema migration which include: + +- Using a Lazy execution approach, errors might be found later when querying through the migration. +- There’s a time constraint as the Lens migration system is a work in progress +- The performance of the system is secondary, with more focus on overall functionality. + +## Future Outlook + +The core problem we currently have in the Lens schema migration system is the performance issues when migrating schemas, hence for future versions, the following would be considered: + +- Increasing the performance of the migration system. +- Making migrations easier to write. +- Expansion of the schema update system to include the removal of fields, not just adding fields. +- Enabling users to query the schema version of their choice on-demand. +- Support for Eager evaluation. +- Implementing dry run testing for development and branching scenarios, and handling divergent schemas. \ No newline at end of file From 8bb809f18939cc4a1f933f18336439ad5438b931 Mon Sep 17 00:00:00 2001 From: Pavneet Kaur Date: Fri, 26 Jan 2024 03:31:32 -0500 Subject: [PATCH 04/48] fix: schema-migration1 --- docs/guides/schema-migration.md | 248 -------------------------------- 1 file changed, 248 deletions(-) delete mode 100644 docs/guides/schema-migration.md diff --git a/docs/guides/schema-migration.md b/docs/guides/schema-migration.md deleted file mode 100644 index 870195d..0000000 --- a/docs/guides/schema-migration.md +++ /dev/null @@ -1,248 +0,0 @@ ---- -sidebar_label: Schema Migration Guide -sidebar_position: 60 ---- -# A Guide to Schema Migration in DefraDB - -## Overview -In a database system, an application’s requirements can change at any given time, to meet this change, Schema migrations are necessary. This is where Lens comes in, as a migration engine that produces effective schema migration. - -This guide will provide an understanding of schema migrations, focusing on the Lens migration engine. Let’s dive in! - -Lens is a pipeline for user-defined transformations. It enables users to write their transformations in any programming language and run them through the Lens pipeline, which transforms the cached representation of the data. - -## Goals of the Lens Migration System - -Here are some of the goals of the Lens schema migration system: - -- **Presenting a consistent view of data across nodes**: The Lens schema migration system can present data across nodes consistently, regardless of the schema version being used. - -- **Verifiability of data**: Schema migration in the Lens migration system is presented as data, this preserves the user-defined mutations without corrupting system-defined mutations and also allows migrating from one schema version to another. - -- **A language-agnostic way of writing schema migrations**: Schema migrations can be written in any programming language and executed properly as Lens is language-agnostic. - -- **Safe usage of migrations by others through a sandbox**: Migrations written in Lens are run in a sandbox, which ensures safety and eliminates the concern for remote code executions (RCE). - -- **Peer-to-peer sync of schema migrations**: Lens allows peers to write their migrations in different application versions and sync without worrying about the versions other peers are using. - -- **Local autonomy of schema migrations**: Lens enables local autonomy in writing schema migrations by giving users control of the schema version they choose to use. The users can stay in a particular schema version and still communicate with peers on different versions, as Lens is not restricted to a particular schema version. - -- **Reproducibility and deterministic nature of executing migrations**: When using the Lens migration system, changes to schemas can be written, tagged and shared with other peers regardless of their infrastructure and requirements for deployments. - - -## Mechanism - -In this section, we’ll look at the mechanism behind the Lens migration system and explain how it works. - -Lens migration system functions as a bi-directional transformation engine, enabling the migration of data documents in both forward and reverse directions. It allows for the transformation of documents from schema X to Y in the forward direction and Y to X in the reverse direction. - -The above process is done foundationally, through a verifiable system powered by WebAssembly (Wasm). Wasm also enables the sandbox safety and language-agnostic feature of Lens. - -Internally, schema migrations are evaluated lazily. This avoids the upfront cost of doing a massive migration at once. - -*Lazy evaluation is a technique in programming where an expression is only evaluated when its value is needed.* - -Adopting lazy evaluation in the migration system also allows rapid toggling between schema versions and representations. - -## Usage - -The Lens migration system addresses critical use cases related to schema migrations in peer-to-peer, eventually consistent databases. These use cases include: - -  - -- **Safe Schema Progression**: Ensuring the seamless progression of database schemas is vital for accommodating changing application requirements. Lens facilitates the modification, upgrade, or reversion of schemas while upholding data integrity. - -- **Handling Peer-to-Peer Complexity**: In environments where different clients operate on varying application and database versions, Lens offers a solution to address the complexity of schema migrations. It ensures coherence and effectiveness across different networks. - -- **Language-Agnostic Flexibility**: Functions in Lens are designed to be language-agnostic, offering the versatility to define schema changes in the preferred programming language. This adaptability makes Lens suitable for diverse development environments and preferences. - -- **Lazy Evaluation**: Lens employs a lazy evaluation mechanism, initiating migrations without immediate execution. Schema changes are applied only when documents are read, queried, or updated. This approach reduces the upfront cost of extensive schema migrations while maintaining data consistency. - -- **On-Demand Schema Selection**: Lens supports on-demand schema selection during data queries. Users can specify the schema version they wish to work with, facilitating A/B testing and the seamless transition between different schema versions. - - - -These use cases highlight how Lens empowers users to manage schema migrations effectively, ensuring data consistency and adaptability in evolving database systems. - - -## Example - -In this example we will define a collection using a schema with an `emailAddress` field. We will then patch the schema to add a new field `email`, then define a bi-directional Lens to migrate data to/from the new field. - -**Step One**, define the `Users` collection/schema: - -```graphql -defradb client schema add ' - type Users { - emailAddress: String - } -' -``` - -**Step Two**, patch the `Users` schema, adding the new field, here we pass in `--set-default=true` to automatically apply the schema change to the `Users` collection: - -```graphql -defradb client schema patch ' - [ - { "op": "add", "path": "/Users/Fields/-", "value": {"Name": "email", "Kind": "String"} } - ] -' --set-default=true -``` - -**Step Three**, fetch the schema ids so that we can later tell Defra which schema versions we wish to migrate to/from: - -```graphql -defradb client schema describe --name="Users" -``` - -**Step Four**, in order to define our Lens module - we need to define 4 functions: - - - `alloc(size: unsignedInteger64) unsignedInteger8`​, this is required by all lens modules regardless of language or content - this function should allocate a block of memory of the given `size` , it is used by the Lens engine to pass stuff in to the wasm instance. The memory needs to remain reserved until the next wasm call, e.g. until `transform` or `set_param` has been called. It's implementation will be different depending on which language you are working with, but it should not need to differ between modules of the same language. The Rust SDK contains an alloc function that you can call. - -- `set_param(ptr: unsignedInteger8) unsignedInteger8`​, this function is only required by modules that accept a set of parameters. As an input parameter it receives a single pointer that will point to the start of a json byte array containing the parameters defined in the configuration file. It returns a pointer to either nil, or an error message. It will be called once, when the the migration is defined in Defra (and on restart of the database). How it is implemented is up to you. - -- `transform(ptr: unsignedInteger8) unsignedInteger8`​, this function is required by all Lens modules - it is the migration, and within this function you should define what the migration should do, in this example it will copy the data from the `emailAddress` field into the `email` field. It receives a single input parameter, a pointer to the start of a json byte array containing the Defra document to migrate. It returns a pointer to either the json byte array of the transformed document, or an error message. - -- `inverse(ptr: unsignedInteger8) unsignedInteger8`​, this function is optional, you only need to define it if you wish to define the inverse migration. It follows the same pattern as the `transform` function, only you should implement it to do the reverse. In this example we want this to copy the value from the `email` field into the `emailAddress`​ field. - -Here is what our migration would look like if we were to write it in Rust: - -```graphql -#[derive(Deserialize, Clone)] -pub struct Parameters { - pub src: String, - pub dst: String, -} - -static PARAMETERS: RwLock> = RwLock::new(None); - -#[no_mangle] -pub extern fn alloc(size: usize) -> *mut u8 { - lens_sdk::alloc(size) -} - -#[no_mangle] -pub extern fn set_param(ptr: *mut u8) -> *mut u8 { - match try_set_param(ptr) { - Ok(_) => lens_sdk::nil_ptr(), - Err(e) => lens_sdk::to_mem(lens_sdk::ERROR_TYPE_ID, &e.to_string().as_bytes()) - } -} - -#[no_mangle] -pub extern fn transform(ptr: *mut u8) -> *mut u8 { - match try_transform(ptr) { - Ok(o) => match o { - Some(result_json) => lens_sdk::to_mem(lens_sdk::JSON_TYPE_ID, &result_json), - None => lens_sdk::nil_ptr(), - }, - Err(e) => lens_sdk::to_mem(lens_sdk::ERROR_TYPE_ID, &e.to_string().as_bytes()) - } -} - -fn try_transform(ptr: *mut u8) -> Result>, Box> { - let mut input = match lens_sdk::try_from_mem::>(ptr)? - - let params = PARAMETERS.read()? - - let value = input.get_mut(¶ms.src)?; - - input.insert(params.dst, value); - - let result_json = serde_json::to_vec(&input.clone())?; - Ok(Some(result_json)) -} - -#[no_mangle] -pub extern fn inverse(ptr: *mut u8) -> *mut u8 { - match try_inverse(ptr) { - Ok(o) => match o { - Some(result_json) => lens_sdk::to_mem(lens_sdk::JSON_TYPE_ID, &result_json), - None => lens_sdk::nil_ptr(), - }, - Err(e) => lens_sdk::to_mem(lens_sdk::ERROR_TYPE_ID, &e.to_string().as_bytes()) - } -} - -fn try_inverse(ptr: *mut u8) -> Result>, Box> { - let mut input = match lens_sdk::try_from_mem::>(ptr)? - - let params = PARAMETERS.read()? - - // Note: In this example `inverse` is exactly the same as `transform`, only the useage - // of `params.dst` and `params.src` is reversed. - let value = input.get_mut(¶ms.dst)?; - - input.insert(params.src, value); - - let result_json = serde_json::to_vec(&input.clone())?; - Ok(Some(result_json)) -} -``` - - - - -More fully coded example modules, including an AssemblyScript example can be found in our integration tests here: https://github.com/sourcenetwork/defradb/tree/develop/tests/lenses - -and here: https://github.com/lens-vm/lens/tree/main/tests/modules - -We should then compile it to wasm, and copy the resultant `.wasm` file to a location that the Defra node has access to. Make sure that the file is safe there, at the moment Defra will not copy it and will refer back to that location on database restart. - -**Step Five**, now that we have updated the collection, and defined our migration, we need to tell Defra to use it, by providing it the source and destination schema IDs from our earlier `defradb client schema describe`​ call, and a configuration file defining the parameters we wish to pass it: - -```graphql -defradb client schema migration set ' - { - "lenses": [ - { - "path": , - "arguments": { - "src": "emailAddress", - "dst": "email" - } - } - ] - } -' -``` - - -Now the migration has been configured! Any documents committed under the original schema version will now be returned as if they were committed using the newer schema version. - -As we have defined an inverse migration, we can give this migration to other nodes in our peer network still on the original schema version, and they will be able to query our documents committed using the new schema version applying the inverse. - -We can also change our default schema version on this node back to the original to see the inverse in action: - -```graphql -defradb client schema set-default -``` - -Now when we query Defra, any documents committed after the schema update will be rendered as if they were committed on the original schema version, with `email` field values being copied to the `emailAddress` field at query time. - -## Advantages  - -Here are some advantages of Lens as a schema migration system: - -- Lens is not bound to a particular deployment, programming language, or interaction method. It can be used globally and is accessible to clients regardless of their location or infrastructure. -- Users can query on-demand even with different schema versions. -- Migration between different schemas is a seamless process. - -## Disadvantages - -The Lens migration system also has some downsides to schema migration which include: - -- Using a Lazy execution approach, errors might be found later when querying through the migration. -- There’s a time constraint as the Lens migration system is a work in progress -- The performance of the system is secondary, with more focus on overall functionality. - -## Future Outlook - -The core problem we currently have in the Lens schema migration system is the performance issues when migrating schemas, hence for future versions, the following would be considered: - -- Increasing the performance of the migration system. -- Making migrations easier to write. -- Expansion of the schema update system to include the removal of fields, not just adding fields. -- Enabling users to query the schema version of their choice on-demand. -- Support for Eager evaluation. -- Implementing dry run testing for development and branching scenarios, and handling divergent schemas. \ No newline at end of file From ae229ea04fd45a8c3ee07524de7b8c2288d57294 Mon Sep 17 00:00:00 2001 From: Pavneet Kaur Date: Fri, 26 Jan 2024 03:36:29 -0500 Subject: [PATCH 05/48] fix: schema-migration2 --- docs/guides/schema-migration.md | 248 ++++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+) create mode 100644 docs/guides/schema-migration.md diff --git a/docs/guides/schema-migration.md b/docs/guides/schema-migration.md new file mode 100644 index 0000000..870195d --- /dev/null +++ b/docs/guides/schema-migration.md @@ -0,0 +1,248 @@ +--- +sidebar_label: Schema Migration Guide +sidebar_position: 60 +--- +# A Guide to Schema Migration in DefraDB + +## Overview +In a database system, an application’s requirements can change at any given time, to meet this change, Schema migrations are necessary. This is where Lens comes in, as a migration engine that produces effective schema migration. + +This guide will provide an understanding of schema migrations, focusing on the Lens migration engine. Let’s dive in! + +Lens is a pipeline for user-defined transformations. It enables users to write their transformations in any programming language and run them through the Lens pipeline, which transforms the cached representation of the data. + +## Goals of the Lens Migration System + +Here are some of the goals of the Lens schema migration system: + +- **Presenting a consistent view of data across nodes**: The Lens schema migration system can present data across nodes consistently, regardless of the schema version being used. + +- **Verifiability of data**: Schema migration in the Lens migration system is presented as data, this preserves the user-defined mutations without corrupting system-defined mutations and also allows migrating from one schema version to another. + +- **A language-agnostic way of writing schema migrations**: Schema migrations can be written in any programming language and executed properly as Lens is language-agnostic. + +- **Safe usage of migrations by others through a sandbox**: Migrations written in Lens are run in a sandbox, which ensures safety and eliminates the concern for remote code executions (RCE). + +- **Peer-to-peer sync of schema migrations**: Lens allows peers to write their migrations in different application versions and sync without worrying about the versions other peers are using. + +- **Local autonomy of schema migrations**: Lens enables local autonomy in writing schema migrations by giving users control of the schema version they choose to use. The users can stay in a particular schema version and still communicate with peers on different versions, as Lens is not restricted to a particular schema version. + +- **Reproducibility and deterministic nature of executing migrations**: When using the Lens migration system, changes to schemas can be written, tagged and shared with other peers regardless of their infrastructure and requirements for deployments. + + +## Mechanism + +In this section, we’ll look at the mechanism behind the Lens migration system and explain how it works. + +Lens migration system functions as a bi-directional transformation engine, enabling the migration of data documents in both forward and reverse directions. It allows for the transformation of documents from schema X to Y in the forward direction and Y to X in the reverse direction. + +The above process is done foundationally, through a verifiable system powered by WebAssembly (Wasm). Wasm also enables the sandbox safety and language-agnostic feature of Lens. + +Internally, schema migrations are evaluated lazily. This avoids the upfront cost of doing a massive migration at once. + +*Lazy evaluation is a technique in programming where an expression is only evaluated when its value is needed.* + +Adopting lazy evaluation in the migration system also allows rapid toggling between schema versions and representations. + +## Usage + +The Lens migration system addresses critical use cases related to schema migrations in peer-to-peer, eventually consistent databases. These use cases include: + +  + +- **Safe Schema Progression**: Ensuring the seamless progression of database schemas is vital for accommodating changing application requirements. Lens facilitates the modification, upgrade, or reversion of schemas while upholding data integrity. + +- **Handling Peer-to-Peer Complexity**: In environments where different clients operate on varying application and database versions, Lens offers a solution to address the complexity of schema migrations. It ensures coherence and effectiveness across different networks. + +- **Language-Agnostic Flexibility**: Functions in Lens are designed to be language-agnostic, offering the versatility to define schema changes in the preferred programming language. This adaptability makes Lens suitable for diverse development environments and preferences. + +- **Lazy Evaluation**: Lens employs a lazy evaluation mechanism, initiating migrations without immediate execution. Schema changes are applied only when documents are read, queried, or updated. This approach reduces the upfront cost of extensive schema migrations while maintaining data consistency. + +- **On-Demand Schema Selection**: Lens supports on-demand schema selection during data queries. Users can specify the schema version they wish to work with, facilitating A/B testing and the seamless transition between different schema versions. + + + +These use cases highlight how Lens empowers users to manage schema migrations effectively, ensuring data consistency and adaptability in evolving database systems. + + +## Example + +In this example we will define a collection using a schema with an `emailAddress` field. We will then patch the schema to add a new field `email`, then define a bi-directional Lens to migrate data to/from the new field. + +**Step One**, define the `Users` collection/schema: + +```graphql +defradb client schema add ' + type Users { + emailAddress: String + } +' +``` + +**Step Two**, patch the `Users` schema, adding the new field, here we pass in `--set-default=true` to automatically apply the schema change to the `Users` collection: + +```graphql +defradb client schema patch ' + [ + { "op": "add", "path": "/Users/Fields/-", "value": {"Name": "email", "Kind": "String"} } + ] +' --set-default=true +``` + +**Step Three**, fetch the schema ids so that we can later tell Defra which schema versions we wish to migrate to/from: + +```graphql +defradb client schema describe --name="Users" +``` + +**Step Four**, in order to define our Lens module - we need to define 4 functions: + + - `alloc(size: unsignedInteger64) unsignedInteger8`​, this is required by all lens modules regardless of language or content - this function should allocate a block of memory of the given `size` , it is used by the Lens engine to pass stuff in to the wasm instance. The memory needs to remain reserved until the next wasm call, e.g. until `transform` or `set_param` has been called. It's implementation will be different depending on which language you are working with, but it should not need to differ between modules of the same language. The Rust SDK contains an alloc function that you can call. + +- `set_param(ptr: unsignedInteger8) unsignedInteger8`​, this function is only required by modules that accept a set of parameters. As an input parameter it receives a single pointer that will point to the start of a json byte array containing the parameters defined in the configuration file. It returns a pointer to either nil, or an error message. It will be called once, when the the migration is defined in Defra (and on restart of the database). How it is implemented is up to you. + +- `transform(ptr: unsignedInteger8) unsignedInteger8`​, this function is required by all Lens modules - it is the migration, and within this function you should define what the migration should do, in this example it will copy the data from the `emailAddress` field into the `email` field. It receives a single input parameter, a pointer to the start of a json byte array containing the Defra document to migrate. It returns a pointer to either the json byte array of the transformed document, or an error message. + +- `inverse(ptr: unsignedInteger8) unsignedInteger8`​, this function is optional, you only need to define it if you wish to define the inverse migration. It follows the same pattern as the `transform` function, only you should implement it to do the reverse. In this example we want this to copy the value from the `email` field into the `emailAddress`​ field. + +Here is what our migration would look like if we were to write it in Rust: + +```graphql +#[derive(Deserialize, Clone)] +pub struct Parameters { + pub src: String, + pub dst: String, +} + +static PARAMETERS: RwLock> = RwLock::new(None); + +#[no_mangle] +pub extern fn alloc(size: usize) -> *mut u8 { + lens_sdk::alloc(size) +} + +#[no_mangle] +pub extern fn set_param(ptr: *mut u8) -> *mut u8 { + match try_set_param(ptr) { + Ok(_) => lens_sdk::nil_ptr(), + Err(e) => lens_sdk::to_mem(lens_sdk::ERROR_TYPE_ID, &e.to_string().as_bytes()) + } +} + +#[no_mangle] +pub extern fn transform(ptr: *mut u8) -> *mut u8 { + match try_transform(ptr) { + Ok(o) => match o { + Some(result_json) => lens_sdk::to_mem(lens_sdk::JSON_TYPE_ID, &result_json), + None => lens_sdk::nil_ptr(), + }, + Err(e) => lens_sdk::to_mem(lens_sdk::ERROR_TYPE_ID, &e.to_string().as_bytes()) + } +} + +fn try_transform(ptr: *mut u8) -> Result>, Box> { + let mut input = match lens_sdk::try_from_mem::>(ptr)? + + let params = PARAMETERS.read()? + + let value = input.get_mut(¶ms.src)?; + + input.insert(params.dst, value); + + let result_json = serde_json::to_vec(&input.clone())?; + Ok(Some(result_json)) +} + +#[no_mangle] +pub extern fn inverse(ptr: *mut u8) -> *mut u8 { + match try_inverse(ptr) { + Ok(o) => match o { + Some(result_json) => lens_sdk::to_mem(lens_sdk::JSON_TYPE_ID, &result_json), + None => lens_sdk::nil_ptr(), + }, + Err(e) => lens_sdk::to_mem(lens_sdk::ERROR_TYPE_ID, &e.to_string().as_bytes()) + } +} + +fn try_inverse(ptr: *mut u8) -> Result>, Box> { + let mut input = match lens_sdk::try_from_mem::>(ptr)? + + let params = PARAMETERS.read()? + + // Note: In this example `inverse` is exactly the same as `transform`, only the useage + // of `params.dst` and `params.src` is reversed. + let value = input.get_mut(¶ms.dst)?; + + input.insert(params.src, value); + + let result_json = serde_json::to_vec(&input.clone())?; + Ok(Some(result_json)) +} +``` + + + + +More fully coded example modules, including an AssemblyScript example can be found in our integration tests here: https://github.com/sourcenetwork/defradb/tree/develop/tests/lenses + +and here: https://github.com/lens-vm/lens/tree/main/tests/modules + +We should then compile it to wasm, and copy the resultant `.wasm` file to a location that the Defra node has access to. Make sure that the file is safe there, at the moment Defra will not copy it and will refer back to that location on database restart. + +**Step Five**, now that we have updated the collection, and defined our migration, we need to tell Defra to use it, by providing it the source and destination schema IDs from our earlier `defradb client schema describe`​ call, and a configuration file defining the parameters we wish to pass it: + +```graphql +defradb client schema migration set ' + { + "lenses": [ + { + "path": , + "arguments": { + "src": "emailAddress", + "dst": "email" + } + } + ] + } +' +``` + + +Now the migration has been configured! Any documents committed under the original schema version will now be returned as if they were committed using the newer schema version. + +As we have defined an inverse migration, we can give this migration to other nodes in our peer network still on the original schema version, and they will be able to query our documents committed using the new schema version applying the inverse. + +We can also change our default schema version on this node back to the original to see the inverse in action: + +```graphql +defradb client schema set-default +``` + +Now when we query Defra, any documents committed after the schema update will be rendered as if they were committed on the original schema version, with `email` field values being copied to the `emailAddress` field at query time. + +## Advantages  + +Here are some advantages of Lens as a schema migration system: + +- Lens is not bound to a particular deployment, programming language, or interaction method. It can be used globally and is accessible to clients regardless of their location or infrastructure. +- Users can query on-demand even with different schema versions. +- Migration between different schemas is a seamless process. + +## Disadvantages + +The Lens migration system also has some downsides to schema migration which include: + +- Using a Lazy execution approach, errors might be found later when querying through the migration. +- There’s a time constraint as the Lens migration system is a work in progress +- The performance of the system is secondary, with more focus on overall functionality. + +## Future Outlook + +The core problem we currently have in the Lens schema migration system is the performance issues when migrating schemas, hence for future versions, the following would be considered: + +- Increasing the performance of the migration system. +- Making migrations easier to write. +- Expansion of the schema update system to include the removal of fields, not just adding fields. +- Enabling users to query the schema version of their choice on-demand. +- Support for Eager evaluation. +- Implementing dry run testing for development and branching scenarios, and handling divergent schemas. \ No newline at end of file From b911903143e55d7dc5a347a75a0f912f84bb2a5d Mon Sep 17 00:00:00 2001 From: PavneetSource <97215213+PavneetSource@users.noreply.github.com> Date: Wed, 31 Jan 2024 05:28:52 -0500 Subject: [PATCH 06/48] fix: deployment guide (#135) Co-authored-by: Pavneet Kaur --- docs/guides/deployment-guide.md | 156 ++++++++++++++++++++++++++++++++ docs/guides/explain-systems.md | 2 +- 2 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 docs/guides/deployment-guide.md diff --git a/docs/guides/deployment-guide.md b/docs/guides/deployment-guide.md new file mode 100644 index 0000000..82541ed --- /dev/null +++ b/docs/guides/deployment-guide.md @@ -0,0 +1,156 @@ +--- +sidebar_label: Deployment Guide +sidebar_position: 70 +--- +# A Guide to DefraDB Deployment +DefraDB aspires to be a versatile database, supporting both single-node and clustered deployments. In a clustered setup, multiple nodes collaborate seamlessly. This guide walks you through deploying DefraDB, from single-node configurations to cloud and server environments. Let’s begin. + +## Prerequisites +The prerequisites listed in this section should be met before starting the deployment process. + +**Pre-Compiled Binaries** - Each release has its own set of pre-compiled binaries for different Operating Systems. Obtain the pre-compiled binaries for your operating system from the [official releases](https://github.com/sourcenetwork/defradb/releases). + +### Bare Metal Deployment + +For Bare Metal deployments, there are two methods available: + +- ### Building from Source + +Ensure Git, Go and make are installed for all your development environments. + +1. **Unix (Mac and Linux)** - The main thing required is the [Go language toolchain](https://go.dev/dl/), which is supported up to Go 1.20 in DefraDB due to the current dependencies. +2. **Windows** - Install the [MinGW toolchain](https://www.mingw-w64.org/) specific to GCC and add the [Make toolchain](https://www.gnu.org/software/make/). + +Follow these steps to build from source: + +1. Run git clone to download the [DefraDB repository](https://github.com/sourcenetwork/defradb#install) to your local machine. +2. Navigate to the repository using `cd`. +3. Execute the Make command to build a local DefraDB setup with default configurations. +4. Set the compiler and build tags for the playground: `GOFLAGS="-tags=playground"` + +#### Build Playground + +Refer to the Playground Basics Guide for detailed instructions. + +1. Compile the playground separately using the command: `make deps:playground` +2. This produces a bundle file in a folder called dist. +3. Set the environment variable using the [NodeJS language toolchain](https://nodejs.org/en/download/current) and npm to build locally on your machine. The JavaScript and Typescript code create an output bundle for the frontend code to work. +4. Build a specific playground version of DefraDB. Use the go flags environment variable, instructing the compiler to include the playground directly embedded in all files. Execute the [go binary embed](https://pkg.go.dev/embed) command, producing a binary of approximately 4MB. + + + +- ### Docker Deployments + +Docker deployments are designed for containerized environments. The main prerequisite is that Docker should be installed on your machine. + + +The steps for Docker deployment are as follows: + +1. Install Docker by referring to the [official Docker documentation](https://docs.docker.com/get-docker/). +2. Navigate to the root of the repository where the Dockerfile is located. +3. Run the following command: +`docker build -t defra -f tools/defradb.containerfile ` + + +**Note**: The period at the end is important and the -f flag specifies the file location. + +The container file is in a subfolder called tools: `path: tools/defradb.containerfile` + +Docker images streamline the deployment process, requiring fewer dependencies. This produces a DefraDB binary file for manual building and one-click deployments, representing the database in binary form as a system. + +## Deployment + +### Manual Deployment + +DefraDB is a single statically built binary with no third-party dependencies. Similar to bare metal, it can run on any cloud or machine. Execute the following command to start DefraDB: +`defradb start --store badger` + + + +### AWS Environment + +For deploying to an AWS environment, note the following: + +- Deploy effortlessly with a prebuilt [AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html) (Amazon Machine Image) featuring DefraDB. +- Access the image ID or opt for the convenience of the Amazon Marketplace link. +- Refer to [AWS documentation](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html) for an easy EC2 instance launch with your specified image size. +- Customize your setup using Packer and Terraform scripts in this directory: `tools/cloud/aws/packer` + +  + +### Akash Deployments + +For detailed instructions on deploying DefraDB with Akash, refer to the [Akash Deployment Guide](https://nasdf-feat-akash-deploy.docs-source-network.pages.dev/guides/akash-deployment). + +  + +## Configurations + +- The default root directory on Unix machines is `$HOME/.defradb`. For Windows it is `%USERPROFILE%\.defradb`​. +- Specifiy the DefraDB folder with this command: `defradb --rootdir start`. +- The default directory for where data is specified is `/data`. + +  + +## Storage Engine + +The storage engines currently used include: + +- Fileback persistent storage powered the [Badger](https://github.com/dgraph-io/badger%5D ) database. +- [In-Memory Storage](https://github.com/sourcenetwork/defradb/blob/develop/datastore/memory/memory.go) which is B-Tree based, ideal for testing does not work with the file system. It is specified with this flag: `--store memory` + +  + +## Network and Connectivity + +As a P2P database, DefraDB requires two ports for node communication, they include: + +  + +1. **API Port**: It powers the HTTP API, handling queries  from the client to the database  and various API commands. The default port number is *9181*. + +2. **P2P Port**: It facilitates communication between nodes, supporting data sharing, synchronization, and replication. The default port no is *9171*. + +  + +The P2P networking functionality can't be disabled entirely, but you can use the `defradb start --no-p2p`​ command through the config files and CLI to deactivate it. + +  + +### Port Customization + +The API port can be specified using the [bind address](https://docs.libp2p.io/concepts/fundamentals/addressing/): + +`API: --url :` + +For P2P use the P2P adder to a multi-address: + +`--p2paddr ` + +Here is an [infographic](https://images.ctfassets.net/efgoat6bykjh/XQrDLqpkV06rFhT24viJc/1c2c72ddebe609c80fc848bfa9c4771e/multiaddress.png) to further understand multi-address. + + +## The Peer Key + +Secure communication between nodes in DefraDB is established with a unique peer key for each node. Key details include: + +  + +- The peer key is automatically generated on startup, replacing the key file in a specific path. +- There is no current method for generating a new key except for overwriting an existing one. +- The peer key type uses a specific elliptic curve, called an Ed25519, which can be used to generate private keys. +- In-memory mode generates a new key with each startup. +- The config file located at `/config.yaml` is definable and used for specification. +- Additional methods for users to generate their own Ed25519 key: +openssl genpkey -algorithm ed25519 -text + +## Future Outlook + +As DefraDB evolves, the roadmap includes expanding compatibility with diverse deployment environments: + +- **Google Cloud Platform (GCP)**: Tailored deployment solutions for seamless integration with GCP environments. +- **Kubernetes**: Optimization for Kubernetes deployments, ensuring scalability and flexibility. +- **Embedded/IoT for Small Environments**: Adaptations to cater to the unique demands of embedded systems and IoT applications. +- **Web Assembly (WASM) Deployments**: Exploring deployment strategies utilizing Web Assembly for enhanced cross-platform compatibility. + +  \ No newline at end of file diff --git a/docs/guides/explain-systems.md b/docs/guides/explain-systems.md index bb65485..a1d770f 100644 --- a/docs/guides/explain-systems.md +++ b/docs/guides/explain-systems.md @@ -74,7 +74,7 @@ Having the plan arranged as parts in a graph is helpful because it's both fast t ### Simple Explain -Simple Explain Requests is the default mode for explanation, only requiring the additional `@explain` directive. You can also be explicit and provide a type argument to the directive like this `@explain(type: simple)`. ` +Simple Explain Requests is the default mode for explanation, only requiring the additional `@explain` directive. You can also be explicit and provide a type argument to the directive like this `@explain(type: simple)`. This mode of explanation returns only the syntactic and structural information of the Plan Graph, its nodes, and their attributes. From d9bdd6a8e8d2bd937b19087a6743082bc749ed67 Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Thu, 15 Feb 2024 16:32:12 -0500 Subject: [PATCH 07/48] Update Multi Project structure and Testnet Join Docs (#136) Moved the structure to support multiple projects so we can now create documents seperately for Defra, SourceHub, and Orbis. Also, updated the SourceHub docs for more comprehensive "Join Testnet" docs. --- docs/{ => defradb}/BSL-License.md | 0 docs/{ => defradb}/concepts/_category_.json | 0 docs/{ => defradb}/concepts/ipfs.md | 0 docs/{ => defradb}/concepts/libp2p.md | 0 docs/{intro.md => defradb/getting-started.md} | 0 docs/{ => defradb}/guides/_category_.json | 0 docs/{ => defradb}/guides/deployment-guide.md | 0 docs/{ => defradb}/guides/explain-systems.md | 0 docs/{ => defradb}/guides/merkle-crdt.md | 0 docs/{ => defradb}/guides/peer-to-peer.md | 0 docs/{ => defradb}/guides/schema-migration.md | 0 .../guides/schema-relationship.md | 0 .../guides/time-traveling-queries.md | 0 docs/{ => defradb}/references/_category_.json | 0 .../references/cli/_category_.json | 0 docs/{ => defradb}/references/cli/defradb.md | 0 .../references/cli/defradb_client.md | 0 .../references/cli/defradb_client_blocks.md | 0 .../cli/defradb_client_blocks_get.md | 0 .../references/cli/defradb_client_dump.md | 0 .../references/cli/defradb_client_peerid.md | 0 .../references/cli/defradb_client_ping.md | 0 .../references/cli/defradb_client_query.md | 0 .../references/cli/defradb_client_rpc.md | 0 .../cli/defradb_client_rpc_addreplicator.md | 0 .../cli/defradb_client_rpc_p2pcollection.md | 0 .../defradb_client_rpc_p2pcollection_add.md | 0 ...defradb_client_rpc_p2pcollection_getall.md | 0 ...defradb_client_rpc_p2pcollection_remove.md | 0 .../cli/defradb_client_rpc_replicator.md | 0 .../defradb_client_rpc_replicator_delete.md | 0 .../defradb_client_rpc_replicator_getall.md | 0 .../cli/defradb_client_rpc_replicator_set.md | 0 .../references/cli/defradb_client_schema.md | 0 .../cli/defradb_client_schema_add.md | 0 .../cli/defradb_client_schema_patch.md | 0 .../references/cli/defradb_init.md | 0 .../references/cli/defradb_server-dump.md | 0 .../references/cli/defradb_start.md | 0 .../references/cli/defradb_version.md | 0 .../query-specification/_category_.json | 0 .../aggregate-functions.md | 0 .../references/query-specification/aliases.md | 0 .../query-specification/collections.md | 0 .../query-specification/database-api.md | 0 .../query-specification/execution-flow.md | 0 .../query-specification/filtering.md | 0 .../query-specification/grouping.md | 0 .../limiting-and-pagination.md | 0 .../query-specification/mutation-block.md | 0 .../query-specification/query-block.md | 0 .../query-language-overview.md | 0 .../query-specification/relationships.md | 0 .../sorting-and-ordering.md | 0 docs/defradb/release notes/_category_.json | 5 + docs/defradb/release notes/v0.2.0.md | 86 +++ docs/defradb/release notes/v0.2.1.md | 57 ++ docs/defradb/release notes/v0.3.0.md | 178 +++++ docs/defradb/release notes/v0.3.1.md | 94 +++ docs/defradb/release notes/v0.4.0.md | 80 +++ docs/defradb/release notes/v0.5.0.md | 144 ++++ docs/defradb/release notes/v0.5.1.md | 91 +++ docs/defradb/release notes/v0.6.0.md | 85 +++ docs/defradb/release notes/v0.7.0.md | 74 ++ docs/defradb/release notes/v0.8.0.md | 75 +++ docs/defradb/release notes/v0.9.0.md | 78 +++ docs/orbis/getting-started.md | 1 + docs/release-notes.md | 633 ------------------ docs/sourcehub/testnet/_category_.json | 4 + docs/sourcehub/testnet/join.md | 158 +++++ .../testnet/overview.md} | 12 +- docusaurus.config.js | 42 +- package-lock.json | 4 +- sidebars.js | 13 +- 74 files changed, 1268 insertions(+), 646 deletions(-) rename docs/{ => defradb}/BSL-License.md (100%) rename docs/{ => defradb}/concepts/_category_.json (100%) rename docs/{ => defradb}/concepts/ipfs.md (100%) rename docs/{ => defradb}/concepts/libp2p.md (100%) rename docs/{intro.md => defradb/getting-started.md} (100%) rename docs/{ => defradb}/guides/_category_.json (100%) rename docs/{ => defradb}/guides/deployment-guide.md (100%) rename docs/{ => defradb}/guides/explain-systems.md (100%) rename docs/{ => defradb}/guides/merkle-crdt.md (100%) rename docs/{ => defradb}/guides/peer-to-peer.md (100%) rename docs/{ => defradb}/guides/schema-migration.md (100%) rename docs/{ => defradb}/guides/schema-relationship.md (100%) rename docs/{ => defradb}/guides/time-traveling-queries.md (100%) rename docs/{ => defradb}/references/_category_.json (100%) rename docs/{ => defradb}/references/cli/_category_.json (100%) rename docs/{ => defradb}/references/cli/defradb.md (100%) rename docs/{ => defradb}/references/cli/defradb_client.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_blocks.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_blocks_get.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_dump.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_peerid.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_ping.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_query.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_rpc.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_rpc_addreplicator.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_rpc_p2pcollection.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_rpc_p2pcollection_add.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_rpc_p2pcollection_getall.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_rpc_p2pcollection_remove.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_rpc_replicator.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_rpc_replicator_delete.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_rpc_replicator_getall.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_rpc_replicator_set.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_schema.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_schema_add.md (100%) rename docs/{ => defradb}/references/cli/defradb_client_schema_patch.md (100%) rename docs/{ => defradb}/references/cli/defradb_init.md (100%) rename docs/{ => defradb}/references/cli/defradb_server-dump.md (100%) rename docs/{ => defradb}/references/cli/defradb_start.md (100%) rename docs/{ => defradb}/references/cli/defradb_version.md (100%) rename docs/{ => defradb}/references/query-specification/_category_.json (100%) rename docs/{ => defradb}/references/query-specification/aggregate-functions.md (100%) rename docs/{ => defradb}/references/query-specification/aliases.md (100%) rename docs/{ => defradb}/references/query-specification/collections.md (100%) rename docs/{ => defradb}/references/query-specification/database-api.md (100%) rename docs/{ => defradb}/references/query-specification/execution-flow.md (100%) rename docs/{ => defradb}/references/query-specification/filtering.md (100%) rename docs/{ => defradb}/references/query-specification/grouping.md (100%) rename docs/{ => defradb}/references/query-specification/limiting-and-pagination.md (100%) rename docs/{ => defradb}/references/query-specification/mutation-block.md (100%) rename docs/{ => defradb}/references/query-specification/query-block.md (100%) rename docs/{ => defradb}/references/query-specification/query-language-overview.md (100%) rename docs/{ => defradb}/references/query-specification/relationships.md (100%) rename docs/{ => defradb}/references/query-specification/sorting-and-ordering.md (100%) create mode 100644 docs/defradb/release notes/_category_.json create mode 100644 docs/defradb/release notes/v0.2.0.md create mode 100644 docs/defradb/release notes/v0.2.1.md create mode 100644 docs/defradb/release notes/v0.3.0.md create mode 100644 docs/defradb/release notes/v0.3.1.md create mode 100644 docs/defradb/release notes/v0.4.0.md create mode 100644 docs/defradb/release notes/v0.5.0.md create mode 100644 docs/defradb/release notes/v0.5.1.md create mode 100644 docs/defradb/release notes/v0.6.0.md create mode 100644 docs/defradb/release notes/v0.7.0.md create mode 100644 docs/defradb/release notes/v0.8.0.md create mode 100644 docs/defradb/release notes/v0.9.0.md create mode 100644 docs/orbis/getting-started.md delete mode 100644 docs/release-notes.md create mode 100644 docs/sourcehub/testnet/_category_.json create mode 100644 docs/sourcehub/testnet/join.md rename docs/{Testnet1.md => sourcehub/testnet/overview.md} (97%) diff --git a/docs/BSL-License.md b/docs/defradb/BSL-License.md similarity index 100% rename from docs/BSL-License.md rename to docs/defradb/BSL-License.md diff --git a/docs/concepts/_category_.json b/docs/defradb/concepts/_category_.json similarity index 100% rename from docs/concepts/_category_.json rename to docs/defradb/concepts/_category_.json diff --git a/docs/concepts/ipfs.md b/docs/defradb/concepts/ipfs.md similarity index 100% rename from docs/concepts/ipfs.md rename to docs/defradb/concepts/ipfs.md diff --git a/docs/concepts/libp2p.md b/docs/defradb/concepts/libp2p.md similarity index 100% rename from docs/concepts/libp2p.md rename to docs/defradb/concepts/libp2p.md diff --git a/docs/intro.md b/docs/defradb/getting-started.md similarity index 100% rename from docs/intro.md rename to docs/defradb/getting-started.md diff --git a/docs/guides/_category_.json b/docs/defradb/guides/_category_.json similarity index 100% rename from docs/guides/_category_.json rename to docs/defradb/guides/_category_.json diff --git a/docs/guides/deployment-guide.md b/docs/defradb/guides/deployment-guide.md similarity index 100% rename from docs/guides/deployment-guide.md rename to docs/defradb/guides/deployment-guide.md diff --git a/docs/guides/explain-systems.md b/docs/defradb/guides/explain-systems.md similarity index 100% rename from docs/guides/explain-systems.md rename to docs/defradb/guides/explain-systems.md diff --git a/docs/guides/merkle-crdt.md b/docs/defradb/guides/merkle-crdt.md similarity index 100% rename from docs/guides/merkle-crdt.md rename to docs/defradb/guides/merkle-crdt.md diff --git a/docs/guides/peer-to-peer.md b/docs/defradb/guides/peer-to-peer.md similarity index 100% rename from docs/guides/peer-to-peer.md rename to docs/defradb/guides/peer-to-peer.md diff --git a/docs/guides/schema-migration.md b/docs/defradb/guides/schema-migration.md similarity index 100% rename from docs/guides/schema-migration.md rename to docs/defradb/guides/schema-migration.md diff --git a/docs/guides/schema-relationship.md b/docs/defradb/guides/schema-relationship.md similarity index 100% rename from docs/guides/schema-relationship.md rename to docs/defradb/guides/schema-relationship.md diff --git a/docs/guides/time-traveling-queries.md b/docs/defradb/guides/time-traveling-queries.md similarity index 100% rename from docs/guides/time-traveling-queries.md rename to docs/defradb/guides/time-traveling-queries.md diff --git a/docs/references/_category_.json b/docs/defradb/references/_category_.json similarity index 100% rename from docs/references/_category_.json rename to docs/defradb/references/_category_.json diff --git a/docs/references/cli/_category_.json b/docs/defradb/references/cli/_category_.json similarity index 100% rename from docs/references/cli/_category_.json rename to docs/defradb/references/cli/_category_.json diff --git a/docs/references/cli/defradb.md b/docs/defradb/references/cli/defradb.md similarity index 100% rename from docs/references/cli/defradb.md rename to docs/defradb/references/cli/defradb.md diff --git a/docs/references/cli/defradb_client.md b/docs/defradb/references/cli/defradb_client.md similarity index 100% rename from docs/references/cli/defradb_client.md rename to docs/defradb/references/cli/defradb_client.md diff --git a/docs/references/cli/defradb_client_blocks.md b/docs/defradb/references/cli/defradb_client_blocks.md similarity index 100% rename from docs/references/cli/defradb_client_blocks.md rename to docs/defradb/references/cli/defradb_client_blocks.md diff --git a/docs/references/cli/defradb_client_blocks_get.md b/docs/defradb/references/cli/defradb_client_blocks_get.md similarity index 100% rename from docs/references/cli/defradb_client_blocks_get.md rename to docs/defradb/references/cli/defradb_client_blocks_get.md diff --git a/docs/references/cli/defradb_client_dump.md b/docs/defradb/references/cli/defradb_client_dump.md similarity index 100% rename from docs/references/cli/defradb_client_dump.md rename to docs/defradb/references/cli/defradb_client_dump.md diff --git a/docs/references/cli/defradb_client_peerid.md b/docs/defradb/references/cli/defradb_client_peerid.md similarity index 100% rename from docs/references/cli/defradb_client_peerid.md rename to docs/defradb/references/cli/defradb_client_peerid.md diff --git a/docs/references/cli/defradb_client_ping.md b/docs/defradb/references/cli/defradb_client_ping.md similarity index 100% rename from docs/references/cli/defradb_client_ping.md rename to docs/defradb/references/cli/defradb_client_ping.md diff --git a/docs/references/cli/defradb_client_query.md b/docs/defradb/references/cli/defradb_client_query.md similarity index 100% rename from docs/references/cli/defradb_client_query.md rename to docs/defradb/references/cli/defradb_client_query.md diff --git a/docs/references/cli/defradb_client_rpc.md b/docs/defradb/references/cli/defradb_client_rpc.md similarity index 100% rename from docs/references/cli/defradb_client_rpc.md rename to docs/defradb/references/cli/defradb_client_rpc.md diff --git a/docs/references/cli/defradb_client_rpc_addreplicator.md b/docs/defradb/references/cli/defradb_client_rpc_addreplicator.md similarity index 100% rename from docs/references/cli/defradb_client_rpc_addreplicator.md rename to docs/defradb/references/cli/defradb_client_rpc_addreplicator.md diff --git a/docs/references/cli/defradb_client_rpc_p2pcollection.md b/docs/defradb/references/cli/defradb_client_rpc_p2pcollection.md similarity index 100% rename from docs/references/cli/defradb_client_rpc_p2pcollection.md rename to docs/defradb/references/cli/defradb_client_rpc_p2pcollection.md diff --git a/docs/references/cli/defradb_client_rpc_p2pcollection_add.md b/docs/defradb/references/cli/defradb_client_rpc_p2pcollection_add.md similarity index 100% rename from docs/references/cli/defradb_client_rpc_p2pcollection_add.md rename to docs/defradb/references/cli/defradb_client_rpc_p2pcollection_add.md diff --git a/docs/references/cli/defradb_client_rpc_p2pcollection_getall.md b/docs/defradb/references/cli/defradb_client_rpc_p2pcollection_getall.md similarity index 100% rename from docs/references/cli/defradb_client_rpc_p2pcollection_getall.md rename to docs/defradb/references/cli/defradb_client_rpc_p2pcollection_getall.md diff --git a/docs/references/cli/defradb_client_rpc_p2pcollection_remove.md b/docs/defradb/references/cli/defradb_client_rpc_p2pcollection_remove.md similarity index 100% rename from docs/references/cli/defradb_client_rpc_p2pcollection_remove.md rename to docs/defradb/references/cli/defradb_client_rpc_p2pcollection_remove.md diff --git a/docs/references/cli/defradb_client_rpc_replicator.md b/docs/defradb/references/cli/defradb_client_rpc_replicator.md similarity index 100% rename from docs/references/cli/defradb_client_rpc_replicator.md rename to docs/defradb/references/cli/defradb_client_rpc_replicator.md diff --git a/docs/references/cli/defradb_client_rpc_replicator_delete.md b/docs/defradb/references/cli/defradb_client_rpc_replicator_delete.md similarity index 100% rename from docs/references/cli/defradb_client_rpc_replicator_delete.md rename to docs/defradb/references/cli/defradb_client_rpc_replicator_delete.md diff --git a/docs/references/cli/defradb_client_rpc_replicator_getall.md b/docs/defradb/references/cli/defradb_client_rpc_replicator_getall.md similarity index 100% rename from docs/references/cli/defradb_client_rpc_replicator_getall.md rename to docs/defradb/references/cli/defradb_client_rpc_replicator_getall.md diff --git a/docs/references/cli/defradb_client_rpc_replicator_set.md b/docs/defradb/references/cli/defradb_client_rpc_replicator_set.md similarity index 100% rename from docs/references/cli/defradb_client_rpc_replicator_set.md rename to docs/defradb/references/cli/defradb_client_rpc_replicator_set.md diff --git a/docs/references/cli/defradb_client_schema.md b/docs/defradb/references/cli/defradb_client_schema.md similarity index 100% rename from docs/references/cli/defradb_client_schema.md rename to docs/defradb/references/cli/defradb_client_schema.md diff --git a/docs/references/cli/defradb_client_schema_add.md b/docs/defradb/references/cli/defradb_client_schema_add.md similarity index 100% rename from docs/references/cli/defradb_client_schema_add.md rename to docs/defradb/references/cli/defradb_client_schema_add.md diff --git a/docs/references/cli/defradb_client_schema_patch.md b/docs/defradb/references/cli/defradb_client_schema_patch.md similarity index 100% rename from docs/references/cli/defradb_client_schema_patch.md rename to docs/defradb/references/cli/defradb_client_schema_patch.md diff --git a/docs/references/cli/defradb_init.md b/docs/defradb/references/cli/defradb_init.md similarity index 100% rename from docs/references/cli/defradb_init.md rename to docs/defradb/references/cli/defradb_init.md diff --git a/docs/references/cli/defradb_server-dump.md b/docs/defradb/references/cli/defradb_server-dump.md similarity index 100% rename from docs/references/cli/defradb_server-dump.md rename to docs/defradb/references/cli/defradb_server-dump.md diff --git a/docs/references/cli/defradb_start.md b/docs/defradb/references/cli/defradb_start.md similarity index 100% rename from docs/references/cli/defradb_start.md rename to docs/defradb/references/cli/defradb_start.md diff --git a/docs/references/cli/defradb_version.md b/docs/defradb/references/cli/defradb_version.md similarity index 100% rename from docs/references/cli/defradb_version.md rename to docs/defradb/references/cli/defradb_version.md diff --git a/docs/references/query-specification/_category_.json b/docs/defradb/references/query-specification/_category_.json similarity index 100% rename from docs/references/query-specification/_category_.json rename to docs/defradb/references/query-specification/_category_.json diff --git a/docs/references/query-specification/aggregate-functions.md b/docs/defradb/references/query-specification/aggregate-functions.md similarity index 100% rename from docs/references/query-specification/aggregate-functions.md rename to docs/defradb/references/query-specification/aggregate-functions.md diff --git a/docs/references/query-specification/aliases.md b/docs/defradb/references/query-specification/aliases.md similarity index 100% rename from docs/references/query-specification/aliases.md rename to docs/defradb/references/query-specification/aliases.md diff --git a/docs/references/query-specification/collections.md b/docs/defradb/references/query-specification/collections.md similarity index 100% rename from docs/references/query-specification/collections.md rename to docs/defradb/references/query-specification/collections.md diff --git a/docs/references/query-specification/database-api.md b/docs/defradb/references/query-specification/database-api.md similarity index 100% rename from docs/references/query-specification/database-api.md rename to docs/defradb/references/query-specification/database-api.md diff --git a/docs/references/query-specification/execution-flow.md b/docs/defradb/references/query-specification/execution-flow.md similarity index 100% rename from docs/references/query-specification/execution-flow.md rename to docs/defradb/references/query-specification/execution-flow.md diff --git a/docs/references/query-specification/filtering.md b/docs/defradb/references/query-specification/filtering.md similarity index 100% rename from docs/references/query-specification/filtering.md rename to docs/defradb/references/query-specification/filtering.md diff --git a/docs/references/query-specification/grouping.md b/docs/defradb/references/query-specification/grouping.md similarity index 100% rename from docs/references/query-specification/grouping.md rename to docs/defradb/references/query-specification/grouping.md diff --git a/docs/references/query-specification/limiting-and-pagination.md b/docs/defradb/references/query-specification/limiting-and-pagination.md similarity index 100% rename from docs/references/query-specification/limiting-and-pagination.md rename to docs/defradb/references/query-specification/limiting-and-pagination.md diff --git a/docs/references/query-specification/mutation-block.md b/docs/defradb/references/query-specification/mutation-block.md similarity index 100% rename from docs/references/query-specification/mutation-block.md rename to docs/defradb/references/query-specification/mutation-block.md diff --git a/docs/references/query-specification/query-block.md b/docs/defradb/references/query-specification/query-block.md similarity index 100% rename from docs/references/query-specification/query-block.md rename to docs/defradb/references/query-specification/query-block.md diff --git a/docs/references/query-specification/query-language-overview.md b/docs/defradb/references/query-specification/query-language-overview.md similarity index 100% rename from docs/references/query-specification/query-language-overview.md rename to docs/defradb/references/query-specification/query-language-overview.md diff --git a/docs/references/query-specification/relationships.md b/docs/defradb/references/query-specification/relationships.md similarity index 100% rename from docs/references/query-specification/relationships.md rename to docs/defradb/references/query-specification/relationships.md diff --git a/docs/references/query-specification/sorting-and-ordering.md b/docs/defradb/references/query-specification/sorting-and-ordering.md similarity index 100% rename from docs/references/query-specification/sorting-and-ordering.md rename to docs/defradb/references/query-specification/sorting-and-ordering.md diff --git a/docs/defradb/release notes/_category_.json b/docs/defradb/release notes/_category_.json new file mode 100644 index 0000000..40addbd --- /dev/null +++ b/docs/defradb/release notes/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Release Notes", + "position": 4 + } + \ No newline at end of file diff --git a/docs/defradb/release notes/v0.2.0.md b/docs/defradb/release notes/v0.2.0.md new file mode 100644 index 0000000..ae66bf9 --- /dev/null +++ b/docs/defradb/release notes/v0.2.0.md @@ -0,0 +1,86 @@ +--- +sidebar_position: 20 +--- + +# v0.2.0 + +> 2022-02-07 + +DefraDB v0.2 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +This release is jam-packed with new features and a small number of breaking changes. Read the full changelog for a detailed description. Most notable features include a new Peer-to-Peer (P2P) data synchronization system, an expanded query system to support GroupBy & Aggregate operations, and lastly TimeTraveling queries allowing to query previous states of a document. + +Much more than just that has been added to ensure we're building reliable software expected of any database, such as expanded test & benchmark suites, automated bug detection, performance gains, and more. + +This release does include a Breaking Change to existing v0.1 databases regarding the internal data model, which affects the "Content Identifiers" we use to generate DocKeys and VersionIDs. If you need help migrating an existing deployment, reach out at hello@source.network or join our Discord at https://discord.source.network. + +### Features + +* Added Peer-to-Peer networking data synchronization ([#177](https://github.com/sourcenetwork/defradb/issues/177)) +* TimeTraveling (History Traversing) query engine and doc fetcher ([#59](https://github.com/sourcenetwork/defradb/issues/59)) +* Add Document Deletion with a Key ([#150](https://github.com/sourcenetwork/defradb/issues/150)) +* Add support for sum aggregate ([#121](https://github.com/sourcenetwork/defradb/issues/121)) +* Add support for lwwr scalar arrays (full replace on update) ([#115](https://github.com/sourcenetwork/defradb/issues/115)) +* Add count aggregate support ([#102](https://github.com/sourcenetwork/defradb/issues/102)) +* Add support for named relationships ([#108](https://github.com/sourcenetwork/defradb/issues/108)) +* Add multi doc key lookup support ([#76](https://github.com/sourcenetwork/defradb/issues/76)) +* Add basic group by functionality ([#43](https://github.com/sourcenetwork/defradb/issues/43)) +* Update datastore packages to allow use of context ([#48](https://github.com/sourcenetwork/defradb/issues/48)) + +### Bug fixes + +* Only add join if aggregating child object collection ([#188](https://github.com/sourcenetwork/defradb/issues/188)) +* Handle errors generated during input object thunks ([#123](https://github.com/sourcenetwork/defradb/issues/123)) +* Remove new types from in-memory cache on generate error ([#122](https://github.com/sourcenetwork/defradb/issues/122)) +* Support relationships where both fields have the same name ([#109](https://github.com/sourcenetwork/defradb/issues/109)) +* Handle errors generated in fields thunk ([#66](https://github.com/sourcenetwork/defradb/issues/66)) +* Ensure OperationDefinition case has at least one selection([#24](https://github.com/sourcenetwork/defradb/pull/24)) +* Close datastore iterator on scan close ([#56](https://github.com/sourcenetwork/defradb/pull/56)) (resulted in a panic when using limit) +* Close superseded iterators before orphaning ([#56](https://github.com/sourcenetwork/defradb/pull/56)) (fixes a panic in the join code) +* Move discard to after error check ([#88](https://github.com/sourcenetwork/defradb/pull/88)) (did result in panic if transaction creation fails) +* Check for nil iterator before closing document fetcher ([#108](https://github.com/sourcenetwork/defradb/pull/108)) + +### Tooling +* Added benchmark suite ([#160](https://github.com/sourcenetwork/defradb/issues/160)) + +### Documentation + +* Correcting comment typos ([#142](https://github.com/sourcenetwork/defradb/issues/142)) +* Correcting README typos ([#140](https://github.com/sourcenetwork/defradb/issues/140)) + +### Testing + +* Add transaction integration tests ([#175](https://github.com/sourcenetwork/defradb/issues/175)) +* Allow running of tests using badger-file as well as IM options ([#128](https://github.com/sourcenetwork/defradb/issues/128)) +* Add test datastore selection support ([#88](https://github.com/sourcenetwork/defradb/issues/88)) + +### Refactoring + +* Datatype modification protection ([#138](https://github.com/sourcenetwork/defradb/issues/138)) +* Cleanup Linter Complaints and Setup Makefile ([#63](https://github.com/sourcenetwork/defradb/issues/63)) +* Rework document rendering to avoid data duplication and mutation ([#68](https://github.com/sourcenetwork/defradb/issues/68)) +* Remove dependency on concrete datastore implementations from db package ([#51](https://github.com/sourcenetwork/defradb/issues/51)) +* Remove all `errors.Wrap` and update them with `fmt.Errorf`. ([#41](https://github.com/sourcenetwork/defradb/issues/41)) +* Restructure integration tests to provide better visibility ([#15](https://github.com/sourcenetwork/defradb/pull/15)) +* Remove schemaless code branches ([#23](https://github.com/sourcenetwork/defradb/pull/23)) + +### Performance +* Add badger multi scan support ([#85](https://github.com/sourcenetwork/defradb/pull/85)) +* Add support for range spans ([#86](https://github.com/sourcenetwork/defradb/pull/86)) + +### Continous integration + +* Use more accurate test coverage. ([#134](https://github.com/sourcenetwork/defradb/issues/134)) +* Disable Codecov's Patch Check +* Make codcov less strict for now to unblock development ([#125](https://github.com/sourcenetwork/defradb/issues/125)) +* Add codecov config file. ([#118](https://github.com/sourcenetwork/defradb/issues/118)) +* Add workflow that runs a job on AWS EC2 instance. ([#110](https://github.com/sourcenetwork/defradb/issues/110)) +* Add Code Test Coverage with CodeCov ([#116](https://github.com/sourcenetwork/defradb/issues/116)) +* Integrate GitHub Action for golangci-lint Annotations ([#106](https://github.com/sourcenetwork/defradb/issues/106)) +* Add Linter Check to CircleCi ([#92](https://github.com/sourcenetwork/defradb/issues/92)) + +### Chore + +* Remove the S1038 rule of the gosimple linter. ([#129](https://github.com/sourcenetwork/defradb/issues/129)) +* Update to badger v3, and use badger as default in memory store ([#56](https://github.com/sourcenetwork/defradb/issues/56)) +* Make Cid versions consistent ([#57](https://github.com/sourcenetwork/defradb/issues/57)) \ No newline at end of file diff --git a/docs/defradb/release notes/v0.2.1.md b/docs/defradb/release notes/v0.2.1.md new file mode 100644 index 0000000..e72ea06 --- /dev/null +++ b/docs/defradb/release notes/v0.2.1.md @@ -0,0 +1,57 @@ +--- +sidebar_position: 21 +--- + +# v0.2.1 + +> 2022-03-04 + +### Features + +* Add ability to delete multiple documents using filter ([#206](https://github.com/sourcenetwork/defradb/issues/206)) +* Add ability to delete multiple documents, using multiple ids ([#196](https://github.com/sourcenetwork/defradb/issues/196)) + +### Fixes + +* Concurrency control of Document using RWMutex ([#213](https://github.com/sourcenetwork/defradb/issues/213)) +* Only log errors and above when benchmarking ([#261](https://github.com/sourcenetwork/defradb/issues/261)) +* Handle proper type conversion on sort nodes ([#228](https://github.com/sourcenetwork/defradb/issues/228)) +* Return empty array if no values found ([#223](https://github.com/sourcenetwork/defradb/issues/223)) +* Close fetcher on error ([#210](https://github.com/sourcenetwork/defradb/issues/210)) +* Installing binary using defradb name ([#190](https://github.com/sourcenetwork/defradb/issues/190)) + +### Tooling + +* Add short benchmark runner option ([#263](https://github.com/sourcenetwork/defradb/issues/263)) + +### Documentation + +* Add data format changes documentation folder ([#89](https://github.com/sourcenetwork/defradb/issues/89)) +* Correcting typos ([#143](https://github.com/sourcenetwork/defradb/issues/143)) +* Update generated CLI docs ([#208](https://github.com/sourcenetwork/defradb/issues/208)) +* Updated readme with P2P section ([#220](https://github.com/sourcenetwork/defradb/issues/220)) +* Update old or missing license headers ([#205](https://github.com/sourcenetwork/defradb/issues/205)) +* Update git-chglog config and template ([#195](https://github.com/sourcenetwork/defradb/issues/195)) + +### Refactoring + +* Introduction of logging system ([#67](https://github.com/sourcenetwork/defradb/issues/67)) +* Restructure db/txn/multistore structures ([#199](https://github.com/sourcenetwork/defradb/issues/199)) +* Initialize database in constructor ([#211](https://github.com/sourcenetwork/defradb/issues/211)) +* Purge all println and ban it ([#253](https://github.com/sourcenetwork/defradb/issues/253)) + +### Testing + +* Detect and force breaking filesystem changes to be documented ([#89](https://github.com/sourcenetwork/defradb/issues/89)) +* Boost collection test coverage ([#183](https://github.com/sourcenetwork/defradb/issues/183)) + +### Continuous integration + +* Combine the Lint and Benchmark workflows so that the benchmark job depends on the lint job in one workflow ([#209](https://github.com/sourcenetwork/defradb/issues/209)) +* Add rule to only run benchmark if other check are successful ([#194](https://github.com/sourcenetwork/defradb/issues/194)) +* Increase linter timeout ([#230](https://github.com/sourcenetwork/defradb/issues/230)) + +### Chore + +* Remove commented out code ([#238](https://github.com/sourcenetwork/defradb/issues/238)) +* Remove dead code from multi node ([#186](https://github.com/sourcenetwork/defradb/issues/186)) \ No newline at end of file diff --git a/docs/defradb/release notes/v0.3.0.md b/docs/defradb/release notes/v0.3.0.md new file mode 100644 index 0000000..01002c2 --- /dev/null +++ b/docs/defradb/release notes/v0.3.0.md @@ -0,0 +1,178 @@ +--- +sidebar_position: 30 +--- + +# v0.3.0 + +> 2022-08-02 + +DefraDB v0.3 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +There are *several* new features in this release, and we invite you to review the official changelog below. Some highlights are various new features for Grouping & Aggregation for the query system, like top-level aggregation and group filtering. Moreover, a brand new Query Explain system was added to introspect the execution plans created by DefraDB. Lastly we introduced a revamped CLI configuration system. + +This release does include a Breaking Change to existing v0.2.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. + +### Features + +* Add named config overrides ([#659](https://github.com/sourcenetwork/defradb/issues/659)) +* Expose color and caller log options, add validation ([#652](https://github.com/sourcenetwork/defradb/issues/652)) +* Add ability to explain `groupNode` and it's attribute(s). ([#641](https://github.com/sourcenetwork/defradb/issues/641)) +* Add primary directive for schema definitions ([@primary](https://github.com/primary)) ([#650](https://github.com/sourcenetwork/defradb/issues/650)) +* Add support for aggregate filters on inline arrays ([#622](https://github.com/sourcenetwork/defradb/issues/622)) +* Add explainable renderLimitNode & hardLimitNode attributes. ([#614](https://github.com/sourcenetwork/defradb/issues/614)) +* Add support for top level aggregates ([#594](https://github.com/sourcenetwork/defradb/issues/594)) +* Update `countNode` explanation to be consistent. ([#600](https://github.com/sourcenetwork/defradb/issues/600)) +* Add support for stdin as input in CLI ([#608](https://github.com/sourcenetwork/defradb/issues/608)) +* Explain `cid` & `field` attributes for `dagScanNode` ([#598](https://github.com/sourcenetwork/defradb/issues/598)) +* Add ability to explain `dagScanNode` attribute(s). ([#560](https://github.com/sourcenetwork/defradb/issues/560)) +* Add the ability to send user feedback to the console even when logging to file. ([#568](https://github.com/sourcenetwork/defradb/issues/568)) +* Add ability to explain `sortNode` attribute(s). ([#558](https://github.com/sourcenetwork/defradb/issues/558)) +* Add ability to explain `sumNode` attribute(s). ([#559](https://github.com/sourcenetwork/defradb/issues/559)) +* Introduce top-level config package ([#389](https://github.com/sourcenetwork/defradb/issues/389)) +* Add ability to explain `updateNode` attributes. ([#514](https://github.com/sourcenetwork/defradb/issues/514)) +* Add `typeIndexJoin` explainable attributes. ([#499](https://github.com/sourcenetwork/defradb/issues/499)) +* Add support to explain `countNode` attributes. ([#504](https://github.com/sourcenetwork/defradb/issues/504)) +* Add CORS capability to HTTP API ([#467](https://github.com/sourcenetwork/defradb/issues/467)) +* Add explaination of spans for `scanNode`. ([#492](https://github.com/sourcenetwork/defradb/issues/492)) +* Add ability to Explain the response plan. ([#385](https://github.com/sourcenetwork/defradb/issues/385)) +* Add aggregate filter support for groups only ([#426](https://github.com/sourcenetwork/defradb/issues/426)) +* Configurable caller option in logger ([#416](https://github.com/sourcenetwork/defradb/issues/416)) +* Add Average aggregate support ([#383](https://github.com/sourcenetwork/defradb/issues/383)) +* Allow summation of aggregates ([#341](https://github.com/sourcenetwork/defradb/issues/341)) +* Add ability to check DefraDB CLI version. ([#339](https://github.com/sourcenetwork/defradb/issues/339)) + +### Fixes + +* Add a check to ensure limit is not 0 when evaluating query limit and offset ([#706](https://github.com/sourcenetwork/defradb/issues/706)) +* Support multiple `--logger` flags ([#704](https://github.com/sourcenetwork/defradb/issues/704)) +* Return without an error if relation is finalized ([#698](https://github.com/sourcenetwork/defradb/issues/698)) +* Logger not correctly applying named config ([#696](https://github.com/sourcenetwork/defradb/issues/696)) +* Add content-type media type parsing ([#678](https://github.com/sourcenetwork/defradb/issues/678)) +* Remove portSyncLock deadlock condition ([#671](https://github.com/sourcenetwork/defradb/issues/671)) +* Silence cobra default errors and usage printing ([#668](https://github.com/sourcenetwork/defradb/issues/668)) +* Add stdout validation when setting logging output path ([#666](https://github.com/sourcenetwork/defradb/issues/666)) +* Consider `--logoutput` CLI flag properly ([#645](https://github.com/sourcenetwork/defradb/issues/645)) +* Handle errors and responses in CLI `client` commands ([#579](https://github.com/sourcenetwork/defradb/issues/579)) +* Rename aggregate gql types ([#638](https://github.com/sourcenetwork/defradb/issues/638)) +* Error when attempting to insert value into relationship field ([#632](https://github.com/sourcenetwork/defradb/issues/632)) +* Allow adding of new schema to database ([#635](https://github.com/sourcenetwork/defradb/issues/635)) +* Correctly parse dockey in broadcast log event. ([#631](https://github.com/sourcenetwork/defradb/issues/631)) +* Increase system's open files limit in integration tests ([#627](https://github.com/sourcenetwork/defradb/issues/627)) +* Avoid populating `order.ordering` with empties. ([#618](https://github.com/sourcenetwork/defradb/issues/618)) +* Change to supporting of non-null inline arrays ([#609](https://github.com/sourcenetwork/defradb/issues/609)) +* Assert fields exist in collection before saving to them ([#604](https://github.com/sourcenetwork/defradb/issues/604)) +* CLI `init` command to reinitialize only config file ([#603](https://github.com/sourcenetwork/defradb/issues/603)) +* Add config and registry clearing to TestLogWritesMessagesToFeedbackLog ([#596](https://github.com/sourcenetwork/defradb/issues/596)) +* Change `$eq` to `_eq` in the failing test. ([#576](https://github.com/sourcenetwork/defradb/issues/576)) +* Resolve failing HTTP API tests via cleanup ([#557](https://github.com/sourcenetwork/defradb/issues/557)) +* Ensure Makefile compatibility with macOS ([#527](https://github.com/sourcenetwork/defradb/issues/527)) +* Separate out iotas in their own blocks. ([#464](https://github.com/sourcenetwork/defradb/issues/464)) +* Use x/cases for titling instead of strings to handle deprecation ([#457](https://github.com/sourcenetwork/defradb/issues/457)) +* Handle limit and offset in sub groups ([#440](https://github.com/sourcenetwork/defradb/issues/440)) +* Issue preventing DB from restarting with no records ([#437](https://github.com/sourcenetwork/defradb/issues/437)) +* log serving HTTP API before goroutine blocks ([#358](https://github.com/sourcenetwork/defradb/issues/358)) + +### Testing + +* Add integration testing for P2P. ([#655](https://github.com/sourcenetwork/defradb/issues/655)) +* Fix formatting of tests with no extra brackets ([#643](https://github.com/sourcenetwork/defradb/issues/643)) +* Add tests for `averageNode` explain. ([#639](https://github.com/sourcenetwork/defradb/issues/639)) +* Add schema integration tests ([#628](https://github.com/sourcenetwork/defradb/issues/628)) +* Add tests for default properties ([#611](https://github.com/sourcenetwork/defradb/issues/611)) +* Specify which collection to update in test framework ([#601](https://github.com/sourcenetwork/defradb/issues/601)) +* Add tests for grouping by undefined value ([#543](https://github.com/sourcenetwork/defradb/issues/543)) +* Add test for querying undefined field ([#544](https://github.com/sourcenetwork/defradb/issues/544)) +* Expand commit query tests ([#541](https://github.com/sourcenetwork/defradb/issues/541)) +* Add cid (time-travel) query tests ([#539](https://github.com/sourcenetwork/defradb/issues/539)) +* Restructure and expand filter tests ([#512](https://github.com/sourcenetwork/defradb/issues/512)) +* Basic unit testing of `node` package ([#503](https://github.com/sourcenetwork/defradb/issues/503)) +* Test filter in filter tests ([#473](https://github.com/sourcenetwork/defradb/issues/473)) +* Add test for deletion of records in a relationship ([#329](https://github.com/sourcenetwork/defradb/issues/329)) +* Benchmark transaction iteration ([#289](https://github.com/sourcenetwork/defradb/issues/289)) + +### Refactoring + +* Improve CLI error handling and fix small issues ([#649](https://github.com/sourcenetwork/defradb/issues/649)) +* Add top-level `version` package ([#583](https://github.com/sourcenetwork/defradb/issues/583)) +* Remove extra log levels ([#634](https://github.com/sourcenetwork/defradb/issues/634)) +* Change `sortNode` to `orderNode`. ([#591](https://github.com/sourcenetwork/defradb/issues/591)) +* Rework update and delete node to remove secondary planner ([#571](https://github.com/sourcenetwork/defradb/issues/571)) +* Trim imported connor package ([#530](https://github.com/sourcenetwork/defradb/issues/530)) +* Internal doc restructure ([#471](https://github.com/sourcenetwork/defradb/issues/471)) +* Copy-paste connor fork into repo ([#567](https://github.com/sourcenetwork/defradb/issues/567)) +* Add safety to the tests, add ability to catch stderr logs and add output path validation ([#552](https://github.com/sourcenetwork/defradb/issues/552)) +* Change handler functions implementation and response formatting ([#498](https://github.com/sourcenetwork/defradb/issues/498)) +* Improve the HTTP API implementation ([#382](https://github.com/sourcenetwork/defradb/issues/382)) +* Use new logger in net/api ([#420](https://github.com/sourcenetwork/defradb/issues/420)) +* Rename NewCidV1_SHA2_256 to mixedCaps ([#415](https://github.com/sourcenetwork/defradb/issues/415)) +* Remove utils package ([#397](https://github.com/sourcenetwork/defradb/issues/397)) +* Rework planNode Next and Value(s) function ([#374](https://github.com/sourcenetwork/defradb/issues/374)) +* Restructure aggregate query syntax ([#373](https://github.com/sourcenetwork/defradb/issues/373)) +* Remove dead code from client package and document remaining ([#356](https://github.com/sourcenetwork/defradb/issues/356)) +* Restructure datastore keys ([#316](https://github.com/sourcenetwork/defradb/issues/316)) +* Add commits lost during github outage ([#303](https://github.com/sourcenetwork/defradb/issues/303)) +* Move public members out of core and base packages ([#295](https://github.com/sourcenetwork/defradb/issues/295)) +* Make db stuff internal/private ([#291](https://github.com/sourcenetwork/defradb/issues/291)) +* Rework client.DB to ensure interface contains only public types ([#277](https://github.com/sourcenetwork/defradb/issues/277)) +* Remove GetPrimaryIndexDocKey from collection interface ([#279](https://github.com/sourcenetwork/defradb/issues/279)) +* Remove DataStoreKey from (public) dockey struct ([#278](https://github.com/sourcenetwork/defradb/issues/278)) +* Renormalize to ensure consistent file line termination. ([#226](https://github.com/sourcenetwork/defradb/issues/226)) +* Strongly typed key refactor ([#17](https://github.com/sourcenetwork/defradb/issues/17)) + +### Documentation + +* Use permanent link to BSL license document ([#692](https://github.com/sourcenetwork/defradb/issues/692)) +* README update v0.3.0 ([#646](https://github.com/sourcenetwork/defradb/issues/646)) +* Improve code documentation ([#533](https://github.com/sourcenetwork/defradb/issues/533)) +* Add CONTRIBUTING.md ([#531](https://github.com/sourcenetwork/defradb/issues/531)) +* Add package level docs for logging lib ([#338](https://github.com/sourcenetwork/defradb/issues/338)) + +### Tooling + +* Include all touched packages in code coverage ([#673](https://github.com/sourcenetwork/defradb/issues/673)) +* Use `gotestsum` over `go test` ([#619](https://github.com/sourcenetwork/defradb/issues/619)) +* Update Github pull request template ([#524](https://github.com/sourcenetwork/defradb/issues/524)) +* Fix the cross-build script ([#460](https://github.com/sourcenetwork/defradb/issues/460)) +* Add test coverage html output ([#466](https://github.com/sourcenetwork/defradb/issues/466)) +* Add linter rule for `goconst`. ([#398](https://github.com/sourcenetwork/defradb/issues/398)) +* Add github PR template. ([#394](https://github.com/sourcenetwork/defradb/issues/394)) +* Disable auto-fixing linter issues by default ([#429](https://github.com/sourcenetwork/defradb/issues/429)) +* Fix linting of empty `else` code blocks ([#402](https://github.com/sourcenetwork/defradb/issues/402)) +* Add the `gofmt` linter rule. ([#405](https://github.com/sourcenetwork/defradb/issues/405)) +* Cleanup linter config file ([#400](https://github.com/sourcenetwork/defradb/issues/400)) +* Add linter rule for copyright headers ([#360](https://github.com/sourcenetwork/defradb/issues/360)) +* Organize our config files and tooling. ([#336](https://github.com/sourcenetwork/defradb/issues/336)) +* Limit line length to 100 characters (linter check) ([#224](https://github.com/sourcenetwork/defradb/issues/224)) +* Ignore db/tests folder and the bench marks. ([#280](https://github.com/sourcenetwork/defradb/issues/280)) + +### Continuous Integration + +* Fix circleci cache permission errors. ([#371](https://github.com/sourcenetwork/defradb/issues/371)) +* Ban extra elses ([#366](https://github.com/sourcenetwork/defradb/issues/366)) +* Fix change-detection to not fail when new tests are added. ([#333](https://github.com/sourcenetwork/defradb/issues/333)) +* Update golang-ci linter and explicit go-setup to use v1.17 ([#331](https://github.com/sourcenetwork/defradb/issues/331)) +* Comment the benchmarking result comparison to the PR ([#305](https://github.com/sourcenetwork/defradb/issues/305)) +* Add benchmark performance comparisons ([#232](https://github.com/sourcenetwork/defradb/issues/232)) +* Add caching / storing of bench report on default branch ([#290](https://github.com/sourcenetwork/defradb/issues/290)) +* Ensure full-benchmarks are ran on a PR-merge. ([#282](https://github.com/sourcenetwork/defradb/issues/282)) +* Add ability to control benchmarks by PR labels. ([#267](https://github.com/sourcenetwork/defradb/issues/267)) + +### Chore + +* Update APL to refer to D2 Foundation ([#711](https://github.com/sourcenetwork/defradb/issues/711)) +* Update gitignore to include `cmd` folders ([#617](https://github.com/sourcenetwork/defradb/issues/617)) +* Enable random execution order of tests ([#554](https://github.com/sourcenetwork/defradb/issues/554)) +* Enable linters exportloopref, nolintlint, whitespace ([#535](https://github.com/sourcenetwork/defradb/issues/535)) +* Add utility for generation of man pages ([#493](https://github.com/sourcenetwork/defradb/issues/493)) +* Add Dockerfile ([#517](https://github.com/sourcenetwork/defradb/issues/517)) +* Enable errorlint linter ([#520](https://github.com/sourcenetwork/defradb/issues/520)) +* Binaries in`cmd` folder, examples in `examples` folder ([#501](https://github.com/sourcenetwork/defradb/issues/501)) +* Improve log outputs ([#506](https://github.com/sourcenetwork/defradb/issues/506)) +* Move testing to top-level `tests` folder ([#446](https://github.com/sourcenetwork/defradb/issues/446)) +* Update dependencies ([#450](https://github.com/sourcenetwork/defradb/issues/450)) +* Update go-ipfs-blockstore and ipfs-lite ([#436](https://github.com/sourcenetwork/defradb/issues/436)) +* Update libp2p dependency to v0.19 ([#424](https://github.com/sourcenetwork/defradb/issues/424)) +* Update ioutil package to io / os packages. ([#376](https://github.com/sourcenetwork/defradb/issues/376)) +* git ignore vscode ([#343](https://github.com/sourcenetwork/defradb/issues/343)) +* Updated README.md contributors section ([#292](https://github.com/sourcenetwork/defradb/issues/292)) +* Update changelog v0.2.1 ([#252](https://github.com/sourcenetwork/defradb/issues/252)) \ No newline at end of file diff --git a/docs/defradb/release notes/v0.3.1.md b/docs/defradb/release notes/v0.3.1.md new file mode 100644 index 0000000..1d54ada --- /dev/null +++ b/docs/defradb/release notes/v0.3.1.md @@ -0,0 +1,94 @@ +--- +sidebar_position: 31 +--- +# v0.3.1 + +> 2022-09-23 + +DefraDB v0.3.1 is a minor release, primarily focusing on additional/extended features and fixes of items added in the `v0.3.0` release. + +### Features + +* Add cid support for allCommits ([#857](https://github.com/sourcenetwork/defradb/issues/857)) +* Add offset support to allCommits ([#859](https://github.com/sourcenetwork/defradb/issues/859)) +* Add limit support to allCommits query ([#856](https://github.com/sourcenetwork/defradb/issues/856)) +* Add order support to allCommits ([#845](https://github.com/sourcenetwork/defradb/issues/845)) +* Display CLI usage on user error ([#819](https://github.com/sourcenetwork/defradb/issues/819)) +* Add support for dockey filters in child joins ([#806](https://github.com/sourcenetwork/defradb/issues/806)) +* Add sort support for numeric aggregates ([#786](https://github.com/sourcenetwork/defradb/issues/786)) +* Allow filtering by nil ([#789](https://github.com/sourcenetwork/defradb/issues/789)) +* Add aggregate offset support ([#778](https://github.com/sourcenetwork/defradb/issues/778)) +* Remove filter depth limit ([#777](https://github.com/sourcenetwork/defradb/issues/777)) +* Add support for and-or inline array aggregate filters ([#779](https://github.com/sourcenetwork/defradb/issues/779)) +* Add limit support for aggregates ([#771](https://github.com/sourcenetwork/defradb/issues/771)) +* Add support for inline arrays of nillable types ([#759](https://github.com/sourcenetwork/defradb/issues/759)) +* Create errors package ([#548](https://github.com/sourcenetwork/defradb/issues/548)) +* Add ability to display peer id ([#719](https://github.com/sourcenetwork/defradb/issues/719)) +* Add a config option to set the vlog max file size ([#743](https://github.com/sourcenetwork/defradb/issues/743)) +* Explain `topLevelNode` like a `MultiNode` plan ([#749](https://github.com/sourcenetwork/defradb/issues/749)) +* Make `topLevelNode` explainable ([#737](https://github.com/sourcenetwork/defradb/issues/737)) + +### Fixes + +* Order subtype without selecting the join child ([#810](https://github.com/sourcenetwork/defradb/issues/810)) +* Correctly handles nil one-one joins ([#837](https://github.com/sourcenetwork/defradb/issues/837)) +* Reset scan node for each join ([#828](https://github.com/sourcenetwork/defradb/issues/828)) +* Handle filter input field argument being nil ([#787](https://github.com/sourcenetwork/defradb/issues/787)) +* Ensure CLI outputs JSON to stdout when directed to pipe ([#804](https://github.com/sourcenetwork/defradb/issues/804)) +* Error if given the wrong side of a one-one relationship ([#795](https://github.com/sourcenetwork/defradb/issues/795)) +* Add object marker to enable return of empty docs ([#800](https://github.com/sourcenetwork/defradb/issues/800)) +* Resolve the extra `typeIndexJoin`s for `_avg` aggregate ([#774](https://github.com/sourcenetwork/defradb/issues/774)) +* Remove _like filter operator ([#797](https://github.com/sourcenetwork/defradb/issues/797)) +* Remove having gql types ([#785](https://github.com/sourcenetwork/defradb/issues/785)) +* Error if child _group selected without parent groupBy ([#781](https://github.com/sourcenetwork/defradb/issues/781)) +* Error nicely on missing field specifier ([#782](https://github.com/sourcenetwork/defradb/issues/782)) +* Handle order input field argument being nil ([#701](https://github.com/sourcenetwork/defradb/issues/701)) +* Change output to outputpath in config file template for logger ([#716](https://github.com/sourcenetwork/defradb/issues/716)) +* Delete mutations not correct persisting all keys ([#731](https://github.com/sourcenetwork/defradb/issues/731)) + +### Tooling + +* Ban the usage of `ioutil` package ([#747](https://github.com/sourcenetwork/defradb/issues/747)) +* Migrate from CircleCi to GitHub Actions ([#679](https://github.com/sourcenetwork/defradb/issues/679)) + +### Documentation + +* Clarify meaning of url param, update in-repo CLI docs ([#814](https://github.com/sourcenetwork/defradb/issues/814)) +* Disclaimer of exposed to network and not encrypted ([#793](https://github.com/sourcenetwork/defradb/issues/793)) +* Update logo to respect theme ([#728](https://github.com/sourcenetwork/defradb/issues/728)) + +### Refactoring + +* Replace all `interface{}` with `any` alias ([#805](https://github.com/sourcenetwork/defradb/issues/805)) +* Use fastjson to parse mutation data string ([#772](https://github.com/sourcenetwork/defradb/issues/772)) +* Rework limit node flow ([#767](https://github.com/sourcenetwork/defradb/issues/767)) +* Make Option immutable ([#769](https://github.com/sourcenetwork/defradb/issues/769)) +* Rework sum and count nodes to make use of generics ([#757](https://github.com/sourcenetwork/defradb/issues/757)) +* Remove some possible panics from codebase ([#732](https://github.com/sourcenetwork/defradb/issues/732)) +* Change logging calls to use feedback in CLI package ([#714](https://github.com/sourcenetwork/defradb/issues/714)) + +### Testing + +* Add tests for aggs with nil filters ([#813](https://github.com/sourcenetwork/defradb/issues/813)) +* Add not equals filter tests ([#798](https://github.com/sourcenetwork/defradb/issues/798)) +* Fix `cli/peerid_test` to not clash addresses ([#766](https://github.com/sourcenetwork/defradb/issues/766)) +* Add change detector summary to test readme ([#754](https://github.com/sourcenetwork/defradb/issues/754)) +* Add tests for inline array grouping ([#752](https://github.com/sourcenetwork/defradb/issues/752)) + +### Continuous integration + +* Reduce test resource usage and test with file db ([#791](https://github.com/sourcenetwork/defradb/issues/791)) +* Add makefile target to verify the local module cache ([#775](https://github.com/sourcenetwork/defradb/issues/775)) +* Allow PR titles to end with a number ([#745](https://github.com/sourcenetwork/defradb/issues/745)) +* Add a workflow to validate pull request titles ([#734](https://github.com/sourcenetwork/defradb/issues/734)) +* Fix the linter version to `v1.47` ([#726](https://github.com/sourcenetwork/defradb/issues/726)) + +### Chore + +* Remove file system paths from resulting executable ([#831](https://github.com/sourcenetwork/defradb/issues/831)) +* Add goimports linter for consistent imports ordering ([#816](https://github.com/sourcenetwork/defradb/issues/816)) +* Improve UX by providing more information ([#802](https://github.com/sourcenetwork/defradb/issues/802)) +* Change to defra errors and handle errors stacktrace ([#794](https://github.com/sourcenetwork/defradb/issues/794)) +* Clean up `go.mod` with pruned module graphs ([#756](https://github.com/sourcenetwork/defradb/issues/756)) +* Update to v0.20.3 of libp2p ([#740](https://github.com/sourcenetwork/defradb/issues/740)) +* Bump to GoLang `v1.18` ([#721](https://github.com/sourcenetwork/defradb/issues/721)) \ No newline at end of file diff --git a/docs/defradb/release notes/v0.4.0.md b/docs/defradb/release notes/v0.4.0.md new file mode 100644 index 0000000..24ec532 --- /dev/null +++ b/docs/defradb/release notes/v0.4.0.md @@ -0,0 +1,80 @@ +--- +sidebar_position: 40 +--- + +# v0.4.0 + +> 2023-12-23 + +DefraDB v0.4 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +There are various new features in this release - some of which are breaking - and we invite you to review the official changelog below. Some highlights are persistence of replicators, DateTime scalars, TLS support, and GQL subscriptions. + +This release does include a Breaking Change to existing v0.3.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. + +### Features + +* Add basic metric functionality ([#971](https://github.com/sourcenetwork/defradb/issues/971)) +* Add thread safe transactional in-memory datastore ([#947](https://github.com/sourcenetwork/defradb/issues/947)) +* Persist p2p replicators ([#960](https://github.com/sourcenetwork/defradb/issues/960)) +* Add DateTime custom scalars ([#931](https://github.com/sourcenetwork/defradb/issues/931)) +* Add GraphQL subscriptions ([#934](https://github.com/sourcenetwork/defradb/issues/934)) +* Add support for tls ([#885](https://github.com/sourcenetwork/defradb/issues/885)) +* Add group by support for commits ([#887](https://github.com/sourcenetwork/defradb/issues/887)) +* Add depth support for commits ([#889](https://github.com/sourcenetwork/defradb/issues/889)) +* Make dockey optional for allCommits queries ([#847](https://github.com/sourcenetwork/defradb/issues/847)) +* Add WithStack to the errors package ([#870](https://github.com/sourcenetwork/defradb/issues/870)) +* Add event system ([#834](https://github.com/sourcenetwork/defradb/issues/834)) + +### Fixes + +* Correct errors.WithStack behaviour ([#984](https://github.com/sourcenetwork/defradb/issues/984)) +* Correctly handle nested one to one joins ([#964](https://github.com/sourcenetwork/defradb/issues/964)) +* Do not assume parent record exists when joining ([#963](https://github.com/sourcenetwork/defradb/issues/963)) +* Change time format for HTTP API log ([#910](https://github.com/sourcenetwork/defradb/issues/910)) +* Error if group select contains non-group-by fields ([#898](https://github.com/sourcenetwork/defradb/issues/898)) +* Add inspection of values for ENV flags ([#900](https://github.com/sourcenetwork/defradb/issues/900)) +* Remove panics from document ([#881](https://github.com/sourcenetwork/defradb/issues/881)) +* Add __typename support ([#871](https://github.com/sourcenetwork/defradb/issues/871)) +* Handle subscriber close ([#877](https://github.com/sourcenetwork/defradb/issues/877)) +* Publish update events post commit ([#866](https://github.com/sourcenetwork/defradb/issues/866)) + +### Refactoring + +* Make rootstore require Batching and TxnDatastore ([#940](https://github.com/sourcenetwork/defradb/issues/940)) +* Conceptually clarify schema vs query-language ([#924](https://github.com/sourcenetwork/defradb/issues/924)) +* Decouple db.db from gql ([#912](https://github.com/sourcenetwork/defradb/issues/912)) +* Merkle clock heads cleanup ([#918](https://github.com/sourcenetwork/defradb/issues/918)) +* Simplify dag fetcher ([#913](https://github.com/sourcenetwork/defradb/issues/913)) +* Cleanup parsing logic ([#909](https://github.com/sourcenetwork/defradb/issues/909)) +* Move planner outside the gql directory ([#907](https://github.com/sourcenetwork/defradb/issues/907)) +* Refactor commit nodes ([#892](https://github.com/sourcenetwork/defradb/issues/892)) +* Make latest commits syntax sugar ([#890](https://github.com/sourcenetwork/defradb/issues/890)) +* Remove commit query ([#841](https://github.com/sourcenetwork/defradb/issues/841)) + +### Testing + +* Add event tests ([#965](https://github.com/sourcenetwork/defradb/issues/965)) +* Add new setup for testing explain functionality ([#949](https://github.com/sourcenetwork/defradb/issues/949)) +* Add txn relation-type delete and create tests ([#875](https://github.com/sourcenetwork/defradb/issues/875)) +* Skip change detection for tests that assert panic ([#883](https://github.com/sourcenetwork/defradb/issues/883)) + +### Continuous integration + +* Bump all gh-action versions to support node16 ([#990](https://github.com/sourcenetwork/defradb/issues/990)) +* Bump ssh-agent action to v0.7.0 ([#978](https://github.com/sourcenetwork/defradb/issues/978)) +* Add error message format check ([#901](https://github.com/sourcenetwork/defradb/issues/901)) + +### Chore + +* Extract (events, merkle) errors to errors.go ([#973](https://github.com/sourcenetwork/defradb/issues/973)) +* Extract (datastore, db) errors to errors.go ([#969](https://github.com/sourcenetwork/defradb/issues/969)) +* Extract (connor, crdt, core) errors to errors.go ([#968](https://github.com/sourcenetwork/defradb/issues/968)) +* Extract inline (http and client) errors to errors.go ([#967](https://github.com/sourcenetwork/defradb/issues/967)) +* Update badger version ([#966](https://github.com/sourcenetwork/defradb/issues/966)) +* Move Option and Enumerable to immutables ([#939](https://github.com/sourcenetwork/defradb/issues/939)) +* Add configuration of external loggers ([#942](https://github.com/sourcenetwork/defradb/issues/942)) +* Strip DSKey prefixes and simplify NewDataStoreKey ([#944](https://github.com/sourcenetwork/defradb/issues/944)) +* Include version metadata in cross-building ([#930](https://github.com/sourcenetwork/defradb/issues/930)) +* Update to v0.23.2 the libP2P package ([#908](https://github.com/sourcenetwork/defradb/issues/908)) +* Remove `ipfslite` dependency ([#739](https://github.com/sourcenetwork/defradb/issues/739)) \ No newline at end of file diff --git a/docs/defradb/release notes/v0.5.0.md b/docs/defradb/release notes/v0.5.0.md new file mode 100644 index 0000000..7a3154f --- /dev/null +++ b/docs/defradb/release notes/v0.5.0.md @@ -0,0 +1,144 @@ +--- +sidebar_position: 50 +--- + +# v0.5.0 + +> 2023-04-12 + +DefraDB v0.5 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +There many new features in this release, but most importantly, this is the first open source release for DefraDB. As such, this release focused on various quality of life changes and refactors, bug fixes, and overall cleanliness of the repo so it can effectively be used and tested in the public domain. + +To get a full outline of the changes, we invite you to review the official changelog below. Some highlights are the first iteration of our schema update system, allowing developers to add new fields to schemas using our JSON Patch based DDL, a new DAG based delete system which will persist "soft-delete" ops into the CRDT Merkle DAG, and a early prototype for our collection level peer-to-peer synchronization. + +This release does include a Breaking Change to existing v0.4.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. + +### Features + +* Add document delete mechanics ([#1263](https://github.com/sourcenetwork/defradb/issues/1263)) +* Ability to explain an executed request ([#1188](https://github.com/sourcenetwork/defradb/issues/1188)) +* Add SchemaPatch CLI command ([#1250](https://github.com/sourcenetwork/defradb/issues/1250)) +* Add support for one-one mutation from sec. side ([#1247](https://github.com/sourcenetwork/defradb/issues/1247)) +* Store only key in DAG instead of dockey path ([#1245](https://github.com/sourcenetwork/defradb/issues/1245)) +* Add collectionId field to commit field ([#1235](https://github.com/sourcenetwork/defradb/issues/1235)) +* Add field kind substitution for PatchSchema ([#1223](https://github.com/sourcenetwork/defradb/issues/1223)) +* Add dockey field for commit field ([#1216](https://github.com/sourcenetwork/defradb/issues/1216)) +* Allow new fields to be added locally to schema ([#1139](https://github.com/sourcenetwork/defradb/issues/1139)) +* Add `like` sub-string filter ([#1091](https://github.com/sourcenetwork/defradb/issues/1091)) +* Add ability for P2P to wait for pushlog by peer ([#1098](https://github.com/sourcenetwork/defradb/issues/1098)) +* Add P2P collection topic subscription ([#1086](https://github.com/sourcenetwork/defradb/issues/1086)) +* Add support for schema version id in queries ([#1067](https://github.com/sourcenetwork/defradb/issues/1067)) +* Add schema version id to commit queries ([#1061](https://github.com/sourcenetwork/defradb/issues/1061)) +* Persist schema version at time of commit ([#1055](https://github.com/sourcenetwork/defradb/issues/1055)) +* Add ability to input simple explain type arg ([#1039](https://github.com/sourcenetwork/defradb/issues/1039)) + +### Fixes + +* API address parameter validation ([#1311](https://github.com/sourcenetwork/defradb/issues/1311)) +* Improve error message for NonNull GQL types ([#1333](https://github.com/sourcenetwork/defradb/issues/1333)) +* Handle panics in the rpc server ([#1330](https://github.com/sourcenetwork/defradb/issues/1330)) +* Handle returned error in select.go ([#1329](https://github.com/sourcenetwork/defradb/issues/1329)) +* Resolve handful of CLI issues ([#1318](https://github.com/sourcenetwork/defradb/issues/1318)) +* Only check for events queue on subscription request ([#1326](https://github.com/sourcenetwork/defradb/issues/1326)) +* Remove client Create/UpdateCollection ([#1309](https://github.com/sourcenetwork/defradb/issues/1309)) +* CLI to display specific command usage help ([#1314](https://github.com/sourcenetwork/defradb/issues/1314)) +* Fix P2P collection CLI commands ([#1295](https://github.com/sourcenetwork/defradb/issues/1295)) +* Dont double up badger file path ([#1299](https://github.com/sourcenetwork/defradb/issues/1299)) +* Update immutable package ([#1290](https://github.com/sourcenetwork/defradb/issues/1290)) +* Fix panic on success of Add/RemoveP2PCollections ([#1297](https://github.com/sourcenetwork/defradb/issues/1297)) +* Fix deadlock on memory-datastore Close ([#1273](https://github.com/sourcenetwork/defradb/issues/1273)) +* Determine if query is introspection query ([#1255](https://github.com/sourcenetwork/defradb/issues/1255)) +* Allow newly added fields to sync via p2p ([#1226](https://github.com/sourcenetwork/defradb/issues/1226)) +* Expose `ExplainEnum` in the GQL schema ([#1204](https://github.com/sourcenetwork/defradb/issues/1204)) +* Resolve aggregates' mapping with deep nested subtypes ([#1175](https://github.com/sourcenetwork/defradb/issues/1175)) +* Make sort stable and handle nil comparison ([#1094](https://github.com/sourcenetwork/defradb/issues/1094)) +* Change successful schema add status to 200 ([#1106](https://github.com/sourcenetwork/defradb/issues/1106)) +* Add delay in P2P test util execution ([#1093](https://github.com/sourcenetwork/defradb/issues/1093)) +* Ensure errors test don't hard expect folder name ([#1072](https://github.com/sourcenetwork/defradb/issues/1072)) +* Remove potential P2P deadlock ([#1056](https://github.com/sourcenetwork/defradb/issues/1056)) +* Rework the P2P integration tests ([#989](https://github.com/sourcenetwork/defradb/issues/989)) +* Improve DAG sync with highly concurrent updates ([#1031](https://github.com/sourcenetwork/defradb/issues/1031)) + +### Documentation + +* Update docs for the v0.5 release ([#1320](https://github.com/sourcenetwork/defradb/issues/1320)) +* Document client interfaces in client/db.go ([#1305](https://github.com/sourcenetwork/defradb/issues/1305)) +* Document client Description types ([#1307](https://github.com/sourcenetwork/defradb/issues/1307)) +* Improve security policy ([#1240](https://github.com/sourcenetwork/defradb/issues/1240)) +* Add security disclosure policy ([#1194](https://github.com/sourcenetwork/defradb/issues/1194)) +* Correct commits query example in readme ([#1172](https://github.com/sourcenetwork/defradb/issues/1172)) + +### Refactoring + +* Improve p2p collection operations on peer ([#1286](https://github.com/sourcenetwork/defradb/issues/1286)) +* Migrate gql introspection tests to new framework ([#1211](https://github.com/sourcenetwork/defradb/issues/1211)) +* Reorganise client transaction related interfaces ([#1180](https://github.com/sourcenetwork/defradb/issues/1180)) +* Config-local viper, rootdir, and logger parsing ([#1132](https://github.com/sourcenetwork/defradb/issues/1132)) +* Migrate mutation-relation tests to new framework ([#1109](https://github.com/sourcenetwork/defradb/issues/1109)) +* Rework integration test framework ([#1089](https://github.com/sourcenetwork/defradb/issues/1089)) +* Generate gql types using col. desc ([#1080](https://github.com/sourcenetwork/defradb/issues/1080)) +* Extract config errors to dedicated file ([#1107](https://github.com/sourcenetwork/defradb/issues/1107)) +* Change terminology from query to request ([#1054](https://github.com/sourcenetwork/defradb/issues/1054)) +* Allow db keys to handle multiple schema versions ([#1026](https://github.com/sourcenetwork/defradb/issues/1026)) +* Extract query schema errors to dedicated file ([#1037](https://github.com/sourcenetwork/defradb/issues/1037)) +* Extract planner errors to dedicated file ([#1034](https://github.com/sourcenetwork/defradb/issues/1034)) +* Extract query parser errors to dedicated file ([#1035](https://github.com/sourcenetwork/defradb/issues/1035)) + +### Testing + +* Remove test reference to DEFRA_ROOTDIR env var ([#1328](https://github.com/sourcenetwork/defradb/issues/1328)) +* Expand tests for Peer subscribe actions ([#1287](https://github.com/sourcenetwork/defradb/issues/1287)) +* Fix flaky TestCloseThroughContext test ([#1265](https://github.com/sourcenetwork/defradb/issues/1265)) +* Add gql introspection tests for patch schema ([#1219](https://github.com/sourcenetwork/defradb/issues/1219)) +* Explicitly state change detector split for test ([#1228](https://github.com/sourcenetwork/defradb/issues/1228)) +* Add test for successful one-one create mutation ([#1215](https://github.com/sourcenetwork/defradb/issues/1215)) +* Ensure that all databases are always closed on exit ([#1187](https://github.com/sourcenetwork/defradb/issues/1187)) +* Add P2P tests for Schema Update adding field ([#1182](https://github.com/sourcenetwork/defradb/issues/1182)) +* Migrate P2P/state tests to new framework ([#1160](https://github.com/sourcenetwork/defradb/issues/1160)) +* Remove sleep from subscription tests ([#1156](https://github.com/sourcenetwork/defradb/issues/1156)) +* Fetch documents on test execution start ([#1163](https://github.com/sourcenetwork/defradb/issues/1163)) +* Introduce basic testing for the `version` module ([#1111](https://github.com/sourcenetwork/defradb/issues/1111)) +* Boost test coverage for collection_update ([#1050](https://github.com/sourcenetwork/defradb/issues/1050)) +* Wait between P2P update retry attempts ([#1052](https://github.com/sourcenetwork/defradb/issues/1052)) +* Exclude auto-generated protobuf files from codecov ([#1048](https://github.com/sourcenetwork/defradb/issues/1048)) +* Add P2P tests for relational docs ([#1042](https://github.com/sourcenetwork/defradb/issues/1042)) + +### Continuous integration + +* Add workflow that builds DefraDB AMI upon tag push ([#1304](https://github.com/sourcenetwork/defradb/issues/1304)) +* Allow PR title to end with a capital letter ([#1291](https://github.com/sourcenetwork/defradb/issues/1291)) +* Changes for `dependabot` to be well-behaved ([#1165](https://github.com/sourcenetwork/defradb/issues/1165)) +* Skip benchmarks for dependabot ([#1144](https://github.com/sourcenetwork/defradb/issues/1144)) +* Add workflow to ensure deps build properly ([#1078](https://github.com/sourcenetwork/defradb/issues/1078)) +* Runner and Builder Containerfiles ([#951](https://github.com/sourcenetwork/defradb/issues/951)) +* Fix go-header linter rule to be any year ([#1021](https://github.com/sourcenetwork/defradb/issues/1021)) + +### Chore + +* Add Islam as contributor ([#1302](https://github.com/sourcenetwork/defradb/issues/1302)) +* Update go-libp2p to 0.26.4 ([#1257](https://github.com/sourcenetwork/defradb/issues/1257)) +* Improve the test coverage of datastore ([#1203](https://github.com/sourcenetwork/defradb/issues/1203)) +* Add issue and discussion templates ([#1193](https://github.com/sourcenetwork/defradb/issues/1193)) +* Bump libp2p/go-libp2p-kad-dht from 0.21.0 to 0.21.1 ([#1146](https://github.com/sourcenetwork/defradb/issues/1146)) +* Enable dependabot ([#1120](https://github.com/sourcenetwork/defradb/issues/1120)) +* Update `opentelemetry` dependencies ([#1114](https://github.com/sourcenetwork/defradb/issues/1114)) +* Update dependencies including go-ipfs ([#1112](https://github.com/sourcenetwork/defradb/issues/1112)) +* Bump to GoLang v1.19 ([#818](https://github.com/sourcenetwork/defradb/issues/818)) +* Remove versionedScan node ([#1049](https://github.com/sourcenetwork/defradb/issues/1049)) + +### Bot + +* Bump github.com/multiformats/go-multiaddr from 0.8.0 to 0.9.0 ([#1277](https://github.com/sourcenetwork/defradb/issues/1277)) +* Bump google.golang.org/grpc from 1.53.0 to 1.54.0 ([#1233](https://github.com/sourcenetwork/defradb/issues/1233)) +* Bump github.com/multiformats/go-multibase from 0.1.1 to 0.2.0 ([#1230](https://github.com/sourcenetwork/defradb/issues/1230)) +* Bump github.com/ipfs/go-libipfs from 0.6.2 to 0.7.0 ([#1231](https://github.com/sourcenetwork/defradb/issues/1231)) +* Bump github.com/ipfs/go-cid from 0.3.2 to 0.4.0 ([#1200](https://github.com/sourcenetwork/defradb/issues/1200)) +* Bump github.com/ipfs/go-ipfs-blockstore from 1.2.0 to 1.3.0 ([#1199](https://github.com/sourcenetwork/defradb/issues/1199)) +* Bump github.com/stretchr/testify from 1.8.1 to 1.8.2 ([#1198](https://github.com/sourcenetwork/defradb/issues/1198)) +* Bump github.com/ipfs/go-libipfs from 0.6.1 to 0.6.2 ([#1201](https://github.com/sourcenetwork/defradb/issues/1201)) +* Bump golang.org/x/crypto from 0.6.0 to 0.7.0 ([#1197](https://github.com/sourcenetwork/defradb/issues/1197)) +* Bump libp2p/go-libp2p-gostream from 0.5.0 to 0.6.0 ([#1152](https://github.com/sourcenetwork/defradb/issues/1152)) +* Bump github.com/ipfs/go-libipfs from 0.5.0 to 0.6.1 ([#1166](https://github.com/sourcenetwork/defradb/issues/1166)) +* Bump github.com/ugorji/go/codec from 1.2.9 to 1.2.11 ([#1173](https://github.com/sourcenetwork/defradb/issues/1173)) +* Bump github.com/libp2p/go-libp2p-pubsub from 0.9.0 to 0.9.3 ([#1183](https://github.com/sourcenetwork/defradb/issues/1183)) \ No newline at end of file diff --git a/docs/defradb/release notes/v0.5.1.md b/docs/defradb/release notes/v0.5.1.md new file mode 100644 index 0000000..f204c56 --- /dev/null +++ b/docs/defradb/release notes/v0.5.1.md @@ -0,0 +1,91 @@ +--- +sidebar_position: 51 +--- + +# v0.5.1 + +> 2023-05-16 + +### Features + +* Add collection response information on creation ([#1499](https://github.com/sourcenetwork/defradb/issues/1499)) +* CLI client request from file ([#1503](https://github.com/sourcenetwork/defradb/issues/1503)) +* Add commits fieldName and fieldId fields ([#1451](https://github.com/sourcenetwork/defradb/issues/1451)) +* Add allowed origins config ([#1408](https://github.com/sourcenetwork/defradb/issues/1408)) +* Add descriptions to all system defined GQL stuff ([#1387](https://github.com/sourcenetwork/defradb/issues/1387)) +* Strongly type Request.Errors ([#1364](https://github.com/sourcenetwork/defradb/issues/1364)) + +### Fixes + +* Skip new test packages in change detector ([#1495](https://github.com/sourcenetwork/defradb/issues/1495)) +* Make nested joins work correctly from primary direction ([#1491](https://github.com/sourcenetwork/defradb/issues/1491)) +* Add reconnection to known peers ([#1482](https://github.com/sourcenetwork/defradb/issues/1482)) +* Rename commit field input arg to fieldId ([#1460](https://github.com/sourcenetwork/defradb/issues/1460)) +* Reference collectionID in p2p readme ([#1466](https://github.com/sourcenetwork/defradb/issues/1466)) +* Handling SIGTERM in CLI `start` command ([#1459](https://github.com/sourcenetwork/defradb/issues/1459)) +* Update QL documentation link and replicator command ([#1440](https://github.com/sourcenetwork/defradb/issues/1440)) +* Fix typo in readme ([#1419](https://github.com/sourcenetwork/defradb/issues/1419)) +* Limit the size of http request bodies that we handle ([#1405](https://github.com/sourcenetwork/defradb/issues/1405)) +* Improve P2P event handling ([#1388](https://github.com/sourcenetwork/defradb/issues/1388)) +* Serialize DB errors to json in http package ([#1401](https://github.com/sourcenetwork/defradb/issues/1401)) +* Do not commit if errors have been returned ([#1390](https://github.com/sourcenetwork/defradb/issues/1390)) +* Unlock replicator lock before returning error ([#1369](https://github.com/sourcenetwork/defradb/issues/1369)) +* Improve NonNull error message ([#1362](https://github.com/sourcenetwork/defradb/issues/1362)) +* Use ring-buffer for WaitForFoo chans ([#1359](https://github.com/sourcenetwork/defradb/issues/1359)) +* Guarantee event processing order ([#1352](https://github.com/sourcenetwork/defradb/issues/1352)) +* Explain of _group with dockeys filter to be []string ([#1348](https://github.com/sourcenetwork/defradb/issues/1348)) + +### Refactoring + +* Use `int32` for proper gql scalar Int parsing ([#1493](https://github.com/sourcenetwork/defradb/issues/1493)) +* Improve rollback on peer P2P collection error ([#1461](https://github.com/sourcenetwork/defradb/issues/1461)) +* Improve CLI with test suite and builder pattern ([#928](https://github.com/sourcenetwork/defradb/issues/928)) + +### Testing + +* Add DB/Node Restart tests ([#1504](https://github.com/sourcenetwork/defradb/issues/1504)) +* Provide tests for client introspection query ([#1492](https://github.com/sourcenetwork/defradb/issues/1492)) +* Convert explain count tests to new explain setup ([#1488](https://github.com/sourcenetwork/defradb/issues/1488)) +* Convert explain sum tests to new explain setup ([#1489](https://github.com/sourcenetwork/defradb/issues/1489)) +* Convert explain average tests to new explain setup ([#1487](https://github.com/sourcenetwork/defradb/issues/1487)) +* Convert explain top-level tests to new explain setup ([#1480](https://github.com/sourcenetwork/defradb/issues/1480)) +* Convert explain order tests to new explain setup ([#1478](https://github.com/sourcenetwork/defradb/issues/1478)) +* Convert explain join tests to new explain setup ([#1476](https://github.com/sourcenetwork/defradb/issues/1476)) +* Convert explain dagscan tests to new explain setup ([#1474](https://github.com/sourcenetwork/defradb/issues/1474)) +* Add tests to assert schema id order independence ([#1456](https://github.com/sourcenetwork/defradb/issues/1456)) +* Capitalize all integration schema types ([#1445](https://github.com/sourcenetwork/defradb/issues/1445)) +* Convert explain limit tests to new explain setup ([#1446](https://github.com/sourcenetwork/defradb/issues/1446)) +* Improve change detector performance ([#1433](https://github.com/sourcenetwork/defradb/issues/1433)) +* Convert mutation explain tests to new explain setup ([#1416](https://github.com/sourcenetwork/defradb/issues/1416)) +* Convert filter explain tests to new explain setup ([#1380](https://github.com/sourcenetwork/defradb/issues/1380)) +* Retry test doc mutation on transaction conflict ([#1366](https://github.com/sourcenetwork/defradb/issues/1366)) + +### Continuous integration + +* Remove secret ssh key stuff from change detector wf ([#1438](https://github.com/sourcenetwork/defradb/issues/1438)) +* Fix the SSH security issue from AMI scan report ([#1426](https://github.com/sourcenetwork/defradb/issues/1426)) +* Add a separate workflow to run the linter ([#1434](https://github.com/sourcenetwork/defradb/issues/1434)) +* Allow CI to work from forked repo ([#1392](https://github.com/sourcenetwork/defradb/issues/1392)) +* Bump go version within packer for AWS AMI ([#1344](https://github.com/sourcenetwork/defradb/issues/1344)) + +### Chore + +* Enshrine defra logger names ([#1410](https://github.com/sourcenetwork/defradb/issues/1410)) +* Remove some dead code ([#1470](https://github.com/sourcenetwork/defradb/issues/1470)) +* Update graphql-go ([#1422](https://github.com/sourcenetwork/defradb/issues/1422)) +* Improve logging consistency ([#1424](https://github.com/sourcenetwork/defradb/issues/1424)) +* Makefile tests with shorter timeout and common flags ([#1397](https://github.com/sourcenetwork/defradb/issues/1397)) +* Move to gofrs/uuid ([#1396](https://github.com/sourcenetwork/defradb/issues/1396)) +* Move to ipfs boxo ([#1393](https://github.com/sourcenetwork/defradb/issues/1393)) +* Document collection.txn ([#1363](https://github.com/sourcenetwork/defradb/issues/1363)) + +### Bot + +* Bump golang.org/x/crypto from 0.8.0 to 0.9.0 ([#1497](https://github.com/sourcenetwork/defradb/issues/1497)) +* Bump golang.org/x/net from 0.9.0 to 0.10.0 ([#1496](https://github.com/sourcenetwork/defradb/issues/1496)) +* Bump google.golang.org/grpc from 1.54.0 to 1.55.0 ([#1464](https://github.com/sourcenetwork/defradb/issues/1464)) +* Bump github.com/ipfs/boxo from 0.8.0 to 0.8.1 ([#1427](https://github.com/sourcenetwork/defradb/issues/1427)) +* Bump golang.org/x/crypto from 0.7.0 to 0.8.0 ([#1398](https://github.com/sourcenetwork/defradb/issues/1398)) +* Bump github.com/spf13/cobra from 1.6.1 to 1.7.0 ([#1399](https://github.com/sourcenetwork/defradb/issues/1399)) +* Bump github.com/ipfs/go-blockservice from 0.5.0 to 0.5.1 ([#1300](https://github.com/sourcenetwork/defradb/issues/1300)) +* Bump github.com/ipfs/go-cid from 0.4.0 to 0.4.1 ([#1301](https://github.com/sourcenetwork/defradb/issues/1301)) diff --git a/docs/defradb/release notes/v0.6.0.md b/docs/defradb/release notes/v0.6.0.md new file mode 100644 index 0000000..8026fec --- /dev/null +++ b/docs/defradb/release notes/v0.6.0.md @@ -0,0 +1,85 @@ +--- +sidebar_position: 61 +--- + +# v0.6.0 + +> 2023-07-31 + +DefraDB v0.6 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +There are several new and powerful features, important bug fixes, and notable refactors in this release. Some highlight features include: The initial release of our LensVM based schema migration engine powered by WebAssembly ([#1650](https://github.com/sourcenetwork/defradb/issues/1650)), newly embedded DefraDB Playround which includes a bundled GraphQL client and schema manager, and last but not least a relation field (type_id) alias to improve the developer experience ([#1609](https://github.com/sourcenetwork/defradb/issues/1609)). + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.5.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.gg/w7jYQVJ/. + +### Features + +* Add `_not` operator ([#1631](https://github.com/sourcenetwork/defradb/issues/1631)) +* Schema list API ([#1625](https://github.com/sourcenetwork/defradb/issues/1625)) +* Add simple data import and export ([#1630](https://github.com/sourcenetwork/defradb/issues/1630)) +* Playground ([#1575](https://github.com/sourcenetwork/defradb/issues/1575)) +* Add schema migration get and set cmds to CLI ([#1650](https://github.com/sourcenetwork/defradb/issues/1650)) +* Allow relation alias on create and update ([#1609](https://github.com/sourcenetwork/defradb/issues/1609)) +* Make fetcher calculate docFetches and fieldFetches ([#1713](https://github.com/sourcenetwork/defradb/issues/1713)) +* Add lens migration engine to defra ([#1564](https://github.com/sourcenetwork/defradb/issues/1564)) +* Add `_keys` attribute to `selectNode` simple explain ([#1546](https://github.com/sourcenetwork/defradb/issues/1546)) +* CLI commands for secondary indexes ([#1595](https://github.com/sourcenetwork/defradb/issues/1595)) +* Add alias to `groupBy` related object ([#1579](https://github.com/sourcenetwork/defradb/issues/1579)) +* Non-unique secondary index (no querying) ([#1450](https://github.com/sourcenetwork/defradb/issues/1450)) +* Add ability to explain-debug all nodes ([#1563](https://github.com/sourcenetwork/defradb/issues/1563)) +* Include dockey in doc exists err ([#1558](https://github.com/sourcenetwork/defradb/issues/1558)) + +### Fixes + +* Better wait in CLI integration test ([#1415](https://github.com/sourcenetwork/defradb/issues/1415)) +* Return error when relation is not defined on both types ([#1647](https://github.com/sourcenetwork/defradb/issues/1647)) +* Change `core.DocumentMapping` to pointer ([#1528](https://github.com/sourcenetwork/defradb/issues/1528)) +* Fix invalid (badger) datastore state ([#1685](https://github.com/sourcenetwork/defradb/issues/1685)) +* Discard index and subscription implicit transactions ([#1715](https://github.com/sourcenetwork/defradb/issues/1715)) +* Remove duplicated `peers` in peerstore prefix ([#1678](https://github.com/sourcenetwork/defradb/issues/1678)) +* Return errors from typeJoinOne ([#1716](https://github.com/sourcenetwork/defradb/issues/1716)) +* Document change detector breaking change ([#1531](https://github.com/sourcenetwork/defradb/issues/1531)) +* Standardise `schema migration` CLI errors ([#1682](https://github.com/sourcenetwork/defradb/issues/1682)) +* Introspection OrderArg returns null inputFields ([#1633](https://github.com/sourcenetwork/defradb/issues/1633)) +* Avoid duplicated requestable fields ([#1621](https://github.com/sourcenetwork/defradb/issues/1621)) +* Normalize int field kind ([#1619](https://github.com/sourcenetwork/defradb/issues/1619)) +* Change the WriteSyncer to use lock when piping ([#1608](https://github.com/sourcenetwork/defradb/issues/1608)) +* Filter splitting and rendering for related types ([#1541](https://github.com/sourcenetwork/defradb/issues/1541)) + +### Documentation + +* Improve CLI command documentation ([#1505](https://github.com/sourcenetwork/defradb/issues/1505)) + +### Refactoring + +* Schema list output to include schemaVersionID ([#1706](https://github.com/sourcenetwork/defradb/issues/1706)) +* Reuse lens wasm modules ([#1641](https://github.com/sourcenetwork/defradb/issues/1641)) +* Remove redundant txn param from fetcher start ([#1635](https://github.com/sourcenetwork/defradb/issues/1635)) +* Remove first CRDT byte from field encoded values ([#1622](https://github.com/sourcenetwork/defradb/issues/1622)) +* Merge `node` into `net` and improve coverage ([#1593](https://github.com/sourcenetwork/defradb/issues/1593)) +* Fetcher filter and field optimization ([#1500](https://github.com/sourcenetwork/defradb/issues/1500)) + +### Testing + +* Rework transaction test framework capabilities ([#1603](https://github.com/sourcenetwork/defradb/issues/1603)) +* Expand backup integration tests ([#1699](https://github.com/sourcenetwork/defradb/issues/1699)) +* Disable test ([#1675](https://github.com/sourcenetwork/defradb/issues/1675)) +* Add tests for 1-1 group by id ([#1655](https://github.com/sourcenetwork/defradb/issues/1655)) +* Remove CLI tests from make test ([#1643](https://github.com/sourcenetwork/defradb/issues/1643)) +* Bundle test state into single var ([#1645](https://github.com/sourcenetwork/defradb/issues/1645)) +* Convert explain group tests to new explain setup ([#1537](https://github.com/sourcenetwork/defradb/issues/1537)) +* Add tests for foo_id field name clashes ([#1521](https://github.com/sourcenetwork/defradb/issues/1521)) +* Resume wait correctly following test node restart ([#1515](https://github.com/sourcenetwork/defradb/issues/1515)) +* Require no errors when none expected ([#1509](https://github.com/sourcenetwork/defradb/issues/1509)) + +### Continuous integration + +* Add workflows to push, pull, and validate docker images ([#1676](https://github.com/sourcenetwork/defradb/issues/1676)) +* Build mocks using make ([#1612](https://github.com/sourcenetwork/defradb/issues/1612)) +* Fix terraform plan and merge AMI build + deploy workflow ([#1514](https://github.com/sourcenetwork/defradb/issues/1514)) +* Reconfigure CodeCov action to ensure stability ([#1414](https://github.com/sourcenetwork/defradb/issues/1414)) + +### Chore + +* Bump to GoLang v1.20 ([#1689](https://github.com/sourcenetwork/defradb/issues/1689)) +* Update to ipfs boxo 0.10.0 ([#1573](https://github.com/sourcenetwork/defradb/issues/1573)) \ No newline at end of file diff --git a/docs/defradb/release notes/v0.7.0.md b/docs/defradb/release notes/v0.7.0.md new file mode 100644 index 0000000..00ea8d5 --- /dev/null +++ b/docs/defradb/release notes/v0.7.0.md @@ -0,0 +1,74 @@ +--- +sidebar_position: 70 +--- +# v0.7.0 + +> 2023-09-18 + +DefraDB v0.7 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +This release has focused on robustness, testing, and schema management. Some highlight new features include notable expansions to the expressiveness of schema migrations. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.6.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.gg/w7jYQVJ/. + +### Features + +* Allow field indexing by name in PatchSchema ([#1810](https://github.com/sourcenetwork/defradb/issues/1810)) +* Auto-create relation id fields via PatchSchema ([#1807](https://github.com/sourcenetwork/defradb/issues/1807)) +* Support PatchSchema relational field kind substitution ([#1777](https://github.com/sourcenetwork/defradb/issues/1777)) +* Add support for adding of relational fields ([#1766](https://github.com/sourcenetwork/defradb/issues/1766)) +* Enable downgrading of documents via Lens inverses ([#1721](https://github.com/sourcenetwork/defradb/issues/1721)) + +### Fixes + +* Correctly handle serialisation of nil field values ([#1872](https://github.com/sourcenetwork/defradb/issues/1872)) +* Compound filter operators with relations ([#1855](https://github.com/sourcenetwork/defradb/issues/1855)) +* Only update updated fields via update requests ([#1817](https://github.com/sourcenetwork/defradb/issues/1817)) +* Error when saving a deleted document ([#1806](https://github.com/sourcenetwork/defradb/issues/1806)) +* Prevent multiple docs from being linked in one one ([#1790](https://github.com/sourcenetwork/defradb/issues/1790)) +* Handle the querying of secondary relation id fields ([#1768](https://github.com/sourcenetwork/defradb/issues/1768)) +* Improve the way migrations handle transactions ([#1737](https://github.com/sourcenetwork/defradb/issues/1737)) + +### Tooling + +* Add Akash deployment configuration ([#1736](https://github.com/sourcenetwork/defradb/issues/1736)) + +### Refactoring + +* HTTP client interface ([#1776](https://github.com/sourcenetwork/defradb/issues/1776)) +* Simplify fetcher interface ([#1746](https://github.com/sourcenetwork/defradb/issues/1746)) + +### Testing + +* Convert and move out of place explain tests ([#1878](https://github.com/sourcenetwork/defradb/issues/1878)) +* Update mutation tests to make use of mutation system ([#1853](https://github.com/sourcenetwork/defradb/issues/1853)) +* Test top level agg. with compound relational filter ([#1870](https://github.com/sourcenetwork/defradb/issues/1870)) +* Skip unsupported mutation types at test level ([#1850](https://github.com/sourcenetwork/defradb/issues/1850)) +* Extend mutation tests with col.Update and Create ([#1838](https://github.com/sourcenetwork/defradb/issues/1838)) +* Add tests for multiple one-one joins ([#1793](https://github.com/sourcenetwork/defradb/issues/1793)) + +### Chore + +* Update Badger version to v4 ([#1740](https://github.com/sourcenetwork/defradb/issues/1740)) +* Update go-libp2p to 0.29.2 ([#1780](https://github.com/sourcenetwork/defradb/issues/1780)) +* Bump golangci-lint to v1.54 ([#1881](https://github.com/sourcenetwork/defradb/issues/1881)) +* Bump go.opentelemetry.io/otel/metric from 1.17.0 to 1.18.0 ([#1890](https://github.com/sourcenetwork/defradb/issues/1890)) +* Bump [@tanstack](https://github.com/tanstack)/react-query from 4.35.0 to 4.35.3 in /playground ([#1876](https://github.com/sourcenetwork/defradb/issues/1876)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.5.0 to 6.7.0 in /playground ([#1874](https://github.com/sourcenetwork/defradb/issues/1874)) +* Bump [@typescript](https://github.com/typescript)-eslint/parser from 6.6.0 to 6.7.0 in /playground ([#1875](https://github.com/sourcenetwork/defradb/issues/1875)) +* Combined PRs 2023-09-14 ([#1873](https://github.com/sourcenetwork/defradb/issues/1873)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.4.0 to 6.5.0 in /playground ([#1827](https://github.com/sourcenetwork/defradb/issues/1827)) +* Bump go.opentelemetry.io/otel/sdk/metric from 0.39.0 to 0.40.0 ([#1829](https://github.com/sourcenetwork/defradb/issues/1829)) +* Bump github.com/ipfs/go-block-format from 0.1.2 to 0.2.0 ([#1819](https://github.com/sourcenetwork/defradb/issues/1819)) +* Combined PRs ([#1826](https://github.com/sourcenetwork/defradb/issues/1826)) +* Bump [@typescript](https://github.com/typescript)-eslint/parser from 6.4.0 to 6.4.1 in /playground ([#1804](https://github.com/sourcenetwork/defradb/issues/1804)) +* Combined PRs ([#1803](https://github.com/sourcenetwork/defradb/issues/1803)) +* Combined PRs ([#1791](https://github.com/sourcenetwork/defradb/issues/1791)) +* Combined PRs ([#1778](https://github.com/sourcenetwork/defradb/issues/1778)) +* Bump dependencies ([#1761](https://github.com/sourcenetwork/defradb/issues/1761)) +* Bump vite from 4.3.9 to 4.4.8 in /playground ([#1748](https://github.com/sourcenetwork/defradb/issues/1748)) +* Bump graphiql from 3.0.4 to 3.0.5 in /playground ([#1730](https://github.com/sourcenetwork/defradb/issues/1730)) +* Combined bumps of dependencies under /playground ([#1744](https://github.com/sourcenetwork/defradb/issues/1744)) +* Bump github.com/ipfs/boxo from 0.10.2 to 0.11.0 ([#1726](https://github.com/sourcenetwork/defradb/issues/1726)) +* Bump github.com/libp2p/go-libp2p-kad-dht from 0.24.2 to 0.24.3 ([#1724](https://github.com/sourcenetwork/defradb/issues/1724)) +* Bump google.golang.org/grpc from 1.56.2 to 1.57.0 ([#1725](https://github.com/sourcenetwork/defradb/issues/1725)) \ No newline at end of file diff --git a/docs/defradb/release notes/v0.8.0.md b/docs/defradb/release notes/v0.8.0.md new file mode 100644 index 0000000..9ff4e85 --- /dev/null +++ b/docs/defradb/release notes/v0.8.0.md @@ -0,0 +1,75 @@ +--- +sidebar_position: 80 +--- +# v0.8.0 + +> 2023-11-14 + +DefraDB v0.8 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.7.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.gg/w7jYQVJ/. + +### Features + +* Add means to fetch schema ([#2006](https://github.com/sourcenetwork/defradb/issues/2006)) +* Rename Schema.SchemaID to Schema.Root ([#2005](https://github.com/sourcenetwork/defradb/issues/2005)) +* Enable playground in Docker build ([#1986](https://github.com/sourcenetwork/defradb/issues/1986)) +* Change GetCollectionBySchemaFoo funcs to return many ([#1984](https://github.com/sourcenetwork/defradb/issues/1984)) +* Add Swagger UI to playground ([#1979](https://github.com/sourcenetwork/defradb/issues/1979)) +* Add OpenAPI route ([#1960](https://github.com/sourcenetwork/defradb/issues/1960)) +* Remove CollectionDescription.Schema ([#1965](https://github.com/sourcenetwork/defradb/issues/1965)) +* Remove collection from patch schema ([#1957](https://github.com/sourcenetwork/defradb/issues/1957)) +* Make queries utilise secondary indexes ([#1925](https://github.com/sourcenetwork/defradb/issues/1925)) +* Allow setting of default schema version ([#1888](https://github.com/sourcenetwork/defradb/issues/1888)) +* Add CCIP Support ([#1896](https://github.com/sourcenetwork/defradb/issues/1896)) + +### Fixes + +* Fix test module relying on closed memory leak ([#2037](https://github.com/sourcenetwork/defradb/issues/2037)) +* Make return type for FieldKind_INT an int64 ([#1982](https://github.com/sourcenetwork/defradb/issues/1982)) +* Node private key requires data directory ([#1938](https://github.com/sourcenetwork/defradb/issues/1938)) +* Remove collection name from schema ID generation ([#1920](https://github.com/sourcenetwork/defradb/issues/1920)) +* Infinite loop when updating one-one relation ([#1915](https://github.com/sourcenetwork/defradb/issues/1915)) + +### Refactoring + +* CRDT merge direction ([#2016](https://github.com/sourcenetwork/defradb/issues/2016)) +* Reorganise collection description storage ([#1988](https://github.com/sourcenetwork/defradb/issues/1988)) +* Add peerstore to multistore ([#1980](https://github.com/sourcenetwork/defradb/issues/1980)) +* P2P client interface ([#1924](https://github.com/sourcenetwork/defradb/issues/1924)) +* Deprecate CollectionDescription.Schema ([#1939](https://github.com/sourcenetwork/defradb/issues/1939)) +* Remove net GRPC API ([#1927](https://github.com/sourcenetwork/defradb/issues/1927)) +* CLI client interface ([#1839](https://github.com/sourcenetwork/defradb/issues/1839)) + +### Continuous integration + +* Add goreleaser workflow ([#2040](https://github.com/sourcenetwork/defradb/issues/2040)) +* Add mac test runner ([#2035](https://github.com/sourcenetwork/defradb/issues/2035)) +* Parallelize change detector ([#1871](https://github.com/sourcenetwork/defradb/issues/1871)) + +### Chore + +* Update dependencies ([#2044](https://github.com/sourcenetwork/defradb/issues/2044)) + +### Bot + +* Bump [@typescript](https://github.com/typescript)-eslint/parser from 6.10.0 to 6.11.0 in /playground ([#2053](https://github.com/sourcenetwork/defradb/issues/2053)) +* Update dependencies (bulk dependabot PRs) 13-11-2023 ([#2052](https://github.com/sourcenetwork/defradb/issues/2052)) +* Bump axios from 1.5.1 to 1.6.1 in /playground ([#2041](https://github.com/sourcenetwork/defradb/issues/2041)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.9.1 to 6.10.0 in /playground ([#2042](https://github.com/sourcenetwork/defradb/issues/2042)) +* Bump [@vitejs](https://github.com/vitejs)/plugin-react-swc from 3.4.0 to 3.4.1 in /playground ([#2022](https://github.com/sourcenetwork/defradb/issues/2022)) +* Update dependencies (bulk dependabot PRs) 08-11-2023 ([#2038](https://github.com/sourcenetwork/defradb/issues/2038)) +* Update dependencies (bulk dependabot PRs) 30-10-2023 ([#2015](https://github.com/sourcenetwork/defradb/issues/2015)) +* Bump eslint-plugin and parser from 6.8.0 to 6.9.0 in /playground ([#2000](https://github.com/sourcenetwork/defradb/issues/2000)) +* Update dependencies (bulk dependabot PRs) 16-10-2023 ([#1998](https://github.com/sourcenetwork/defradb/issues/1998)) +* Update dependencies (bulk dependabot PRs) 16-10-2023 ([#1976](https://github.com/sourcenetwork/defradb/issues/1976)) +* Bump golang.org/x/net from 0.16.0 to 0.17.0 ([#1961](https://github.com/sourcenetwork/defradb/issues/1961)) +* Bump [@types](https://github.com/types)/react-dom from 18.2.11 to 18.2.12 in /playground ([#1952](https://github.com/sourcenetwork/defradb/issues/1952)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.7.4 to 6.7.5 in /playground ([#1953](https://github.com/sourcenetwork/defradb/issues/1953)) +* Bump combined dependencies 09-10-2023 ([#1951](https://github.com/sourcenetwork/defradb/issues/1951)) +* Bump [@types](https://github.com/types)/react from 18.2.24 to 18.2.25 in /playground ([#1932](https://github.com/sourcenetwork/defradb/issues/1932)) +* Bump [@typescript](https://github.com/typescript)-eslint/parser from 6.7.3 to 6.7.4 in /playground ([#1933](https://github.com/sourcenetwork/defradb/issues/1933)) +* Bump [@vitejs](https://github.com/vitejs)/plugin-react-swc from 3.3.2 to 3.4.0 in /playground ([#1904](https://github.com/sourcenetwork/defradb/issues/1904)) +* Bump combined dependencies 19-09-2023 ([#1931](https://github.com/sourcenetwork/defradb/issues/1931)) +* Bump graphql from 16.8.0 to 16.8.1 in /playground ([#1901](https://github.com/sourcenetwork/defradb/issues/1901)) +* Update combined dependabot PRs 19-09-2023 ([#1898](https://github.com/sourcenetwork/defradb/issues/1898)) \ No newline at end of file diff --git a/docs/defradb/release notes/v0.9.0.md b/docs/defradb/release notes/v0.9.0.md new file mode 100644 index 0000000..71a6088 --- /dev/null +++ b/docs/defradb/release notes/v0.9.0.md @@ -0,0 +1,78 @@ +--- +sidebar_position: 90 +--- +# v0.9.0 + +> 2024-01-18 + +DefraDB v0.9 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.8.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.gg/w7jYQVJ/. + +### Features + +* Mutation typed input ([#2167](https://github.com/sourcenetwork/defradb/issues/2167)) +* Add PN Counter CRDT type ([#2119](https://github.com/sourcenetwork/defradb/issues/2119)) +* Allow users to add Views ([#2114](https://github.com/sourcenetwork/defradb/issues/2114)) +* Add unique secondary index ([#2131](https://github.com/sourcenetwork/defradb/issues/2131)) +* New cmd for docs auto generation ([#2096](https://github.com/sourcenetwork/defradb/issues/2096)) +* Add blob scalar type ([#2091](https://github.com/sourcenetwork/defradb/issues/2091)) + +### Fixes + +* Add entropy to counter CRDT type updates ([#2186](https://github.com/sourcenetwork/defradb/issues/2186)) +* Handle multiple nil values on unique indexed fields ([#2178](https://github.com/sourcenetwork/defradb/issues/2178)) +* Filtering on unique index if there is no match ([#2177](https://github.com/sourcenetwork/defradb/issues/2177)) + +### Performance + +* Switch LensVM to wasmtime runtime ([#2030](https://github.com/sourcenetwork/defradb/issues/2030)) + +### Refactoring + +* Add strong typing to document creation ([#2161](https://github.com/sourcenetwork/defradb/issues/2161)) +* Rename key,id,dockey to docID terminology ([#1749](https://github.com/sourcenetwork/defradb/issues/1749)) +* Simplify Merkle CRDT workflow ([#2111](https://github.com/sourcenetwork/defradb/issues/2111)) + +### Testing + +* Add auto-doc generation ([#2051](https://github.com/sourcenetwork/defradb/issues/2051)) + +### Continuous integration + +* Add windows test runner ([#2033](https://github.com/sourcenetwork/defradb/issues/2033)) + +### Chore + +* Update Lens to v0.5 ([#2083](https://github.com/sourcenetwork/defradb/issues/2083)) + +### Bot + +* Bump [@types](https://github.com/types)/react from 18.2.47 to 18.2.48 in /playground ([#2213](https://github.com/sourcenetwork/defradb/issues/2213)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.18.0 to 6.18.1 in /playground ([#2215](https://github.com/sourcenetwork/defradb/issues/2215)) +* Update dependencies (bulk dependabot PRs) 15-01-2024 ([#2217](https://github.com/sourcenetwork/defradb/issues/2217)) +* Bump follow-redirects from 1.15.3 to 1.15.4 in /playground ([#2181](https://github.com/sourcenetwork/defradb/issues/2181)) +* Bump github.com/getkin/kin-openapi from 0.120.0 to 0.122.0 ([#2097](https://github.com/sourcenetwork/defradb/issues/2097)) +* Update dependencies (bulk dependabot PRs) 08-01-2024 ([#2173](https://github.com/sourcenetwork/defradb/issues/2173)) +* Bump github.com/bits-and-blooms/bitset from 1.12.0 to 1.13.0 ([#2160](https://github.com/sourcenetwork/defradb/issues/2160)) +* Bump [@types](https://github.com/types)/react from 18.2.45 to 18.2.46 in /playground ([#2159](https://github.com/sourcenetwork/defradb/issues/2159)) +* Bump [@typescript](https://github.com/typescript)-eslint/parser from 6.15.0 to 6.16.0 in /playground ([#2156](https://github.com/sourcenetwork/defradb/issues/2156)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.15.0 to 6.16.0 in /playground ([#2155](https://github.com/sourcenetwork/defradb/issues/2155)) +* Update dependencies (bulk dependabot PRs) 27-12-2023 ([#2154](https://github.com/sourcenetwork/defradb/issues/2154)) +* Bump github.com/spf13/viper from 1.17.0 to 1.18.2 ([#2145](https://github.com/sourcenetwork/defradb/issues/2145)) +* Bump golang.org/x/crypto from 0.16.0 to 0.17.0 ([#2144](https://github.com/sourcenetwork/defradb/issues/2144)) +* Update dependencies (bulk dependabot PRs) 18-12-2023 ([#2142](https://github.com/sourcenetwork/defradb/issues/2142)) +* Bump [@typescript](https://github.com/typescript)-eslint/parser from 6.13.2 to 6.14.0 in /playground ([#2136](https://github.com/sourcenetwork/defradb/issues/2136)) +* Bump [@types](https://github.com/types)/react from 18.2.43 to 18.2.45 in /playground ([#2134](https://github.com/sourcenetwork/defradb/issues/2134)) +* Bump vite from 5.0.7 to 5.0.10 in /playground ([#2135](https://github.com/sourcenetwork/defradb/issues/2135)) +* Update dependencies (bulk dependabot PRs) 04-12-2023 ([#2133](https://github.com/sourcenetwork/defradb/issues/2133)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.13.1 to 6.13.2 in /playground ([#2109](https://github.com/sourcenetwork/defradb/issues/2109)) +* Bump vite from 5.0.2 to 5.0.5 in /playground ([#2112](https://github.com/sourcenetwork/defradb/issues/2112)) +* Bump [@types](https://github.com/types)/react from 18.2.41 to 18.2.42 in /playground ([#2108](https://github.com/sourcenetwork/defradb/issues/2108)) +* Update dependencies (bulk dependabot PRs) 04-12-2023 ([#2107](https://github.com/sourcenetwork/defradb/issues/2107)) +* Bump [@types](https://github.com/types)/react from 18.2.38 to 18.2.39 in /playground ([#2086](https://github.com/sourcenetwork/defradb/issues/2086)) +* Bump [@typescript](https://github.com/typescript)-eslint/parser from 6.12.0 to 6.13.0 in /playground ([#2085](https://github.com/sourcenetwork/defradb/issues/2085)) +* Update dependencies (bulk dependabot PRs) 27-11-2023 ([#2081](https://github.com/sourcenetwork/defradb/issues/2081)) +* Bump swagger-ui-react from 5.10.0 to 5.10.3 in /playground ([#2067](https://github.com/sourcenetwork/defradb/issues/2067)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.11.0 to 6.12.0 in /playground ([#2068](https://github.com/sourcenetwork/defradb/issues/2068)) +* Update dependencies (bulk dependabot PRs) 20-11-2023 ([#2066](https://github.com/sourcenetwork/defradb/issues/2066)) \ No newline at end of file diff --git a/docs/orbis/getting-started.md b/docs/orbis/getting-started.md new file mode 100644 index 0000000..816280d --- /dev/null +++ b/docs/orbis/getting-started.md @@ -0,0 +1 @@ +# 🚧 Coming Soon 🚧 \ No newline at end of file diff --git a/docs/release-notes.md b/docs/release-notes.md deleted file mode 100644 index ead4fc1..0000000 --- a/docs/release-notes.md +++ /dev/null @@ -1,633 +0,0 @@ ---- -sidebar_position: 5 -title: Release Notes ---- - -# Release Notes -## [v0.5.0](https://github.com/sourcenetwork/defradb/compare/v0.4.0...v0.5.0) - -> 2023-04-12 - -DefraDB v0.5 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. - -There many new features in this release, but most importantly, this is the first open source release for DefraDB. As such, this release focused on various quality of life changes and refactors, bug fixes, and overall cleanliness of the repo so it can effectively be used and tested in the public domain. - -To get a full outline of the changes, we invite you to review the official changelog below. Some highlights are the first iteration of our schema update system, allowing developers to add new fields to schemas using our JSON Patch based DDL, a new DAG based delete system which will persist "soft-delete" ops into the CRDT Merkle DAG, and a early prototype for our collection level peer-to-peer synchronization. - -This release does include a Breaking Change to existing v0.4.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. - -### Features - -* Add document delete mechanics ([#1263](https://github.com/sourcenetwork/defradb/issues/1263)) -* Ability to explain an executed request ([#1188](https://github.com/sourcenetwork/defradb/issues/1188)) -* Add SchemaPatch CLI command ([#1250](https://github.com/sourcenetwork/defradb/issues/1250)) -* Add support for one-one mutation from sec. side ([#1247](https://github.com/sourcenetwork/defradb/issues/1247)) -* Store only key in DAG instead of dockey path ([#1245](https://github.com/sourcenetwork/defradb/issues/1245)) -* Add collectionId field to commit field ([#1235](https://github.com/sourcenetwork/defradb/issues/1235)) -* Add field kind substitution for PatchSchema ([#1223](https://github.com/sourcenetwork/defradb/issues/1223)) -* Add dockey field for commit field ([#1216](https://github.com/sourcenetwork/defradb/issues/1216)) -* Allow new fields to be added locally to schema ([#1139](https://github.com/sourcenetwork/defradb/issues/1139)) -* Add `like` sub-string filter ([#1091](https://github.com/sourcenetwork/defradb/issues/1091)) -* Add ability for P2P to wait for pushlog by peer ([#1098](https://github.com/sourcenetwork/defradb/issues/1098)) -* Add P2P collection topic subscription ([#1086](https://github.com/sourcenetwork/defradb/issues/1086)) -* Add support for schema version id in queries ([#1067](https://github.com/sourcenetwork/defradb/issues/1067)) -* Add schema version id to commit queries ([#1061](https://github.com/sourcenetwork/defradb/issues/1061)) -* Persist schema version at time of commit ([#1055](https://github.com/sourcenetwork/defradb/issues/1055)) -* Add ability to input simple explain type arg ([#1039](https://github.com/sourcenetwork/defradb/issues/1039)) - -### Fixes - -* API address parameter validation ([#1311](https://github.com/sourcenetwork/defradb/issues/1311)) -* Improve error message for NonNull GQL types ([#1333](https://github.com/sourcenetwork/defradb/issues/1333)) -* Handle panics in the rpc server ([#1330](https://github.com/sourcenetwork/defradb/issues/1330)) -* Handle returned error in select.go ([#1329](https://github.com/sourcenetwork/defradb/issues/1329)) -* Resolve handful of CLI issues ([#1318](https://github.com/sourcenetwork/defradb/issues/1318)) -* Only check for events queue on subscription request ([#1326](https://github.com/sourcenetwork/defradb/issues/1326)) -* Remove client Create/UpdateCollection ([#1309](https://github.com/sourcenetwork/defradb/issues/1309)) -* CLI to display specific command usage help ([#1314](https://github.com/sourcenetwork/defradb/issues/1314)) -* Fix P2P collection CLI commands ([#1295](https://github.com/sourcenetwork/defradb/issues/1295)) -* Dont double up badger file path ([#1299](https://github.com/sourcenetwork/defradb/issues/1299)) -* Update immutable package ([#1290](https://github.com/sourcenetwork/defradb/issues/1290)) -* Fix panic on success of Add/RemoveP2PCollections ([#1297](https://github.com/sourcenetwork/defradb/issues/1297)) -* Fix deadlock on memory-datastore Close ([#1273](https://github.com/sourcenetwork/defradb/issues/1273)) -* Determine if query is introspection query ([#1255](https://github.com/sourcenetwork/defradb/issues/1255)) -* Allow newly added fields to sync via p2p ([#1226](https://github.com/sourcenetwork/defradb/issues/1226)) -* Expose `ExplainEnum` in the GQL schema ([#1204](https://github.com/sourcenetwork/defradb/issues/1204)) -* Resolve aggregates' mapping with deep nested subtypes ([#1175](https://github.com/sourcenetwork/defradb/issues/1175)) -* Make sort stable and handle nil comparison ([#1094](https://github.com/sourcenetwork/defradb/issues/1094)) -* Change successful schema add status to 200 ([#1106](https://github.com/sourcenetwork/defradb/issues/1106)) -* Add delay in P2P test util execution ([#1093](https://github.com/sourcenetwork/defradb/issues/1093)) -* Ensure errors test don't hard expect folder name ([#1072](https://github.com/sourcenetwork/defradb/issues/1072)) -* Remove potential P2P deadlock ([#1056](https://github.com/sourcenetwork/defradb/issues/1056)) -* Rework the P2P integration tests ([#989](https://github.com/sourcenetwork/defradb/issues/989)) -* Improve DAG sync with highly concurrent updates ([#1031](https://github.com/sourcenetwork/defradb/issues/1031)) - -### Documentation - -* Update docs for the v0.5 release ([#1320](https://github.com/sourcenetwork/defradb/issues/1320)) -* Document client interfaces in client/db.go ([#1305](https://github.com/sourcenetwork/defradb/issues/1305)) -* Document client Description types ([#1307](https://github.com/sourcenetwork/defradb/issues/1307)) -* Improve security policy ([#1240](https://github.com/sourcenetwork/defradb/issues/1240)) -* Add security disclosure policy ([#1194](https://github.com/sourcenetwork/defradb/issues/1194)) -* Correct commits query example in readme ([#1172](https://github.com/sourcenetwork/defradb/issues/1172)) - -### Refactoring - -* Improve p2p collection operations on peer ([#1286](https://github.com/sourcenetwork/defradb/issues/1286)) -* Migrate gql introspection tests to new framework ([#1211](https://github.com/sourcenetwork/defradb/issues/1211)) -* Reorganise client transaction related interfaces ([#1180](https://github.com/sourcenetwork/defradb/issues/1180)) -* Config-local viper, rootdir, and logger parsing ([#1132](https://github.com/sourcenetwork/defradb/issues/1132)) -* Migrate mutation-relation tests to new framework ([#1109](https://github.com/sourcenetwork/defradb/issues/1109)) -* Rework integration test framework ([#1089](https://github.com/sourcenetwork/defradb/issues/1089)) -* Generate gql types using col. desc ([#1080](https://github.com/sourcenetwork/defradb/issues/1080)) -* Extract config errors to dedicated file ([#1107](https://github.com/sourcenetwork/defradb/issues/1107)) -* Change terminology from query to request ([#1054](https://github.com/sourcenetwork/defradb/issues/1054)) -* Allow db keys to handle multiple schema versions ([#1026](https://github.com/sourcenetwork/defradb/issues/1026)) -* Extract query schema errors to dedicated file ([#1037](https://github.com/sourcenetwork/defradb/issues/1037)) -* Extract planner errors to dedicated file ([#1034](https://github.com/sourcenetwork/defradb/issues/1034)) -* Extract query parser errors to dedicated file ([#1035](https://github.com/sourcenetwork/defradb/issues/1035)) - -### Testing - -* Remove test reference to DEFRA_ROOTDIR env var ([#1328](https://github.com/sourcenetwork/defradb/issues/1328)) -* Expand tests for Peer subscribe actions ([#1287](https://github.com/sourcenetwork/defradb/issues/1287)) -* Fix flaky TestCloseThroughContext test ([#1265](https://github.com/sourcenetwork/defradb/issues/1265)) -* Add gql introspection tests for patch schema ([#1219](https://github.com/sourcenetwork/defradb/issues/1219)) -* Explicitly state change detector split for test ([#1228](https://github.com/sourcenetwork/defradb/issues/1228)) -* Add test for successful one-one create mutation ([#1215](https://github.com/sourcenetwork/defradb/issues/1215)) -* Ensure that all databases are always closed on exit ([#1187](https://github.com/sourcenetwork/defradb/issues/1187)) -* Add P2P tests for Schema Update adding field ([#1182](https://github.com/sourcenetwork/defradb/issues/1182)) -* Migrate P2P/state tests to new framework ([#1160](https://github.com/sourcenetwork/defradb/issues/1160)) -* Remove sleep from subscription tests ([#1156](https://github.com/sourcenetwork/defradb/issues/1156)) -* Fetch documents on test execution start ([#1163](https://github.com/sourcenetwork/defradb/issues/1163)) -* Introduce basic testing for the `version` module ([#1111](https://github.com/sourcenetwork/defradb/issues/1111)) -* Boost test coverage for collection_update ([#1050](https://github.com/sourcenetwork/defradb/issues/1050)) -* Wait between P2P update retry attempts ([#1052](https://github.com/sourcenetwork/defradb/issues/1052)) -* Exclude auto-generated protobuf files from codecov ([#1048](https://github.com/sourcenetwork/defradb/issues/1048)) -* Add P2P tests for relational docs ([#1042](https://github.com/sourcenetwork/defradb/issues/1042)) - -### Continuous integration - -* Add workflow that builds DefraDB AMI upon tag push ([#1304](https://github.com/sourcenetwork/defradb/issues/1304)) -* Allow PR title to end with a capital letter ([#1291](https://github.com/sourcenetwork/defradb/issues/1291)) -* Changes for `dependabot` to be well-behaved ([#1165](https://github.com/sourcenetwork/defradb/issues/1165)) -* Skip benchmarks for dependabot ([#1144](https://github.com/sourcenetwork/defradb/issues/1144)) -* Add workflow to ensure deps build properly ([#1078](https://github.com/sourcenetwork/defradb/issues/1078)) -* Runner and Builder Containerfiles ([#951](https://github.com/sourcenetwork/defradb/issues/951)) -* Fix go-header linter rule to be any year ([#1021](https://github.com/sourcenetwork/defradb/issues/1021)) - -### Chore - -* Add Islam as contributor ([#1302](https://github.com/sourcenetwork/defradb/issues/1302)) -* Update go-libp2p to 0.26.4 ([#1257](https://github.com/sourcenetwork/defradb/issues/1257)) -* Improve the test coverage of datastore ([#1203](https://github.com/sourcenetwork/defradb/issues/1203)) -* Add issue and discussion templates ([#1193](https://github.com/sourcenetwork/defradb/issues/1193)) -* Bump libp2p/go-libp2p-kad-dht from 0.21.0 to 0.21.1 ([#1146](https://github.com/sourcenetwork/defradb/issues/1146)) -* Enable dependabot ([#1120](https://github.com/sourcenetwork/defradb/issues/1120)) -* Update `opentelemetry` dependencies ([#1114](https://github.com/sourcenetwork/defradb/issues/1114)) -* Update dependencies including go-ipfs ([#1112](https://github.com/sourcenetwork/defradb/issues/1112)) -* Bump to GoLang v1.19 ([#818](https://github.com/sourcenetwork/defradb/issues/818)) -* Remove versionedScan node ([#1049](https://github.com/sourcenetwork/defradb/issues/1049)) - -### Bot - -* Bump github.com/multiformats/go-multiaddr from 0.8.0 to 0.9.0 ([#1277](https://github.com/sourcenetwork/defradb/issues/1277)) -* Bump google.golang.org/grpc from 1.53.0 to 1.54.0 ([#1233](https://github.com/sourcenetwork/defradb/issues/1233)) -* Bump github.com/multiformats/go-multibase from 0.1.1 to 0.2.0 ([#1230](https://github.com/sourcenetwork/defradb/issues/1230)) -* Bump github.com/ipfs/go-libipfs from 0.6.2 to 0.7.0 ([#1231](https://github.com/sourcenetwork/defradb/issues/1231)) -* Bump github.com/ipfs/go-cid from 0.3.2 to 0.4.0 ([#1200](https://github.com/sourcenetwork/defradb/issues/1200)) -* Bump github.com/ipfs/go-ipfs-blockstore from 1.2.0 to 1.3.0 ([#1199](https://github.com/sourcenetwork/defradb/issues/1199)) -* Bump github.com/stretchr/testify from 1.8.1 to 1.8.2 ([#1198](https://github.com/sourcenetwork/defradb/issues/1198)) -* Bump github.com/ipfs/go-libipfs from 0.6.1 to 0.6.2 ([#1201](https://github.com/sourcenetwork/defradb/issues/1201)) -* Bump golang.org/x/crypto from 0.6.0 to 0.7.0 ([#1197](https://github.com/sourcenetwork/defradb/issues/1197)) -* Bump libp2p/go-libp2p-gostream from 0.5.0 to 0.6.0 ([#1152](https://github.com/sourcenetwork/defradb/issues/1152)) -* Bump github.com/ipfs/go-libipfs from 0.5.0 to 0.6.1 ([#1166](https://github.com/sourcenetwork/defradb/issues/1166)) -* Bump github.com/ugorji/go/codec from 1.2.9 to 1.2.11 ([#1173](https://github.com/sourcenetwork/defradb/issues/1173)) -* Bump github.com/libp2p/go-libp2p-pubsub from 0.9.0 to 0.9.3 ([#1183](https://github.com/sourcenetwork/defradb/issues/1183)) - - -## [v0.4.0](https://github.com/sourcenetwork/defradb/compare/v0.3.1...v0.4.0) - -> 2023-12-23 - -DefraDB v0.4 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. - -There are various new features in this release - some of which are breaking - and we invite you to review the official changelog below. Some highlights are persistence of replicators, DateTime scalars, TLS support, and GQL subscriptions. - -This release does include a Breaking Change to existing v0.3.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. - -### Features - -* Add basic metric functionality ([#971](https://github.com/sourcenetwork/defradb/issues/971)) -* Add thread safe transactional in-memory datastore ([#947](https://github.com/sourcenetwork/defradb/issues/947)) -* Persist p2p replicators ([#960](https://github.com/sourcenetwork/defradb/issues/960)) -* Add DateTime custom scalars ([#931](https://github.com/sourcenetwork/defradb/issues/931)) -* Add GraphQL subscriptions ([#934](https://github.com/sourcenetwork/defradb/issues/934)) -* Add support for tls ([#885](https://github.com/sourcenetwork/defradb/issues/885)) -* Add group by support for commits ([#887](https://github.com/sourcenetwork/defradb/issues/887)) -* Add depth support for commits ([#889](https://github.com/sourcenetwork/defradb/issues/889)) -* Make dockey optional for allCommits queries ([#847](https://github.com/sourcenetwork/defradb/issues/847)) -* Add WithStack to the errors package ([#870](https://github.com/sourcenetwork/defradb/issues/870)) -* Add event system ([#834](https://github.com/sourcenetwork/defradb/issues/834)) - -### Fixes - -* Correct errors.WithStack behaviour ([#984](https://github.com/sourcenetwork/defradb/issues/984)) -* Correctly handle nested one to one joins ([#964](https://github.com/sourcenetwork/defradb/issues/964)) -* Do not assume parent record exists when joining ([#963](https://github.com/sourcenetwork/defradb/issues/963)) -* Change time format for HTTP API log ([#910](https://github.com/sourcenetwork/defradb/issues/910)) -* Error if group select contains non-group-by fields ([#898](https://github.com/sourcenetwork/defradb/issues/898)) -* Add inspection of values for ENV flags ([#900](https://github.com/sourcenetwork/defradb/issues/900)) -* Remove panics from document ([#881](https://github.com/sourcenetwork/defradb/issues/881)) -* Add __typename support ([#871](https://github.com/sourcenetwork/defradb/issues/871)) -* Handle subscriber close ([#877](https://github.com/sourcenetwork/defradb/issues/877)) -* Publish update events post commit ([#866](https://github.com/sourcenetwork/defradb/issues/866)) - -### Refactoring - -* Make rootstore require Batching and TxnDatastore ([#940](https://github.com/sourcenetwork/defradb/issues/940)) -* Conceptually clarify schema vs query-language ([#924](https://github.com/sourcenetwork/defradb/issues/924)) -* Decouple db.db from gql ([#912](https://github.com/sourcenetwork/defradb/issues/912)) -* Merkle clock heads cleanup ([#918](https://github.com/sourcenetwork/defradb/issues/918)) -* Simplify dag fetcher ([#913](https://github.com/sourcenetwork/defradb/issues/913)) -* Cleanup parsing logic ([#909](https://github.com/sourcenetwork/defradb/issues/909)) -* Move planner outside the gql directory ([#907](https://github.com/sourcenetwork/defradb/issues/907)) -* Refactor commit nodes ([#892](https://github.com/sourcenetwork/defradb/issues/892)) -* Make latest commits syntax sugar ([#890](https://github.com/sourcenetwork/defradb/issues/890)) -* Remove commit query ([#841](https://github.com/sourcenetwork/defradb/issues/841)) - -### Testing - -* Add event tests ([#965](https://github.com/sourcenetwork/defradb/issues/965)) -* Add new setup for testing explain functionality ([#949](https://github.com/sourcenetwork/defradb/issues/949)) -* Add txn relation-type delete and create tests ([#875](https://github.com/sourcenetwork/defradb/issues/875)) -* Skip change detection for tests that assert panic ([#883](https://github.com/sourcenetwork/defradb/issues/883)) - -### Continuous integration - -* Bump all gh-action versions to support node16 ([#990](https://github.com/sourcenetwork/defradb/issues/990)) -* Bump ssh-agent action to v0.7.0 ([#978](https://github.com/sourcenetwork/defradb/issues/978)) -* Add error message format check ([#901](https://github.com/sourcenetwork/defradb/issues/901)) - -### Chore - -* Extract (events, merkle) errors to errors.go ([#973](https://github.com/sourcenetwork/defradb/issues/973)) -* Extract (datastore, db) errors to errors.go ([#969](https://github.com/sourcenetwork/defradb/issues/969)) -* Extract (connor, crdt, core) errors to errors.go ([#968](https://github.com/sourcenetwork/defradb/issues/968)) -* Extract inline (http and client) errors to errors.go ([#967](https://github.com/sourcenetwork/defradb/issues/967)) -* Update badger version ([#966](https://github.com/sourcenetwork/defradb/issues/966)) -* Move Option and Enumerable to immutables ([#939](https://github.com/sourcenetwork/defradb/issues/939)) -* Add configuration of external loggers ([#942](https://github.com/sourcenetwork/defradb/issues/942)) -* Strip DSKey prefixes and simplify NewDataStoreKey ([#944](https://github.com/sourcenetwork/defradb/issues/944)) -* Include version metadata in cross-building ([#930](https://github.com/sourcenetwork/defradb/issues/930)) -* Update to v0.23.2 the libP2P package ([#908](https://github.com/sourcenetwork/defradb/issues/908)) -* Remove `ipfslite` dependency ([#739](https://github.com/sourcenetwork/defradb/issues/739)) - - - -## [v0.3.1](https://github.com/sourcenetwork/defradb/compare/v0.3.0...v0.3.1) - -> 2022-09-23 - -DefraDB v0.3.1 is a minor release, primarily focusing on additional/extended features and fixes of items added in the `v0.3.0` release. - -### Features - -* Add cid support for allCommits ([#857](https://github.com/sourcenetwork/defradb/issues/857)) -* Add offset support to allCommits ([#859](https://github.com/sourcenetwork/defradb/issues/859)) -* Add limit support to allCommits query ([#856](https://github.com/sourcenetwork/defradb/issues/856)) -* Add order support to allCommits ([#845](https://github.com/sourcenetwork/defradb/issues/845)) -* Display CLI usage on user error ([#819](https://github.com/sourcenetwork/defradb/issues/819)) -* Add support for dockey filters in child joins ([#806](https://github.com/sourcenetwork/defradb/issues/806)) -* Add sort support for numeric aggregates ([#786](https://github.com/sourcenetwork/defradb/issues/786)) -* Allow filtering by nil ([#789](https://github.com/sourcenetwork/defradb/issues/789)) -* Add aggregate offset support ([#778](https://github.com/sourcenetwork/defradb/issues/778)) -* Remove filter depth limit ([#777](https://github.com/sourcenetwork/defradb/issues/777)) -* Add support for and-or inline array aggregate filters ([#779](https://github.com/sourcenetwork/defradb/issues/779)) -* Add limit support for aggregates ([#771](https://github.com/sourcenetwork/defradb/issues/771)) -* Add support for inline arrays of nillable types ([#759](https://github.com/sourcenetwork/defradb/issues/759)) -* Create errors package ([#548](https://github.com/sourcenetwork/defradb/issues/548)) -* Add ability to display peer id ([#719](https://github.com/sourcenetwork/defradb/issues/719)) -* Add a config option to set the vlog max file size ([#743](https://github.com/sourcenetwork/defradb/issues/743)) -* Explain `topLevelNode` like a `MultiNode` plan ([#749](https://github.com/sourcenetwork/defradb/issues/749)) -* Make `topLevelNode` explainable ([#737](https://github.com/sourcenetwork/defradb/issues/737)) - -### Fixes - -* Order subtype without selecting the join child ([#810](https://github.com/sourcenetwork/defradb/issues/810)) -* Correctly handles nil one-one joins ([#837](https://github.com/sourcenetwork/defradb/issues/837)) -* Reset scan node for each join ([#828](https://github.com/sourcenetwork/defradb/issues/828)) -* Handle filter input field argument being nil ([#787](https://github.com/sourcenetwork/defradb/issues/787)) -* Ensure CLI outputs JSON to stdout when directed to pipe ([#804](https://github.com/sourcenetwork/defradb/issues/804)) -* Error if given the wrong side of a one-one relationship ([#795](https://github.com/sourcenetwork/defradb/issues/795)) -* Add object marker to enable return of empty docs ([#800](https://github.com/sourcenetwork/defradb/issues/800)) -* Resolve the extra `typeIndexJoin`s for `_avg` aggregate ([#774](https://github.com/sourcenetwork/defradb/issues/774)) -* Remove _like filter operator ([#797](https://github.com/sourcenetwork/defradb/issues/797)) -* Remove having gql types ([#785](https://github.com/sourcenetwork/defradb/issues/785)) -* Error if child _group selected without parent groupBy ([#781](https://github.com/sourcenetwork/defradb/issues/781)) -* Error nicely on missing field specifier ([#782](https://github.com/sourcenetwork/defradb/issues/782)) -* Handle order input field argument being nil ([#701](https://github.com/sourcenetwork/defradb/issues/701)) -* Change output to outputpath in config file template for logger ([#716](https://github.com/sourcenetwork/defradb/issues/716)) -* Delete mutations not correct persisting all keys ([#731](https://github.com/sourcenetwork/defradb/issues/731)) - -### Tooling - -* Ban the usage of `ioutil` package ([#747](https://github.com/sourcenetwork/defradb/issues/747)) -* Migrate from CircleCi to GitHub Actions ([#679](https://github.com/sourcenetwork/defradb/issues/679)) - -### Documentation - -* Clarify meaning of url param, update in-repo CLI docs ([#814](https://github.com/sourcenetwork/defradb/issues/814)) -* Disclaimer of exposed to network and not encrypted ([#793](https://github.com/sourcenetwork/defradb/issues/793)) -* Update logo to respect theme ([#728](https://github.com/sourcenetwork/defradb/issues/728)) - -### Refactoring - -* Replace all `interface{}` with `any` alias ([#805](https://github.com/sourcenetwork/defradb/issues/805)) -* Use fastjson to parse mutation data string ([#772](https://github.com/sourcenetwork/defradb/issues/772)) -* Rework limit node flow ([#767](https://github.com/sourcenetwork/defradb/issues/767)) -* Make Option immutable ([#769](https://github.com/sourcenetwork/defradb/issues/769)) -* Rework sum and count nodes to make use of generics ([#757](https://github.com/sourcenetwork/defradb/issues/757)) -* Remove some possible panics from codebase ([#732](https://github.com/sourcenetwork/defradb/issues/732)) -* Change logging calls to use feedback in CLI package ([#714](https://github.com/sourcenetwork/defradb/issues/714)) - -### Testing - -* Add tests for aggs with nil filters ([#813](https://github.com/sourcenetwork/defradb/issues/813)) -* Add not equals filter tests ([#798](https://github.com/sourcenetwork/defradb/issues/798)) -* Fix `cli/peerid_test` to not clash addresses ([#766](https://github.com/sourcenetwork/defradb/issues/766)) -* Add change detector summary to test readme ([#754](https://github.com/sourcenetwork/defradb/issues/754)) -* Add tests for inline array grouping ([#752](https://github.com/sourcenetwork/defradb/issues/752)) - -### Continuous integration - -* Reduce test resource usage and test with file db ([#791](https://github.com/sourcenetwork/defradb/issues/791)) -* Add makefile target to verify the local module cache ([#775](https://github.com/sourcenetwork/defradb/issues/775)) -* Allow PR titles to end with a number ([#745](https://github.com/sourcenetwork/defradb/issues/745)) -* Add a workflow to validate pull request titles ([#734](https://github.com/sourcenetwork/defradb/issues/734)) -* Fix the linter version to `v1.47` ([#726](https://github.com/sourcenetwork/defradb/issues/726)) - -### Chore - -* Remove file system paths from resulting executable ([#831](https://github.com/sourcenetwork/defradb/issues/831)) -* Add goimports linter for consistent imports ordering ([#816](https://github.com/sourcenetwork/defradb/issues/816)) -* Improve UX by providing more information ([#802](https://github.com/sourcenetwork/defradb/issues/802)) -* Change to defra errors and handle errors stacktrace ([#794](https://github.com/sourcenetwork/defradb/issues/794)) -* Clean up `go.mod` with pruned module graphs ([#756](https://github.com/sourcenetwork/defradb/issues/756)) -* Update to v0.20.3 of libp2p ([#740](https://github.com/sourcenetwork/defradb/issues/740)) -* Bump to GoLang `v1.18` ([#721](https://github.com/sourcenetwork/defradb/issues/721)) - - -## [v0.3.0](https://github.com/sourcenetwork/defradb/compare/v0.2.1...v0.3.0) - -> 2022-08-02 - -DefraDB v0.3 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. - -There are *several* new features in this release, and we invite you to review the official changelog below. Some highlights are various new features for Grouping & Aggregation for the query system, like top-level aggregation and group filtering. Moreover, a brand new Query Explain system was added to introspect the execution plans created by DefraDB. Lastly we introduced a revamped CLI configuration system. - -This release does include a Breaking Change to existing v0.2.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. - -### Features - -* Add named config overrides ([#659](https://github.com/sourcenetwork/defradb/issues/659)) -* Expose color and caller log options, add validation ([#652](https://github.com/sourcenetwork/defradb/issues/652)) -* Add ability to explain `groupNode` and it's attribute(s). ([#641](https://github.com/sourcenetwork/defradb/issues/641)) -* Add primary directive for schema definitions ([@primary](https://github.com/primary)) ([#650](https://github.com/sourcenetwork/defradb/issues/650)) -* Add support for aggregate filters on inline arrays ([#622](https://github.com/sourcenetwork/defradb/issues/622)) -* Add explainable renderLimitNode & hardLimitNode attributes. ([#614](https://github.com/sourcenetwork/defradb/issues/614)) -* Add support for top level aggregates ([#594](https://github.com/sourcenetwork/defradb/issues/594)) -* Update `countNode` explanation to be consistent. ([#600](https://github.com/sourcenetwork/defradb/issues/600)) -* Add support for stdin as input in CLI ([#608](https://github.com/sourcenetwork/defradb/issues/608)) -* Explain `cid` & `field` attributes for `dagScanNode` ([#598](https://github.com/sourcenetwork/defradb/issues/598)) -* Add ability to explain `dagScanNode` attribute(s). ([#560](https://github.com/sourcenetwork/defradb/issues/560)) -* Add the ability to send user feedback to the console even when logging to file. ([#568](https://github.com/sourcenetwork/defradb/issues/568)) -* Add ability to explain `sortNode` attribute(s). ([#558](https://github.com/sourcenetwork/defradb/issues/558)) -* Add ability to explain `sumNode` attribute(s). ([#559](https://github.com/sourcenetwork/defradb/issues/559)) -* Introduce top-level config package ([#389](https://github.com/sourcenetwork/defradb/issues/389)) -* Add ability to explain `updateNode` attributes. ([#514](https://github.com/sourcenetwork/defradb/issues/514)) -* Add `typeIndexJoin` explainable attributes. ([#499](https://github.com/sourcenetwork/defradb/issues/499)) -* Add support to explain `countNode` attributes. ([#504](https://github.com/sourcenetwork/defradb/issues/504)) -* Add CORS capability to HTTP API ([#467](https://github.com/sourcenetwork/defradb/issues/467)) -* Add explaination of spans for `scanNode`. ([#492](https://github.com/sourcenetwork/defradb/issues/492)) -* Add ability to Explain the response plan. ([#385](https://github.com/sourcenetwork/defradb/issues/385)) -* Add aggregate filter support for groups only ([#426](https://github.com/sourcenetwork/defradb/issues/426)) -* Configurable caller option in logger ([#416](https://github.com/sourcenetwork/defradb/issues/416)) -* Add Average aggregate support ([#383](https://github.com/sourcenetwork/defradb/issues/383)) -* Allow summation of aggregates ([#341](https://github.com/sourcenetwork/defradb/issues/341)) -* Add ability to check DefraDB CLI version. ([#339](https://github.com/sourcenetwork/defradb/issues/339)) - -### Fixes - -* Add a check to ensure limit is not 0 when evaluating query limit and offset ([#706](https://github.com/sourcenetwork/defradb/issues/706)) -* Support multiple `--logger` flags ([#704](https://github.com/sourcenetwork/defradb/issues/704)) -* Return without an error if relation is finalized ([#698](https://github.com/sourcenetwork/defradb/issues/698)) -* Logger not correctly applying named config ([#696](https://github.com/sourcenetwork/defradb/issues/696)) -* Add content-type media type parsing ([#678](https://github.com/sourcenetwork/defradb/issues/678)) -* Remove portSyncLock deadlock condition ([#671](https://github.com/sourcenetwork/defradb/issues/671)) -* Silence cobra default errors and usage printing ([#668](https://github.com/sourcenetwork/defradb/issues/668)) -* Add stdout validation when setting logging output path ([#666](https://github.com/sourcenetwork/defradb/issues/666)) -* Consider `--logoutput` CLI flag properly ([#645](https://github.com/sourcenetwork/defradb/issues/645)) -* Handle errors and responses in CLI `client` commands ([#579](https://github.com/sourcenetwork/defradb/issues/579)) -* Rename aggregate gql types ([#638](https://github.com/sourcenetwork/defradb/issues/638)) -* Error when attempting to insert value into relationship field ([#632](https://github.com/sourcenetwork/defradb/issues/632)) -* Allow adding of new schema to database ([#635](https://github.com/sourcenetwork/defradb/issues/635)) -* Correctly parse dockey in broadcast log event. ([#631](https://github.com/sourcenetwork/defradb/issues/631)) -* Increase system's open files limit in integration tests ([#627](https://github.com/sourcenetwork/defradb/issues/627)) -* Avoid populating `order.ordering` with empties. ([#618](https://github.com/sourcenetwork/defradb/issues/618)) -* Change to supporting of non-null inline arrays ([#609](https://github.com/sourcenetwork/defradb/issues/609)) -* Assert fields exist in collection before saving to them ([#604](https://github.com/sourcenetwork/defradb/issues/604)) -* CLI `init` command to reinitialize only config file ([#603](https://github.com/sourcenetwork/defradb/issues/603)) -* Add config and registry clearing to TestLogWritesMessagesToFeedbackLog ([#596](https://github.com/sourcenetwork/defradb/issues/596)) -* Change `$eq` to `_eq` in the failing test. ([#576](https://github.com/sourcenetwork/defradb/issues/576)) -* Resolve failing HTTP API tests via cleanup ([#557](https://github.com/sourcenetwork/defradb/issues/557)) -* Ensure Makefile compatibility with macOS ([#527](https://github.com/sourcenetwork/defradb/issues/527)) -* Separate out iotas in their own blocks. ([#464](https://github.com/sourcenetwork/defradb/issues/464)) -* Use x/cases for titling instead of strings to handle deprecation ([#457](https://github.com/sourcenetwork/defradb/issues/457)) -* Handle limit and offset in sub groups ([#440](https://github.com/sourcenetwork/defradb/issues/440)) -* Issue preventing DB from restarting with no records ([#437](https://github.com/sourcenetwork/defradb/issues/437)) -* log serving HTTP API before goroutine blocks ([#358](https://github.com/sourcenetwork/defradb/issues/358)) - -### Testing - -* Add integration testing for P2P. ([#655](https://github.com/sourcenetwork/defradb/issues/655)) -* Fix formatting of tests with no extra brackets ([#643](https://github.com/sourcenetwork/defradb/issues/643)) -* Add tests for `averageNode` explain. ([#639](https://github.com/sourcenetwork/defradb/issues/639)) -* Add schema integration tests ([#628](https://github.com/sourcenetwork/defradb/issues/628)) -* Add tests for default properties ([#611](https://github.com/sourcenetwork/defradb/issues/611)) -* Specify which collection to update in test framework ([#601](https://github.com/sourcenetwork/defradb/issues/601)) -* Add tests for grouping by undefined value ([#543](https://github.com/sourcenetwork/defradb/issues/543)) -* Add test for querying undefined field ([#544](https://github.com/sourcenetwork/defradb/issues/544)) -* Expand commit query tests ([#541](https://github.com/sourcenetwork/defradb/issues/541)) -* Add cid (time-travel) query tests ([#539](https://github.com/sourcenetwork/defradb/issues/539)) -* Restructure and expand filter tests ([#512](https://github.com/sourcenetwork/defradb/issues/512)) -* Basic unit testing of `node` package ([#503](https://github.com/sourcenetwork/defradb/issues/503)) -* Test filter in filter tests ([#473](https://github.com/sourcenetwork/defradb/issues/473)) -* Add test for deletion of records in a relationship ([#329](https://github.com/sourcenetwork/defradb/issues/329)) -* Benchmark transaction iteration ([#289](https://github.com/sourcenetwork/defradb/issues/289)) - -### Refactoring - -* Improve CLI error handling and fix small issues ([#649](https://github.com/sourcenetwork/defradb/issues/649)) -* Add top-level `version` package ([#583](https://github.com/sourcenetwork/defradb/issues/583)) -* Remove extra log levels ([#634](https://github.com/sourcenetwork/defradb/issues/634)) -* Change `sortNode` to `orderNode`. ([#591](https://github.com/sourcenetwork/defradb/issues/591)) -* Rework update and delete node to remove secondary planner ([#571](https://github.com/sourcenetwork/defradb/issues/571)) -* Trim imported connor package ([#530](https://github.com/sourcenetwork/defradb/issues/530)) -* Internal doc restructure ([#471](https://github.com/sourcenetwork/defradb/issues/471)) -* Copy-paste connor fork into repo ([#567](https://github.com/sourcenetwork/defradb/issues/567)) -* Add safety to the tests, add ability to catch stderr logs and add output path validation ([#552](https://github.com/sourcenetwork/defradb/issues/552)) -* Change handler functions implementation and response formatting ([#498](https://github.com/sourcenetwork/defradb/issues/498)) -* Improve the HTTP API implementation ([#382](https://github.com/sourcenetwork/defradb/issues/382)) -* Use new logger in net/api ([#420](https://github.com/sourcenetwork/defradb/issues/420)) -* Rename NewCidV1_SHA2_256 to mixedCaps ([#415](https://github.com/sourcenetwork/defradb/issues/415)) -* Remove utils package ([#397](https://github.com/sourcenetwork/defradb/issues/397)) -* Rework planNode Next and Value(s) function ([#374](https://github.com/sourcenetwork/defradb/issues/374)) -* Restructure aggregate query syntax ([#373](https://github.com/sourcenetwork/defradb/issues/373)) -* Remove dead code from client package and document remaining ([#356](https://github.com/sourcenetwork/defradb/issues/356)) -* Restructure datastore keys ([#316](https://github.com/sourcenetwork/defradb/issues/316)) -* Add commits lost during github outage ([#303](https://github.com/sourcenetwork/defradb/issues/303)) -* Move public members out of core and base packages ([#295](https://github.com/sourcenetwork/defradb/issues/295)) -* Make db stuff internal/private ([#291](https://github.com/sourcenetwork/defradb/issues/291)) -* Rework client.DB to ensure interface contains only public types ([#277](https://github.com/sourcenetwork/defradb/issues/277)) -* Remove GetPrimaryIndexDocKey from collection interface ([#279](https://github.com/sourcenetwork/defradb/issues/279)) -* Remove DataStoreKey from (public) dockey struct ([#278](https://github.com/sourcenetwork/defradb/issues/278)) -* Renormalize to ensure consistent file line termination. ([#226](https://github.com/sourcenetwork/defradb/issues/226)) -* Strongly typed key refactor ([#17](https://github.com/sourcenetwork/defradb/issues/17)) - -### Documentation - -* Use permanent link to BSL license document ([#692](https://github.com/sourcenetwork/defradb/issues/692)) -* README update v0.3.0 ([#646](https://github.com/sourcenetwork/defradb/issues/646)) -* Improve code documentation ([#533](https://github.com/sourcenetwork/defradb/issues/533)) -* Add CONTRIBUTING.md ([#531](https://github.com/sourcenetwork/defradb/issues/531)) -* Add package level docs for logging lib ([#338](https://github.com/sourcenetwork/defradb/issues/338)) - -### Tooling - -* Include all touched packages in code coverage ([#673](https://github.com/sourcenetwork/defradb/issues/673)) -* Use `gotestsum` over `go test` ([#619](https://github.com/sourcenetwork/defradb/issues/619)) -* Update Github pull request template ([#524](https://github.com/sourcenetwork/defradb/issues/524)) -* Fix the cross-build script ([#460](https://github.com/sourcenetwork/defradb/issues/460)) -* Add test coverage html output ([#466](https://github.com/sourcenetwork/defradb/issues/466)) -* Add linter rule for `goconst`. ([#398](https://github.com/sourcenetwork/defradb/issues/398)) -* Add github PR template. ([#394](https://github.com/sourcenetwork/defradb/issues/394)) -* Disable auto-fixing linter issues by default ([#429](https://github.com/sourcenetwork/defradb/issues/429)) -* Fix linting of empty `else` code blocks ([#402](https://github.com/sourcenetwork/defradb/issues/402)) -* Add the `gofmt` linter rule. ([#405](https://github.com/sourcenetwork/defradb/issues/405)) -* Cleanup linter config file ([#400](https://github.com/sourcenetwork/defradb/issues/400)) -* Add linter rule for copyright headers ([#360](https://github.com/sourcenetwork/defradb/issues/360)) -* Organize our config files and tooling. ([#336](https://github.com/sourcenetwork/defradb/issues/336)) -* Limit line length to 100 characters (linter check) ([#224](https://github.com/sourcenetwork/defradb/issues/224)) -* Ignore db/tests folder and the bench marks. ([#280](https://github.com/sourcenetwork/defradb/issues/280)) - -### Continuous Integration - -* Fix circleci cache permission errors. ([#371](https://github.com/sourcenetwork/defradb/issues/371)) -* Ban extra elses ([#366](https://github.com/sourcenetwork/defradb/issues/366)) -* Fix change-detection to not fail when new tests are added. ([#333](https://github.com/sourcenetwork/defradb/issues/333)) -* Update golang-ci linter and explicit go-setup to use v1.17 ([#331](https://github.com/sourcenetwork/defradb/issues/331)) -* Comment the benchmarking result comparison to the PR ([#305](https://github.com/sourcenetwork/defradb/issues/305)) -* Add benchmark performance comparisons ([#232](https://github.com/sourcenetwork/defradb/issues/232)) -* Add caching / storing of bench report on default branch ([#290](https://github.com/sourcenetwork/defradb/issues/290)) -* Ensure full-benchmarks are ran on a PR-merge. ([#282](https://github.com/sourcenetwork/defradb/issues/282)) -* Add ability to control benchmarks by PR labels. ([#267](https://github.com/sourcenetwork/defradb/issues/267)) - -### Chore - -* Update APL to refer to D2 Foundation ([#711](https://github.com/sourcenetwork/defradb/issues/711)) -* Update gitignore to include `cmd` folders ([#617](https://github.com/sourcenetwork/defradb/issues/617)) -* Enable random execution order of tests ([#554](https://github.com/sourcenetwork/defradb/issues/554)) -* Enable linters exportloopref, nolintlint, whitespace ([#535](https://github.com/sourcenetwork/defradb/issues/535)) -* Add utility for generation of man pages ([#493](https://github.com/sourcenetwork/defradb/issues/493)) -* Add Dockerfile ([#517](https://github.com/sourcenetwork/defradb/issues/517)) -* Enable errorlint linter ([#520](https://github.com/sourcenetwork/defradb/issues/520)) -* Binaries in`cmd` folder, examples in `examples` folder ([#501](https://github.com/sourcenetwork/defradb/issues/501)) -* Improve log outputs ([#506](https://github.com/sourcenetwork/defradb/issues/506)) -* Move testing to top-level `tests` folder ([#446](https://github.com/sourcenetwork/defradb/issues/446)) -* Update dependencies ([#450](https://github.com/sourcenetwork/defradb/issues/450)) -* Update go-ipfs-blockstore and ipfs-lite ([#436](https://github.com/sourcenetwork/defradb/issues/436)) -* Update libp2p dependency to v0.19 ([#424](https://github.com/sourcenetwork/defradb/issues/424)) -* Update ioutil package to io / os packages. ([#376](https://github.com/sourcenetwork/defradb/issues/376)) -* git ignore vscode ([#343](https://github.com/sourcenetwork/defradb/issues/343)) -* Updated README.md contributors section ([#292](https://github.com/sourcenetwork/defradb/issues/292)) -* Update changelog v0.2.1 ([#252](https://github.com/sourcenetwork/defradb/issues/252)) - - -## [v0.2.1](https://github.com/sourcenetwork/defradb/compare/v0.2.0...v0.2.1) - -> 2022-03-04 - -### Features - -* Add ability to delete multiple documents using filter ([#206](https://github.com/sourcenetwork/defradb/issues/206)) -* Add ability to delete multiple documents, using multiple ids ([#196](https://github.com/sourcenetwork/defradb/issues/196)) - -### Fixes - -* Concurrency control of Document using RWMutex ([#213](https://github.com/sourcenetwork/defradb/issues/213)) -* Only log errors and above when benchmarking ([#261](https://github.com/sourcenetwork/defradb/issues/261)) -* Handle proper type conversion on sort nodes ([#228](https://github.com/sourcenetwork/defradb/issues/228)) -* Return empty array if no values found ([#223](https://github.com/sourcenetwork/defradb/issues/223)) -* Close fetcher on error ([#210](https://github.com/sourcenetwork/defradb/issues/210)) -* Installing binary using defradb name ([#190](https://github.com/sourcenetwork/defradb/issues/190)) - -### Tooling - -* Add short benchmark runner option ([#263](https://github.com/sourcenetwork/defradb/issues/263)) - -### Documentation - -* Add data format changes documentation folder ([#89](https://github.com/sourcenetwork/defradb/issues/89)) -* Correcting typos ([#143](https://github.com/sourcenetwork/defradb/issues/143)) -* Update generated CLI docs ([#208](https://github.com/sourcenetwork/defradb/issues/208)) -* Updated readme with P2P section ([#220](https://github.com/sourcenetwork/defradb/issues/220)) -* Update old or missing license headers ([#205](https://github.com/sourcenetwork/defradb/issues/205)) -* Update git-chglog config and template ([#195](https://github.com/sourcenetwork/defradb/issues/195)) - -### Refactoring - -* Introduction of logging system ([#67](https://github.com/sourcenetwork/defradb/issues/67)) -* Restructure db/txn/multistore structures ([#199](https://github.com/sourcenetwork/defradb/issues/199)) -* Initialize database in constructor ([#211](https://github.com/sourcenetwork/defradb/issues/211)) -* Purge all println and ban it ([#253](https://github.com/sourcenetwork/defradb/issues/253)) - -### Testing - -* Detect and force breaking filesystem changes to be documented ([#89](https://github.com/sourcenetwork/defradb/issues/89)) -* Boost collection test coverage ([#183](https://github.com/sourcenetwork/defradb/issues/183)) - -### Continuous integration - -* Combine the Lint and Benchmark workflows so that the benchmark job depends on the lint job in one workflow ([#209](https://github.com/sourcenetwork/defradb/issues/209)) -* Add rule to only run benchmark if other check are successful ([#194](https://github.com/sourcenetwork/defradb/issues/194)) -* Increase linter timeout ([#230](https://github.com/sourcenetwork/defradb/issues/230)) - -### Chore - -* Remove commented out code ([#238](https://github.com/sourcenetwork/defradb/issues/238)) -* Remove dead code from multi node ([#186](https://github.com/sourcenetwork/defradb/issues/186)) - - -## [v0.2.0](https://github.com/sourcenetwork/defradb/compare/v0.1.0...v0.2.0) - -> 2022-02-07 - -DefraDB v0.2 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. - -This release is jam-packed with new features and a small number of breaking changes. Read the full changelog for a detailed description. Most notable features include a new Peer-to-Peer (P2P) data synchronization system, an expanded query system to support GroupBy & Aggregate operations, and lastly TimeTraveling queries allowing to query previous states of a document. - -Much more than just that has been added to ensure we're building reliable software expected of any database, such as expanded test & benchmark suites, automated bug detection, performance gains, and more. - -This release does include a Breaking Change to existing v0.1 databases regarding the internal data model, which affects the "Content Identifiers" we use to generate DocKeys and VersionIDs. If you need help migrating an existing deployment, reach out at hello@source.network or join our Discord at https://discord.source.network. - -### Features - -* Added Peer-to-Peer networking data synchronization ([#177](https://github.com/sourcenetwork/defradb/issues/177)) -* TimeTraveling (History Traversing) query engine and doc fetcher ([#59](https://github.com/sourcenetwork/defradb/issues/59)) -* Add Document Deletion with a Key ([#150](https://github.com/sourcenetwork/defradb/issues/150)) -* Add support for sum aggregate ([#121](https://github.com/sourcenetwork/defradb/issues/121)) -* Add support for lwwr scalar arrays (full replace on update) ([#115](https://github.com/sourcenetwork/defradb/issues/115)) -* Add count aggregate support ([#102](https://github.com/sourcenetwork/defradb/issues/102)) -* Add support for named relationships ([#108](https://github.com/sourcenetwork/defradb/issues/108)) -* Add multi doc key lookup support ([#76](https://github.com/sourcenetwork/defradb/issues/76)) -* Add basic group by functionality ([#43](https://github.com/sourcenetwork/defradb/issues/43)) -* Update datastore packages to allow use of context ([#48](https://github.com/sourcenetwork/defradb/issues/48)) - -### Bug fixes - -* Only add join if aggregating child object collection ([#188](https://github.com/sourcenetwork/defradb/issues/188)) -* Handle errors generated during input object thunks ([#123](https://github.com/sourcenetwork/defradb/issues/123)) -* Remove new types from in-memory cache on generate error ([#122](https://github.com/sourcenetwork/defradb/issues/122)) -* Support relationships where both fields have the same name ([#109](https://github.com/sourcenetwork/defradb/issues/109)) -* Handle errors generated in fields thunk ([#66](https://github.com/sourcenetwork/defradb/issues/66)) -* Ensure OperationDefinition case has at least one selection([#24](https://github.com/sourcenetwork/defradb/pull/24)) -* Close datastore iterator on scan close ([#56](https://github.com/sourcenetwork/defradb/pull/56)) (resulted in a panic when using limit) -* Close superseded iterators before orphaning ([#56](https://github.com/sourcenetwork/defradb/pull/56)) (fixes a panic in the join code) -* Move discard to after error check ([#88](https://github.com/sourcenetwork/defradb/pull/88)) (did result in panic if transaction creation fails) -* Check for nil iterator before closing document fetcher ([#108](https://github.com/sourcenetwork/defradb/pull/108)) - -### Tooling -* Added benchmark suite ([#160](https://github.com/sourcenetwork/defradb/issues/160)) - -### Documentation - -* Correcting comment typos ([#142](https://github.com/sourcenetwork/defradb/issues/142)) -* Correcting README typos ([#140](https://github.com/sourcenetwork/defradb/issues/140)) - -### Testing - -* Add transaction integration tests ([#175](https://github.com/sourcenetwork/defradb/issues/175)) -* Allow running of tests using badger-file as well as IM options ([#128](https://github.com/sourcenetwork/defradb/issues/128)) -* Add test datastore selection support ([#88](https://github.com/sourcenetwork/defradb/issues/88)) - -### Refactoring - -* Datatype modification protection ([#138](https://github.com/sourcenetwork/defradb/issues/138)) -* Cleanup Linter Complaints and Setup Makefile ([#63](https://github.com/sourcenetwork/defradb/issues/63)) -* Rework document rendering to avoid data duplication and mutation ([#68](https://github.com/sourcenetwork/defradb/issues/68)) -* Remove dependency on concrete datastore implementations from db package ([#51](https://github.com/sourcenetwork/defradb/issues/51)) -* Remove all `errors.Wrap` and update them with `fmt.Errorf`. ([#41](https://github.com/sourcenetwork/defradb/issues/41)) -* Restructure integration tests to provide better visibility ([#15](https://github.com/sourcenetwork/defradb/pull/15)) -* Remove schemaless code branches ([#23](https://github.com/sourcenetwork/defradb/pull/23)) - -### Performance -* Add badger multi scan support ([#85](https://github.com/sourcenetwork/defradb/pull/85)) -* Add support for range spans ([#86](https://github.com/sourcenetwork/defradb/pull/86)) - -### Continous integration - -* Use more accurate test coverage. ([#134](https://github.com/sourcenetwork/defradb/issues/134)) -* Disable Codecov's Patch Check -* Make codcov less strict for now to unblock development ([#125](https://github.com/sourcenetwork/defradb/issues/125)) -* Add codecov config file. ([#118](https://github.com/sourcenetwork/defradb/issues/118)) -* Add workflow that runs a job on AWS EC2 instance. ([#110](https://github.com/sourcenetwork/defradb/issues/110)) -* Add Code Test Coverage with CodeCov ([#116](https://github.com/sourcenetwork/defradb/issues/116)) -* Integrate GitHub Action for golangci-lint Annotations ([#106](https://github.com/sourcenetwork/defradb/issues/106)) -* Add Linter Check to CircleCi ([#92](https://github.com/sourcenetwork/defradb/issues/92)) - -### Chore - -* Remove the S1038 rule of the gosimple linter. ([#129](https://github.com/sourcenetwork/defradb/issues/129)) -* Update to badger v3, and use badger as default in memory store ([#56](https://github.com/sourcenetwork/defradb/issues/56)) -* Make Cid versions consistent ([#57](https://github.com/sourcenetwork/defradb/issues/57)) \ No newline at end of file diff --git a/docs/sourcehub/testnet/_category_.json b/docs/sourcehub/testnet/_category_.json new file mode 100644 index 0000000..1fcd03f --- /dev/null +++ b/docs/sourcehub/testnet/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Testnet" + } + \ No newline at end of file diff --git a/docs/sourcehub/testnet/join.md b/docs/sourcehub/testnet/join.md new file mode 100644 index 0000000..ff0a6c8 --- /dev/null +++ b/docs/sourcehub/testnet/join.md @@ -0,0 +1,158 @@ +--- +title: Join +sidebar_position: 2 +--- + +# How to join Testnet 1 +The following will detail the necessary steps to join Testnet 1 as a validator. Only approved validators can join testnet 1 as we have not yet enabled permissionless public validator sets. + +## Hardware Requirements +Firstly any validator joining the network must ensure they have sufficient server hardware to ensure the network meets its current performance targets. + +* x86-64 (amd64) multi-core CPU (AMD / Intel) +* 16GB RAM +* 256GB SSD Storage +* 100Mbps bi-directional Internet connection + +## SourceHub Binary + +### Precompiled +You can get the `sourcehubd` binary from the releases page of the SourceHub repo: https://github.com/sourcenetwork/sourcehub/releases/tag/v0.2.0 +```bash +cd $HOME +wget https://github.com/sourcenetwork/sourcehub/releases/download/v0.2.0/sourcehubd +chmod +x sourcehubd +sudo mv /usr/bin +``` + + +### From Source +You can download the code and compile your own binaries if you prefer. However you will need a local installation of the `go` toolchain at a minimum version of 1.21 +```bash +cd $HOME +git clone https://github.com/sourcenetwork/sourcehub +cd sourcehub +git checkout v0.2.0 +make install +export PATH=$PATH:$GOBIN +``` +Now you will have the `sourcehubd` available in your local system. + +## Initialization +To join the network you need to initiaze your node with a keypair, download the genesis file, and update your configurations. + +```bash +# You must specify your own moniker, which is a label for your node +sourcehubd init --chain-id sourcehub-testnet1 + +# Download the Genesis +cd $HOME +wget https://raw.githubusercontent.com/sourcenetwork/networks/testnet/testnet1/genesis.json +mv genesis.json $HOME/.sourcehub/config/genesis.json + +# Update your configuration +cd $HOME/.sourcehub/config +sed -i 's/minimum-gas-prices = ""/minimum-gas-prices = "0.001uopen"/' app.toml +sed -i 's/persistent_peers = ""/persistent_peers = "2da42ce7b32cb76c3a86db2eadfab8508ee41815@54.158.208.103:26656"/' config.toml + +# Update timeouts +sed -i 's/timeout_propose = "3s"/timeout_propose = "500ms"/' config.toml +sed -i 's/timeout_commit = "5s"/timeout_commit = "1s"/' config.toml +``` + +### State Sync (Recommended) +At this point you can start your node and it will begin syncing with the rest of the network starting from height 0. However, this process can take several hours to complete. Instead nodes can use the ***much*** faster State Sync system that automatically downloads a snapshot from other nodes at a specific trusted height, and will sync from this point onwards. This process only takes a couple of minutes. + +```bash +cd $HOME/.sourcehubd/config +# Configure Trusted blocks +sed -i 's/enable = false/enable = true/' config.toml +sed -i 's/trust_height = 0/trust_height = /' config.toml +sed -i 's/trust_hash = ""/trust_hash = ""/' config.toml +sed -i 's/rpc_servers = ""/rpc_servers = "http:\/\/rpc1.testnet1.source.network:26657,http:\/\/rpc2.testnet1.source.network:26657"/' config.toml + +# Download snapshot +cd $HOME +export BLOCK_HEIGHT= +wget https://sourcehub-snapshot.s3.amazonaws.com/testnet-1/$BLOCK_HEIGHT-3.tar.gz +sourcehubd snapshots load $BLOCK_HEIGHT-3.tar.gz +sourcehubd snapshots restore $BLOCK_HEIGHT 3 +sourcehubd comet bootstrap-state +``` + +You can get the `` and `` from the `#validator-info` channel in the Validator section of the [Source Network Discord](https://discord.source.network) + +### SystemD Service (Optional) + +Create the following file: `/etc/systemd/system/sourcehubd.service` +```bash +[Unit] +Description=SourceHub service +After=network-online.target + +[Service] +User= +ExecStart=//sourcehubd start --x-crisis-skip-assert-invariants +Restart=no +LimitNOFILE=4096 + +[Install] +WantedBy=multi-user.target +``` + +You must specify/edit the `` and `` of your system in the SystemD service file. + +#### Start the service + +```bash +# Restart SystemD +systemctl daemon-reload +systemctl restart systemd-journald + +# Start the SourceHub service +systemctl enable sourcehubd.service +systemctl start sourcehubd.service +``` + +To follow the service log, run `journalctl -fu sourcehubd` + +## Register your validator +Once you have your node running and synchronized with the rest of the network you can register as a Validator. + +First, we want to create a local keypair. This keypair is independant of your validator, and can exist on any node, but we need one to submit transactions to the network, like the `create-validator` transaction. +```bash +sourcehubd keys add +``` + +Make sure to backup the newly created keypair. Then, go to the Source Network [Faucet](https://faucet.source.network/) and get some `$OPEN` tokens so you can pay for transaction gas. + +You also need to post your key address to the `#validator-general` chat on the [Source Network Discord](https://discord.source.network) so you can recieve your minimum `stake` tokens. These stake tokens are used to determine voting power in the network, and are seperate from the `$OPEN` tokens used for gas. + +Once you have recieved your `stake` tokens from the Source Network team you can create you validator wit the following commands. + +```bash +# Create Validator info json config +# Update the moniker, website, security, and details +cd $HOME +echo "{ + \"pubkey\": $(sourcehubd comet show-validator), + \"amount\": \"1stake\", + \"moniker\": \"\", + \"website\": \"validator's (optional) website\", + \"security\": \"validator's (optional) security contact email\", + \"details\": \"validator's (optional) details\", + \"commission-rate\": \"0\", + \"commission-max-rate\": \"0\", + \"commission-max-change-rate\": \"0\", + \"min-self-delegation\": \"1\" +}" > validator.json + +# Create validator transaction +sourcehubd tx staking create-validator validator.json --from= --fees 1000uopen -y +``` + +Where the `` is the same key you made from above. + +If the transaction is successful, you now have an *in-active* validator on SourceHub Testnet 1. To become active, you must post your validator address `$> sourcehubd comet show-address` in the `#validator-general` chat on the [Source Network Discord](https://discord.source.network), and we will delegate voting power to you, which will move you into the *active* validator set, and you'll node will start producing and verifying blocks. + +> The SourceHub Testnet 1 is a public but permissioned network, meaning only approved validators can join the network. This is guranteed by the fact that Source owns 100% of the staking power of the network. diff --git a/docs/Testnet1.md b/docs/sourcehub/testnet/overview.md similarity index 97% rename from docs/Testnet1.md rename to docs/sourcehub/testnet/overview.md index 621c21c..aa0ec2d 100644 --- a/docs/Testnet1.md +++ b/docs/sourcehub/testnet/overview.md @@ -1,8 +1,8 @@ --- -sidebar_position: 6 -title: Testnet1 +title: Overview +sidebar_position: 1 --- -# Testnet1 +# Testnet Overview ## Introduction Testnets are essential for developing and testing blockchain networks before they go live on the mainnet. They consist of nodes running specific blockchain protocols and modules that enhance the functionality of the DefraDB. @@ -65,8 +65,8 @@ For testing purposes, developers require tokens in their local wallets, obtained For effective participation in the Testnet, certain hardware specifications are essential for running a node as a validator. The key considerations encompass network capability, persistence, and connections. The specified hardware requirements include: * x86-64 (amd64) multi-core CPU (AMD / Intel) -* 64GB RAM -* 1TB NVMe SSD Storage +* 16GB RAM +* 256GB SSD Storage * 100Mbps bi-directional Internet connection ### Installation @@ -74,7 +74,7 @@ The installation is divided into two components: 1. SourceHub Daemon (SourceHub D): This is also referred to as node software, and is interchangeable with the SourceHub Daemon. The binaries for SourceHub D are named `sourcehubd`. -2. Orbis Daemon (Orbis D): The binaries for Orbis D are named `orbisd`. +2. Orbis Daemon (Orbis): The binaries for Orbis are named `orbisd`.   diff --git a/docusaurus.config.js b/docusaurus.config.js index badb1eb..de40fd3 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -25,6 +25,12 @@ const config = { sidebarPath: require.resolve("./sidebars.js"), editUrl: "https://github.com/sourcenetwork/docs.source.network/edit/master/", + + // Reorder changelog sidebar + async sidebarItemsGenerator({defaultSidebarItemsGenerator, ...args}) { + const sidebarItems = await defaultSidebarItemsGenerator(args); + return reverseSidebarChangelog(sidebarItems); + } }, theme: { customCss: require.resolve("./src/css/custom.scss"), @@ -55,9 +61,23 @@ const config = { { type: "docSidebar", position: "left", - sidebarId: "mainSidebar", - label: "Docs", - className: "header-docs-link", + sidebarId: "defraSidebar", + label: "DefraDB", + className: "header-docs-link-defra", + }, + { + type: "docSidebar", + position: "left", + sidebarId: "sourcehubSidebar", + label: "SourceHub", + className: "header-docs-link-sourcehub", + }, + { + type: "docSidebar", + position: "left", + sidebarId: "orbisSidebar", + label: "Orbis", + className: "header-docs-link-orbis", }, { href: "https://github.com/sourcenetwork/docs.source.network", @@ -126,10 +146,24 @@ const config = { darkTheme: darkCodeTheme, }, }), - plugins: ["docusaurus-plugin-sass"], + plugins: [ + "docusaurus-plugin-sass", + ], customFields: { docsData: {}, }, }; module.exports = config; + +// Reverse the sidebar items ordering (including nested category items) +function reverseSidebarChangelog(items) { + // Reverse items in categories + const result = items.map((item) => { + if (item.type === 'category' && item.label == "Release Notes") { + return {...item, items: item.items.reverse()}; + } + return item; + }); + return result; +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8f93c3c..3a3d48e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "website", + "name": "docs.source.network", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "website", + "name": "docs.source.network", "version": "0.0.0", "dependencies": { "@docusaurus/core": "2.4.0", diff --git a/sidebars.js b/sidebars.js index 1af50d9..c71cd8f 100644 --- a/sidebars.js +++ b/sidebars.js @@ -14,7 +14,18 @@ /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ const sidebars = { // By default, Docusaurus generates a sidebar from the docs folder structure - mainSidebar: [{ type: "autogenerated", dirName: "." }], + defraSidebar: [{ + type: "autogenerated", + dirName: "defradb", + }], + sourcehubSidebar: [{ + type: "autogenerated", + dirName: "sourcehub" + }], + orbisSidebar: [{ + type: "autogenerated", + dirName: "orbis" + }], // But you can create a sidebar manually /* From d5abbea664f799e430fa79aa663f7ef94f9fcd39 Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Thu, 7 Mar 2024 05:41:01 -0500 Subject: [PATCH 08/48] Feat: Added SourceHub OpenAPI docs (#140) Added a quick docusaurus plugin to handle openapi generated documentation. --- docusaurus.config.js | 8 +- openapi.yml | 7539 ++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 1713 +++++++++- package.json | 6 +- sidebars.js | 11 +- 5 files changed, 9229 insertions(+), 48 deletions(-) create mode 100644 openapi.yml diff --git a/docusaurus.config.js b/docusaurus.config.js index de40fd3..f14a95c 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -17,9 +17,13 @@ const config = { projectName: "source-developer", // Usually your repo name. presets: [ [ - "classic", - /** @type {import('@docusaurus/preset-classic').Options} */ + "docusaurus-preset-openapi", + /** @type {import('docusaurus-preset-openapi').Options} */ ({ + api: { + path: "openapi.yml", + routeBasePath: "/sourcehub/api", + }, docs: { routeBasePath: "/", sidebarPath: require.resolve("./sidebars.js"), diff --git a/openapi.yml b/openapi.yml new file mode 100644 index 0000000..b753865 --- /dev/null +++ b/openapi.yml @@ -0,0 +1,7539 @@ +openapi: 3.0.1 +info: + title: HTTP API Console + description: "" + version: 0.2.0 +servers: +- url: http://rpc1.testnet1.source.network:1317/ +tags: +- name: ACP + description: Access Control Policy (ACP) message types +- name: Bulletin + description: Bulletin module message types +paths: + /sourcehub.acp.Msg/CheckAccess: + post: + tags: + - ACP + summary: CheckAccess executes an Access Request for an User + description: |- + The resulting evaluation is stored in SourceHub. It's used to generate a cryptographic proof that the given Access Request + was valid at a particular block height. + operationId: SourcehubAcpMsg_CheckAccess + requestBody: + content: + '*/*': + schema: + type: object + properties: + creator: + type: string + policy_id: + type: string + creation_time: + type: string + format: date-time + access_request: + title: AccessRequest represents the wish to perform a set of operations + by an actor + type: object + properties: + operations: + type: array + items: + type: object + properties: + object: + title: target object for operation + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be + access controlled within a Policy. + permission: + title: permission required to perform operation + type: string + description: Operation represents an action over an object. + actor: + title: actor requesting operations + type: object + properties: + id: + type: string + description: Actor represents an entity which makes access requests + to a Policy. + required: true + responses: + "200": + description: A successful response. + content: + '*/*': + schema: + type: object + properties: + decision: + title: AccessDecision models the result of evaluating a set of + AccessRequests for an Actor + type: object + properties: + id: + type: string + policy_id: + title: used as part of id generation + type: string + creator: + title: used as part of id generation + type: string + creator_acc_sequence: + title: used as part of id generation + type: string + format: uint64 + operations: + title: used as part of id generation + type: array + items: + type: object + properties: + object: + title: target object for operation + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must + be access controlled within a Policy. + permission: + title: permission required to perform operation + type: string + description: Operation represents an action over an object. + actor_did: + title: used as part of id generation + type: string + actor: + title: used as part of id generation + type: string + params: + title: used as part of id generation + type: object + properties: + decision_expiration_delta: + title: number of blocks a Decision is valid for + type: string + format: uint64 + proof_expiration_delta: + title: number of blocks a DecisionProof is valid for + type: string + format: uint64 + ticket_expiration_delta: + title: number of blocks an AccessTicket is valid for + type: string + format: uint64 + creation_time: + type: string + format: date-time + issued_height: + title: issued_height stores the block height when the Decision + was evaluated + type: string + format: uint64 + default: + description: An unexpected error response. + content: + '*/*': + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + additionalProperties: + type: object + x-codegen-request-body-name: body + /sourcehub.acp.Msg/CreatePolicy: + post: + tags: + - ACP + summary: |- + CreatePolicy adds a new Policy. + description: |- + The Policy models an aplication's high level access control rules. + operationId: SourcehubAcpMsg_CreatePolicy + requestBody: + content: + '*/*': + schema: + type: object + properties: + creator: + type: string + policy: + type: string + marshal_type: + type: string + description: |- + PolicyEncodingType enumerates supported marshaling types for policies. + + - UNKNOWN: Fallback value for a missing Marshaling Type + - SHORT_YAML: Policy Marshaled as a YAML Short Policy definition + - SHORT_JSON: Policy Marshaled as a JSON Short Policy definition + default: UNKNOWN + enum: + - UNKNOWN + - SHORT_YAML + - SHORT_JSON + creation_time: + type: string + format: date-time + required: true + responses: + "200": + description: A successful response. + content: + '*/*': + schema: + type: object + properties: + policy: + type: object + properties: + id: + type: string + name: + type: string + description: + type: string + creation_time: + type: string + format: date-time + attributes: + type: object + additionalProperties: + type: string + resources: + type: array + items: + type: object + properties: + name: + type: string + doc: + type: string + permissions: + type: array + items: + type: object + properties: + name: + type: string + doc: + type: string + expression: + type: string + description: |- + Permission models a special type of Relation which is evaluated at runtime. + A permission often maps to an operation defined for a resource which an actor may attempt. + relations: + type: array + items: + type: object + properties: + name: + type: string + doc: + type: string + manages: + title: list of relations managed by the current + relation + type: array + items: + type: string + vr_types: + title: value restriction types + type: array + items: + type: object + properties: + resource_name: + title: resource_name scopes permissible + actors resource + type: string + relation_name: + title: relation_name scopes permissible + actors relation + type: string + description: |- + Restriction models a specification which a Relationship's actor + should meet. + description: |- + Resource models a namespace for objects in a Policy. + Appications will have multiple entities which they must manage such as files or groups. + A Resource represents a set of entities of a certain type. + actor_resource: + type: object + properties: + name: + type: string + doc: + type: string + relations: + type: array + items: + type: object + properties: + name: + type: string + doc: + type: string + manages: + title: list of relations managed by the current + relation + type: array + items: + type: string + vr_types: + title: value restriction types + type: array + items: + type: object + properties: + resource_name: + title: resource_name scopes permissible actors + resource + type: string + relation_name: + title: relation_name scopes permissible actors + relation + type: string + description: |- + Restriction models a specification which a Relationship's actor + should meet. + description: ActorResource represents a special Resource which + is reserved for Policy actors. + creator: + type: string + description: |- + Policy represents an ACP module Policy definition. + Each Policy defines a set of high level rules over how the acces control system + should behave. + default: + description: An unexpected error response. + content: + '*/*': + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + additionalProperties: + type: object + x-codegen-request-body-name: body + /sourcehub.acp.Msg/DeleteRelationship: + post: + tags: + - ACP + summary: |- + DelereRelationship removes a Relationship from a Policy. + description: |- + If the Relationship was not found in a Policy, this Msg is a no-op. + operationId: SourcehubAcpMsg_DeleteRelationship + requestBody: + content: + '*/*': + schema: + type: object + properties: + creator: + type: string + policy_id: + type: string + relationship: + type: object + properties: + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access + controlled within a Policy. + relation: + type: string + subject: + type: object + properties: + actor: + type: object + properties: + id: + type: string + description: Actor represents an entity which makes access + requests to a Policy. + actor_set: + type: object + properties: + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must + be access controlled within a Policy. + relation: + type: string + description: |- + ActorSet represents a set of Actors in a Policy. + It is specified through an Object, Relation pair, which represents + all actors which have a relationship with given obj-rel pair. + This expansion is recursive. + all_actors: + type: object + properties: {} + description: |- + AllActors models a special Relationship Subject which indicates + that all Actors in the Policy are included. + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access + controlled within a Policy. + description: Subject specifies the target of a Relationship. + description: |- + Relationship models an access control rule. + It states that the given subject has relation with object. + required: true + responses: + "200": + description: A successful response. + content: + '*/*': + schema: + type: object + properties: + record_found: + type: boolean + default: + description: An unexpected error response. + content: + '*/*': + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + additionalProperties: + type: object + x-codegen-request-body-name: body + /sourcehub.acp.Msg/RegisterObject: + post: + tags: + - ACP + summary: RegisterObject creates a Relationship within a Policy. + description: |- + The Owner has complete control over the set of subjects that are related + to their Object, + + giving them autonomy to share the object and revoke acces to the object, + + much like owners in a Discretionary Access Control model. + + Attempting to register a previously registered Object is an error, + Object IDs are therefore assumed to be unique within a Policy. + operationId: SourcehubAcpMsg_RegisterObject + requestBody: + content: + '*/*': + schema: + type: object + properties: + creator: + type: string + policy_id: + type: string + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + creation_time: + type: string + format: date-time + required: true + responses: + "200": + description: A successful response. + content: + '*/*': + schema: + type: object + properties: + result: + title: RegistrationResult encodes the possible result set from + Registering an Object + type: string + description: |- + - NoOp: NoOp indicates no action was take. The operation failed or the Object already existed and was active + - Registered: Registered indicates the Object was sucessfuly registered to the Actor. + - Unarchived: Unarchived indicates that a previously deleted Object is active again. + Only the original owners can Unarchive an object. + default: NoOp + enum: + - NoOp + - Registered + - Unarchived + default: + description: An unexpected error response. + content: + '*/*': + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + additionalProperties: + type: object + x-codegen-request-body-name: body + /sourcehub.acp.Msg/SetRelationship: + post: + tags: + - ACP + summary: SetRelationship creates or updates a Relationship within a Policy. + description: |- + A Relationship is a statement which ties together an object and a + subjecto with a "relation", + + which means the set of high level rules defined in the Policy will apply + to these entities. + operationId: SourcehubAcpMsg_SetRelationship + requestBody: + content: + '*/*': + schema: + type: object + properties: + creator: + type: string + policy_id: + type: string + creation_time: + type: string + format: date-time + relationship: + type: object + properties: + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access + controlled within a Policy. + relation: + type: string + subject: + type: object + properties: + actor: + type: object + properties: + id: + type: string + description: Actor represents an entity which makes access + requests to a Policy. + actor_set: + type: object + properties: + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must + be access controlled within a Policy. + relation: + type: string + description: |- + ActorSet represents a set of Actors in a Policy. + It is specified through an Object, Relation pair, which represents + all actors which have a relationship with given obj-rel pair. + This expansion is recursive. + all_actors: + type: object + properties: {} + description: |- + AllActors models a special Relationship Subject which indicates + that all Actors in the Policy are included. + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access + controlled within a Policy. + description: Subject specifies the target of a Relationship. + description: |- + Relationship models an access control rule. + It states that the given subject has relation with object. + required: true + responses: + "200": + description: A successful response. + content: + '*/*': + schema: + type: object + properties: + record_existed: + title: "Indicates whether the given Relationship previously existed,\ + \ ie the Tx was a no op" + type: boolean + default: + description: An unexpected error response. + content: + '*/*': + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + additionalProperties: + type: object + x-codegen-request-body-name: body + /sourcehub.acp.Msg/UnregisterObject: + post: + tags: + - ACP + summary: UnregisterObject "unshare" a Object. + description: |- + A caveat is that after removing the Relationships, a record of the original Object owner + is maintained to prevent an "ownership hijack" attack. + + Suppose Bob owns object Foo, which is shared with Bob but not Eve. + Eve wants to access Foo but was not given permission to, they could "hijack" Bob's object by waiting for Bob to Unregister Foo, + then submitting a RegisterObject Msg, effectively becoming Foo's new owner. + If Charlie has a copy of the object, Eve could convince Charlie to share his copy, granting Eve access to Foo. + The previous scenario where an unauthorized user is able to claim ownership to data previously unaccessible to them + is an "ownership hijack". + operationId: SourcehubAcpMsg_UnregisterObject + requestBody: + content: + '*/*': + schema: + type: object + properties: + creator: + type: string + policy_id: + type: string + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + required: true + responses: + "200": + description: A successful response. + content: + '*/*': + schema: + type: object + properties: + found: + type: boolean + default: + description: An unexpected error response. + content: + '*/*': + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + additionalProperties: + type: object + x-codegen-request-body-name: body + /sourcehub.bulletin.Msg/CreatePost: + post: + tags: + - Bulletin + summary: Post to the Bulletin + operationId: SourcehubBulletinMsg_CreatePost + requestBody: + content: + '*/*': + schema: + type: object + properties: + creator: + type: string + namespace: + type: string + payload: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + required: true + responses: + "200": + description: A successful response. + content: + '*/*': + schema: + type: object + default: + description: An unexpected error response. + content: + '*/*': + schema: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + additionalProperties: + type: object + x-codegen-request-body-name: body +components: + schemas: + cosmos.auth.v1beta1.MsgUpdateParams: + type: object + properties: + authority: + type: string + description: authority is the address that controls the module (defaults + to x/gov unless overwritten). + params: + type: object + properties: + max_memo_characters: + type: string + format: uint64 + tx_sig_limit: + type: string + format: uint64 + tx_size_cost_per_byte: + type: string + format: uint64 + sig_verify_cost_ed25519: + type: string + format: uint64 + sig_verify_cost_secp256k1: + type: string + format: uint64 + description: |- + params defines the x/auth parameters to update. + + NOTE: All parameters must be supplied. + description: |- + MsgUpdateParams is the Msg/UpdateParams request type. + + Since: cosmos-sdk 0.47 + cosmos.auth.v1beta1.MsgUpdateParamsResponse: + type: object + description: |- + MsgUpdateParamsResponse defines the response structure for executing a + MsgUpdateParams message. + + Since: cosmos-sdk 0.47 + cosmos.auth.v1beta1.Params: + type: object + properties: + max_memo_characters: + type: string + format: uint64 + tx_sig_limit: + type: string + format: uint64 + tx_size_cost_per_byte: + type: string + format: uint64 + sig_verify_cost_ed25519: + type: string + format: uint64 + sig_verify_cost_secp256k1: + type: string + format: uint64 + description: Params defines the parameters for the auth module. + google.protobuf.Any: + type: object + properties: + '@type': + type: string + description: |- + A URL/resource name that uniquely identifies the type of the serialized + protocol buffer message. This string must contain at least + one "/" character. The last segment of the URL's path must represent + the fully qualified name of the type (as in + `path/google.protobuf.Duration`). The name should be in a canonical form + (e.g., leading "." is not accepted). + + In practice, teams usually precompile into the binary all types that they + expect it to use in the context of Any. However, for URLs which use the + scheme `http`, `https`, or no scheme, one can optionally set up a type + server that maps type URLs to message definitions as follows: + + * If no scheme is provided, `https` is assumed. + * An HTTP GET on the URL must yield a [google.protobuf.Type][] + value in binary format, or produce an error. + * Applications are allowed to cache lookup results based on the + URL, or have them precompiled into a binary to avoid any + lookup. Therefore, binary compatibility needs to be preserved + on changes to types. (Use versioned type names to manage + breaking changes.) + + Note: this functionality is not currently available in the official + protobuf release, and it is not used for type URLs beginning with + type.googleapis.com. + + Schemes other than `http`, `https` (or the empty scheme) might be + used with implementation specific semantics. + additionalProperties: + type: object + description: |- + `Any` contains an arbitrary serialized protocol buffer message along with a + URL that describes the type of the serialized message. + + Protobuf library provides support to pack/unpack Any values in the form + of utility functions or additional generated methods of the Any type. + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + 'type.googleapis.com/full.type.name' as the type URL and the unpack + methods only use the fully qualified type name after the last '/' + in the type URL, for example "foo.bar.com/x/y.z" will yield type + name "y.z". + + JSON + + The JSON representation of an `Any` value uses the regular + representation of the deserialized, embedded message, with an + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + representation, that representation will be embedded adding a field + `value` which holds the custom JSON in addition to the `@type` + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + google.rpc.Status: + type: object + properties: + code: + type: integer + format: int32 + message: + type: string + details: + type: array + items: + type: object + additionalProperties: + type: object + description: |- + `Any` contains an arbitrary serialized protocol buffer message along with a + URL that describes the type of the serialized message. + + Protobuf library provides support to pack/unpack Any values in the form + of utility functions or additional generated methods of the Any type. + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + 'type.googleapis.com/full.type.name' as the type URL and the unpack + methods only use the fully qualified type name after the last '/' + in the type URL, for example "foo.bar.com/x/y.z" will yield type + name "y.z". + + JSON + + The JSON representation of an `Any` value uses the regular + representation of the deserialized, embedded message, with an + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + representation, that representation will be embedded adding a field + `value` which holds the custom JSON in addition to the `@type` + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + cosmos.authz.v1beta1.Grant: + type: object + properties: + authorization: + type: object + additionalProperties: + type: object + description: |- + `Any` contains an arbitrary serialized protocol buffer message along with a + URL that describes the type of the serialized message. + + Protobuf library provides support to pack/unpack Any values in the form + of utility functions or additional generated methods of the Any type. + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + 'type.googleapis.com/full.type.name' as the type URL and the unpack + methods only use the fully qualified type name after the last '/' + in the type URL, for example "foo.bar.com/x/y.z" will yield type + name "y.z". + + JSON + + The JSON representation of an `Any` value uses the regular + representation of the deserialized, embedded message, with an + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + representation, that representation will be embedded adding a field + `value` which holds the custom JSON in addition to the `@type` + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + expiration: + title: |- + time when the grant will expire and will be pruned. If null, then the grant + doesn't have a time expiration (other conditions in `authorization` + may apply to invalidate the grant) + type: string + format: date-time + description: |- + Grant gives permissions to execute + the provide method with expiration time. + cosmos.authz.v1beta1.MsgExec: + type: object + properties: + grantee: + type: string + msgs: + type: array + description: |- + Execute Msg. + The x/authz will try to find a grant matching (msg.signers[0], grantee, MsgTypeURL(msg)) + triple and validate it. + items: + type: object + additionalProperties: + type: object + description: |- + `Any` contains an arbitrary serialized protocol buffer message along with a + URL that describes the type of the serialized message. + + Protobuf library provides support to pack/unpack Any values in the form + of utility functions or additional generated methods of the Any type. + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + 'type.googleapis.com/full.type.name' as the type URL and the unpack + methods only use the fully qualified type name after the last '/' + in the type URL, for example "foo.bar.com/x/y.z" will yield type + name "y.z". + + JSON + + The JSON representation of an `Any` value uses the regular + representation of the deserialized, embedded message, with an + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + representation, that representation will be embedded adding a field + `value` which holds the custom JSON in addition to the `@type` + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + description: |- + MsgExec attempts to execute the provided messages using + authorizations granted to the grantee. Each message should have only + one signer corresponding to the granter of the authorization. + cosmos.authz.v1beta1.MsgExecResponse: + type: object + properties: + results: + type: array + items: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + description: MsgExecResponse defines the Msg/MsgExecResponse response type. + cosmos.authz.v1beta1.MsgGrant: + type: object + properties: + granter: + type: string + grantee: + type: string + grant: + type: object + properties: + authorization: + type: object + additionalProperties: + type: object + description: |- + `Any` contains an arbitrary serialized protocol buffer message along with a + URL that describes the type of the serialized message. + + Protobuf library provides support to pack/unpack Any values in the form + of utility functions or additional generated methods of the Any type. + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + 'type.googleapis.com/full.type.name' as the type URL and the unpack + methods only use the fully qualified type name after the last '/' + in the type URL, for example "foo.bar.com/x/y.z" will yield type + name "y.z". + + JSON + + The JSON representation of an `Any` value uses the regular + representation of the deserialized, embedded message, with an + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + representation, that representation will be embedded adding a field + `value` which holds the custom JSON in addition to the `@type` + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + expiration: + title: |- + time when the grant will expire and will be pruned. If null, then the grant + doesn't have a time expiration (other conditions in `authorization` + may apply to invalidate the grant) + type: string + format: date-time + description: |- + Grant gives permissions to execute + the provide method with expiration time. + description: |- + MsgGrant is a request type for Grant method. It declares authorization to the grantee + on behalf of the granter with the provided expiration time. + cosmos.authz.v1beta1.MsgGrantResponse: + type: object + description: MsgGrantResponse defines the Msg/MsgGrant response type. + cosmos.authz.v1beta1.MsgRevoke: + type: object + properties: + granter: + type: string + grantee: + type: string + msg_type_url: + type: string + description: |- + MsgRevoke revokes any authorization with the provided sdk.Msg type on the + granter's account with that has been granted to the grantee. + cosmos.authz.v1beta1.MsgRevokeResponse: + type: object + description: MsgRevokeResponse defines the Msg/MsgRevokeResponse response type. + cosmos.bank.v1beta1.Input: + type: object + properties: + address: + type: string + coins: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: Input models transaction input. + cosmos.bank.v1beta1.MsgMultiSend: + type: object + properties: + inputs: + type: array + description: |- + Inputs, despite being `repeated`, only allows one sender input. This is + checked in MsgMultiSend's ValidateBasic. + items: + type: object + properties: + address: + type: string + coins: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: Input models transaction input. + outputs: + type: array + items: + type: object + properties: + address: + type: string + coins: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: Output models transaction outputs. + description: "MsgMultiSend represents an arbitrary multi-in, multi-out send\ + \ message." + cosmos.bank.v1beta1.MsgMultiSendResponse: + type: object + description: MsgMultiSendResponse defines the Msg/MultiSend response type. + cosmos.bank.v1beta1.MsgSend: + type: object + properties: + from_address: + type: string + to_address: + type: string + amount: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: MsgSend represents a message to send coins from one account to + another. + cosmos.bank.v1beta1.MsgSendResponse: + type: object + description: MsgSendResponse defines the Msg/Send response type. + cosmos.bank.v1beta1.MsgSetSendEnabled: + type: object + properties: + authority: + type: string + description: authority is the address that controls the module. + send_enabled: + type: array + description: send_enabled is the list of entries to add or update. + items: + type: object + properties: + denom: + type: string + enabled: + type: boolean + description: |- + SendEnabled maps coin denom to a send_enabled status (whether a denom is + sendable). + use_default_for: + type: array + description: |- + use_default_for is a list of denoms that should use the params.default_send_enabled value. + Denoms listed here will have their SendEnabled entries deleted. + If a denom is included that doesn't have a SendEnabled entry, + it will be ignored. + items: + type: string + description: |- + MsgSetSendEnabled is the Msg/SetSendEnabled request type. + + Only entries to add/update/delete need to be included. + Existing SendEnabled entries that are not included in this + message are left unchanged. + + Since: cosmos-sdk 0.47 + cosmos.bank.v1beta1.MsgSetSendEnabledResponse: + type: object + description: |- + MsgSetSendEnabledResponse defines the Msg/SetSendEnabled response type. + + Since: cosmos-sdk 0.47 + cosmos.bank.v1beta1.MsgUpdateParams: + type: object + properties: + authority: + type: string + description: authority is the address that controls the module (defaults + to x/gov unless overwritten). + params: + type: object + properties: + send_enabled: + type: array + description: |- + Deprecated: Use of SendEnabled in params is deprecated. + For genesis, use the newly added send_enabled field in the genesis object. + Storage, lookup, and manipulation of this information is now in the keeper. + + As of cosmos-sdk 0.47, this only exists for backwards compatibility of genesis files. + items: + type: object + properties: + denom: + type: string + enabled: + type: boolean + description: |- + SendEnabled maps coin denom to a send_enabled status (whether a denom is + sendable). + default_send_enabled: + type: boolean + description: |- + params defines the x/bank parameters to update. + + NOTE: All parameters must be supplied. + description: |- + MsgUpdateParams is the Msg/UpdateParams request type. + + Since: cosmos-sdk 0.47 + cosmos.bank.v1beta1.MsgUpdateParamsResponse: + type: object + description: |- + MsgUpdateParamsResponse defines the response structure for executing a + MsgUpdateParams message. + + Since: cosmos-sdk 0.47 + cosmos.bank.v1beta1.Output: + type: object + properties: + address: + type: string + coins: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: Output models transaction outputs. + cosmos.bank.v1beta1.Params: + type: object + properties: + send_enabled: + type: array + description: |- + Deprecated: Use of SendEnabled in params is deprecated. + For genesis, use the newly added send_enabled field in the genesis object. + Storage, lookup, and manipulation of this information is now in the keeper. + + As of cosmos-sdk 0.47, this only exists for backwards compatibility of genesis files. + items: + type: object + properties: + denom: + type: string + enabled: + type: boolean + description: |- + SendEnabled maps coin denom to a send_enabled status (whether a denom is + sendable). + default_send_enabled: + type: boolean + description: Params defines the parameters for the bank module. + cosmos.bank.v1beta1.SendEnabled: + type: object + properties: + denom: + type: string + enabled: + type: boolean + description: |- + SendEnabled maps coin denom to a send_enabled status (whether a denom is + sendable). + cosmos.base.v1beta1.Coin: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + cosmos.base.node.v1beta1.ConfigResponse: + type: object + properties: + minimum_gas_price: + type: string + pruning_keep_recent: + title: pruning settings + type: string + pruning_interval: + type: string + description: ConfigResponse defines the response structure for the Config gRPC + query. + cosmos.base.node.v1beta1.StatusResponse: + type: object + properties: + earliest_store_height: + title: earliest block height available in the store + type: string + format: uint64 + height: + title: current block height + type: string + format: uint64 + timestamp: + title: block height timestamp + type: string + format: date-time + app_hash: + title: app hash of the current block + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + validator_hash: + title: validator hash provided by the consensus header + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + description: StateResponse defines the response structure for the status of + a node. + cosmos.consensus.v1.MsgUpdateParams: + type: object + properties: + authority: + type: string + description: authority is the address that controls the module (defaults + to x/gov unless overwritten). + block: + type: object + properties: + max_bytes: + title: |- + Max block size, in bytes. + Note: must be greater than 0 + type: string + format: int64 + max_gas: + title: |- + Max gas per block. + Note: must be greater or equal to -1 + type: string + format: int64 + description: |- + params defines the x/consensus parameters to update. + VersionsParams is not included in this Msg because it is tracked + separarately in x/upgrade. + + NOTE: All parameters must be supplied. + evidence: + type: object + properties: + max_age_num_blocks: + type: string + description: |- + Max age of evidence, in blocks. + + The basic formula for calculating this is: MaxAgeDuration / {average block + time}. + format: int64 + max_age_duration: + type: string + description: |- + Max age of evidence, in time. + + It should correspond with an app's "unbonding period" or other similar + mechanism for handling [Nothing-At-Stake + attacks](https://github.com/ethereum/wiki/wiki/Proof-of-Stake-FAQ#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed). + max_bytes: + title: |- + This sets the maximum size of total evidence in bytes that can be committed in a single block. + and should fall comfortably under the max block bytes. + Default is 1048576 or 1MB + type: string + format: int64 + description: EvidenceParams determine how we handle evidence of malfeasance. + validator: + type: object + properties: + pub_key_types: + type: array + items: + type: string + description: |- + ValidatorParams restrict the public key types validators can use. + NOTE: uses ABCI pubkey naming, not Amino names. + abci: + title: "Since: cosmos-sdk 0.50" + type: object + properties: + vote_extensions_enable_height: + type: string + description: |- + vote_extensions_enable_height configures the first height during which + vote extensions will be enabled. During this specified height, and for all + subsequent heights, precommit messages that do not contain valid extension data + will be considered invalid. Prior to this height, vote extensions will not + be used or accepted by validators on the network. + + Once enabled, vote extensions will be created by the application in ExtendVote, + passed to the application for validation in VerifyVoteExtension and given + to the application to use when proposing a block during PrepareProposal. + format: int64 + description: ABCIParams configure functionality specific to the Application + Blockchain Interface. + description: MsgUpdateParams is the Msg/UpdateParams request type. + cosmos.consensus.v1.MsgUpdateParamsResponse: + type: object + description: |- + MsgUpdateParamsResponse defines the response structure for executing a + MsgUpdateParams message. + tendermint.types.ABCIParams: + type: object + properties: + vote_extensions_enable_height: + type: string + description: |- + vote_extensions_enable_height configures the first height during which + vote extensions will be enabled. During this specified height, and for all + subsequent heights, precommit messages that do not contain valid extension data + will be considered invalid. Prior to this height, vote extensions will not + be used or accepted by validators on the network. + + Once enabled, vote extensions will be created by the application in ExtendVote, + passed to the application for validation in VerifyVoteExtension and given + to the application to use when proposing a block during PrepareProposal. + format: int64 + description: ABCIParams configure functionality specific to the Application + Blockchain Interface. + tendermint.types.BlockParams: + type: object + properties: + max_bytes: + title: |- + Max block size, in bytes. + Note: must be greater than 0 + type: string + format: int64 + max_gas: + title: |- + Max gas per block. + Note: must be greater or equal to -1 + type: string + format: int64 + description: BlockParams contains limits on the block size. + tendermint.types.EvidenceParams: + type: object + properties: + max_age_num_blocks: + type: string + description: |- + Max age of evidence, in blocks. + + The basic formula for calculating this is: MaxAgeDuration / {average block + time}. + format: int64 + max_age_duration: + type: string + description: |- + Max age of evidence, in time. + + It should correspond with an app's "unbonding period" or other similar + mechanism for handling [Nothing-At-Stake + attacks](https://github.com/ethereum/wiki/wiki/Proof-of-Stake-FAQ#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed). + max_bytes: + title: |- + This sets the maximum size of total evidence in bytes that can be committed in a single block. + and should fall comfortably under the max block bytes. + Default is 1048576 or 1MB + type: string + format: int64 + description: EvidenceParams determine how we handle evidence of malfeasance. + tendermint.types.ValidatorParams: + type: object + properties: + pub_key_types: + type: array + items: + type: string + description: |- + ValidatorParams restrict the public key types validators can use. + NOTE: uses ABCI pubkey naming, not Amino names. + cosmos.crisis.v1beta1.MsgUpdateParams: + type: object + properties: + authority: + type: string + description: authority is the address that controls the module (defaults + to x/gov unless overwritten). + constant_fee: + type: object + properties: + denom: + type: string + amount: + type: string + description: constant_fee defines the x/crisis parameter. + description: |- + MsgUpdateParams is the Msg/UpdateParams request type. + + Since: cosmos-sdk 0.47 + cosmos.crisis.v1beta1.MsgUpdateParamsResponse: + type: object + description: |- + MsgUpdateParamsResponse defines the response structure for executing a + MsgUpdateParams message. + + Since: cosmos-sdk 0.47 + cosmos.crisis.v1beta1.MsgVerifyInvariant: + type: object + properties: + sender: + type: string + description: sender is the account address of private key to send coins + to fee collector account. + invariant_module_name: + type: string + description: name of the invariant module. + invariant_route: + type: string + description: invariant_route is the msg's invariant route. + description: MsgVerifyInvariant represents a message to verify a particular + invariance. + cosmos.crisis.v1beta1.MsgVerifyInvariantResponse: + type: object + description: MsgVerifyInvariantResponse defines the Msg/VerifyInvariant response + type. + cosmos.distribution.v1beta1.MsgCommunityPoolSpend: + type: object + properties: + authority: + type: string + description: authority is the address that controls the module (defaults + to x/gov unless overwritten). + recipient: + type: string + amount: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: |- + MsgCommunityPoolSpend defines a message for sending tokens from the community + pool to another account. This message is typically executed via a governance + proposal with the governance module being the executing authority. + + Since: cosmos-sdk 0.47 + cosmos.distribution.v1beta1.MsgCommunityPoolSpendResponse: + type: object + description: |- + MsgCommunityPoolSpendResponse defines the response to executing a + MsgCommunityPoolSpend message. + + Since: cosmos-sdk 0.47 + cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPool: + type: object + properties: + depositor: + type: string + validator_address: + type: string + amount: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: |- + DepositValidatorRewardsPool defines the request structure to provide + additional rewards to delegators from a specific validator. + + Since: cosmos-sdk 0.50 + cosmos.distribution.v1beta1.MsgDepositValidatorRewardsPoolResponse: + type: object + description: |- + MsgDepositValidatorRewardsPoolResponse defines the response to executing a + MsgDepositValidatorRewardsPool message. + + Since: cosmos-sdk 0.50 + cosmos.distribution.v1beta1.MsgFundCommunityPool: + type: object + properties: + amount: + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + depositor: + type: string + description: |- + MsgFundCommunityPool allows an account to directly + fund the community pool. + cosmos.distribution.v1beta1.MsgFundCommunityPoolResponse: + type: object + description: MsgFundCommunityPoolResponse defines the Msg/FundCommunityPool + response type. + cosmos.distribution.v1beta1.MsgSetWithdrawAddress: + type: object + properties: + delegator_address: + type: string + withdraw_address: + type: string + description: |- + MsgSetWithdrawAddress sets the withdraw address for + a delegator (or validator self-delegation). + cosmos.distribution.v1beta1.MsgSetWithdrawAddressResponse: + type: object + description: |- + MsgSetWithdrawAddressResponse defines the Msg/SetWithdrawAddress response + type. + cosmos.distribution.v1beta1.MsgUpdateParams: + type: object + properties: + authority: + type: string + description: authority is the address that controls the module (defaults + to x/gov unless overwritten). + params: + type: object + properties: + community_tax: + type: string + base_proposer_reward: + type: string + description: |- + Deprecated: The base_proposer_reward field is deprecated and is no longer used + in the x/distribution module's reward mechanism. + bonus_proposer_reward: + type: string + description: |- + Deprecated: The bonus_proposer_reward field is deprecated and is no longer used + in the x/distribution module's reward mechanism. + withdraw_addr_enabled: + type: boolean + description: |- + params defines the x/distribution parameters to update. + + NOTE: All parameters must be supplied. + description: |- + MsgUpdateParams is the Msg/UpdateParams request type. + + Since: cosmos-sdk 0.47 + cosmos.distribution.v1beta1.MsgUpdateParamsResponse: + type: object + description: |- + MsgUpdateParamsResponse defines the response structure for executing a + MsgUpdateParams message. + + Since: cosmos-sdk 0.47 + cosmos.distribution.v1beta1.MsgWithdrawDelegatorReward: + type: object + properties: + delegator_address: + type: string + validator_address: + type: string + description: |- + MsgWithdrawDelegatorReward represents delegation withdrawal to a delegator + from a single validator. + cosmos.distribution.v1beta1.MsgWithdrawDelegatorRewardResponse: + type: object + properties: + amount: + title: "Since: cosmos-sdk 0.46" + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: |- + MsgWithdrawDelegatorRewardResponse defines the Msg/WithdrawDelegatorReward + response type. + cosmos.distribution.v1beta1.MsgWithdrawValidatorCommission: + type: object + properties: + validator_address: + type: string + description: |- + MsgWithdrawValidatorCommission withdraws the full commission to the validator + address. + cosmos.distribution.v1beta1.MsgWithdrawValidatorCommissionResponse: + type: object + properties: + amount: + title: "Since: cosmos-sdk 0.46" + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: |- + MsgWithdrawValidatorCommissionResponse defines the + Msg/WithdrawValidatorCommission response type. + cosmos.distribution.v1beta1.Params: + type: object + properties: + community_tax: + type: string + base_proposer_reward: + type: string + description: |- + Deprecated: The base_proposer_reward field is deprecated and is no longer used + in the x/distribution module's reward mechanism. + bonus_proposer_reward: + type: string + description: |- + Deprecated: The bonus_proposer_reward field is deprecated and is no longer used + in the x/distribution module's reward mechanism. + withdraw_addr_enabled: + type: boolean + description: Params defines the set of params for the distribution module. + cosmos.evidence.v1beta1.MsgSubmitEvidence: + type: object + properties: + submitter: + type: string + description: submitter is the signer account address of evidence. + evidence: + type: object + additionalProperties: + type: object + description: evidence defines the evidence of misbehavior. + description: |- + MsgSubmitEvidence represents a message that supports submitting arbitrary + Evidence of misbehavior such as equivocation or counterfactual signing. + cosmos.evidence.v1beta1.MsgSubmitEvidenceResponse: + type: object + properties: + hash: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + description: hash defines the hash of the evidence. + format: byte + description: MsgSubmitEvidenceResponse defines the Msg/SubmitEvidence response + type. + cosmos.feegrant.v1beta1.MsgGrantAllowance: + type: object + properties: + granter: + type: string + description: granter is the address of the user granting an allowance of + their funds. + grantee: + type: string + description: grantee is the address of the user being granted an allowance + of another user's funds. + allowance: + type: object + additionalProperties: + type: object + description: "allowance can be any of basic, periodic, allowed fee allowance." + description: |- + MsgGrantAllowance adds permission for Grantee to spend up to Allowance + of fees from the account of Granter. + cosmos.feegrant.v1beta1.MsgGrantAllowanceResponse: + type: object + description: MsgGrantAllowanceResponse defines the Msg/GrantAllowanceResponse + response type. + cosmos.feegrant.v1beta1.MsgPruneAllowances: + type: object + properties: + pruner: + type: string + description: pruner is the address of the user pruning expired allowances. + description: |- + MsgPruneAllowances prunes expired fee allowances. + + Since cosmos-sdk 0.50 + cosmos.feegrant.v1beta1.MsgPruneAllowancesResponse: + type: object + description: |- + MsgPruneAllowancesResponse defines the Msg/PruneAllowancesResponse response type. + + Since cosmos-sdk 0.50 + cosmos.feegrant.v1beta1.MsgRevokeAllowance: + type: object + properties: + granter: + type: string + description: granter is the address of the user granting an allowance of + their funds. + grantee: + type: string + description: grantee is the address of the user being granted an allowance + of another user's funds. + description: MsgRevokeAllowance removes any existing Allowance from Granter + to Grantee. + cosmos.feegrant.v1beta1.MsgRevokeAllowanceResponse: + type: object + description: MsgRevokeAllowanceResponse defines the Msg/RevokeAllowanceResponse + response type. + cosmos.gov.v1.MsgCancelProposal: + type: object + properties: + proposal_id: + type: string + description: proposal_id defines the unique id of the proposal. + format: uint64 + proposer: + type: string + description: proposer is the account address of the proposer. + description: |- + MsgCancelProposal is the Msg/CancelProposal request type. + + Since: cosmos-sdk 0.50 + cosmos.gov.v1.MsgCancelProposalResponse: + type: object + properties: + proposal_id: + type: string + description: proposal_id defines the unique id of the proposal. + format: uint64 + canceled_time: + type: string + description: canceled_time is the time when proposal is canceled. + format: date-time + canceled_height: + type: string + description: canceled_height defines the block height at which the proposal + is canceled. + format: uint64 + description: |- + MsgCancelProposalResponse defines the response structure for executing a + MsgCancelProposal message. + + Since: cosmos-sdk 0.50 + cosmos.gov.v1.MsgDeposit: + type: object + properties: + proposal_id: + type: string + description: proposal_id defines the unique id of the proposal. + format: uint64 + depositor: + type: string + description: depositor defines the deposit addresses from the proposals. + amount: + type: array + description: amount to be deposited by depositor. + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: MsgDeposit defines a message to submit a deposit to an existing + proposal. + cosmos.gov.v1.MsgDepositResponse: + type: object + description: MsgDepositResponse defines the Msg/Deposit response type. + cosmos.gov.v1.MsgExecLegacyContent: + type: object + properties: + content: + type: object + additionalProperties: + type: object + description: content is the proposal's content. + authority: + type: string + description: authority must be the gov module address. + description: |- + MsgExecLegacyContent is used to wrap the legacy content field into a message. + This ensures backwards compatibility with v1beta1.MsgSubmitProposal. + cosmos.gov.v1.MsgExecLegacyContentResponse: + type: object + description: MsgExecLegacyContentResponse defines the Msg/ExecLegacyContent + response type. + cosmos.gov.v1.MsgSubmitProposal: + type: object + properties: + messages: + type: array + description: messages are the arbitrary messages to be executed if proposal + passes. + items: + type: object + additionalProperties: + type: object + description: |- + `Any` contains an arbitrary serialized protocol buffer message along with a + URL that describes the type of the serialized message. + + Protobuf library provides support to pack/unpack Any values in the form + of utility functions or additional generated methods of the Any type. + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + 'type.googleapis.com/full.type.name' as the type URL and the unpack + methods only use the fully qualified type name after the last '/' + in the type URL, for example "foo.bar.com/x/y.z" will yield type + name "y.z". + + JSON + + The JSON representation of an `Any` value uses the regular + representation of the deserialized, embedded message, with an + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + representation, that representation will be embedded adding a field + `value` which holds the custom JSON in addition to the `@type` + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + initial_deposit: + type: array + description: initial_deposit is the deposit value that must be paid at proposal + submission. + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + proposer: + type: string + description: proposer is the account address of the proposer. + metadata: + type: string + description: metadata is any arbitrary metadata attached to the proposal. + title: + type: string + description: |- + title is the title of the proposal. + + Since: cosmos-sdk 0.47 + summary: + title: summary is the summary of the proposal + type: string + description: "Since: cosmos-sdk 0.47" + expedited: + title: expedited defines if the proposal is expedited or not + type: boolean + description: "Since: cosmos-sdk 0.50" + description: |- + MsgSubmitProposal defines an sdk.Msg type that supports submitting arbitrary + proposal Content. + cosmos.gov.v1.MsgSubmitProposalResponse: + type: object + properties: + proposal_id: + type: string + description: proposal_id defines the unique id of the proposal. + format: uint64 + description: MsgSubmitProposalResponse defines the Msg/SubmitProposal response + type. + cosmos.gov.v1.MsgUpdateParams: + type: object + properties: + authority: + type: string + description: authority is the address that controls the module (defaults + to x/gov unless overwritten). + params: + type: object + properties: + min_deposit: + type: array + description: Minimum deposit for a proposal to enter voting period. + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + max_deposit_period: + type: string + description: |- + Maximum period for Atom holders to deposit on a proposal. Initial value: 2 + months. + voting_period: + type: string + description: Duration of the voting period. + quorum: + type: string + description: |- + Minimum percentage of total stake needed to vote for a result to be + considered valid. + threshold: + type: string + description: "Minimum proportion of Yes votes for proposal to pass.\ + \ Default value: 0.5." + veto_threshold: + type: string + description: |- + Minimum value of Veto votes to Total votes ratio for proposal to be + vetoed. Default value: 1/3. + min_initial_deposit_ratio: + type: string + description: The ratio representing the proportion of the deposit value + that must be paid at proposal submission. + proposal_cancel_ratio: + type: string + description: |- + The cancel ratio which will not be returned back to the depositors when a proposal is cancelled. + + Since: cosmos-sdk 0.50 + proposal_cancel_dest: + type: string + description: |- + The address which will receive (proposal_cancel_ratio * deposit) proposal deposits. + If empty, the (proposal_cancel_ratio * deposit) proposal deposits will be burned. + + Since: cosmos-sdk 0.50 + expedited_voting_period: + type: string + description: |- + Duration of the voting period of an expedited proposal. + + Since: cosmos-sdk 0.50 + expedited_threshold: + type: string + description: |- + Minimum proportion of Yes votes for proposal to pass. Default value: 0.67. + + Since: cosmos-sdk 0.50 + expedited_min_deposit: + type: array + description: Minimum expedited deposit for a proposal to enter voting + period. + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + burn_vote_quorum: + title: burn deposits if a proposal does not meet quorum + type: boolean + burn_proposal_deposit_prevote: + title: burn deposits if the proposal does not enter voting period + type: boolean + burn_vote_veto: + title: burn deposits if quorum with vote type no_veto is met + type: boolean + min_deposit_ratio: + type: string + description: |- + The ratio representing the proportion of the deposit value minimum that must be met when making a deposit. + Default value: 0.01. Meaning that for a chain with a min_deposit of 100stake, a deposit of 1stake would be + required. + + Since: cosmos-sdk 0.50 + description: |- + params defines the x/gov parameters to update. + + NOTE: All parameters must be supplied. + description: |- + MsgUpdateParams is the Msg/UpdateParams request type. + + Since: cosmos-sdk 0.47 + cosmos.gov.v1.MsgUpdateParamsResponse: + type: object + description: |- + MsgUpdateParamsResponse defines the response structure for executing a + MsgUpdateParams message. + + Since: cosmos-sdk 0.47 + cosmos.gov.v1.MsgVote: + type: object + properties: + proposal_id: + type: string + description: proposal_id defines the unique id of the proposal. + format: uint64 + voter: + type: string + description: voter is the voter address for the proposal. + option: + type: string + description: option defines the vote option. + default: VOTE_OPTION_UNSPECIFIED + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + metadata: + type: string + description: metadata is any arbitrary metadata attached to the Vote. + description: MsgVote defines a message to cast a vote. + cosmos.gov.v1.MsgVoteResponse: + type: object + description: MsgVoteResponse defines the Msg/Vote response type. + cosmos.gov.v1.MsgVoteWeighted: + type: object + properties: + proposal_id: + type: string + description: proposal_id defines the unique id of the proposal. + format: uint64 + voter: + type: string + description: voter is the voter address for the proposal. + options: + type: array + description: options defines the weighted vote options. + items: + type: object + properties: + option: + type: string + description: "option defines the valid vote options, it must not contain\ + \ duplicate vote options." + default: VOTE_OPTION_UNSPECIFIED + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + weight: + type: string + description: weight is the vote weight associated with the vote option. + description: WeightedVoteOption defines a unit of vote for vote split. + metadata: + type: string + description: metadata is any arbitrary metadata attached to the VoteWeighted. + description: MsgVoteWeighted defines a message to cast a vote. + cosmos.gov.v1.MsgVoteWeightedResponse: + type: object + description: MsgVoteWeightedResponse defines the Msg/VoteWeighted response type. + cosmos.gov.v1.Params: + type: object + properties: + min_deposit: + type: array + description: Minimum deposit for a proposal to enter voting period. + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + max_deposit_period: + type: string + description: |- + Maximum period for Atom holders to deposit on a proposal. Initial value: 2 + months. + voting_period: + type: string + description: Duration of the voting period. + quorum: + type: string + description: |- + Minimum percentage of total stake needed to vote for a result to be + considered valid. + threshold: + type: string + description: "Minimum proportion of Yes votes for proposal to pass. Default\ + \ value: 0.5." + veto_threshold: + type: string + description: |- + Minimum value of Veto votes to Total votes ratio for proposal to be + vetoed. Default value: 1/3. + min_initial_deposit_ratio: + type: string + description: The ratio representing the proportion of the deposit value + that must be paid at proposal submission. + proposal_cancel_ratio: + type: string + description: |- + The cancel ratio which will not be returned back to the depositors when a proposal is cancelled. + + Since: cosmos-sdk 0.50 + proposal_cancel_dest: + type: string + description: |- + The address which will receive (proposal_cancel_ratio * deposit) proposal deposits. + If empty, the (proposal_cancel_ratio * deposit) proposal deposits will be burned. + + Since: cosmos-sdk 0.50 + expedited_voting_period: + type: string + description: |- + Duration of the voting period of an expedited proposal. + + Since: cosmos-sdk 0.50 + expedited_threshold: + type: string + description: |- + Minimum proportion of Yes votes for proposal to pass. Default value: 0.67. + + Since: cosmos-sdk 0.50 + expedited_min_deposit: + type: array + description: Minimum expedited deposit for a proposal to enter voting period. + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + burn_vote_quorum: + title: burn deposits if a proposal does not meet quorum + type: boolean + burn_proposal_deposit_prevote: + title: burn deposits if the proposal does not enter voting period + type: boolean + burn_vote_veto: + title: burn deposits if quorum with vote type no_veto is met + type: boolean + min_deposit_ratio: + type: string + description: |- + The ratio representing the proportion of the deposit value minimum that must be met when making a deposit. + Default value: 0.01. Meaning that for a chain with a min_deposit of 100stake, a deposit of 1stake would be + required. + + Since: cosmos-sdk 0.50 + description: |- + Params defines the parameters for the x/gov module. + + Since: cosmos-sdk 0.47 + cosmos.gov.v1.VoteOption: + type: string + description: |- + VoteOption enumerates the valid vote options for a given governance proposal. + + - VOTE_OPTION_UNSPECIFIED: VOTE_OPTION_UNSPECIFIED defines a no-op vote option. + - VOTE_OPTION_YES: VOTE_OPTION_YES defines a yes vote option. + - VOTE_OPTION_ABSTAIN: VOTE_OPTION_ABSTAIN defines an abstain vote option. + - VOTE_OPTION_NO: VOTE_OPTION_NO defines a no vote option. + - VOTE_OPTION_NO_WITH_VETO: VOTE_OPTION_NO_WITH_VETO defines a no with veto vote option. + default: VOTE_OPTION_UNSPECIFIED + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + cosmos.gov.v1.WeightedVoteOption: + type: object + properties: + option: + type: string + description: "option defines the valid vote options, it must not contain\ + \ duplicate vote options." + default: VOTE_OPTION_UNSPECIFIED + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + weight: + type: string + description: weight is the vote weight associated with the vote option. + description: WeightedVoteOption defines a unit of vote for vote split. + cosmos.gov.v1beta1.MsgDeposit: + type: object + properties: + proposal_id: + type: string + description: proposal_id defines the unique id of the proposal. + format: uint64 + depositor: + type: string + description: depositor defines the deposit addresses from the proposals. + amount: + type: array + description: amount to be deposited by depositor. + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: MsgDeposit defines a message to submit a deposit to an existing + proposal. + cosmos.gov.v1beta1.MsgDepositResponse: + type: object + description: MsgDepositResponse defines the Msg/Deposit response type. + cosmos.gov.v1beta1.MsgSubmitProposal: + type: object + properties: + content: + type: object + additionalProperties: + type: object + description: content is the proposal's content. + initial_deposit: + type: array + description: initial_deposit is the deposit value that must be paid at proposal + submission. + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + proposer: + type: string + description: proposer is the account address of the proposer. + description: |- + MsgSubmitProposal defines an sdk.Msg type that supports submitting arbitrary + proposal Content. + cosmos.gov.v1beta1.MsgSubmitProposalResponse: + type: object + properties: + proposal_id: + type: string + description: proposal_id defines the unique id of the proposal. + format: uint64 + description: MsgSubmitProposalResponse defines the Msg/SubmitProposal response + type. + cosmos.gov.v1beta1.MsgVote: + type: object + properties: + proposal_id: + type: string + description: proposal_id defines the unique id of the proposal. + format: uint64 + voter: + type: string + description: voter is the voter address for the proposal. + option: + type: string + description: option defines the vote option. + default: VOTE_OPTION_UNSPECIFIED + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + description: MsgVote defines a message to cast a vote. + cosmos.gov.v1beta1.MsgVoteResponse: + type: object + description: MsgVoteResponse defines the Msg/Vote response type. + cosmos.gov.v1beta1.MsgVoteWeighted: + type: object + properties: + proposal_id: + type: string + description: proposal_id defines the unique id of the proposal. + format: uint64 + voter: + type: string + description: voter is the voter address for the proposal. + options: + type: array + description: options defines the weighted vote options. + items: + type: object + properties: + option: + type: string + description: "option defines the valid vote options, it must not contain\ + \ duplicate vote options." + default: VOTE_OPTION_UNSPECIFIED + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + weight: + type: string + description: weight is the vote weight associated with the vote option. + description: |- + WeightedVoteOption defines a unit of vote for vote split. + + Since: cosmos-sdk 0.43 + description: |- + MsgVoteWeighted defines a message to cast a vote. + + Since: cosmos-sdk 0.43 + cosmos.gov.v1beta1.MsgVoteWeightedResponse: + type: object + description: |- + MsgVoteWeightedResponse defines the Msg/VoteWeighted response type. + + Since: cosmos-sdk 0.43 + cosmos.gov.v1beta1.VoteOption: + type: string + description: |- + VoteOption enumerates the valid vote options for a given governance proposal. + + - VOTE_OPTION_UNSPECIFIED: VOTE_OPTION_UNSPECIFIED defines a no-op vote option. + - VOTE_OPTION_YES: VOTE_OPTION_YES defines a yes vote option. + - VOTE_OPTION_ABSTAIN: VOTE_OPTION_ABSTAIN defines an abstain vote option. + - VOTE_OPTION_NO: VOTE_OPTION_NO defines a no vote option. + - VOTE_OPTION_NO_WITH_VETO: VOTE_OPTION_NO_WITH_VETO defines a no with veto vote option. + default: VOTE_OPTION_UNSPECIFIED + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + cosmos.gov.v1beta1.WeightedVoteOption: + type: object + properties: + option: + type: string + description: "option defines the valid vote options, it must not contain\ + \ duplicate vote options." + default: VOTE_OPTION_UNSPECIFIED + enum: + - VOTE_OPTION_UNSPECIFIED + - VOTE_OPTION_YES + - VOTE_OPTION_ABSTAIN + - VOTE_OPTION_NO + - VOTE_OPTION_NO_WITH_VETO + weight: + type: string + description: weight is the vote weight associated with the vote option. + description: |- + WeightedVoteOption defines a unit of vote for vote split. + + Since: cosmos-sdk 0.43 + cosmos.mint.v1beta1.MsgUpdateParams: + type: object + properties: + authority: + type: string + description: authority is the address that controls the module (defaults + to x/gov unless overwritten). + params: + type: object + properties: + mint_denom: + title: type of coin to mint + type: string + inflation_rate_change: + title: maximum annual change in inflation rate + type: string + inflation_max: + title: maximum inflation rate + type: string + inflation_min: + title: minimum inflation rate + type: string + goal_bonded: + title: goal of percent bonded atoms + type: string + blocks_per_year: + title: expected blocks per year + type: string + format: uint64 + description: |- + params defines the x/mint parameters to update. + + NOTE: All parameters must be supplied. + description: |- + MsgUpdateParams is the Msg/UpdateParams request type. + + Since: cosmos-sdk 0.47 + cosmos.mint.v1beta1.MsgUpdateParamsResponse: + type: object + description: |- + MsgUpdateParamsResponse defines the response structure for executing a + MsgUpdateParams message. + + Since: cosmos-sdk 0.47 + cosmos.mint.v1beta1.Params: + type: object + properties: + mint_denom: + title: type of coin to mint + type: string + inflation_rate_change: + title: maximum annual change in inflation rate + type: string + inflation_max: + title: maximum inflation rate + type: string + inflation_min: + title: minimum inflation rate + type: string + goal_bonded: + title: goal of percent bonded atoms + type: string + blocks_per_year: + title: expected blocks per year + type: string + format: uint64 + description: Params defines the parameters for the x/mint module. + cosmos.params.v1beta1.ParamChange: + type: object + properties: + subspace: + type: string + key: + type: string + value: + type: string + description: |- + ParamChange defines an individual parameter change, for use in + ParameterChangeProposal. + cosmos.params.v1beta1.QueryParamsResponse: + type: object + properties: + param: + type: object + properties: + subspace: + type: string + key: + type: string + value: + type: string + description: param defines the queried parameter. + description: QueryParamsResponse is response type for the Query/Params RPC method. + cosmos.params.v1beta1.QuerySubspacesResponse: + type: object + properties: + subspaces: + type: array + items: + type: object + properties: + subspace: + type: string + keys: + type: array + items: + type: string + description: |- + Subspace defines a parameter subspace name and all the keys that exist for + the subspace. + + Since: cosmos-sdk 0.46 + description: |- + QuerySubspacesResponse defines the response types for querying for all + registered subspaces and all keys for a subspace. + + Since: cosmos-sdk 0.46 + cosmos.params.v1beta1.Subspace: + type: object + properties: + subspace: + type: string + keys: + type: array + items: + type: string + description: |- + Subspace defines a parameter subspace name and all the keys that exist for + the subspace. + + Since: cosmos-sdk 0.46 + cosmos.slashing.v1beta1.MsgUnjail: + title: MsgUnjail defines the Msg/Unjail request type + type: object + properties: + validator_addr: + type: string + cosmos.slashing.v1beta1.MsgUnjailResponse: + title: MsgUnjailResponse defines the Msg/Unjail response type + type: object + cosmos.slashing.v1beta1.MsgUpdateParams: + type: object + properties: + authority: + type: string + description: authority is the address that controls the module (defaults + to x/gov unless overwritten). + params: + type: object + properties: + signed_blocks_window: + type: string + format: int64 + min_signed_per_window: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + downtime_jail_duration: + type: string + slash_fraction_double_sign: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + slash_fraction_downtime: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + description: |- + params defines the x/slashing parameters to update. + + NOTE: All parameters must be supplied. + description: |- + MsgUpdateParams is the Msg/UpdateParams request type. + + Since: cosmos-sdk 0.47 + cosmos.slashing.v1beta1.MsgUpdateParamsResponse: + type: object + description: |- + MsgUpdateParamsResponse defines the response structure for executing a + MsgUpdateParams message. + + Since: cosmos-sdk 0.47 + cosmos.slashing.v1beta1.Params: + type: object + properties: + signed_blocks_window: + type: string + format: int64 + min_signed_per_window: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + downtime_jail_duration: + type: string + slash_fraction_double_sign: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + slash_fraction_downtime: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + description: Params represents the parameters used for by the slashing module. + cosmos.staking.v1beta1.CommissionRates: + type: object + properties: + rate: + type: string + description: "rate is the commission rate charged to delegators, as a fraction." + max_rate: + type: string + description: "max_rate defines the maximum commission rate which validator\ + \ can ever charge, as a fraction." + max_change_rate: + type: string + description: "max_change_rate defines the maximum daily increase of the\ + \ validator commission, as a fraction." + description: |- + CommissionRates defines the initial commission rates to be used for creating + a validator. + cosmos.staking.v1beta1.Description: + type: object + properties: + moniker: + type: string + description: moniker defines a human-readable name for the validator. + identity: + type: string + description: identity defines an optional identity signature (ex. UPort + or Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: security_contact defines an optional email for security contact. + details: + type: string + description: details define other optional details. + description: Description defines a validator description. + cosmos.staking.v1beta1.MsgBeginRedelegate: + type: object + properties: + delegator_address: + type: string + validator_src_address: + type: string + validator_dst_address: + type: string + amount: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: |- + MsgBeginRedelegate defines a SDK message for performing a redelegation + of coins from a delegator and source validator to a destination validator. + cosmos.staking.v1beta1.MsgBeginRedelegateResponse: + type: object + properties: + completion_time: + type: string + format: date-time + description: MsgBeginRedelegateResponse defines the Msg/BeginRedelegate response + type. + cosmos.staking.v1beta1.MsgCancelUnbondingDelegation: + title: MsgCancelUnbondingDelegation defines the SDK message for performing a + cancel unbonding delegation for delegator + type: object + properties: + delegator_address: + type: string + validator_address: + type: string + amount: + title: amount is always less than or equal to unbonding delegation entry + balance + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + creation_height: + type: string + description: creation_height is the height which the unbonding took place. + format: int64 + description: "Since: cosmos-sdk 0.46" + cosmos.staking.v1beta1.MsgCancelUnbondingDelegationResponse: + title: MsgCancelUnbondingDelegationResponse + type: object + description: "Since: cosmos-sdk 0.46" + cosmos.staking.v1beta1.MsgCreateValidator: + type: object + properties: + description: + type: object + properties: + moniker: + type: string + description: moniker defines a human-readable name for the validator. + identity: + type: string + description: identity defines an optional identity signature (ex. UPort + or Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: security_contact defines an optional email for security + contact. + details: + type: string + description: details define other optional details. + description: Description defines a validator description. + commission: + type: object + properties: + rate: + type: string + description: "rate is the commission rate charged to delegators, as\ + \ a fraction." + max_rate: + type: string + description: "max_rate defines the maximum commission rate which validator\ + \ can ever charge, as a fraction." + max_change_rate: + type: string + description: "max_change_rate defines the maximum daily increase of\ + \ the validator commission, as a fraction." + description: |- + CommissionRates defines the initial commission rates to be used for creating + a validator. + min_self_delegation: + type: string + delegator_address: + type: string + description: |- + Deprecated: Use of Delegator Address in MsgCreateValidator is deprecated. + The validator address bytes and delegator address bytes refer to the same account while creating validator (defer + only in bech32 notation). + validator_address: + type: string + pubkey: + type: object + additionalProperties: + type: object + description: |- + `Any` contains an arbitrary serialized protocol buffer message along with a + URL that describes the type of the serialized message. + + Protobuf library provides support to pack/unpack Any values in the form + of utility functions or additional generated methods of the Any type. + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + 'type.googleapis.com/full.type.name' as the type URL and the unpack + methods only use the fully qualified type name after the last '/' + in the type URL, for example "foo.bar.com/x/y.z" will yield type + name "y.z". + + JSON + + The JSON representation of an `Any` value uses the regular + representation of the deserialized, embedded message, with an + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + representation, that representation will be embedded adding a field + `value` which holds the custom JSON in addition to the `@type` + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + value: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: MsgCreateValidator defines a SDK message for creating a new validator. + cosmos.staking.v1beta1.MsgCreateValidatorResponse: + type: object + description: MsgCreateValidatorResponse defines the Msg/CreateValidator response + type. + cosmos.staking.v1beta1.MsgDelegate: + type: object + properties: + delegator_address: + type: string + validator_address: + type: string + amount: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: |- + MsgDelegate defines a SDK message for performing a delegation of coins + from a delegator to a validator. + cosmos.staking.v1beta1.MsgDelegateResponse: + type: object + description: MsgDelegateResponse defines the Msg/Delegate response type. + cosmos.staking.v1beta1.MsgEditValidator: + type: object + properties: + description: + type: object + properties: + moniker: + type: string + description: moniker defines a human-readable name for the validator. + identity: + type: string + description: identity defines an optional identity signature (ex. UPort + or Keybase). + website: + type: string + description: website defines an optional website link. + security_contact: + type: string + description: security_contact defines an optional email for security + contact. + details: + type: string + description: details define other optional details. + description: Description defines a validator description. + validator_address: + type: string + commission_rate: + title: |- + We pass a reference to the new commission rate and min self delegation as + it's not mandatory to update. If not updated, the deserialized rate will be + zero with no way to distinguish if an update was intended. + REF: #2373 + type: string + min_self_delegation: + type: string + description: MsgEditValidator defines a SDK message for editing an existing + validator. + cosmos.staking.v1beta1.MsgEditValidatorResponse: + type: object + description: MsgEditValidatorResponse defines the Msg/EditValidator response + type. + cosmos.staking.v1beta1.MsgUndelegate: + type: object + properties: + delegator_address: + type: string + validator_address: + type: string + amount: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: |- + MsgUndelegate defines a SDK message for performing an undelegation from a + delegate and a validator. + cosmos.staking.v1beta1.MsgUndelegateResponse: + type: object + properties: + completion_time: + type: string + format: date-time + amount: + title: amount returns the amount of undelegated coins + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + description: MsgUndelegateResponse defines the Msg/Undelegate response type. + cosmos.staking.v1beta1.MsgUpdateParams: + type: object + properties: + authority: + type: string + description: authority is the address that controls the module (defaults + to x/gov unless overwritten). + params: + type: object + properties: + unbonding_time: + type: string + description: unbonding_time is the time duration of unbonding. + max_validators: + type: integer + description: max_validators is the maximum number of validators. + format: int64 + max_entries: + type: integer + description: max_entries is the max entries for either unbonding delegation + or redelegation (per pair/trio). + format: int64 + historical_entries: + type: integer + description: historical_entries is the number of historical entries + to persist. + format: int64 + bond_denom: + type: string + description: bond_denom defines the bondable coin denomination. + min_commission_rate: + title: min_commission_rate is the chain-wide minimum commission rate + that a validator can charge their delegators + type: string + description: |- + params defines the x/staking parameters to update. + + NOTE: All parameters must be supplied. + description: |- + MsgUpdateParams is the Msg/UpdateParams request type. + + Since: cosmos-sdk 0.47 + cosmos.staking.v1beta1.MsgUpdateParamsResponse: + type: object + description: |- + MsgUpdateParamsResponse defines the response structure for executing a + MsgUpdateParams message. + + Since: cosmos-sdk 0.47 + cosmos.staking.v1beta1.Params: + type: object + properties: + unbonding_time: + type: string + description: unbonding_time is the time duration of unbonding. + max_validators: + type: integer + description: max_validators is the maximum number of validators. + format: int64 + max_entries: + type: integer + description: max_entries is the max entries for either unbonding delegation + or redelegation (per pair/trio). + format: int64 + historical_entries: + type: integer + description: historical_entries is the number of historical entries to persist. + format: int64 + bond_denom: + type: string + description: bond_denom defines the bondable coin denomination. + min_commission_rate: + title: min_commission_rate is the chain-wide minimum commission rate that + a validator can charge their delegators + type: string + description: Params defines the parameters for the x/staking module. + ibc.applications.fee.v1.Fee: + title: "Fee defines the ICS29 receive, acknowledgement and timeout fees" + type: object + properties: + recv_fee: + title: the packet receive fee + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + ack_fee: + title: the packet acknowledgement fee + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + timeout_fee: + title: the packet timeout fee + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + ibc.applications.fee.v1.MsgPayPacketFee: + title: |- + MsgPayPacketFee defines the request type for the PayPacketFee rpc + This Msg can be used to pay for a packet at the next sequence send & should be combined with the Msg that will be + paid for + type: object + properties: + fee: + title: "fee encapsulates the recv, ack and timeout fees associated with\ + \ an IBC packet" + type: object + properties: + recv_fee: + title: the packet receive fee + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + ack_fee: + title: the packet acknowledgement fee + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + timeout_fee: + title: the packet timeout fee + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + source_port_id: + title: the source port unique identifier + type: string + source_channel_id: + title: the source channel unique identifer + type: string + signer: + title: account address to refund fee if necessary + type: string + relayers: + title: optional list of relayers permitted to the receive packet fees + type: array + items: + type: string + ibc.applications.fee.v1.MsgPayPacketFeeAsync: + title: |- + MsgPayPacketFeeAsync defines the request type for the PayPacketFeeAsync rpc + This Msg can be used to pay for a packet at a specified sequence (instead of the next sequence send) + type: object + properties: + packet_id: + title: "unique packet identifier comprised of the channel ID, port ID and\ + \ sequence" + type: object + properties: + port_id: + title: channel port identifier + type: string + channel_id: + title: channel unique identifier + type: string + sequence: + title: packet sequence + type: string + format: uint64 + packet_fee: + title: the packet fee associated with a particular IBC packet + type: object + properties: + fee: + title: "fee encapsulates the recv, ack and timeout fees associated with\ + \ an IBC packet" + type: object + properties: + recv_fee: + title: the packet receive fee + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + ack_fee: + title: the packet acknowledgement fee + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + timeout_fee: + title: the packet timeout fee + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + refund_address: + title: the refund address for unspent fees + type: string + relayers: + title: optional list of relayers permitted to receive fees + type: array + items: + type: string + ibc.applications.fee.v1.MsgPayPacketFeeAsyncResponse: + title: MsgPayPacketFeeAsyncResponse defines the response type for the PayPacketFeeAsync + rpc + type: object + ibc.applications.fee.v1.MsgPayPacketFeeResponse: + title: MsgPayPacketFeeResponse defines the response type for the PayPacketFee + rpc + type: object + ibc.applications.fee.v1.MsgRegisterCounterpartyPayee: + title: MsgRegisterCounterpartyPayee defines the request type for the RegisterCounterpartyPayee + rpc + type: object + properties: + port_id: + title: unique port identifier + type: string + channel_id: + title: unique channel identifier + type: string + relayer: + title: the relayer address + type: string + counterparty_payee: + title: the counterparty payee address + type: string + ibc.applications.fee.v1.MsgRegisterCounterpartyPayeeResponse: + title: MsgRegisterCounterpartyPayeeResponse defines the response type for the + RegisterCounterpartyPayee rpc + type: object + ibc.applications.fee.v1.MsgRegisterPayee: + title: MsgRegisterPayee defines the request type for the RegisterPayee rpc + type: object + properties: + port_id: + title: unique port identifier + type: string + channel_id: + title: unique channel identifier + type: string + relayer: + title: the relayer address + type: string + payee: + title: the payee address + type: string + ibc.applications.fee.v1.MsgRegisterPayeeResponse: + title: MsgRegisterPayeeResponse defines the response type for the RegisterPayee + rpc + type: object + ibc.applications.fee.v1.PacketFee: + title: "PacketFee contains ICS29 relayer fees, refund address and optional list\ + \ of permitted relayers" + type: object + properties: + fee: + title: "fee encapsulates the recv, ack and timeout fees associated with\ + \ an IBC packet" + type: object + properties: + recv_fee: + title: the packet receive fee + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + ack_fee: + title: the packet acknowledgement fee + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + timeout_fee: + title: the packet timeout fee + type: array + items: + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + refund_address: + title: the refund address for unspent fees + type: string + relayers: + title: optional list of relayers permitted to receive fees + type: array + items: + type: string + ibc.core.channel.v1.PacketId: + title: |- + PacketId is an identifer for a unique Packet + Source chains refer to packets by source port/channel + Destination chains refer to packets by destination port/channel + type: object + properties: + port_id: + title: channel port identifier + type: string + channel_id: + title: channel unique identifier + type: string + sequence: + title: packet sequence + type: string + format: uint64 + ibc.applications.interchain_accounts.controller.v1.MsgRegisterInterchainAccount: + title: MsgRegisterInterchainAccount defines the payload for Msg/RegisterAccount + type: object + properties: + owner: + type: string + connection_id: + type: string + version: + type: string + ibc.applications.interchain_accounts.controller.v1.MsgRegisterInterchainAccountResponse: + title: MsgRegisterInterchainAccountResponse defines the response for Msg/RegisterAccount + type: object + properties: + channel_id: + type: string + port_id: + type: string + ibc.applications.interchain_accounts.controller.v1.MsgSendTx: + title: MsgSendTx defines the payload for Msg/SendTx + type: object + properties: + owner: + type: string + connection_id: + type: string + packet_data: + type: object + properties: + type: + title: |- + Type defines a classification of message issued from a controller chain to its associated interchain accounts + host + type: string + description: |- + - TYPE_UNSPECIFIED: Default zero value enumeration + - TYPE_EXECUTE_TX: Execute a transaction on an interchain accounts host chain + default: TYPE_UNSPECIFIED + enum: + - TYPE_UNSPECIFIED + - TYPE_EXECUTE_TX + data: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + memo: + type: string + description: "InterchainAccountPacketData is comprised of a raw transaction,\ + \ type of transaction and optional memo field." + relative_timeout: + type: string + description: |- + Relative timeout timestamp provided will be added to the current block time during transaction execution. + The timeout timestamp must be non-zero. + format: uint64 + ibc.applications.interchain_accounts.controller.v1.MsgSendTxResponse: + title: MsgSendTxResponse defines the response for MsgSendTx + type: object + properties: + sequence: + type: string + format: uint64 + ibc.applications.interchain_accounts.controller.v1.MsgUpdateParams: + title: MsgUpdateParams defines the payload for Msg/UpdateParams + type: object + properties: + signer: + title: signer address + type: string + params: + type: object + properties: + controller_enabled: + type: boolean + description: controller_enabled enables or disables the controller submodule. + description: |- + params defines the 27-interchain-accounts/controller parameters to update. + + NOTE: All parameters must be supplied. + ibc.applications.interchain_accounts.controller.v1.MsgUpdateParamsResponse: + title: MsgUpdateParamsResponse defines the response for Msg/UpdateParams + type: object + ibc.applications.interchain_accounts.controller.v1.Params: + type: object + properties: + controller_enabled: + type: boolean + description: controller_enabled enables or disables the controller submodule. + description: |- + Params defines the set of on-chain interchain accounts parameters. + The following parameters may be used to disable the controller submodule. + ibc.applications.interchain_accounts.v1.InterchainAccountPacketData: + type: object + properties: + type: + title: |- + Type defines a classification of message issued from a controller chain to its associated interchain accounts + host + type: string + description: |- + - TYPE_UNSPECIFIED: Default zero value enumeration + - TYPE_EXECUTE_TX: Execute a transaction on an interchain accounts host chain + default: TYPE_UNSPECIFIED + enum: + - TYPE_UNSPECIFIED + - TYPE_EXECUTE_TX + data: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + memo: + type: string + description: "InterchainAccountPacketData is comprised of a raw transaction,\ + \ type of transaction and optional memo field." + ibc.applications.interchain_accounts.v1.Type: + title: |- + Type defines a classification of message issued from a controller chain to its associated interchain accounts + host + type: string + description: |- + - TYPE_UNSPECIFIED: Default zero value enumeration + - TYPE_EXECUTE_TX: Execute a transaction on an interchain accounts host chain + default: TYPE_UNSPECIFIED + enum: + - TYPE_UNSPECIFIED + - TYPE_EXECUTE_TX + ibc.applications.interchain_accounts.host.v1.MsgUpdateParams: + title: MsgUpdateParams defines the payload for Msg/UpdateParams + type: object + properties: + signer: + title: signer address + type: string + params: + type: object + properties: + host_enabled: + type: boolean + description: host_enabled enables or disables the host submodule. + allow_messages: + type: array + description: allow_messages defines a list of sdk message typeURLs allowed + to be executed on a host chain. + items: + type: string + description: |- + params defines the 27-interchain-accounts/host parameters to update. + + NOTE: All parameters must be supplied. + ibc.applications.interchain_accounts.host.v1.MsgUpdateParamsResponse: + title: MsgUpdateParamsResponse defines the response for Msg/UpdateParams + type: object + ibc.applications.interchain_accounts.host.v1.Params: + type: object + properties: + host_enabled: + type: boolean + description: host_enabled enables or disables the host submodule. + allow_messages: + type: array + description: allow_messages defines a list of sdk message typeURLs allowed + to be executed on a host chain. + items: + type: string + description: |- + Params defines the set of on-chain interchain accounts parameters. + The following parameters may be used to disable the host submodule. + ibc.applications.transfer.v1.MsgTransfer: + title: |- + MsgTransfer defines a msg to transfer fungible tokens (i.e Coins) between + ICS20 enabled chains. See ICS Spec here: + https://github.com/cosmos/ibc/tree/master/spec/app/ics-020-fungible-token-transfer#data-structures + type: object + properties: + source_port: + title: the port on which the packet will be sent + type: string + source_channel: + title: the channel by which the packet will be sent + type: string + token: + title: the tokens to be transferred + type: object + properties: + denom: + type: string + amount: + type: string + description: |- + Coin defines a token with a denomination and an amount. + + NOTE: The amount field is an Int which implements the custom method + signatures required by gogoproto. + sender: + title: the sender address + type: string + receiver: + title: the recipient address on the destination chain + type: string + timeout_height: + title: |- + Height is a monotonically increasing data type + that can be compared against another Height for the purposes of updating and + freezing clients + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Timeout height relative to the current block height. + The timeout is disabled when set to 0. + timeout_timestamp: + type: string + description: |- + Timeout timestamp in absolute nanoseconds since unix epoch. + The timeout is disabled when set to 0. + format: uint64 + memo: + title: optional memo + type: string + ibc.applications.transfer.v1.MsgTransferResponse: + type: object + properties: + sequence: + title: sequence number of the transfer packet sent + type: string + format: uint64 + description: MsgTransferResponse defines the Msg/Transfer response type. + ibc.applications.transfer.v1.MsgUpdateParams: + type: object + properties: + signer: + title: signer address + type: string + params: + type: object + properties: + send_enabled: + type: boolean + description: |- + send_enabled enables or disables all cross-chain token transfers from this + chain. + receive_enabled: + type: boolean + description: |- + receive_enabled enables or disables all cross-chain token transfers to this + chain. + description: |- + params defines the transfer parameters to update. + + NOTE: All parameters must be supplied. + description: MsgUpdateParams is the Msg/UpdateParams request type. + ibc.applications.transfer.v1.MsgUpdateParamsResponse: + type: object + description: |- + MsgUpdateParamsResponse defines the response structure for executing a + MsgUpdateParams message. + ibc.applications.transfer.v1.Params: + type: object + properties: + send_enabled: + type: boolean + description: |- + send_enabled enables or disables all cross-chain token transfers from this + chain. + receive_enabled: + type: boolean + description: |- + receive_enabled enables or disables all cross-chain token transfers to this + chain. + description: |- + Params defines the set of IBC transfer parameters. + NOTE: To prevent a single token from being transferred, set the + TransfersEnabled parameter to true and then set the bank module's SendEnabled + parameter for the denomination to false. + ibc.core.client.v1.Height: + title: |- + Height is a monotonically increasing data type + that can be compared against another Height for the purposes of updating and + freezing clients + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + ibc.core.channel.v1.Channel: + type: object + properties: + state: + title: current state of the channel end + type: string + description: |- + State defines if a channel is in one of the following states: + CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. + + - STATE_UNINITIALIZED_UNSPECIFIED: Default State + - STATE_INIT: A channel has just started the opening handshake. + - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain. + - STATE_OPEN: A channel has completed the handshake. Open channels are + ready to send and receive packets. + - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive + packets. + default: STATE_UNINITIALIZED_UNSPECIFIED + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + - STATE_CLOSED + ordering: + title: whether the channel is ordered or unordered + type: string + description: |- + - ORDER_NONE_UNSPECIFIED: zero-value for channel ordering + - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in + which they were sent. + - ORDER_ORDERED: packets are delivered exactly in the order which they were sent + default: ORDER_NONE_UNSPECIFIED + enum: + - ORDER_NONE_UNSPECIFIED + - ORDER_UNORDERED + - ORDER_ORDERED + counterparty: + title: counterparty channel end + type: object + properties: + port_id: + type: string + description: port on the counterparty chain which owns the other end + of the channel. + channel_id: + title: channel end on the counterparty chain + type: string + connection_hops: + title: |- + list of connection identifiers, in order, along which packets sent on + this channel will travel + type: array + items: + type: string + version: + title: "opaque channel version, which is agreed upon during the handshake" + type: string + description: |- + Channel defines pipeline for exactly-once packet delivery between specific + modules on separate blockchains, which has at least one end capable of + sending packets and one end capable of receiving packets. + ibc.core.channel.v1.Counterparty: + title: Counterparty defines a channel end counterparty + type: object + properties: + port_id: + type: string + description: port on the counterparty chain which owns the other end of + the channel. + channel_id: + title: channel end on the counterparty chain + type: string + ibc.core.channel.v1.MsgAcknowledgement: + title: MsgAcknowledgement receives incoming IBC acknowledgement + type: object + properties: + packet: + title: Packet defines a type that carries data across different chains through + IBC + type: object + properties: + sequence: + type: string + description: |- + number corresponds to the order of sends and receives, where a Packet + with an earlier sequence number must be sent and received before a Packet + with a later sequence number. + format: uint64 + source_port: + type: string + description: identifies the port on the sending chain. + source_channel: + type: string + description: identifies the channel end on the sending chain. + destination_port: + type: string + description: identifies the port on the receiving chain. + destination_channel: + type: string + description: identifies the channel end on the receiving chain. + data: + title: actual opaque bytes transferred directly to the application module + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + timeout_height: + title: block height after which the packet times out + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + timeout_timestamp: + title: block timestamp (in nanoseconds) after which the packet times + out + type: string + format: uint64 + acknowledgement: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_acked: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_height: + title: |- + Height is a monotonically increasing data type + that can be compared against another Height for the purposes of updating and + freezing clients + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + signer: + type: string + ibc.core.channel.v1.MsgAcknowledgementResponse: + type: object + properties: + result: + title: ResponseResultType defines the possible outcomes of the execution + of a message + type: string + description: |- + - RESPONSE_RESULT_TYPE_UNSPECIFIED: Default zero value enumeration + - RESPONSE_RESULT_TYPE_NOOP: The message did not call the IBC application callbacks (because, for example, the packet had already been relayed) + - RESPONSE_RESULT_TYPE_SUCCESS: The message was executed successfully + default: RESPONSE_RESULT_TYPE_UNSPECIFIED + enum: + - RESPONSE_RESULT_TYPE_UNSPECIFIED + - RESPONSE_RESULT_TYPE_NOOP + - RESPONSE_RESULT_TYPE_SUCCESS + description: MsgAcknowledgementResponse defines the Msg/Acknowledgement response + type. + ibc.core.channel.v1.MsgChannelCloseConfirm: + type: object + properties: + port_id: + type: string + channel_id: + type: string + proof_init: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_height: + title: |- + Height is a monotonically increasing data type + that can be compared against another Height for the purposes of updating and + freezing clients + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + signer: + type: string + description: |- + MsgChannelCloseConfirm defines a msg sent by a Relayer to Chain B + to acknowledge the change of channel state to CLOSED on Chain A. + ibc.core.channel.v1.MsgChannelCloseConfirmResponse: + type: object + description: |- + MsgChannelCloseConfirmResponse defines the Msg/ChannelCloseConfirm response + type. + ibc.core.channel.v1.MsgChannelCloseInit: + type: object + properties: + port_id: + type: string + channel_id: + type: string + signer: + type: string + description: |- + MsgChannelCloseInit defines a msg sent by a Relayer to Chain A + to close a channel with Chain B. + ibc.core.channel.v1.MsgChannelCloseInitResponse: + type: object + description: MsgChannelCloseInitResponse defines the Msg/ChannelCloseInit response + type. + ibc.core.channel.v1.MsgChannelOpenAck: + type: object + properties: + port_id: + type: string + channel_id: + type: string + counterparty_channel_id: + type: string + counterparty_version: + type: string + proof_try: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_height: + title: |- + Height is a monotonically increasing data type + that can be compared against another Height for the purposes of updating and + freezing clients + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + signer: + type: string + description: |- + MsgChannelOpenAck defines a msg sent by a Relayer to Chain A to acknowledge + the change of channel state to TRYOPEN on Chain B. + ibc.core.channel.v1.MsgChannelOpenAckResponse: + type: object + description: MsgChannelOpenAckResponse defines the Msg/ChannelOpenAck response + type. + ibc.core.channel.v1.MsgChannelOpenConfirm: + type: object + properties: + port_id: + type: string + channel_id: + type: string + proof_ack: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_height: + title: |- + Height is a monotonically increasing data type + that can be compared against another Height for the purposes of updating and + freezing clients + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + signer: + type: string + description: |- + MsgChannelOpenConfirm defines a msg sent by a Relayer to Chain B to + acknowledge the change of channel state to OPEN on Chain A. + ibc.core.channel.v1.MsgChannelOpenConfirmResponse: + type: object + description: |- + MsgChannelOpenConfirmResponse defines the Msg/ChannelOpenConfirm response + type. + ibc.core.channel.v1.MsgChannelOpenInit: + type: object + properties: + port_id: + type: string + channel: + type: object + properties: + state: + title: current state of the channel end + type: string + description: |- + State defines if a channel is in one of the following states: + CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. + + - STATE_UNINITIALIZED_UNSPECIFIED: Default State + - STATE_INIT: A channel has just started the opening handshake. + - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain. + - STATE_OPEN: A channel has completed the handshake. Open channels are + ready to send and receive packets. + - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive + packets. + default: STATE_UNINITIALIZED_UNSPECIFIED + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + - STATE_CLOSED + ordering: + title: whether the channel is ordered or unordered + type: string + description: |- + - ORDER_NONE_UNSPECIFIED: zero-value for channel ordering + - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in + which they were sent. + - ORDER_ORDERED: packets are delivered exactly in the order which they were sent + default: ORDER_NONE_UNSPECIFIED + enum: + - ORDER_NONE_UNSPECIFIED + - ORDER_UNORDERED + - ORDER_ORDERED + counterparty: + title: counterparty channel end + type: object + properties: + port_id: + type: string + description: port on the counterparty chain which owns the other + end of the channel. + channel_id: + title: channel end on the counterparty chain + type: string + connection_hops: + title: |- + list of connection identifiers, in order, along which packets sent on + this channel will travel + type: array + items: + type: string + version: + title: "opaque channel version, which is agreed upon during the handshake" + type: string + description: |- + Channel defines pipeline for exactly-once packet delivery between specific + modules on separate blockchains, which has at least one end capable of + sending packets and one end capable of receiving packets. + signer: + type: string + description: |- + MsgChannelOpenInit defines an sdk.Msg to initialize a channel handshake. It + is called by a relayer on Chain A. + ibc.core.channel.v1.MsgChannelOpenInitResponse: + type: object + properties: + channel_id: + type: string + version: + type: string + description: MsgChannelOpenInitResponse defines the Msg/ChannelOpenInit response + type. + ibc.core.channel.v1.MsgChannelOpenTry: + type: object + properties: + port_id: + type: string + previous_channel_id: + type: string + description: "Deprecated: this field is unused. Crossing hello's are no\ + \ longer supported in core IBC." + channel: + type: object + properties: + state: + title: current state of the channel end + type: string + description: |- + State defines if a channel is in one of the following states: + CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. + + - STATE_UNINITIALIZED_UNSPECIFIED: Default State + - STATE_INIT: A channel has just started the opening handshake. + - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain. + - STATE_OPEN: A channel has completed the handshake. Open channels are + ready to send and receive packets. + - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive + packets. + default: STATE_UNINITIALIZED_UNSPECIFIED + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + - STATE_CLOSED + ordering: + title: whether the channel is ordered or unordered + type: string + description: |- + - ORDER_NONE_UNSPECIFIED: zero-value for channel ordering + - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in + which they were sent. + - ORDER_ORDERED: packets are delivered exactly in the order which they were sent + default: ORDER_NONE_UNSPECIFIED + enum: + - ORDER_NONE_UNSPECIFIED + - ORDER_UNORDERED + - ORDER_ORDERED + counterparty: + title: counterparty channel end + type: object + properties: + port_id: + type: string + description: port on the counterparty chain which owns the other + end of the channel. + channel_id: + title: channel end on the counterparty chain + type: string + connection_hops: + title: |- + list of connection identifiers, in order, along which packets sent on + this channel will travel + type: array + items: + type: string + version: + title: "opaque channel version, which is agreed upon during the handshake" + type: string + description: |- + Channel defines pipeline for exactly-once packet delivery between specific + modules on separate blockchains, which has at least one end capable of + sending packets and one end capable of receiving packets. + counterparty_version: + type: string + proof_init: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_height: + title: |- + Height is a monotonically increasing data type + that can be compared against another Height for the purposes of updating and + freezing clients + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + signer: + type: string + description: |- + MsgChannelOpenInit defines a msg sent by a Relayer to try to open a channel + on Chain B. The version field within the Channel field has been deprecated. Its + value will be ignored by core IBC. + ibc.core.channel.v1.MsgChannelOpenTryResponse: + type: object + properties: + version: + type: string + channel_id: + type: string + description: MsgChannelOpenTryResponse defines the Msg/ChannelOpenTry response + type. + ibc.core.channel.v1.MsgRecvPacket: + title: MsgRecvPacket receives incoming IBC packet + type: object + properties: + packet: + title: Packet defines a type that carries data across different chains through + IBC + type: object + properties: + sequence: + type: string + description: |- + number corresponds to the order of sends and receives, where a Packet + with an earlier sequence number must be sent and received before a Packet + with a later sequence number. + format: uint64 + source_port: + type: string + description: identifies the port on the sending chain. + source_channel: + type: string + description: identifies the channel end on the sending chain. + destination_port: + type: string + description: identifies the port on the receiving chain. + destination_channel: + type: string + description: identifies the channel end on the receiving chain. + data: + title: actual opaque bytes transferred directly to the application module + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + timeout_height: + title: block height after which the packet times out + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + timeout_timestamp: + title: block timestamp (in nanoseconds) after which the packet times + out + type: string + format: uint64 + proof_commitment: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_height: + title: |- + Height is a monotonically increasing data type + that can be compared against another Height for the purposes of updating and + freezing clients + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + signer: + type: string + ibc.core.channel.v1.MsgRecvPacketResponse: + type: object + properties: + result: + title: ResponseResultType defines the possible outcomes of the execution + of a message + type: string + description: |- + - RESPONSE_RESULT_TYPE_UNSPECIFIED: Default zero value enumeration + - RESPONSE_RESULT_TYPE_NOOP: The message did not call the IBC application callbacks (because, for example, the packet had already been relayed) + - RESPONSE_RESULT_TYPE_SUCCESS: The message was executed successfully + default: RESPONSE_RESULT_TYPE_UNSPECIFIED + enum: + - RESPONSE_RESULT_TYPE_UNSPECIFIED + - RESPONSE_RESULT_TYPE_NOOP + - RESPONSE_RESULT_TYPE_SUCCESS + description: MsgRecvPacketResponse defines the Msg/RecvPacket response type. + ibc.core.channel.v1.MsgTimeout: + title: MsgTimeout receives timed-out packet + type: object + properties: + packet: + title: Packet defines a type that carries data across different chains through + IBC + type: object + properties: + sequence: + type: string + description: |- + number corresponds to the order of sends and receives, where a Packet + with an earlier sequence number must be sent and received before a Packet + with a later sequence number. + format: uint64 + source_port: + type: string + description: identifies the port on the sending chain. + source_channel: + type: string + description: identifies the channel end on the sending chain. + destination_port: + type: string + description: identifies the port on the receiving chain. + destination_channel: + type: string + description: identifies the channel end on the receiving chain. + data: + title: actual opaque bytes transferred directly to the application module + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + timeout_height: + title: block height after which the packet times out + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + timeout_timestamp: + title: block timestamp (in nanoseconds) after which the packet times + out + type: string + format: uint64 + proof_unreceived: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_height: + title: |- + Height is a monotonically increasing data type + that can be compared against another Height for the purposes of updating and + freezing clients + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + next_sequence_recv: + type: string + format: uint64 + signer: + type: string + ibc.core.channel.v1.MsgTimeoutOnClose: + type: object + properties: + packet: + title: Packet defines a type that carries data across different chains through + IBC + type: object + properties: + sequence: + type: string + description: |- + number corresponds to the order of sends and receives, where a Packet + with an earlier sequence number must be sent and received before a Packet + with a later sequence number. + format: uint64 + source_port: + type: string + description: identifies the port on the sending chain. + source_channel: + type: string + description: identifies the channel end on the sending chain. + destination_port: + type: string + description: identifies the port on the receiving chain. + destination_channel: + type: string + description: identifies the channel end on the receiving chain. + data: + title: actual opaque bytes transferred directly to the application module + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + timeout_height: + title: block height after which the packet times out + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + timeout_timestamp: + title: block timestamp (in nanoseconds) after which the packet times + out + type: string + format: uint64 + proof_unreceived: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_close: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_height: + title: |- + Height is a monotonically increasing data type + that can be compared against another Height for the purposes of updating and + freezing clients + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + next_sequence_recv: + type: string + format: uint64 + signer: + type: string + description: MsgTimeoutOnClose timed-out packet upon counterparty channel closure. + ibc.core.channel.v1.MsgTimeoutOnCloseResponse: + type: object + properties: + result: + title: ResponseResultType defines the possible outcomes of the execution + of a message + type: string + description: |- + - RESPONSE_RESULT_TYPE_UNSPECIFIED: Default zero value enumeration + - RESPONSE_RESULT_TYPE_NOOP: The message did not call the IBC application callbacks (because, for example, the packet had already been relayed) + - RESPONSE_RESULT_TYPE_SUCCESS: The message was executed successfully + default: RESPONSE_RESULT_TYPE_UNSPECIFIED + enum: + - RESPONSE_RESULT_TYPE_UNSPECIFIED + - RESPONSE_RESULT_TYPE_NOOP + - RESPONSE_RESULT_TYPE_SUCCESS + description: MsgTimeoutOnCloseResponse defines the Msg/TimeoutOnClose response + type. + ibc.core.channel.v1.MsgTimeoutResponse: + type: object + properties: + result: + title: ResponseResultType defines the possible outcomes of the execution + of a message + type: string + description: |- + - RESPONSE_RESULT_TYPE_UNSPECIFIED: Default zero value enumeration + - RESPONSE_RESULT_TYPE_NOOP: The message did not call the IBC application callbacks (because, for example, the packet had already been relayed) + - RESPONSE_RESULT_TYPE_SUCCESS: The message was executed successfully + default: RESPONSE_RESULT_TYPE_UNSPECIFIED + enum: + - RESPONSE_RESULT_TYPE_UNSPECIFIED + - RESPONSE_RESULT_TYPE_NOOP + - RESPONSE_RESULT_TYPE_SUCCESS + description: MsgTimeoutResponse defines the Msg/Timeout response type. + ibc.core.channel.v1.Order: + title: Order defines if a channel is ORDERED or UNORDERED + type: string + description: |- + - ORDER_NONE_UNSPECIFIED: zero-value for channel ordering + - ORDER_UNORDERED: packets can be delivered in any order, which may differ from the order in + which they were sent. + - ORDER_ORDERED: packets are delivered exactly in the order which they were sent + default: ORDER_NONE_UNSPECIFIED + enum: + - ORDER_NONE_UNSPECIFIED + - ORDER_UNORDERED + - ORDER_ORDERED + ibc.core.channel.v1.Packet: + title: Packet defines a type that carries data across different chains through + IBC + type: object + properties: + sequence: + type: string + description: |- + number corresponds to the order of sends and receives, where a Packet + with an earlier sequence number must be sent and received before a Packet + with a later sequence number. + format: uint64 + source_port: + type: string + description: identifies the port on the sending chain. + source_channel: + type: string + description: identifies the channel end on the sending chain. + destination_port: + type: string + description: identifies the port on the receiving chain. + destination_channel: + type: string + description: identifies the channel end on the receiving chain. + data: + title: actual opaque bytes transferred directly to the application module + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + timeout_height: + title: block height after which the packet times out + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + timeout_timestamp: + title: block timestamp (in nanoseconds) after which the packet times out + type: string + format: uint64 + ibc.core.channel.v1.ResponseResultType: + title: ResponseResultType defines the possible outcomes of the execution of + a message + type: string + description: |- + - RESPONSE_RESULT_TYPE_UNSPECIFIED: Default zero value enumeration + - RESPONSE_RESULT_TYPE_NOOP: The message did not call the IBC application callbacks (because, for example, the packet had already been relayed) + - RESPONSE_RESULT_TYPE_SUCCESS: The message was executed successfully + default: RESPONSE_RESULT_TYPE_UNSPECIFIED + enum: + - RESPONSE_RESULT_TYPE_UNSPECIFIED + - RESPONSE_RESULT_TYPE_NOOP + - RESPONSE_RESULT_TYPE_SUCCESS + ibc.core.channel.v1.State: + type: string + description: |- + State defines if a channel is in one of the following states: + CLOSED, INIT, TRYOPEN, OPEN or UNINITIALIZED. + + - STATE_UNINITIALIZED_UNSPECIFIED: Default State + - STATE_INIT: A channel has just started the opening handshake. + - STATE_TRYOPEN: A channel has acknowledged the handshake step on the counterparty chain. + - STATE_OPEN: A channel has completed the handshake. Open channels are + ready to send and receive packets. + - STATE_CLOSED: A channel has been closed and can no longer be used to send or receive + packets. + default: STATE_UNINITIALIZED_UNSPECIFIED + enum: + - STATE_UNINITIALIZED_UNSPECIFIED + - STATE_INIT + - STATE_TRYOPEN + - STATE_OPEN + - STATE_CLOSED + cosmos.upgrade.v1beta1.Plan: + type: object + properties: + name: + type: string + description: |- + Sets the name for the upgrade. This name will be used by the upgraded + version of the software to apply any special "on-upgrade" commands during + the first BeginBlock method after the upgrade is applied. It is also used + to detect whether a software version can handle a given upgrade. If no + upgrade handler with this name has been set in the software, it will be + assumed that the software is out-of-date when the upgrade Time or Height is + reached and the software will exit. + time: + type: string + description: |- + Deprecated: Time based upgrades have been deprecated. Time based upgrade logic + has been removed from the SDK. + If this field is not empty, an error will be thrown. + format: date-time + height: + type: string + description: The height at which the upgrade must be performed. + format: int64 + info: + title: |- + Any application specific upgrade info to be included on-chain + such as a git commit that validators could automatically upgrade to + type: string + upgraded_client_state: + type: object + additionalProperties: + type: object + description: |- + Deprecated: UpgradedClientState field has been deprecated. IBC upgrade logic has been + moved to the IBC module in the sub module 02-client. + If this field is not empty, an error will be thrown. + description: Plan specifies information about a planned upgrade and when it + should occur. + ibc.core.client.v1.MsgCreateClient: + title: MsgCreateClient defines a message to create an IBC client + type: object + properties: + client_state: + title: light client state + type: object + additionalProperties: + type: object + description: |- + `Any` contains an arbitrary serialized protocol buffer message along with a + URL that describes the type of the serialized message. + + Protobuf library provides support to pack/unpack Any values in the form + of utility functions or additional generated methods of the Any type. + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + 'type.googleapis.com/full.type.name' as the type URL and the unpack + methods only use the fully qualified type name after the last '/' + in the type URL, for example "foo.bar.com/x/y.z" will yield type + name "y.z". + + JSON + + The JSON representation of an `Any` value uses the regular + representation of the deserialized, embedded message, with an + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + representation, that representation will be embedded adding a field + `value` which holds the custom JSON in addition to the `@type` + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + consensus_state: + type: object + additionalProperties: + type: object + description: |- + consensus state associated with the client that corresponds to a given + height. + signer: + title: signer address + type: string + ibc.core.client.v1.MsgCreateClientResponse: + type: object + description: MsgCreateClientResponse defines the Msg/CreateClient response type. + ibc.core.client.v1.MsgIBCSoftwareUpgrade: + title: MsgIBCSoftwareUpgrade defines the message used to schedule an upgrade + of an IBC client using a v1 governance proposal + type: object + properties: + plan: + type: object + properties: + name: + type: string + description: |- + Sets the name for the upgrade. This name will be used by the upgraded + version of the software to apply any special "on-upgrade" commands during + the first BeginBlock method after the upgrade is applied. It is also used + to detect whether a software version can handle a given upgrade. If no + upgrade handler with this name has been set in the software, it will be + assumed that the software is out-of-date when the upgrade Time or Height is + reached and the software will exit. + time: + type: string + description: |- + Deprecated: Time based upgrades have been deprecated. Time based upgrade logic + has been removed from the SDK. + If this field is not empty, an error will be thrown. + format: date-time + height: + type: string + description: The height at which the upgrade must be performed. + format: int64 + info: + title: |- + Any application specific upgrade info to be included on-chain + such as a git commit that validators could automatically upgrade to + type: string + upgraded_client_state: + type: object + additionalProperties: + type: object + description: |- + Deprecated: UpgradedClientState field has been deprecated. IBC upgrade logic has been + moved to the IBC module in the sub module 02-client. + If this field is not empty, an error will be thrown. + description: Plan specifies information about a planned upgrade and when + it should occur. + upgraded_client_state: + type: object + additionalProperties: + type: object + description: |- + An UpgradedClientState must be provided to perform an IBC breaking upgrade. + This will make the chain commit to the correct upgraded (self) client state + before the upgrade occurs, so that connecting chains can verify that the + new upgraded client is valid by verifying a proof on the previous version + of the chain. This will allow IBC connections to persist smoothly across + planned chain upgrades. Correspondingly, the UpgradedClientState field has been + deprecated in the Cosmos SDK to allow for this logic to exist solely in + the 02-client module. + signer: + title: signer address + type: string + ibc.core.client.v1.MsgIBCSoftwareUpgradeResponse: + type: object + description: MsgIBCSoftwareUpgradeResponse defines the Msg/IBCSoftwareUpgrade + response type. + ibc.core.client.v1.MsgRecoverClient: + type: object + properties: + subject_client_id: + title: the client identifier for the client to be updated if the proposal + passes + type: string + substitute_client_id: + title: |- + the substitute client identifier for the client which will replace the subject + client + type: string + signer: + title: signer address + type: string + description: MsgRecoverClient defines the message used to recover a frozen or + expired client. + ibc.core.client.v1.MsgRecoverClientResponse: + type: object + description: MsgRecoverClientResponse defines the Msg/RecoverClient response + type. + ibc.core.client.v1.MsgSubmitMisbehaviour: + type: object + properties: + client_id: + title: client unique identifier + type: string + misbehaviour: + title: misbehaviour used for freezing the light client + type: object + additionalProperties: + type: object + description: |- + `Any` contains an arbitrary serialized protocol buffer message along with a + URL that describes the type of the serialized message. + + Protobuf library provides support to pack/unpack Any values in the form + of utility functions or additional generated methods of the Any type. + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + 'type.googleapis.com/full.type.name' as the type URL and the unpack + methods only use the fully qualified type name after the last '/' + in the type URL, for example "foo.bar.com/x/y.z" will yield type + name "y.z". + + JSON + + The JSON representation of an `Any` value uses the regular + representation of the deserialized, embedded message, with an + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + representation, that representation will be embedded adding a field + `value` which holds the custom JSON in addition to the `@type` + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + signer: + title: signer address + type: string + description: |- + MsgSubmitMisbehaviour defines an sdk.Msg type that submits Evidence for + light client misbehaviour. + This message has been deprecated. Use MsgUpdateClient instead. + ibc.core.client.v1.MsgSubmitMisbehaviourResponse: + type: object + description: |- + MsgSubmitMisbehaviourResponse defines the Msg/SubmitMisbehaviour response + type. + ibc.core.client.v1.MsgUpdateClient: + type: object + properties: + client_id: + title: client unique identifier + type: string + client_message: + title: client message to update the light client + type: object + additionalProperties: + type: object + description: |- + `Any` contains an arbitrary serialized protocol buffer message along with a + URL that describes the type of the serialized message. + + Protobuf library provides support to pack/unpack Any values in the form + of utility functions or additional generated methods of the Any type. + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + 'type.googleapis.com/full.type.name' as the type URL and the unpack + methods only use the fully qualified type name after the last '/' + in the type URL, for example "foo.bar.com/x/y.z" will yield type + name "y.z". + + JSON + + The JSON representation of an `Any` value uses the regular + representation of the deserialized, embedded message, with an + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + representation, that representation will be embedded adding a field + `value` which holds the custom JSON in addition to the `@type` + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + signer: + title: signer address + type: string + description: |- + MsgUpdateClient defines an sdk.Msg to update a IBC client state using + the given client message. + ibc.core.client.v1.MsgUpdateClientResponse: + type: object + description: MsgUpdateClientResponse defines the Msg/UpdateClient response type. + ibc.core.client.v1.MsgUpdateParams: + type: object + properties: + signer: + title: signer address + type: string + params: + type: object + properties: + allowed_clients: + type: array + description: |- + allowed_clients defines the list of allowed client state types which can be created + and interacted with. If a client type is removed from the allowed clients list, usage + of this client will be disabled until it is added again to the list. + items: + type: string + description: |- + params defines the client parameters to update. + + NOTE: All parameters must be supplied. + description: MsgUpdateParams defines the sdk.Msg type to update the client parameters. + ibc.core.client.v1.MsgUpdateParamsResponse: + type: object + description: MsgUpdateParamsResponse defines the MsgUpdateParams response type. + ibc.core.client.v1.MsgUpgradeClient: + title: |- + MsgUpgradeClient defines an sdk.Msg to upgrade an IBC client to a new client + state + type: object + properties: + client_id: + title: client unique identifier + type: string + client_state: + title: upgraded client state + type: object + additionalProperties: + type: object + description: |- + `Any` contains an arbitrary serialized protocol buffer message along with a + URL that describes the type of the serialized message. + + Protobuf library provides support to pack/unpack Any values in the form + of utility functions or additional generated methods of the Any type. + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + 'type.googleapis.com/full.type.name' as the type URL and the unpack + methods only use the fully qualified type name after the last '/' + in the type URL, for example "foo.bar.com/x/y.z" will yield type + name "y.z". + + JSON + + The JSON representation of an `Any` value uses the regular + representation of the deserialized, embedded message, with an + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + representation, that representation will be embedded adding a field + `value` which holds the custom JSON in addition to the `@type` + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + consensus_state: + title: |- + upgraded consensus state, only contains enough information to serve as a + basis of trust in update logic + type: object + additionalProperties: + type: object + description: |- + `Any` contains an arbitrary serialized protocol buffer message along with a + URL that describes the type of the serialized message. + + Protobuf library provides support to pack/unpack Any values in the form + of utility functions or additional generated methods of the Any type. + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + 'type.googleapis.com/full.type.name' as the type URL and the unpack + methods only use the fully qualified type name after the last '/' + in the type URL, for example "foo.bar.com/x/y.z" will yield type + name "y.z". + + JSON + + The JSON representation of an `Any` value uses the regular + representation of the deserialized, embedded message, with an + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + representation, that representation will be embedded adding a field + `value` which holds the custom JSON in addition to the `@type` + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + proof_upgrade_client: + title: proof that old chain committed to new client + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_upgrade_consensus_state: + title: proof that old chain committed to new consensus state + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + signer: + title: signer address + type: string + ibc.core.client.v1.MsgUpgradeClientResponse: + type: object + description: MsgUpgradeClientResponse defines the Msg/UpgradeClient response + type. + ibc.core.client.v1.Params: + type: object + properties: + allowed_clients: + type: array + description: |- + allowed_clients defines the list of allowed client state types which can be created + and interacted with. If a client type is removed from the allowed clients list, usage + of this client will be disabled until it is added again to the list. + items: + type: string + description: Params defines the set of IBC light client parameters. + ibc.core.commitment.v1.MerklePrefix: + title: |- + MerklePrefix is merkle path prefixed to the key. + The constructed key from the Path and the key will be append(Path.KeyPath, + append(Path.KeyPrefix, key...)) + type: object + properties: + key_prefix: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + ibc.core.connection.v1.Counterparty: + type: object + properties: + client_id: + type: string + description: |- + identifies the client on the counterparty chain associated with a given + connection. + connection_id: + type: string + description: |- + identifies the connection end on the counterparty chain associated with a + given connection. + prefix: + title: |- + MerklePrefix is merkle path prefixed to the key. + The constructed key from the Path and the key will be append(Path.KeyPath, + append(Path.KeyPrefix, key...)) + type: object + properties: + key_prefix: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + description: commitment merkle prefix of the counterparty chain. + description: Counterparty defines the counterparty chain associated with a connection + end. + ibc.core.connection.v1.MsgConnectionOpenAck: + type: object + properties: + connection_id: + type: string + counterparty_connection_id: + type: string + version: + type: object + properties: + identifier: + title: unique version identifier + type: string + features: + title: list of features compatible with the specified identifier + type: array + items: + type: string + description: |- + Version defines the versioning scheme used to negotiate the IBC verison in + the connection handshake. + client_state: + type: object + additionalProperties: + type: object + description: |- + `Any` contains an arbitrary serialized protocol buffer message along with a + URL that describes the type of the serialized message. + + Protobuf library provides support to pack/unpack Any values in the form + of utility functions or additional generated methods of the Any type. + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + 'type.googleapis.com/full.type.name' as the type URL and the unpack + methods only use the fully qualified type name after the last '/' + in the type URL, for example "foo.bar.com/x/y.z" will yield type + name "y.z". + + JSON + + The JSON representation of an `Any` value uses the regular + representation of the deserialized, embedded message, with an + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + representation, that representation will be embedded adding a field + `value` which holds the custom JSON in addition to the `@type` + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + proof_height: + title: |- + Height is a monotonically increasing data type + that can be compared against another Height for the purposes of updating and + freezing clients + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + proof_try: + title: |- + proof of the initialization the connection on Chain B: `UNITIALIZED -> + TRYOPEN` + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_client: + title: proof of client state included in message + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_consensus: + title: proof of client consensus state + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + consensus_height: + title: |- + Height is a monotonically increasing data type + that can be compared against another Height for the purposes of updating and + freezing clients + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + signer: + type: string + host_consensus_state_proof: + title: optional proof data for host state machines that are unable to introspect + their own consensus state + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + description: |- + MsgConnectionOpenAck defines a msg sent by a Relayer to Chain A to + acknowledge the change of connection state to TRYOPEN on Chain B. + ibc.core.connection.v1.MsgConnectionOpenAckResponse: + type: object + description: MsgConnectionOpenAckResponse defines the Msg/ConnectionOpenAck + response type. + ibc.core.connection.v1.MsgConnectionOpenConfirm: + type: object + properties: + connection_id: + type: string + proof_ack: + title: "proof for the change of the connection state on Chain A: `INIT ->\ + \ OPEN`" + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_height: + title: |- + Height is a monotonically increasing data type + that can be compared against another Height for the purposes of updating and + freezing clients + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + signer: + type: string + description: |- + MsgConnectionOpenConfirm defines a msg sent by a Relayer to Chain B to + acknowledge the change of connection state to OPEN on Chain A. + ibc.core.connection.v1.MsgConnectionOpenConfirmResponse: + type: object + description: |- + MsgConnectionOpenConfirmResponse defines the Msg/ConnectionOpenConfirm + response type. + ibc.core.connection.v1.MsgConnectionOpenInit: + type: object + properties: + client_id: + type: string + counterparty: + type: object + properties: + client_id: + type: string + description: |- + identifies the client on the counterparty chain associated with a given + connection. + connection_id: + type: string + description: |- + identifies the connection end on the counterparty chain associated with a + given connection. + prefix: + title: |- + MerklePrefix is merkle path prefixed to the key. + The constructed key from the Path and the key will be append(Path.KeyPath, + append(Path.KeyPrefix, key...)) + type: object + properties: + key_prefix: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + description: commitment merkle prefix of the counterparty chain. + description: Counterparty defines the counterparty chain associated with + a connection end. + version: + type: object + properties: + identifier: + title: unique version identifier + type: string + features: + title: list of features compatible with the specified identifier + type: array + items: + type: string + description: |- + Version defines the versioning scheme used to negotiate the IBC verison in + the connection handshake. + delay_period: + type: string + format: uint64 + signer: + type: string + description: |- + MsgConnectionOpenInit defines the msg sent by an account on Chain A to + initialize a connection with Chain B. + ibc.core.connection.v1.MsgConnectionOpenInitResponse: + type: object + description: |- + MsgConnectionOpenInitResponse defines the Msg/ConnectionOpenInit response + type. + ibc.core.connection.v1.MsgConnectionOpenTry: + type: object + properties: + client_id: + type: string + previous_connection_id: + type: string + description: "Deprecated: this field is unused. Crossing hellos are no longer\ + \ supported in core IBC." + client_state: + type: object + additionalProperties: + type: object + description: |- + `Any` contains an arbitrary serialized protocol buffer message along with a + URL that describes the type of the serialized message. + + Protobuf library provides support to pack/unpack Any values in the form + of utility functions or additional generated methods of the Any type. + + Example 1: Pack and unpack a message in C++. + + Foo foo = ...; + Any any; + any.PackFrom(foo); + ... + if (any.UnpackTo(&foo)) { + ... + } + + Example 2: Pack and unpack a message in Java. + + Foo foo = ...; + Any any = Any.pack(foo); + ... + if (any.is(Foo.class)) { + foo = any.unpack(Foo.class); + } + // or ... + if (any.isSameTypeAs(Foo.getDefaultInstance())) { + foo = any.unpack(Foo.getDefaultInstance()); + } + + Example 3: Pack and unpack a message in Python. + + foo = Foo(...) + any = Any() + any.Pack(foo) + ... + if any.Is(Foo.DESCRIPTOR): + any.Unpack(foo) + ... + + Example 4: Pack and unpack a message in Go + + foo := &pb.Foo{...} + any, err := anypb.New(foo) + if err != nil { + ... + } + ... + foo := &pb.Foo{} + if err := any.UnmarshalTo(foo); err != nil { + ... + } + + The pack methods provided by protobuf library will by default use + 'type.googleapis.com/full.type.name' as the type URL and the unpack + methods only use the fully qualified type name after the last '/' + in the type URL, for example "foo.bar.com/x/y.z" will yield type + name "y.z". + + JSON + + The JSON representation of an `Any` value uses the regular + representation of the deserialized, embedded message, with an + additional field `@type` which contains the type URL. Example: + + package google.profile; + message Person { + string first_name = 1; + string last_name = 2; + } + + { + "@type": "type.googleapis.com/google.profile.Person", + "firstName": , + "lastName": + } + + If the embedded message type is well-known and has a custom JSON + representation, that representation will be embedded adding a field + `value` which holds the custom JSON in addition to the `@type` + field. Example (for message [google.protobuf.Duration][]): + + { + "@type": "type.googleapis.com/google.protobuf.Duration", + "value": "1.212s" + } + counterparty: + type: object + properties: + client_id: + type: string + description: |- + identifies the client on the counterparty chain associated with a given + connection. + connection_id: + type: string + description: |- + identifies the connection end on the counterparty chain associated with a + given connection. + prefix: + title: |- + MerklePrefix is merkle path prefixed to the key. + The constructed key from the Path and the key will be append(Path.KeyPath, + append(Path.KeyPrefix, key...)) + type: object + properties: + key_prefix: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + description: commitment merkle prefix of the counterparty chain. + description: Counterparty defines the counterparty chain associated with + a connection end. + delay_period: + type: string + format: uint64 + counterparty_versions: + type: array + items: + type: object + properties: + identifier: + title: unique version identifier + type: string + features: + title: list of features compatible with the specified identifier + type: array + items: + type: string + description: |- + Version defines the versioning scheme used to negotiate the IBC verison in + the connection handshake. + proof_height: + title: |- + Height is a monotonically increasing data type + that can be compared against another Height for the purposes of updating and + freezing clients + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + proof_init: + title: |- + proof of the initialization the connection on Chain A: `UNITIALIZED -> + INIT` + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_client: + title: proof of client state included in message + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof_consensus: + title: proof of client consensus state + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + consensus_height: + title: |- + Height is a monotonically increasing data type + that can be compared against another Height for the purposes of updating and + freezing clients + type: object + properties: + revision_number: + title: the revision that the client is currently on + type: string + format: uint64 + revision_height: + title: the height within the given revision + type: string + format: uint64 + description: |- + Normally the RevisionHeight is incremented at each height while keeping + RevisionNumber the same. However some consensus algorithms may choose to + reset the height in certain conditions e.g. hard forks, state-machine + breaking changes In these cases, the RevisionNumber is incremented so that + height continues to be monitonically increasing even as the RevisionHeight + gets reset + signer: + type: string + host_consensus_state_proof: + title: optional proof data for host state machines that are unable to introspect + their own consensus state + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + description: |- + MsgConnectionOpenTry defines a msg sent by a Relayer to try to open a + connection on Chain B. + ibc.core.connection.v1.MsgConnectionOpenTryResponse: + type: object + description: MsgConnectionOpenTryResponse defines the Msg/ConnectionOpenTry + response type. + ibc.core.connection.v1.MsgUpdateParams: + type: object + properties: + signer: + title: signer address + type: string + params: + type: object + properties: + max_expected_time_per_block: + type: string + description: |- + maximum expected time per block (in nanoseconds), used to enforce block delay. This parameter should reflect the + largest amount of time that the chain might reasonably take to produce the next block under normal operating + conditions. A safe choice is 3-5x the expected time per block. + format: uint64 + description: |- + params defines the connection parameters to update. + + NOTE: All parameters must be supplied. + description: MsgUpdateParams defines the sdk.Msg type to update the connection + parameters. + ibc.core.connection.v1.MsgUpdateParamsResponse: + type: object + description: MsgUpdateParamsResponse defines the MsgUpdateParams response type. + ibc.core.connection.v1.Params: + type: object + properties: + max_expected_time_per_block: + type: string + description: |- + maximum expected time per block (in nanoseconds), used to enforce block delay. This parameter should reflect the + largest amount of time that the chain might reasonably take to produce the next block under normal operating + conditions. A safe choice is 3-5x the expected time per block. + format: uint64 + description: Params defines the set of Connection parameters. + ibc.core.connection.v1.Version: + type: object + properties: + identifier: + title: unique version identifier + type: string + features: + title: list of features compatible with the specified identifier + type: array + items: + type: string + description: |- + Version defines the versioning scheme used to negotiate the IBC verison in + the connection handshake. + sourcehub.acp.AccessDecision: + title: AccessDecision models the result of evaluating a set of AccessRequests + for an Actor + type: object + properties: + id: + type: string + policy_id: + title: used as part of id generation + type: string + creator: + title: used as part of id generation + type: string + creator_acc_sequence: + title: used as part of id generation + type: string + format: uint64 + operations: + title: used as part of id generation + type: array + items: + type: object + properties: + object: + title: target object for operation + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + permission: + title: permission required to perform operation + type: string + description: Operation represents an action over an object. + actor_did: + title: used as part of id generation + type: string + actor: + title: used as part of id generation + type: string + params: + title: used as part of id generation + type: object + properties: + decision_expiration_delta: + title: number of blocks a Decision is valid for + type: string + format: uint64 + proof_expiration_delta: + title: number of blocks a DecisionProof is valid for + type: string + format: uint64 + ticket_expiration_delta: + title: number of blocks an AccessTicket is valid for + type: string + format: uint64 + creation_time: + type: string + format: date-time + issued_height: + title: issued_height stores the block height when the Decision was evaluated + type: string + format: uint64 + sourcehub.acp.AccessRequest: + title: AccessRequest represents the wish to perform a set of operations by an + actor + type: object + properties: + operations: + type: array + items: + type: object + properties: + object: + title: target object for operation + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + permission: + title: permission required to perform operation + type: string + description: Operation represents an action over an object. + actor: + title: actor requesting operations + type: object + properties: + id: + type: string + description: Actor represents an entity which makes access requests to a + Policy. + sourcehub.acp.Actor: + type: object + properties: + id: + type: string + description: Actor represents an entity which makes access requests to a Policy. + sourcehub.acp.ActorResource: + type: object + properties: + name: + type: string + doc: + type: string + relations: + type: array + items: + type: object + properties: + name: + type: string + doc: + type: string + manages: + title: list of relations managed by the current relation + type: array + items: + type: string + vr_types: + title: value restriction types + type: array + items: + type: object + properties: + resource_name: + title: resource_name scopes permissible actors resource + type: string + relation_name: + title: relation_name scopes permissible actors relation + type: string + description: |- + Restriction models a specification which a Relationship's actor + should meet. + description: ActorResource represents a special Resource which is reserved for + Policy actors. + sourcehub.acp.ActorSet: + type: object + properties: + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + relation: + type: string + description: |- + ActorSet represents a set of Actors in a Policy. + It is specified through an Object, Relation pair, which represents + all actors which have a relationship with given obj-rel pair. + This expansion is recursive. + sourcehub.acp.AllActors: + type: object + description: |- + AllActors models a special Relationship Subject which indicates + that all Actors in the Policy are included. + sourcehub.acp.DecisionParams: + title: DecisionParams stores auxiliary information regarding the validity of + a decision + type: object + properties: + decision_expiration_delta: + title: number of blocks a Decision is valid for + type: string + format: uint64 + proof_expiration_delta: + title: number of blocks a DecisionProof is valid for + type: string + format: uint64 + ticket_expiration_delta: + title: number of blocks an AccessTicket is valid for + type: string + format: uint64 + sourcehub.acp.MsgCheckAccess: + type: object + properties: + creator: + type: string + policy_id: + type: string + creation_time: + type: string + format: date-time + access_request: + title: AccessRequest represents the wish to perform a set of operations + by an actor + type: object + properties: + operations: + type: array + items: + type: object + properties: + object: + title: target object for operation + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access + controlled within a Policy. + permission: + title: permission required to perform operation + type: string + description: Operation represents an action over an object. + actor: + title: actor requesting operations + type: object + properties: + id: + type: string + description: Actor represents an entity which makes access requests + to a Policy. + sourcehub.acp.MsgCheckAccessResponse: + type: object + properties: + decision: + title: AccessDecision models the result of evaluating a set of AccessRequests + for an Actor + type: object + properties: + id: + type: string + policy_id: + title: used as part of id generation + type: string + creator: + title: used as part of id generation + type: string + creator_acc_sequence: + title: used as part of id generation + type: string + format: uint64 + operations: + title: used as part of id generation + type: array + items: + type: object + properties: + object: + title: target object for operation + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access + controlled within a Policy. + permission: + title: permission required to perform operation + type: string + description: Operation represents an action over an object. + actor_did: + title: used as part of id generation + type: string + actor: + title: used as part of id generation + type: string + params: + title: used as part of id generation + type: object + properties: + decision_expiration_delta: + title: number of blocks a Decision is valid for + type: string + format: uint64 + proof_expiration_delta: + title: number of blocks a DecisionProof is valid for + type: string + format: uint64 + ticket_expiration_delta: + title: number of blocks an AccessTicket is valid for + type: string + format: uint64 + creation_time: + type: string + format: date-time + issued_height: + title: issued_height stores the block height when the Decision was evaluated + type: string + format: uint64 + sourcehub.acp.MsgCreatePolicy: + type: object + properties: + creator: + type: string + policy: + type: string + marshal_type: + type: string + description: |- + PolicyEncodingType enumerates supported marshaling types for policies. + + - UNKNOWN: Fallback value for a missing Marshaling Type + - SHORT_YAML: Policy Marshaled as a YAML Short Policy definition + - SHORT_JSON: Policy Marshaled as a JSON Short Policy definition + default: UNKNOWN + enum: + - UNKNOWN + - SHORT_YAML + - SHORT_JSON + creation_time: + type: string + format: date-time + sourcehub.acp.MsgCreatePolicyResponse: + type: object + properties: + policy: + type: object + properties: + id: + type: string + name: + type: string + description: + type: string + creation_time: + type: string + format: date-time + attributes: + type: object + additionalProperties: + type: string + resources: + type: array + items: + type: object + properties: + name: + type: string + doc: + type: string + permissions: + type: array + items: + type: object + properties: + name: + type: string + doc: + type: string + expression: + type: string + description: |- + Permission models a special type of Relation which is evaluated at runtime. + A permission often maps to an operation defined for a resource which an actor may attempt. + relations: + type: array + items: + type: object + properties: + name: + type: string + doc: + type: string + manages: + title: list of relations managed by the current relation + type: array + items: + type: string + vr_types: + title: value restriction types + type: array + items: + type: object + properties: + resource_name: + title: resource_name scopes permissible actors resource + type: string + relation_name: + title: relation_name scopes permissible actors relation + type: string + description: |- + Restriction models a specification which a Relationship's actor + should meet. + description: |- + Resource models a namespace for objects in a Policy. + Appications will have multiple entities which they must manage such as files or groups. + A Resource represents a set of entities of a certain type. + actor_resource: + type: object + properties: + name: + type: string + doc: + type: string + relations: + type: array + items: + type: object + properties: + name: + type: string + doc: + type: string + manages: + title: list of relations managed by the current relation + type: array + items: + type: string + vr_types: + title: value restriction types + type: array + items: + type: object + properties: + resource_name: + title: resource_name scopes permissible actors resource + type: string + relation_name: + title: relation_name scopes permissible actors relation + type: string + description: |- + Restriction models a specification which a Relationship's actor + should meet. + description: ActorResource represents a special Resource which is reserved + for Policy actors. + creator: + type: string + description: |- + Policy represents an ACP module Policy definition. + Each Policy defines a set of high level rules over how the acces control system + should behave. + sourcehub.acp.MsgDeleteRelationship: + type: object + properties: + creator: + type: string + policy_id: + type: string + relationship: + type: object + properties: + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + relation: + type: string + subject: + type: object + properties: + actor: + type: object + properties: + id: + type: string + description: Actor represents an entity which makes access requests + to a Policy. + actor_set: + type: object + properties: + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access + controlled within a Policy. + relation: + type: string + description: |- + ActorSet represents a set of Actors in a Policy. + It is specified through an Object, Relation pair, which represents + all actors which have a relationship with given obj-rel pair. + This expansion is recursive. + all_actors: + type: object + properties: {} + description: |- + AllActors models a special Relationship Subject which indicates + that all Actors in the Policy are included. + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + description: Subject specifies the target of a Relationship. + description: |- + Relationship models an access control rule. + It states that the given subject has relation with object. + sourcehub.acp.MsgDeleteRelationshipResponse: + type: object + properties: + record_found: + type: boolean + sourcehub.acp.MsgRegisterObject: + type: object + properties: + creator: + type: string + policy_id: + type: string + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + creation_time: + type: string + format: date-time + sourcehub.acp.MsgRegisterObjectResponse: + type: object + properties: + result: + title: RegistrationResult encodes the possible result set from Registering + an Object + type: string + description: |- + - NoOp: NoOp indicates no action was take. The operation failed or the Object already existed and was active + - Registered: Registered indicates the Object was sucessfuly registered to the Actor. + - Unarchived: Unarchived indicates that a previously deleted Object is active again. + Only the original owners can Unarchive an object. + default: NoOp + enum: + - NoOp + - Registered + - Unarchived + sourcehub.acp.MsgSetRelationship: + type: object + properties: + creator: + type: string + policy_id: + type: string + creation_time: + type: string + format: date-time + relationship: + type: object + properties: + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + relation: + type: string + subject: + type: object + properties: + actor: + type: object + properties: + id: + type: string + description: Actor represents an entity which makes access requests + to a Policy. + actor_set: + type: object + properties: + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access + controlled within a Policy. + relation: + type: string + description: |- + ActorSet represents a set of Actors in a Policy. + It is specified through an Object, Relation pair, which represents + all actors which have a relationship with given obj-rel pair. + This expansion is recursive. + all_actors: + type: object + properties: {} + description: |- + AllActors models a special Relationship Subject which indicates + that all Actors in the Policy are included. + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + description: Subject specifies the target of a Relationship. + description: |- + Relationship models an access control rule. + It states that the given subject has relation with object. + sourcehub.acp.MsgSetRelationshipResponse: + type: object + properties: + record_existed: + title: "Indicates whether the given Relationship previously existed, ie\ + \ the Tx was a no op" + type: boolean + sourcehub.acp.MsgUnregisterObject: + type: object + properties: + creator: + type: string + policy_id: + type: string + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + sourcehub.acp.MsgUnregisterObjectResponse: + type: object + properties: + found: + type: boolean + sourcehub.acp.MsgUpdateParams: + type: object + properties: + authority: + type: string + description: authority is the address that controls the module (defaults + to x/gov unless overwritten). + params: + type: object + properties: {} + description: "NOTE: All parameters must be supplied." + description: MsgUpdateParams is the Msg/UpdateParams request type. + sourcehub.acp.MsgUpdateParamsResponse: + type: object + description: |- + MsgUpdateParamsResponse defines the response structure for executing a + MsgUpdateParams message. + sourcehub.acp.Object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled within + a Policy. + sourcehub.acp.Operation: + type: object + properties: + object: + title: target object for operation + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + permission: + title: permission required to perform operation + type: string + description: Operation represents an action over an object. + sourcehub.acp.Params: + type: object + description: Params defines the parameters for the module. + sourcehub.acp.Permission: + type: object + properties: + name: + type: string + doc: + type: string + expression: + type: string + description: |- + Permission models a special type of Relation which is evaluated at runtime. + A permission often maps to an operation defined for a resource which an actor may attempt. + sourcehub.acp.Policy: + type: object + properties: + id: + type: string + name: + type: string + description: + type: string + creation_time: + type: string + format: date-time + attributes: + type: object + additionalProperties: + type: string + resources: + type: array + items: + type: object + properties: + name: + type: string + doc: + type: string + permissions: + type: array + items: + type: object + properties: + name: + type: string + doc: + type: string + expression: + type: string + description: |- + Permission models a special type of Relation which is evaluated at runtime. + A permission often maps to an operation defined for a resource which an actor may attempt. + relations: + type: array + items: + type: object + properties: + name: + type: string + doc: + type: string + manages: + title: list of relations managed by the current relation + type: array + items: + type: string + vr_types: + title: value restriction types + type: array + items: + type: object + properties: + resource_name: + title: resource_name scopes permissible actors resource + type: string + relation_name: + title: relation_name scopes permissible actors relation + type: string + description: |- + Restriction models a specification which a Relationship's actor + should meet. + description: |- + Resource models a namespace for objects in a Policy. + Appications will have multiple entities which they must manage such as files or groups. + A Resource represents a set of entities of a certain type. + actor_resource: + type: object + properties: + name: + type: string + doc: + type: string + relations: + type: array + items: + type: object + properties: + name: + type: string + doc: + type: string + manages: + title: list of relations managed by the current relation + type: array + items: + type: string + vr_types: + title: value restriction types + type: array + items: + type: object + properties: + resource_name: + title: resource_name scopes permissible actors resource + type: string + relation_name: + title: relation_name scopes permissible actors relation + type: string + description: |- + Restriction models a specification which a Relationship's actor + should meet. + description: ActorResource represents a special Resource which is reserved + for Policy actors. + creator: + type: string + description: |- + Policy represents an ACP module Policy definition. + Each Policy defines a set of high level rules over how the acces control system + should behave. + sourcehub.acp.PolicyMarshalingType: + type: string + description: |- + PolicyEncodingType enumerates supported marshaling types for policies. + + - UNKNOWN: Fallback value for a missing Marshaling Type + - SHORT_YAML: Policy Marshaled as a YAML Short Policy definition + - SHORT_JSON: Policy Marshaled as a JSON Short Policy definition + default: UNKNOWN + enum: + - UNKNOWN + - SHORT_YAML + - SHORT_JSON + sourcehub.acp.RegistrationResult: + title: RegistrationResult encodes the possible result set from Registering an + Object + type: string + description: |- + - NoOp: NoOp indicates no action was take. The operation failed or the Object already existed and was active + - Registered: Registered indicates the Object was sucessfuly registered to the Actor. + - Unarchived: Unarchived indicates that a previously deleted Object is active again. + Only the original owners can Unarchive an object. + default: NoOp + enum: + - NoOp + - Registered + - Unarchived + sourcehub.acp.Relation: + type: object + properties: + name: + type: string + doc: + type: string + manages: + title: list of relations managed by the current relation + type: array + items: + type: string + vr_types: + title: value restriction types + type: array + items: + type: object + properties: + resource_name: + title: resource_name scopes permissible actors resource + type: string + relation_name: + title: relation_name scopes permissible actors relation + type: string + description: |- + Restriction models a specification which a Relationship's actor + should meet. + sourcehub.acp.Relationship: + type: object + properties: + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + relation: + type: string + subject: + type: object + properties: + actor: + type: object + properties: + id: + type: string + description: Actor represents an entity which makes access requests + to a Policy. + actor_set: + type: object + properties: + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + relation: + type: string + description: |- + ActorSet represents a set of Actors in a Policy. + It is specified through an Object, Relation pair, which represents + all actors which have a relationship with given obj-rel pair. + This expansion is recursive. + all_actors: + type: object + properties: {} + description: |- + AllActors models a special Relationship Subject which indicates + that all Actors in the Policy are included. + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + description: Subject specifies the target of a Relationship. + description: |- + Relationship models an access control rule. + It states that the given subject has relation with object. + sourcehub.acp.Resource: + type: object + properties: + name: + type: string + doc: + type: string + permissions: + type: array + items: + type: object + properties: + name: + type: string + doc: + type: string + expression: + type: string + description: |- + Permission models a special type of Relation which is evaluated at runtime. + A permission often maps to an operation defined for a resource which an actor may attempt. + relations: + type: array + items: + type: object + properties: + name: + type: string + doc: + type: string + manages: + title: list of relations managed by the current relation + type: array + items: + type: string + vr_types: + title: value restriction types + type: array + items: + type: object + properties: + resource_name: + title: resource_name scopes permissible actors resource + type: string + relation_name: + title: relation_name scopes permissible actors relation + type: string + description: |- + Restriction models a specification which a Relationship's actor + should meet. + description: |- + Resource models a namespace for objects in a Policy. + Appications will have multiple entities which they must manage such as files or groups. + A Resource represents a set of entities of a certain type. + sourcehub.acp.Restriction: + type: object + properties: + resource_name: + title: resource_name scopes permissible actors resource + type: string + relation_name: + title: relation_name scopes permissible actors relation + type: string + description: |- + Restriction models a specification which a Relationship's actor + should meet. + sourcehub.acp.Subject: + type: object + properties: + actor: + type: object + properties: + id: + type: string + description: Actor represents an entity which makes access requests to a + Policy. + actor_set: + type: object + properties: + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + relation: + type: string + description: |- + ActorSet represents a set of Actors in a Policy. + It is specified through an Object, Relation pair, which represents + all actors which have a relationship with given obj-rel pair. + This expansion is recursive. + all_actors: + type: object + properties: {} + description: |- + AllActors models a special Relationship Subject which indicates + that all Actors in the Policy are included. + object: + type: object + properties: + resource: + type: string + id: + type: string + description: Object represents an entity which must be access controlled + within a Policy. + description: Subject specifies the target of a Relationship. + sourcehub.bulletin.MsgCreatePost: + type: object + properties: + creator: + type: string + namespace: + type: string + payload: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + proof: + pattern: "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$" + type: string + format: byte + sourcehub.bulletin.MsgCreatePostResponse: + type: object + sourcehub.bulletin.MsgUpdateParams: + type: object + properties: + authority: + type: string + description: authority is the address that controls the module (defaults + to x/gov unless overwritten). + params: + type: object + properties: {} + description: "NOTE: All parameters must be supplied." + description: MsgUpdateParams is the Msg/UpdateParams request type. + sourcehub.bulletin.MsgUpdateParamsResponse: + type: object + description: |- + MsgUpdateParamsResponse defines the response structure for executing a + MsgUpdateParams message. + sourcehub.bulletin.Params: + type: object + description: Params defines the parameters for the module. +x-original-swagger-version: "2.0" diff --git a/package-lock.json b/package-lock.json index 3a3d48e..246052a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,11 +14,13 @@ "@svgr/webpack": "^7.0.0", "clsx": "^1.2.1", "docusaurus-plugin-sass": "^0.2.3", + "docusaurus-preset-openapi": "^0.6.4", "prism-react-renderer": "^1.3.5", "react": "^17.0.2", "react-dom": "^17.0.2", "react-icons": "^4.8.0", - "sass": "^1.60.0" + "sass": "^1.60.0", + "url": "^0.11.3" }, "devDependencies": { "@docusaurus/module-type-aliases": "^2.4.0", @@ -3290,6 +3292,11 @@ "node": ">=10.13.0" } }, + "node_modules/@faker-js/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==" + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -3539,6 +3546,30 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/@monaco-editor/loader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", + "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", + "dependencies": { + "state-local": "^1.0.6" + }, + "peerDependencies": { + "monaco-editor": ">= 0.21.0 < 1" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", + "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", + "dependencies": { + "@monaco-editor/loader": "^1.4.0" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3586,6 +3617,29 @@ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" }, + "node_modules/@reduxjs/toolkit": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", + "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", + "dependencies": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -3985,6 +4039,15 @@ "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -4077,6 +4140,17 @@ "csstype": "^3.0.2" } }, + "node_modules/@types/react-redux": { + "version": "7.1.33", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", + "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" + } + }, "node_modules/@types/react-router": { "version": "5.1.20", "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", @@ -4579,11 +4653,29 @@ "node": ">=8" } }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, + "node_modules/async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -4759,6 +4851,25 @@ "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -4908,6 +5019,29 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4969,12 +5103,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "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.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5093,6 +5233,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/charset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/cheerio": { "version": "1.0.0-rc.12", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", @@ -5362,6 +5510,17 @@ "node": ">=10" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/comma-separated-tokens": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", @@ -5384,6 +5543,14 @@ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -5506,6 +5673,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" + }, "node_modules/copy-text-to-clipboard": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz", @@ -5704,6 +5876,11 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -6032,6 +6209,14 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", @@ -6075,6 +6260,22 @@ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -6119,6 +6320,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -6195,6 +6404,15 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -6222,6 +6440,66 @@ "node": ">=6" } }, + "node_modules/docusaurus-plugin-openapi": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-openapi/-/docusaurus-plugin-openapi-0.6.4.tgz", + "integrity": "sha512-RkJ68mndhbpx7x1Dukj6BUgUqQEuL5Iv3FFiVIxSCVFw5IuIk+5Oo7tiKbIUMfUHPbvmGSp4839JBTmM99153Q==", + "dependencies": { + "@docusaurus/mdx-loader": "^2.0.0", + "@docusaurus/plugin-content-docs": "^2.0.0", + "@docusaurus/utils": "^2.0.0", + "@docusaurus/utils-validation": "^2.0.0", + "axios": "^0.26.1", + "chalk": "^4.1.2", + "clsx": "^1.1.1", + "fs-extra": "^9.0.1", + "js-yaml": "^4.1.0", + "json-refs": "^3.0.15", + "json-schema-resolve-allof": "^1.5.0", + "lodash": "^4.17.20", + "openapi-to-postmanv2": "^1.2.1", + "postman-collection": "^4.1.0", + "remark-admonitions": "^1.2.1", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/docusaurus-plugin-openapi/node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, + "node_modules/docusaurus-plugin-openapi/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/docusaurus-plugin-proxy": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-proxy/-/docusaurus-plugin-proxy-0.6.3.tgz", + "integrity": "sha512-HAR76IsuSWlVI1K6P8fEJDjhHxT3LLdXGr+ZxNBm6DJTUQ8Xf057nHR8BhB5sfwmzrDPup5wChP/nuOVAfU6wg==", + "engines": { + "node": ">=14" + } + }, "node_modules/docusaurus-plugin-sass": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.3.tgz", @@ -6234,6 +6512,57 @@ "sass": "^1.30.0" } }, + "node_modules/docusaurus-preset-openapi": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/docusaurus-preset-openapi/-/docusaurus-preset-openapi-0.6.4.tgz", + "integrity": "sha512-jSgc23SDp13AHqFu4ehsCIRWwHNkQu9llKV56s3Ik2x7B7hWTQtVXBScz+m3qfXClztEx/XSF5nbZ55OfutyPA==", + "dependencies": { + "@docusaurus/preset-classic": "^2.0.0", + "docusaurus-plugin-openapi": "^0.6.4", + "docusaurus-plugin-proxy": "^0.6.3", + "docusaurus-theme-openapi": "^0.6.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/docusaurus-theme-openapi": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/docusaurus-theme-openapi/-/docusaurus-theme-openapi-0.6.4.tgz", + "integrity": "sha512-j+KZTo8f/jtIQ13WVsXUybOXsdUfKabJLE8Wi/RbVacVhB7WSR2in1wy4/gBmQ7xTPptedJOZm2cRB72dXgbiw==", + "dependencies": { + "@docusaurus/theme-common": "^2.0.0", + "@mdx-js/react": "^1.6.22", + "@monaco-editor/react": "^4.3.1", + "@reduxjs/toolkit": "^1.7.1", + "buffer": "^6.0.3", + "clsx": "^1.1.1", + "crypto-js": "^4.1.1", + "docusaurus-plugin-openapi": "^0.6.4", + "immer": "^9.0.7", + "lodash": "^4.17.20", + "monaco-editor": "^0.31.1", + "postman-code-generators": "^1.0.0", + "postman-collection": "^4.1.0", + "prism-react-renderer": "^1.2.1", + "process": "^0.11.10", + "react-magic-dropzone": "^1.0.1", + "react-redux": "^7.2.0", + "redux-devtools-extension": "^2.13.8", + "webpack": "^5.73.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, "node_modules/dom-converter": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", @@ -6415,6 +6744,25 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", @@ -6687,6 +7035,11 @@ "node": ">=0.10.0" } }, + "node_modules/faker": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/faker/-/faker-5.1.0.tgz", + "integrity": "sha512-RrWKFSSA/aNLP0g3o2WW1Zez7/MnMr7xkiZmoCfAGZmdkDQZ6l2KtuXHN5XjdvpRjDl8+3vf+Rrtl06Z352+Mw==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -6712,6 +7065,11 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "node_modules/fast-url-parser": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", @@ -6813,6 +7171,14 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/filesize": { "version": "8.0.7", "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", @@ -7060,6 +7426,33 @@ "node": ">=6" } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -7125,9 +7518,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -7137,14 +7533,27 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7155,6 +7564,14 @@ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" }, + "node_modules/get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -7317,6 +7734,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -7343,6 +7771,14 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dependencies": { + "lodash": "^4.17.15" + } + }, "node_modules/gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", @@ -7416,20 +7852,20 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { + "node_modules/has-proto": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -7437,14 +7873,36 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", "engines": { "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hast-to-hyperscript": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", @@ -7555,6 +8013,14 @@ "he": "bin/he" } }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "engines": { + "node": ">=8" + } + }, "node_modules/history": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", @@ -7789,6 +8255,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/http-reasons": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", + "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==" + }, + "node_modules/http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==" + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -7819,6 +8295,25 @@ "postcss": "^8.1.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -8376,6 +8871,67 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, + "node_modules/json-refs": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/json-refs/-/json-refs-3.0.15.tgz", + "integrity": "sha512-0vOQd9eLNBL18EGl5yYaO44GhixmImes2wiYn9Z3sag3QnehWrYWlB9AFtMxCL2Bj3fyxgDYkxGFEU/chlYssw==", + "dependencies": { + "commander": "~4.1.1", + "graphlib": "^2.1.8", + "js-yaml": "^3.13.1", + "lodash": "^4.17.15", + "native-promise-only": "^0.8.1", + "path-loader": "^1.0.10", + "slash": "^3.0.0", + "uri-js": "^4.2.2" + }, + "bin": { + "json-refs": "bin/json-refs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/json-refs/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/json-refs/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/json-refs/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-resolve-allof": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/json-schema-resolve-allof/-/json-schema-resolve-allof-1.5.0.tgz", + "integrity": "sha512-Jgn6BQGSLDp3D7bTYrmCbP/p7SRFz5BfpeEJ9A7sXuVADMc14aaDN1a49zqk9D26wwJlcNvjRpT63cz1VgFZeg==", + "dependencies": { + "get-stdin": "^5.0.1", + "lodash": "^4.14.0" + }, + "bin": { + "json-schema-resolve-allof": "bin/json-schema-resolve-allof" + } + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -8476,6 +9032,14 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "node_modules/liquid-json": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", + "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", + "engines": { + "node": ">=4" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -8513,6 +9077,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, "node_modules/lodash.curry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", @@ -8523,16 +9092,36 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, "node_modules/lodash.flow": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" + }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -8604,6 +9193,17 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/marked": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.1.1.tgz", + "integrity": "sha512-mJzT8D2yPxoPh7h0UXkB+dBj4FykPJ2OIfxAWeIHrvoHDkFxukV/29QxoFQoPM6RLEwhIFdJpmKBlqVM3s2ZIw==", + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 8.16.2" + } + }, "node_modules/mdast-squeeze-paragraphs": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", @@ -8742,6 +9342,14 @@ "node": ">= 0.6" } }, + "node_modules/mime-format": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.1.tgz", + "integrity": "sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg==", + "dependencies": { + "charset": "^1.0.0" + } + }, "node_modules/mime-types": { "version": "2.1.18", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", @@ -8869,6 +9477,11 @@ "node": ">=8" } }, + "node_modules/monaco-editor": { + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.31.1.tgz", + "integrity": "sha512-FYPwxGZAeP6mRRyrr5XTGHD9gRXVjy7GUzF4IPChnyt3fS5WrNxIkS8DNujWf6EQy0Zlzpxw8oTVE+mWI2/D1Q==" + }, "node_modules/mrmime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", @@ -8911,6 +9524,11 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==" + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -8960,6 +9578,17 @@ } } }, + "node_modules/node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "dependencies": { + "http2-client": "^1.2.5" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -9027,6 +9656,41 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/oas-resolver-browser": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/oas-resolver-browser/-/oas-resolver-browser-2.3.3.tgz", + "integrity": "sha512-KvggQ6xU7WlUWRYZKEktR90zJtNCHi1wbTAZuUX6oSfmBSdZo/b26rzfg3w2AdPVwQPRXMga6tqLW3OhbUF0Qg==", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "path-browserify": "^1.0.1", + "reftools": "^1.1.1", + "yaml": "^1.8.3", + "yargs": "^15.3.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -9036,9 +9700,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9130,6 +9794,180 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openapi-to-postmanv2": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/openapi-to-postmanv2/-/openapi-to-postmanv2-1.2.7.tgz", + "integrity": "sha512-oG3PZfAAljy5ebot8DZGLFDNNmDZ/qWqI/dboWlgg5hRj6dSSrXeiyXL6VQpcGDalxVX4jSChufOq2eDsFXp4w==", + "dependencies": { + "ajv": "6.12.3", + "async": "3.2.0", + "commander": "2.20.3", + "js-yaml": "3.13.1", + "lodash": "4.17.20", + "oas-resolver-browser": "2.3.3", + "path-browserify": "1.0.1", + "postman-collection": "3.6.6", + "yaml": "1.8.3" + }, + "bin": { + "openapi2postmanv2": "bin/openapi2postmanv2.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/openapi-to-postmanv2/node_modules/iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "node_modules/openapi-to-postmanv2/node_modules/mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/mime-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.0.tgz", + "integrity": "sha512-sv1KDeJFutfXbT+MpIuExruuVZ7LSNQVHIxf7IZVr0a/qWKcHY8DHklWoO6CWf7QnGLl0eC8vBEghl5paWSqqg==", + "dependencies": { + "charset": "^1.0.0" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dependencies": { + "mime-db": "1.44.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/postman-collection": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-3.6.6.tgz", + "integrity": "sha512-fm9AGKHbL2coSzD5nw+F07JrX7jzqu2doGIXevPPrwlpTZyTM6yagEdENeO/Na8rSUrI1+tKPj+TgAFiLvtF4w==", + "dependencies": { + "escape-html": "1.0.3", + "faker": "5.1.0", + "file-type": "3.9.0", + "http-reasons": "0.1.0", + "iconv-lite": "0.6.2", + "liquid-json": "0.3.1", + "lodash": "4.17.20", + "marked": "1.1.1", + "mime-format": "2.0.0", + "mime-types": "2.1.27", + "postman-url-encoder": "2.1.3", + "sanitize-html": "1.20.1", + "semver": "7.3.2", + "uuid": "3.4.0" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/postman-url-encoder": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-2.1.3.tgz", + "integrity": "sha512-CwQjnoxaugCGeOyzVeZ4k1cNQ6iS8OBCzuWzcf4kLStKeRp0MwmLKYv25frynmDpugUUimq/d+FZCq6GtIX9Ag==", + "dependencies": { + "postman-collection": "^3.6.4", + "punycode": "^2.1.1" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/openapi-to-postmanv2/node_modules/yaml": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz", + "integrity": "sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==", + "dependencies": { + "@babel/runtime": "^7.8.7" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -9326,6 +10164,20 @@ "tslib": "^2.0.3" } }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -9355,6 +10207,15 @@ "node": ">=8" } }, + "node_modules/path-loader": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.12.tgz", + "integrity": "sha512-n7oDG8B+k/p818uweWrOixY9/Dsr89o2TkCm6tOTex3fpdo2+BFDgR+KpB37mGKBRsBAlR8CIJMFN0OEy/7hIQ==", + "dependencies": { + "native-promise-only": "^0.8.1", + "superagent": "^7.1.6" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -10162,6 +11023,232 @@ "postcss": "^8.2.15" } }, + "node_modules/postman-code-generators": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/postman-code-generators/-/postman-code-generators-1.9.0.tgz", + "integrity": "sha512-ZM4H7cU1dNUuMPw9CsEoQ7aONl/n8bpSEunZcvzyJd1WtLNj5ktGBGOlDtbTo773dZy5CiVrugdCdt0jhdnUOA==", + "hasInstallScript": true, + "dependencies": { + "async": "3.2.2", + "lodash": "4.17.21", + "path": "0.12.7", + "postman-collection": "4.0.0", + "shelljs": "0.8.5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/postman-code-generators/node_modules/async": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" + }, + "node_modules/postman-code-generators/node_modules/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==" + }, + "node_modules/postman-code-generators/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postman-code-generators/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-code-generators/node_modules/mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/postman-code-generators/node_modules/mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dependencies": { + "mime-db": "1.48.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/postman-code-generators/node_modules/postman-collection": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.0.0.tgz", + "integrity": "sha512-vDrXG/dclSu6RMqPqBz4ZqoQBwcj/a80sJYsQZmzWJ6dWgXiudPhwu6Vm3C1Hy7zX5W8A6am1Z6vb/TB4eyURA==", + "dependencies": { + "faker": "5.5.3", + "file-type": "3.9.0", + "http-reasons": "0.1.0", + "iconv-lite": "0.6.3", + "liquid-json": "0.3.1", + "lodash": "4.17.21", + "mime-format": "2.0.1", + "mime-types": "2.1.31", + "postman-url-encoder": "3.0.1", + "semver": "7.3.5", + "uuid": "8.3.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-code-generators/node_modules/postman-url-encoder": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.1.tgz", + "integrity": "sha512-dMPqXnkDlstM2Eya+Gw4MIGWEan8TzldDcUKZIhZUsJ/G5JjubfQPhFhVWKzuATDMvwvrWbSjF+8VmAvbu6giw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-code-generators/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/postman-code-generators/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-code-generators/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/postman-collection": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.4.0.tgz", + "integrity": "sha512-2BGDFcUwlK08CqZFUlIC8kwRJueVzPjZnnokWPtJCd9f2J06HBQpGL7t2P1Ud1NEsK9NHq9wdipUhWLOPj5s/Q==", + "dependencies": { + "@faker-js/faker": "5.5.3", + "file-type": "3.9.0", + "http-reasons": "0.1.0", + "iconv-lite": "0.6.3", + "liquid-json": "0.3.1", + "lodash": "4.17.21", + "mime-format": "2.0.1", + "mime-types": "2.1.35", + "postman-url-encoder": "3.0.5", + "semver": "7.5.4", + "uuid": "8.3.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-collection/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postman-collection/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-collection/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/postman-collection/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/postman-collection/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-collection/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/postman-url-encoder": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz", + "integrity": "sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postman-url-encoder/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, "node_modules/prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", @@ -10203,6 +11290,14 @@ "node": ">=6" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -10623,6 +11718,40 @@ "webpack": ">=4.41.1 || 5.x" } }, + "node_modules/react-magic-dropzone": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-magic-dropzone/-/react-magic-dropzone-1.0.1.tgz", + "integrity": "sha512-0BIROPARmXHpk4AS3eWBOsewxoM5ndk2psYP/JmbCq8tz3uR2LIV1XiroZ9PKrmDRMctpW+TvsBCtWasuS8vFA==" + }, + "node_modules/react-redux": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", + "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, "node_modules/react-router": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", @@ -10738,6 +11867,39 @@ "node": ">=6.0.0" } }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-devtools-extension": { + "version": "2.13.9", + "resolved": "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz", + "integrity": "sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A==", + "deprecated": "Package moved to @redux-devtools/extension.", + "peerDependencies": { + "redux": "^3.1.0 || ^4.0.0" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "peerDependencies": { + "redux": "^4" + } + }, + "node_modules/reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -10816,13 +11978,63 @@ "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehype-parse": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", + "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", + "dependencies": { + "hast-util-from-parse5": "^5.0.0", + "parse5": "^5.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/hast-util-from-parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", + "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", + "dependencies": { + "ccount": "^1.0.3", + "hastscript": "^5.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.1.2", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/hastscript": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", + "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", + "dependencies": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" }, "node_modules/relateurl": { "version": "0.2.7", @@ -10832,6 +12044,32 @@ "node": ">= 0.10" } }, + "node_modules/remark-admonitions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", + "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", + "dependencies": { + "rehype-parse": "^6.0.2", + "unified": "^8.4.2", + "unist-util-visit": "^2.0.1" + } + }, + "node_modules/remark-admonitions/node_modules/unified": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", + "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-emoji": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", @@ -11102,6 +12340,14 @@ "node": ">=0.10" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -11118,11 +12364,21 @@ "node": "*" } }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, + "node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", @@ -11340,6 +12596,176 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/sanitize-html": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.20.1.tgz", + "integrity": "sha512-txnH8TQjaQvg2Q0HY06G6CDJLVYCpbnxrdO0WN8gjCKaU5J0KbyGYhZxx5QJg3WLZ1lB7XU9kDkfrCXUozqptA==", + "dependencies": { + "chalk": "^2.4.1", + "htmlparser2": "^3.10.0", + "lodash.clonedeep": "^4.5.0", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.mergewith": "^4.6.1", + "postcss": "^7.0.5", + "srcset": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "node_modules/sanitize-html/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sanitize-html/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sanitize-html/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/sanitize-html/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/sanitize-html/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/sanitize-html/node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/sanitize-html/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/sanitize-html/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/sanitize-html/node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/sanitize-html/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/sanitize-html/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/sanitize-html/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sanitize-html/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/sanitize-html/node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/sanitize-html/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/sanitize-html/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/sanitize-html/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/sass": { "version": "1.60.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.60.0.tgz", @@ -11678,6 +13104,27 @@ "node": ">= 0.8.0" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -11767,13 +13214,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11933,12 +13384,29 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "node_modules/srcset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz", + "integrity": "sha512-UH8e80l36aWnhACzjdtLspd4TAWldXJMa45NuOkTTU+stwekswObdqM63TtQixN4PPd/vO/kxLa6RD+tUPeFMg==", + "dependencies": { + "array-uniq": "^1.0.2", + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" + }, "node_modules/state-toggle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", @@ -12084,6 +13552,39 @@ "postcss": "^8.2.15" } }, + "node_modules/superagent": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.6.tgz", + "integrity": "sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g==", + "deprecated": "Please downgrade to v7.1.5 if you need IE/ActiveXObject support OR upgrade to v8.0.0 as we no longer support IE and published an incorrect patch version (see https://github.com/visionmedia/superagent/issues/1731)", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.3", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.0.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.10.3", + "readable-stream": "^3.6.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12786,6 +14287,15 @@ "node": ">=6" } }, + "node_modules/url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.11.2" + } + }, "node_modules/url-loader": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", @@ -12859,6 +14369,20 @@ "node": ">=4" } }, + "node_modules/url/node_modules/qs": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", + "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/use-composed-ref": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", @@ -12904,11 +14428,24 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", @@ -13459,6 +14996,11 @@ "node": ">= 8" } }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -13593,6 +15135,11 @@ "node": ">=0.4" } }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -13606,6 +15153,88 @@ "node": ">= 6" } }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 12d2a27..57010fa 100644 --- a/package.json +++ b/package.json @@ -22,11 +22,13 @@ "@svgr/webpack": "^7.0.0", "clsx": "^1.2.1", "docusaurus-plugin-sass": "^0.2.3", + "docusaurus-preset-openapi": "^0.6.4", "prism-react-renderer": "^1.3.5", "react": "^17.0.2", "react-dom": "^17.0.2", "react-icons": "^4.8.0", - "sass": "^1.60.0" + "sass": "^1.60.0", + "url": "^0.11.3" }, "browserslist": { "production": [ @@ -48,4 +50,4 @@ "tmp": "^0.2.1", "typescript": "^5.0.2" } -} \ No newline at end of file +} diff --git a/sidebars.js b/sidebars.js index c71cd8f..62dfc07 100644 --- a/sidebars.js +++ b/sidebars.js @@ -18,10 +18,17 @@ const sidebars = { type: "autogenerated", dirName: "defradb", }], - sourcehubSidebar: [{ + sourcehubSidebar: [ + { type: "autogenerated", dirName: "sourcehub" - }], + }, + { + type: 'link', + label: 'API', // The link label + href: '/sourcehub/api', // The internal path + }, + ], orbisSidebar: [{ type: "autogenerated", dirName: "orbis" From b0d7e6b050b5b14ba8f418e48ac8c9ec77a08be2 Mon Sep 17 00:00:00 2001 From: Keenan Nemetz Date: Tue, 12 Mar 2024 12:12:32 -0700 Subject: [PATCH 09/48] feat: Add Akash deploy guide (#132) This PR adds an Akash deployment guide with p2p replicator instructions. --- docs/guides/akash-deployment.md | 145 ++++++++++++++++++++++++++++++++ static/img/akash/deploy.png | Bin 0 -> 210107 bytes static/img/akash/info.png | Bin 0 -> 211296 bytes 3 files changed, 145 insertions(+) create mode 100644 docs/guides/akash-deployment.md create mode 100644 static/img/akash/deploy.png create mode 100644 static/img/akash/info.png diff --git a/docs/guides/akash-deployment.md b/docs/guides/akash-deployment.md new file mode 100644 index 0000000..1156347 --- /dev/null +++ b/docs/guides/akash-deployment.md @@ -0,0 +1,145 @@ +--- +sidebar_label: Akash Deployment Guide +sidebar_position: 60 +--- +# Deploy DefraDB on Akash + +## Overview + +This guide will walk you through the required steps to deploy DefraDB on Akash. + +## Prerequisites + +Before you get started you will need an Akash account with at least 5 AKT. If don't have an Akash account you can create one by installing [Keplr](https://www.keplr.app/). + +## Deploy + +![Cloudmos console](/img/akash/deploy.png "Cloudmos console") + +Deploying on Akash can be done through the [Cloudmos console](https://deploy.cloudmos.io/new-deployment). Click on the "Empty" deployment type and copy the config below into the editor. + +```yaml +--- +version: "2.0" + +services: + defradb: + image: sourcenetwork/defradb:develop + args: + - start + - --url=0.0.0.0:9181 + expose: + - port: 9171 + as: 9171 + to: + - global: true + - port: 9181 + as: 80 + to: + - global: true + +profiles: + compute: + defradb: + resources: + cpu: + units: 1.0 + memory: + size: 1Gi + storage: + size: 1Gi + placement: + akash: + attributes: + host: akash + signedBy: + anyOf: + - "akash1365yvmc4s7awdyj3n2sav7xfx76adc6dnmlx63" + - "akash18qa2a2ltfyvkyj0ggj3hkvuj6twzyumuaru9s4" + pricing: + defradb: + denom: uakt + amount: 10000 + +deployment: + defradb: + akash: + profile: defradb + count: 1 +``` + +Next click the "Create Deployment" button. A pop-up will appear asking you to confirm the configuration transaction. + +After confirming you will be prompted to select a provider. Select a provider with a price and location that makes sense for your use case. + +A final pop-up will appear asking you to confirm the deployment transaction. If the deployment is successful you should now see deployment info similar to the image below. + +## Deployment Info + +![Cloudmos deployment](/img/akash/info.png "Cloudmos deployment") + +To configure and interact with your DefraDB node, you will need the P2P and API addresses. They can be found at the labeled locations in the image above. + +## P2P Replication + +To replicate documents from a local DefraDB instance to your Akash deployment you will need to create a shared schema on both nodes. + +Run the commands below to create the shared schema. + +First on the local node: + +```bash +defradb client schema add ' + type User { + name: String + age: Int + } +' +``` + +Then on the Akash node: + +```bash +defradb client schema add --url ' + type User { + name: String + age: Int + } +' +``` + +> The API address can be found in the [deployment info](#deployment-info). + +Next you will need the peer ID of the Akash node. Run the command below to view the node's peer info. + +```bash +defradb client p2p info --url +``` + +If the command is successful, you should see output similar to the text below. + +```json +{ + "ID": "12D3KooWQr7voGBQPTVQrsk76k7sYWRwsAdHRbRjXW39akYomLP3", + "Addrs": [ + "/ip4/0.0.0.0/tcp/9171" + ] +} +``` + +> The address here is the node's p2p bind address. The public p2p address can be found in the [deployment info](#deployment-info). + +Setup the replicator from your local node to the Akash node by running the command below. + +```bash +defradb client p2p replicator set --collection User '{ + "ID": "12D3KooWQr7voGBQPTVQrsk76k7sYWRwsAdHRbRjXW39akYomLP3", + "Addrs": [ + "/dns//" + ] +}' +``` + +> The p2p host and port can be found in the [deployment info](#deployment-info). For example: if your p2p address is http://provider.bdl.computer:32582/ the host would be provider.bdl.computer and the port would be 32582. + +The local node should now be replicating all User documents to the Akash node. \ No newline at end of file diff --git a/static/img/akash/deploy.png b/static/img/akash/deploy.png new file mode 100644 index 0000000000000000000000000000000000000000..63265b2d21da9b93405e8c9eb948b1463010535e GIT binary patch literal 210107 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
>CZI^-Vm{xWoB#dAUy1j_R`6(U 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

`tIJeoW=|%d^OPqNJO=T|t{jHZ#g%g- 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 literal 0 HcmV?d00001 From ed43915012c53249a27bf8e5f4d6b950403b0db5 Mon Sep 17 00:00:00 2001 From: Keenan Nemetz Date: Tue, 12 Mar 2024 15:36:59 -0700 Subject: [PATCH 10/48] fix(i): Move Akash deploy guide (#141) Move Akash deploy guide into defradb sub directory. --- docs/{ => defradb}/guides/akash-deployment.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{ => defradb}/guides/akash-deployment.md (100%) diff --git a/docs/guides/akash-deployment.md b/docs/defradb/guides/akash-deployment.md similarity index 100% rename from docs/guides/akash-deployment.md rename to docs/defradb/guides/akash-deployment.md From bd5b1cbc1895b80fdb0d025956723d40700acf06 Mon Sep 17 00:00:00 2001 From: Keenan Nemetz Date: Wed, 13 Mar 2024 12:16:22 -0700 Subject: [PATCH 11/48] fix: Update mutation input types (#142) This PR updates the mutation input type in all examples. It also removes some out dated language about JSON patch in update mutations. --- docs/defradb/getting-started.md | 2 +- docs/defradb/guides/schema-relationship.md | 12 +++---- .../query-specification/mutation-block.md | 36 +++++++++---------- 3 files changed, 24 insertions(+), 26 deletions(-) diff --git a/docs/defradb/getting-started.md b/docs/defradb/getting-started.md index f0e7ddb..739f27b 100644 --- a/docs/defradb/getting-started.md +++ b/docs/defradb/getting-started.md @@ -70,7 +70,7 @@ Submit a `mutation` request to create a document of the `User` type: ```shell defradb client query ' mutation { - create_User(data: "{\"age\": 31, \"verified\": true, \"points\": 90, \"name\": \"Bob\"}") { + create_User(input: {age: 31, verified: true, points: 90, name: "Bob"}) { _key } } diff --git a/docs/defradb/guides/schema-relationship.md b/docs/defradb/guides/schema-relationship.md index f59dabe..59745b6 100644 --- a/docs/defradb/guides/schema-relationship.md +++ b/docs/defradb/guides/schema-relationship.md @@ -73,7 +73,7 @@ type Address { ```graphql mutation { - create_Address(data: "{\"streetNumber\": \"123\", \"streetName\": \"Test road\", \"country\": \"Canada\"}") { + create_Address(input: {streetNumber: "123", streetName: "Test road", country: "Canada"}) { _key } } @@ -81,7 +81,7 @@ mutation { ```graphql mutation { - create_User(data: "{\"name\": \"Alice\", \"username\": \"awesomealice\", \"age\": 35, \"address_id\": \"bae-fd541c25-229e-5280-b44b-e5c2af3e374d\"}") { + create_User(input: {name: "Alice", username: "awesomealice", age: 35, address_id: "bae-fd541c25-229e-5280-b44b-e5c2af3e374d"}) { _key } } @@ -177,7 +177,7 @@ defradb client schema add -f schema.graphql ```graphql mutation { - create_Author(data: "{\"name\": \"Saadi\",\"dateOfBirth\": \"1210-07-23T03:46:56.647Z\"}") { + create_Author(input: {name: "Saadi", dateOfBirth: "1210-07-23T03:46:56.647Z"}) { _key } } @@ -186,7 +186,7 @@ mutation { ```graphql mutation { - create_Book(data: "{\"name\": \"Gulistan\",\"genre\": \"Poetry\", \"author_id\": \"bae-0e7c3bb5-4917-5d98-9fcf-b9db369ea6e4\"}") { + create_Book(input: {name: "Gulistan", genre: "Poetry", author_id: "bae-0e7c3bb5-4917-5d98-9fcf-b9db369ea6e4"}) { _key } } @@ -195,7 +195,7 @@ mutation { ```graphql mutation { - update_Author(id: "bae-0e7c3bb5-4917-5d98-9fcf-b9db369ea6e4", data: "{\"name\": \"Saadi Shirazi\"}") { + update_Author(id: "bae-0e7c3bb5-4917-5d98-9fcf-b9db369ea6e4", input: {name: "Saadi Shirazi"}) { _key } } @@ -204,7 +204,7 @@ mutation { ```graphql mutation { - update_Book(filter: {name: {_eq: "Gulistan"}}, data: "{\"description\": \"Persian poetry of ideas\"}") { + update_Book(filter: {name: {_eq: "Gulistan"}}, input: {description: "Persian poetry of ideas"}) { _key } } diff --git a/docs/defradb/references/query-specification/mutation-block.md b/docs/defradb/references/query-specification/mutation-block.md index 99529ce..255c3b4 100644 --- a/docs/defradb/references/query-specification/mutation-block.md +++ b/docs/defradb/references/query-specification/mutation-block.md @@ -18,17 +18,17 @@ Insert is used to create new documents from scratch. This involves many necessar type Book { ... } mutation { - create_Book(data: createBookPayload) [Book] + create_Book(input: createBookInput) [Book] } ``` -The above example displays the general structure of an insert mutation. You call the `createTYPE` mutation, with the given data payload. +The above example displays the general structure of an insert mutation. You call the `create_TYPE` mutation, with the given input. -### Payload Format +### Input Object Type -All mutations use a payload to update the data. Unlike the rest of the Query system, mutation payloads aren't typed. Instead, they use a standard JSON Serialization format. Removing the type system from payloads allows flexibility in the system. +All mutations use a typed input object to update the data. -JSON Supports all the same types as DefraDB, and it's familiar for developers. Hence, it is an obvious choice for us. The following is an example with a full type and payload: +The following is an example with a full type and input object: ```graphql type Book { @@ -38,11 +38,11 @@ type Book { } mutation { - create_Book(data: "{ - 'title': 'Painted House', - 'description': 'The story begins as Luke Chandler ...', - 'rating': 4.9 - }") { + create_Book(input: { + title: "Painted House", + description: "The story begins as Luke Chandler ...", + rating: 4.9 + }) { title description rating @@ -65,32 +65,30 @@ Update filters use the same format and types from the Query system. Hence, it ea The structure of the generated update mutation for a `Book` type is given below: ```graphql mutation { - update_Book(dockey: ID, filter: BookFilterArg, data: updateBookPayload) [Book] + update_Book(dockey: ID, filter: BookFilterArg, input: updateBookInput) [Book] } ``` See the structure and syntax of the filter query above. You can also see an additional field `id`, thawhich will supersede the `filter`; this makes it easy to update a single document by a given ID. -More important than the Update filter, is the update payload. Currently all update payloads use the `JSON Merge Patch` system. - -`JSON Merge Patch` is very similar to a traditional JSON object, with a few semantic differences that are important for Updates. The most significant aspect is how to remove or delete a field value in a document. To remove a `JSON Merge Patch` field. we provide a `nil` value in the JSON object. +The input object type is the same for both `update_TYPE` and `create_TYPE` mutations. Here's an example. ```json { - "name": "John", - "rating": nil + name: "John", + rating: nil } ``` -This Merge Patch sets the `name` field to "John" and deletes the `rating` field value. +This update sets the `name` field to "John" and deletes the `rating` field value. Once we create our update, and select which document(s) to update, we can query the new state of all documents affected by the mutation. This is because our update mutation returns the type it mutates. A basic example is provided below: ```graphql mutation { - update_Book(dockey: '123', data: "{'name': 'John'}") { + update_Book(dockey: '123', input: {name: "John"}) { _key name } @@ -104,7 +102,7 @@ Beyond updating by an ID or IDs, we can use a query filter to select which field ```graphql mutation { - update_Book(filter: {rating: {_le: 1.0}}, data: "{'rating': '1.5'}") { + update_Book(filter: {rating: {_le: 1.0}}, input: {rating: 1.5}) { _key rating name From 8578076a50ce304c693268bc350acd4a9921a74d Mon Sep 17 00:00:00 2001 From: AndrewSisley Date: Tue, 2 Apr 2024 16:58:38 -0400 Subject: [PATCH 12/48] feat: Update schema migration guide to defra 0.10.0 (#138) Resolves #137 This updates the schema migration guide to Defra version 0.10.0. --- docs/defradb/guides/schema-migration.md | 80 ++++++++++++++++++------- 1 file changed, 59 insertions(+), 21 deletions(-) diff --git a/docs/defradb/guides/schema-migration.md b/docs/defradb/guides/schema-migration.md index 870195d..9bdd854 100644 --- a/docs/defradb/guides/schema-migration.md +++ b/docs/defradb/guides/schema-migration.md @@ -79,14 +79,14 @@ defradb client schema add ' ' ``` -**Step Two**, patch the `Users` schema, adding the new field, here we pass in `--set-default=true` to automatically apply the schema change to the `Users` collection: +**Step Two**, patch the `Users` schema, adding the new field, here we pass in `--set-active=true` to automatically apply the schema change to the `Users` collection: ```graphql defradb client schema patch ' [ { "op": "add", "path": "/Users/Fields/-", "value": {"Name": "email", "Kind": "String"} } ] -' --set-default=true +' --set-active=true ``` **Step Three**, fetch the schema ids so that we can later tell Defra which schema versions we wish to migrate to/from: @@ -97,17 +97,25 @@ defradb client schema describe --name="Users" **Step Four**, in order to define our Lens module - we need to define 4 functions: +- `next() unsignedInteger8`, this is a host function imported to the module - calling it will return a pointer to a byte array that will either contain + an error, an EndOfStream identifier (indicating that there are no more source values), or a pointer to the start of a json byte array containing the Defra document to migrate. It is typically called from within the `transform` and `inverse` functions, and can be called multiple times within them if desired. + - `alloc(size: unsignedInteger64) unsignedInteger8`​, this is required by all lens modules regardless of language or content - this function should allocate a block of memory of the given `size` , it is used by the Lens engine to pass stuff in to the wasm instance. The memory needs to remain reserved until the next wasm call, e.g. until `transform` or `set_param` has been called. It's implementation will be different depending on which language you are working with, but it should not need to differ between modules of the same language. The Rust SDK contains an alloc function that you can call. - `set_param(ptr: unsignedInteger8) unsignedInteger8`​, this function is only required by modules that accept a set of parameters. As an input parameter it receives a single pointer that will point to the start of a json byte array containing the parameters defined in the configuration file. It returns a pointer to either nil, or an error message. It will be called once, when the the migration is defined in Defra (and on restart of the database). How it is implemented is up to you. -- `transform(ptr: unsignedInteger8) unsignedInteger8`​, this function is required by all Lens modules - it is the migration, and within this function you should define what the migration should do, in this example it will copy the data from the `emailAddress` field into the `email` field. It receives a single input parameter, a pointer to the start of a json byte array containing the Defra document to migrate. It returns a pointer to either the json byte array of the transformed document, or an error message. +- `transform() unsignedInteger8`​, this function is required by all Lens modules - it is the migration, and within this function you should define what the migration should do, in this example it will copy the data from the `emailAddress` field into the `email` field. Lens Modules can call the `next` function zero to many times to draw documents from the Defra datastore, however modules used in schema migrations should currently limit this to a single call per `transform` call (Lens based views may call it more or less frequently in order to filter or create documents). -- `inverse(ptr: unsignedInteger8) unsignedInteger8`​, this function is optional, you only need to define it if you wish to define the inverse migration. It follows the same pattern as the `transform` function, only you should implement it to do the reverse. In this example we want this to copy the value from the `email` field into the `emailAddress`​ field. +- `inverse() unsignedInteger8`​, this function is optional, you only need to define it if you wish to define the inverse migration. It follows the same pattern as the `transform` function, only you should implement it to do the reverse. In this example we want this to copy the value from the `email` field into the `emailAddress`​ field. Here is what our migration would look like if we were to write it in Rust: ```graphql +#[link(wasm_import_module = "lens")] +extern "C" { + fn next() -> *mut u8; +} + #[derive(Deserialize, Clone)] pub struct Parameters { pub src: String, @@ -129,53 +137,83 @@ pub extern fn set_param(ptr: *mut u8) -> *mut u8 { } } +fn try_set_param(ptr: *mut u8) -> Result<(), Box> { + let parameter = lens_sdk::try_from_mem::(ptr)?; + + let mut dst = PARAMETERS.write()?; + *dst = Some(parameter); + Ok(()) +} + #[no_mangle] -pub extern fn transform(ptr: *mut u8) -> *mut u8 { - match try_transform(ptr) { +pub extern fn transform() -> *mut u8 { + match try_transform() { Ok(o) => match o { Some(result_json) => lens_sdk::to_mem(lens_sdk::JSON_TYPE_ID, &result_json), None => lens_sdk::nil_ptr(), + EndOfStream => lens_sdk::to_mem(lens_sdk::EOS_TYPE_ID, &[]), }, Err(e) => lens_sdk::to_mem(lens_sdk::ERROR_TYPE_ID, &e.to_string().as_bytes()) } } -fn try_transform(ptr: *mut u8) -> Result>, Box> { - let mut input = match lens_sdk::try_from_mem::>(ptr)? +fn try_transform() -> Result>, Box> { + let ptr = unsafe { next() }; + let mut input = match lens_sdk::try_from_mem::>(ptr)? { + Some(v) => v, + // Implementations of `transform` are free to handle nil however they like. In this + // implementation we chose to return nil given a nil input. + None => return Ok(None), + EndOfStream => return Ok(EndOfStream) + }; - let params = PARAMETERS.read()? + let params = PARAMETERS.read()?; - let value = input.get_mut(¶ms.src)?; + let value = input.get_mut(¶ms.src) + .ok_or(ModuleError::PropertyNotFoundError{requested: params.src.clone()})? + .clone(); - input.insert(params.dst, value); + let mut result = input.clone(); + result.insert(params.dst, value); - let result_json = serde_json::to_vec(&input.clone())?; + let result_json = serde_json::to_vec(&result)?; + lens_sdk::free_transport_buffer(ptr)?; Ok(Some(result_json)) } #[no_mangle] -pub extern fn inverse(ptr: *mut u8) -> *mut u8 { - match try_inverse(ptr) { +pub extern fn inverse() -> *mut u8 { + match try_inverse() { Ok(o) => match o { Some(result_json) => lens_sdk::to_mem(lens_sdk::JSON_TYPE_ID, &result_json), None => lens_sdk::nil_ptr(), + EndOfStream => lens_sdk::to_mem(lens_sdk::EOS_TYPE_ID, &[]), }, Err(e) => lens_sdk::to_mem(lens_sdk::ERROR_TYPE_ID, &e.to_string().as_bytes()) } } -fn try_inverse(ptr: *mut u8) -> Result>, Box> { - let mut input = match lens_sdk::try_from_mem::>(ptr)? +fn try_inverse() -> Result>, Box> { + let ptr = unsafe { next() }; + let mut input = match lens_sdk::try_from_mem::>(ptr)? { + Some(v) => v, + // Implementations of `transform` are free to handle nil however they like. In this + // implementation we chose to return nil given a nil input. + None => return Ok(None), + EndOfStream => return Ok(EndOfStream) + }; - let params = PARAMETERS.read()? + let params = PARAMETERS.read()?; // Note: In this example `inverse` is exactly the same as `transform`, only the useage // of `params.dst` and `params.src` is reversed. let value = input.get_mut(¶ms.dst)?; - input.insert(params.src, value); + let mut result = input.clone(); + result.insert(params.src, value); - let result_json = serde_json::to_vec(&input.clone())?; + let result_json = serde_json::to_vec(&result)?; + lens_sdk::free_transport_buffer(ptr)?; Ok(Some(result_json)) } ``` @@ -212,10 +250,10 @@ Now the migration has been configured! Any documents committed under the origin As we have defined an inverse migration, we can give this migration to other nodes in our peer network still on the original schema version, and they will be able to query our documents committed using the new schema version applying the inverse. -We can also change our default schema version on this node back to the original to see the inverse in action: +We can also change our active schema version on this node back to the original to see the inverse in action: ```graphql -defradb client schema set-default +defradb client schema set-active ``` Now when we query Defra, any documents committed after the schema update will be rendered as if they were committed on the original schema version, with `email` field values being copied to the `emailAddress` field at query time. From 27c3e299b5ebf89eb4caff10ddecdce4afb504f6 Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Thu, 4 Apr 2024 05:06:50 -0400 Subject: [PATCH 13/48] feat: Orbis Testnet 1 docs (#144) Added the Orbis "Join Testnet 1" documentation. Resolves #143 --- docs/orbis/getting-started.md | 1 - docs/orbis/testnet/_category_.json | 4 + docs/orbis/testnet/join.md | 249 +++++++++++++++++++++++++++++ docs/sourcehub/testnet/overview.md | 40 +++-- 4 files changed, 272 insertions(+), 22 deletions(-) delete mode 100644 docs/orbis/getting-started.md create mode 100644 docs/orbis/testnet/_category_.json create mode 100644 docs/orbis/testnet/join.md diff --git a/docs/orbis/getting-started.md b/docs/orbis/getting-started.md deleted file mode 100644 index 816280d..0000000 --- a/docs/orbis/getting-started.md +++ /dev/null @@ -1 +0,0 @@ -# 🚧 Coming Soon 🚧 \ No newline at end of file diff --git a/docs/orbis/testnet/_category_.json b/docs/orbis/testnet/_category_.json new file mode 100644 index 0000000..1fcd03f --- /dev/null +++ b/docs/orbis/testnet/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Testnet" + } + \ No newline at end of file diff --git a/docs/orbis/testnet/join.md b/docs/orbis/testnet/join.md new file mode 100644 index 0000000..29ca962 --- /dev/null +++ b/docs/orbis/testnet/join.md @@ -0,0 +1,249 @@ +--- +title: Join Root Ring +--- + +# How to Join Testnet 1 Root Ring +The following will detail the necessary steps to join Testnet 1 Orbis Root Ring as a validator. Only the existing and approved validators can operate a Orbis node in the Root Ring. + +## Hardware Requirements +Orbis doesn't have any specific requirements from a hardware perspective at the moment, however it is recommended to use a "good enough" datacenter machine. + +Orbis can be deployed along side your existing validator hardware as a co-process. Or on a seprate machine entirely. + +Minimum hardware requirements: +* 2-core amd64 CPU (or 2 virtual cores) +* 4GB RAM +* 32GB SSD Storage +* 100Mbps bi-directional internet connection. + +## Orbis Binary +You can get the `orbisd` binary from the releases page of the Orbis repo: [https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.1](https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.1). +```bash +cd $HOME +wget https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.1 +chmod +x orbisd +sudo mv /usr/bin +``` + +### From Source +You can download the code and compile your own binaries if you prefer. However you will need a local installation of the `go` toolchain at a minimum version of 1.21 +```bash +cd $HOME +git clone https://github.com/sourcenetwork/orbis-go +cd orbis-go +git checkout v0.2.1 +make build +cp ./build/orbisd $GOBIN/orbisd +export PATH=$PATH:$GOBIN +``` +Now you will have the `orbisd` available in your local system. + +## Docker +You can either use the pre-existing docker image hosted on our GitHub, or build your own + +### Github Container Registry (coming soon) +`docker pull ghcr.io/sourcenetwork/orbis:0.2.1` + +### Build Docker Image from Source +```bash +cd $HOME +git clone https://github.com/sourcenetwork/orbis-go +cd orbis-go +git checkout v0.2.1 +docker build -t . +``` + +## Docker Compose + + +## Initialization +To deploy our orbis node and to join the Root Ring running on [SourceHub Testnet 1](/sourcehub/testnet/overview), generate or use an existing sourcehub keypair, and update your respective configuration. + +Orbis will also need access to a running SourceHub Testnet 1 RPC Endpoint, this can either be: +* A) The RPC endpoint of your existing validator node, if you are running both daemons on a single machine +* B) Your own hosted RPC endpoint +* C) A public RPC endpoint + * http://rpc1.testnet1.source.network:26657 + * http://rpc2.testnet1.source.network:26657 + +### Key Ring +As for the sourcehub keypair, Orbis needs access to a sourcehubd keyring instance. You already have one running on your validator node, but you can also create a keyring on any node with `sourcehubd keys add `. If you are running both `orbisd` and `sourcehubd` on the same machine, then you can share keys between your validator and orbis node. + +The `keyname` you have already, or if you create a new one, must match what you specify in the `orbis.yml` config, defined below. + +By default `sourcehubd keys add ` will use the `os` keyring backend, you may use other key backends supported by the SourceHub keyring utility, but whatever backend you use *MUST* match what is in your `orbis.yml` config. To learn more about various backends you can see the documentation available from the `sourcehubd keys --help` command. + +:::caution +If you start your node and you get an error similar to `error: bech32 decode ...` then you likely have either used the wrong `keyname` or `keyringBackend`. +::: + + +## Configuration +You may have to configure orbis to work in your specific environment or hardware, depending on your storage and networking resources, here is a pretty standard configuration file `orbis.yml` +```yaml +grpc: + # GRPC Endpoint + grpcURL: "0.0.0.0:8080" + # Rest API Endpoint (optional) + restURL: "0.0.0.0:8090" + # GRPC Request logging (true/false) + logging: true + +logger: + # Default log level ("fatal", "error", "warn", "info", "debug") + level: "info" + +host: + # P2P Host Address (required - see below) + listenAddresses: + - /ip4/0.0.0.0/tcp/9000 + # P2P Boostrap peers (required - see below) + bootstrap_peers: + - /dns4//tcp/9000/p2p/ + +transport: + # P2P Peer exchange topic (required) + rendezvous: "orbis-transport" + +db: + # DB data store path, prefixed with $HOME/.orbis + # So "data" would result in a path $HOME/.orbis/data + path: "data" + +cosmos: + # Cosmos chain ID + chainId: sourcehub-testnet1 + # Cosmos keyring key name + accountName: + # Cosmos keyring backend ('os' is the default when running sourcehubd) + keyringBackend: os + # Cosmos address prefix ('source' is for SourceHub) + addressPrefix: source + # Transaction fees + fees: 2000uopen + rpcAddress: +``` + +When starting an Orbis daemon, you can specify the config file path with the `--config ` flag. + +## Configuration Requirements +:::info +required `host.listenAddress` +::: + +You *MUST* run orbis with a publicly available `host.listenAddress`. In the above example config this is the +```yaml +listenAddresses: + - /ip4/0.0.0.0/tcp/9000 +``` +You can specify your own port to listen on, but the host port and bind address must result in a publicly available listener. This is the port that all the orbis nodes communicate their P2P network traffic. + +:::info +required `host.bootstrapPeers` +::: + +You *MUST* use the `host.boostrapPeers`address provided in the [#validator-info](https://discord.com/channels/427944769851752448/1207162452337360936) channel in the Source Network discord. +```yaml + bootstrap_peers: + - /dns4//tcp/9000/p2p/ +``` + +The GRPC and Rest address/port don't necessarily have to be public, this can match whatever deployment environment you are currently using, however if you want to access these APIs from other machines, you must make the appropriate port and network rules to do so. + +### Start your node +Once you have configured your keyring and config file, you can start you node. +```bash +orbisd start --config /path/to/orbis.yml +``` +:::info +When starting your orbis daemon, your configured `cosmos.rpcAddress` endpoint **must** be live, since it tries to connect to this node immediatly upon startup. If you have any errors relating to `cosmos client` then you have either used the wrong `rpcAddress` or the RPC node isn't online. +::: + +### SystemD Service (Optional) +If you wish to use systemd to manage your daemon, you can use the following configuration. + +Create the following file: `/etc/systemd/system/orbisd.service` +```bash +[Unit] +Description=Orbis service +After=network-online.target + +[Service] +User= +ExecStart=//orbisd start --config +Restart=no +LimitNOFILE=4096 + +[Install] +WantedBy=multi-user.target +``` + +## Joining the Root Ring +The *Root Ring* is the Orbis deployment maintained by the validators of the SourceHub Testnet. The primary function of nodes maintaining the Root Ring is to create a shared keypair using a Distributed Key Generation (DKG) algorithm. + +A Orbis ring is defined by its *Manifest* which is a configuration that describes all the initial parameters of a ring, such as what DKG algorithm to use, how to authenticate and authorize requests, the threshold number of nodes required for a proxy-encryption, etc. You can think of a ring manifest similar to a network genesis file. + +***Example Manifest*** +```json +{ + "n": 3, // total number of initial nodes in the ring + "t": 2, // threshold number of nodes for a proxy-encryption operation + "dkg": "rabin", // DKG algorithm + "pss": "avpss", // Proactive Secret Sharing algorithm + "pre": "elgamal", // Proxy-Encyption algorithm + "bulletin": "sourcehub", // bulletin board implementation + "transport": "p2p", // networking transport + "authentication": "jws-did", // encryption request authentication + "authorization": "ACP", // encryption request authorization + "nodes": [ // PeerIDs and Addresses of the initial nodes + {"id":"16Uiu2HAm35sSr96x1TJHBTkWdcDH9P8twhTw92iDyq38XvyGzgZN","address":"/ip4/127.0.0.1/tcp/9001"}, + {"id":"16Uiu2HAmAVcM6V1PY8DdvzobyK5QZbwX5z3AA6wCSrCm6xUA79Xn","address":"/ip4/127.0.0.1/tcp/9002"}, + {"id":"16Uiu2HAkzjLLosHcV4LGvLY4vskda5NgMW4qmtfQ2uMbgFAoqghX","address":"/ip4/127.0.0.1/tcp/9003"} + ], + "nonce": 0 // nonce to alter the determinisic ring content identifier (CID) +} +``` + +### Creating the Root Ring Manifest +To create the Root Ring manifest we need all the initial nodes PeerIDs and P2P Addresses. In fact, the rest of the parameters of the Root Ring manifest will be the same as the example above, with the exception of +* `Number of nodes (n)` +* `Threshold number of nodes (t)` +* `Initial (nodes)` + +The root ring manifest *cannot* be created until all existing validators start their Orbis nodes, and report back with the respective PeerIDs and Addresses. + +Once you have a running node, you can get your PeerID and Address with the following command: +```bash +orbisd -s transport-service get-host --transport p2p +``` +This will respond back with something like: +```json +{ + "node":{ + "id":"16Uiu2HAm35sSr96x1TJHBTkWdcDH9P8twhTw92iDyq38XvyGzgZN", + "address":"/ip4/127.0.0.1/tcp/9001", + "publicKey":{ + "Type":"Secp256k1", + "Data":"AnHK2Co3LgeLHo8tMsyfMlp0JXGL3y9yiPOAkQVknfrp" + } + } +} +``` + +Please post this *full* response in the [#validator-general](https://discord.com/channels/427944769851752448/1200236096089509918) channel, this is all public information, so no security details are being leaked. + +Once all the current validators have started their nodes, and posted their host info, we can craft the Root Ring manifest. + +### Create Root Ring +Once we have the Root Ring manifest, everyone can download it from the discord or Github testnet repo page (links to be provided here once we generate it), we can go ahead and create the root ring. + +To do so, each node will need to run +```bash +orbisd -s ring-service create-ring -f /manifest.json +``` + +This will initialze the DKG process and you node will start generating its respective DKG Share. This process can't complete unless *all* nodes are online and syncing. Once completed, the Root Ring will have an initialized DKG, and is ready to start recieving `Store` and `ReEncrypt` requests! + +If we have reached this step together without errors, then we will have completed the Orbis Root Ring setup! + +However, if there are errors experienced along the way, we may need to issue a software update, and restart the process. This is experimental and bleeding edge software, but we hopeful that we can collectively launch the Root Ring without any breaking or blocking issues. \ No newline at end of file diff --git a/docs/sourcehub/testnet/overview.md b/docs/sourcehub/testnet/overview.md index aa0ec2d..6c379fd 100644 --- a/docs/sourcehub/testnet/overview.md +++ b/docs/sourcehub/testnet/overview.md @@ -102,31 +102,29 @@ Specific values like address prefix and account name must be obtained from local   **Note**: - * Specific values for address prefix and account name need to be obtained from your local configuration. - ``` - bulletin: - p2p: -    rendezvous: "orbis-bulletin" - sourcehub: -     accountName: "" -     addressPrefix: "" -     nodeAddress: "" -     rpcAddress: "" - ``` - -  - +```yaml +cosmos: + # Cosmos chain ID + chainId: sourcehub-testnet1 + # Cosmos keyring key name + accountName: + # Cosmos keyring backend ('os' is the default when running sourcehubd) + keyringBackend: os + # Cosmos address prefix ('source' is for SourceHub) + addressPrefix: source + # Transaction fees + fees: 2000uopen + rpcAddress: +``` * Remove the crypto section (specifically host_crypto_seed) from the config file. - ``` - host: -   crypto: -     seed: 1 -   listenAddresses: -     - /ip4/0.0.0.0/tcp/9001 - ``` +``` + host: + listenAddresses: + - /ip4/0.0.0.0/tcp/9001 +```   From 33d0b3392fa7d0f575a942f4f1a98d4e0c019534 Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Thu, 4 Apr 2024 05:25:01 -0400 Subject: [PATCH 14/48] orbis testnet faucet --- docs/orbis/testnet/join.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/orbis/testnet/join.md b/docs/orbis/testnet/join.md index 29ca962..2fdc134 100644 --- a/docs/orbis/testnet/join.md +++ b/docs/orbis/testnet/join.md @@ -77,6 +77,10 @@ By default `sourcehubd keys add ` will use the `os` keyring backend, yo If you start your node and you get an error similar to `error: bech32 decode ...` then you likely have either used the wrong `keyname` or `keyringBackend`. ::: +### Faucet +To be able to properly run the Orbis daemon and join the Root Ring, you need to ensure your account for the key you chose has sufficent number of $OPEN tokens, since initializating the DKG requires transactions on the network that need to be paid for. + +As usual, you can go the [SourceHub Testnet 1](https://faucet.source.network/) and use the address of the new key `sourcehubd keys show --address`. ## Configuration You may have to configure orbis to work in your specific environment or hardware, depending on your storage and networking resources, here is a pretty standard configuration file `orbis.yml` From babad8d04dc83e1e79061f93e1b34aef708851f7 Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Thu, 4 Apr 2024 05:32:26 -0400 Subject: [PATCH 15/48] Added orbis cosmos keyring config example --- docs/orbis/testnet/join.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/orbis/testnet/join.md b/docs/orbis/testnet/join.md index 2fdc134..e16ac84 100644 --- a/docs/orbis/testnet/join.md +++ b/docs/orbis/testnet/join.md @@ -20,7 +20,7 @@ Minimum hardware requirements: You can get the `orbisd` binary from the releases page of the Orbis repo: [https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.1](https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.1). ```bash cd $HOME -wget https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.1 +wget https://github.com/sourcenetwork/orbis-go/releases/download/v0.2.1/orbisd chmod +x orbisd sudo mv /usr/bin ``` @@ -125,6 +125,8 @@ cosmos: addressPrefix: source # Transaction fees fees: 2000uopen + # SourceHub data folder where your keyring is defined + home: ~/.sourcehub rpcAddress: ``` From 033772ef70f92526851dcb853838131b4287800c Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Thu, 4 Apr 2024 06:37:39 -0400 Subject: [PATCH 16/48] updated orbis docs to 0.2.2 --- docs/orbis/testnet/join.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/orbis/testnet/join.md b/docs/orbis/testnet/join.md index e16ac84..be4810c 100644 --- a/docs/orbis/testnet/join.md +++ b/docs/orbis/testnet/join.md @@ -17,10 +17,10 @@ Minimum hardware requirements: * 100Mbps bi-directional internet connection. ## Orbis Binary -You can get the `orbisd` binary from the releases page of the Orbis repo: [https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.1](https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.1). +You can get the `orbisd` binary from the releases page of the Orbis repo: [https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.2](https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.2). ```bash cd $HOME -wget https://github.com/sourcenetwork/orbis-go/releases/download/v0.2.1/orbisd +wget https://github.com/sourcenetwork/orbis-go/releases/download/v0.2.2/orbisd chmod +x orbisd sudo mv /usr/bin ``` @@ -31,7 +31,7 @@ You can download the code and compile your own binaries if you prefer. However y cd $HOME git clone https://github.com/sourcenetwork/orbis-go cd orbis-go -git checkout v0.2.1 +git checkout v0.2.2 make build cp ./build/orbisd $GOBIN/orbisd export PATH=$PATH:$GOBIN @@ -42,14 +42,14 @@ Now you will have the `orbisd` available in your local system. You can either use the pre-existing docker image hosted on our GitHub, or build your own ### Github Container Registry (coming soon) -`docker pull ghcr.io/sourcenetwork/orbis:0.2.1` +`docker pull ghcr.io/sourcenetwork/orbis:0.2.2` ### Build Docker Image from Source ```bash cd $HOME git clone https://github.com/sourcenetwork/orbis-go cd orbis-go -git checkout v0.2.1 +git checkout v0.2.2 docker build -t . ``` @@ -227,7 +227,7 @@ This will respond back with something like: { "node":{ "id":"16Uiu2HAm35sSr96x1TJHBTkWdcDH9P8twhTw92iDyq38XvyGzgZN", - "address":"/ip4/127.0.0.1/tcp/9001", + "address":"/ip4//tcp/9001", "publicKey":{ "Type":"Secp256k1", "Data":"AnHK2Co3LgeLHo8tMsyfMlp0JXGL3y9yiPOAkQVknfrp" @@ -236,6 +236,10 @@ This will respond back with something like: } ``` +:::info +Sometimes the `address` field returns `127.0.0.1` instead of a public address, if so, please replace it with your nodes publicly accessible IP address +::: + Please post this *full* response in the [#validator-general](https://discord.com/channels/427944769851752448/1200236096089509918) channel, this is all public information, so no security details are being leaked. Once all the current validators have started their nodes, and posted their host info, we can craft the Root Ring manifest. From 2bfc87d6226d7e48de0fa0b48cc99f925ae695ee Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Mon, 22 Apr 2024 07:37:30 -0400 Subject: [PATCH 17/48] Updated orbis join docs with newest version --- docs/orbis/testnet/join.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/orbis/testnet/join.md b/docs/orbis/testnet/join.md index be4810c..525c61c 100644 --- a/docs/orbis/testnet/join.md +++ b/docs/orbis/testnet/join.md @@ -17,10 +17,10 @@ Minimum hardware requirements: * 100Mbps bi-directional internet connection. ## Orbis Binary -You can get the `orbisd` binary from the releases page of the Orbis repo: [https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.2](https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.2). +You can get the `orbisd` binary from the releases page of the Orbis repo: [https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.3](https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.3). ```bash cd $HOME -wget https://github.com/sourcenetwork/orbis-go/releases/download/v0.2.2/orbisd +wget https://github.com/sourcenetwork/orbis-go/releases/download/v0.2.3/orbisd chmod +x orbisd sudo mv /usr/bin ``` @@ -31,7 +31,7 @@ You can download the code and compile your own binaries if you prefer. However y cd $HOME git clone https://github.com/sourcenetwork/orbis-go cd orbis-go -git checkout v0.2.2 +git checkout v0.2.3 make build cp ./build/orbisd $GOBIN/orbisd export PATH=$PATH:$GOBIN @@ -42,14 +42,14 @@ Now you will have the `orbisd` available in your local system. You can either use the pre-existing docker image hosted on our GitHub, or build your own ### Github Container Registry (coming soon) -`docker pull ghcr.io/sourcenetwork/orbis:0.2.2` +`docker pull ghcr.io/sourcenetwork/orbis:0.2.3` ### Build Docker Image from Source ```bash cd $HOME git clone https://github.com/sourcenetwork/orbis-go cd orbis-go -git checkout v0.2.2 +git checkout v0.2.3 docker build -t . ``` From 55a4ad387b747206cea6e1f3ec7cdb017bb89232 Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Mon, 22 Apr 2024 15:13:31 -0400 Subject: [PATCH 18/48] updated orbis join doc with generated manifest --- docs/orbis/testnet/join.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/orbis/testnet/join.md b/docs/orbis/testnet/join.md index 525c61c..3cabfa5 100644 --- a/docs/orbis/testnet/join.md +++ b/docs/orbis/testnet/join.md @@ -245,10 +245,13 @@ Please post this *full* response in the [#validator-general](https://discord.com Once all the current validators have started their nodes, and posted their host info, we can craft the Root Ring manifest. ### Create Root Ring -Once we have the Root Ring manifest, everyone can download it from the discord or Github testnet repo page (links to be provided here once we generate it), we can go ahead and create the root ring. - -To do so, each node will need to run +:::info +We now have the assembled `manifest.json` file needed to start the root ring. You can download the root ring manifest for Testnet1 [here](https://github.com/sourcenetwork/networks/blob/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json) +::: +To create the root ring, and start the Ditributed Key Generation (DKG) process to create the shared keypair, each node will need download the manifest file [here](https://github.com/sourcenetwork/networks/blob/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json) and then run the `create-ring` command, as shown here: ```bash +wget https://github.com/sourcenetwork/networks/blob/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json + orbisd -s ring-service create-ring -f /manifest.json ``` From 80e05f136f836b893b18c29e415f7eada3f81408 Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Mon, 22 Apr 2024 15:16:34 -0400 Subject: [PATCH 19/48] added raw download link for manifest --- docs/orbis/testnet/join.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/orbis/testnet/join.md b/docs/orbis/testnet/join.md index 3cabfa5..3319f3a 100644 --- a/docs/orbis/testnet/join.md +++ b/docs/orbis/testnet/join.md @@ -250,7 +250,7 @@ We now have the assembled `manifest.json` file needed to start the root ring. Yo ::: To create the root ring, and start the Ditributed Key Generation (DKG) process to create the shared keypair, each node will need download the manifest file [here](https://github.com/sourcenetwork/networks/blob/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json) and then run the `create-ring` command, as shown here: ```bash -wget https://github.com/sourcenetwork/networks/blob/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json +wget https://raw.githubusercontent.com/sourcenetwork/networks/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json orbisd -s ring-service create-ring -f /manifest.json ``` From c9df1de9bf0acf4852848576efe17623bf9b47a3 Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Mon, 22 Apr 2024 15:18:20 -0400 Subject: [PATCH 20/48] updated create root ring version requirement --- docs/orbis/testnet/join.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/orbis/testnet/join.md b/docs/orbis/testnet/join.md index 3319f3a..1c4be6a 100644 --- a/docs/orbis/testnet/join.md +++ b/docs/orbis/testnet/join.md @@ -248,6 +248,7 @@ Once all the current validators have started their nodes, and posted their host :::info We now have the assembled `manifest.json` file needed to start the root ring. You can download the root ring manifest for Testnet1 [here](https://github.com/sourcenetwork/networks/blob/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json) ::: +**ALL NODES MUST BE UPDATED TO v0.2.3 BEFORE CREATING THE RING** To create the root ring, and start the Ditributed Key Generation (DKG) process to create the shared keypair, each node will need download the manifest file [here](https://github.com/sourcenetwork/networks/blob/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json) and then run the `create-ring` command, as shown here: ```bash wget https://raw.githubusercontent.com/sourcenetwork/networks/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json From 1b0cbaccfec26affd9cd92c5760778ca208a845f Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Mon, 22 Apr 2024 15:33:42 -0400 Subject: [PATCH 21/48] Added note about faucet and tokens for ring creation --- docs/orbis/testnet/join.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/orbis/testnet/join.md b/docs/orbis/testnet/join.md index 1c4be6a..d36a07e 100644 --- a/docs/orbis/testnet/join.md +++ b/docs/orbis/testnet/join.md @@ -249,7 +249,11 @@ Once all the current validators have started their nodes, and posted their host We now have the assembled `manifest.json` file needed to start the root ring. You can download the root ring manifest for Testnet1 [here](https://github.com/sourcenetwork/networks/blob/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json) ::: **ALL NODES MUST BE UPDATED TO v0.2.3 BEFORE CREATING THE RING** -To create the root ring, and start the Ditributed Key Generation (DKG) process to create the shared keypair, each node will need download the manifest file [here](https://github.com/sourcenetwork/networks/blob/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json) and then run the `create-ring` command, as shown here: +To create the root ring, and start the Ditributed Key Generation (DKG) process to create the shared keypair, each node will need download the manifest file [here](https://github.com/sourcenetwork/networks/blob/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json) and then run the `create-ring` command, as shown below. + +**NOTE** You must ensure you have sufficient $OPEN balance for the SourceHub key you are using for your orbis node. You can get tokens from the faucet: https://faucet.source.network/ + + ```bash wget https://raw.githubusercontent.com/sourcenetwork/networks/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json From 7c1234765e75c87cb5e7d204e78d0f01a5a286ea Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Wed, 24 Jul 2024 14:56:56 -0400 Subject: [PATCH 22/48] feat: Extend protocol docs (#145) Extended SourceHub documentation. Added index page. --- docs/defradb/getting-started.md | 4 +- docs/orbis/testnet/join.md | 1 + docs/sourcehub/concepts/_category_.json | 4 + docs/sourcehub/concepts/zanzibar.md | 252 ++++++++++++++++++ docs/sourcehub/getting-started/1-readme.md | 27 ++ docs/sourcehub/getting-started/2-account.md | 46 ++++ .../getting-started/3-create-a-policy.md | 63 +++++ docs/sourcehub/getting-started/4-acp-check.md | 54 ++++ .../sourcehub/getting-started/_category_.json | 5 + docs/sourcehub/networks/_category_.json | 3 + .../networks/testnet-1/_category_.json | 4 + .../{testnet => networks/testnet-1}/join.md | 0 .../testnet-1}/overview.md | 0 docs/sourcehub/overview.md | 23 ++ docs/sourcehub/testnet/_category_.json | 4 - src/pages/index.js | 79 ++++++ src/pages/index.module.css | 52 ++++ static/img/defradb-cover.png | Bin 0 -> 123132 bytes static/img/hero_grid_black_1.png | Bin 0 -> 58747 bytes static/img/hero_grid_white_1.png | Bin 0 -> 22353 bytes static/img/sourcehub-cover-copy.png | Bin 0 -> 114371 bytes static/img/sourcehub-cover.png | Bin 0 -> 158636 bytes static/img/sourcehub/cu-annotated.png | Bin 0 -> 31428 bytes .../cu-annotated.png:Zone.Identifier | 3 + static/img/sourcehub/faucet.png | Bin 0 -> 40577 bytes static/img/sourcehub/key-add-output.png | Bin 0 -> 45706 bytes static/img/sourcehub/object-owner.png | Bin 0 -> 25896 bytes static/img/sourcehub/policy-ids-1.png | Bin 0 -> 12552 bytes static/img/sourcehub/relgraph-simple.png | Bin 0 -> 26725 bytes .../relgraph-simple.png:Zone.Identifier | 3 + .../img/sourcehub/trust-protocol-defradb.png | Bin 0 -> 949192 bytes static/img/sourcehub/ttu-eval.png | Bin 0 -> 28096 bytes .../sourcehub/ttu-eval.png:Zone.Identifier | 3 + static/img/sourcehub/ttu-relgraph-2.png | Bin 0 -> 30789 bytes .../ttu-relgraph-2.png:Zone.Identifier | 3 + static/img/sourcehub/ttu-relgraph-3.png | Bin 0 -> 38144 bytes .../ttu-relgraph-3.png:Zone.Identifier | 3 + .../img/sourcehub/ttu-relgraph-annotated.png | Bin 0 -> 41156 bytes ...ttu-relgraph-annotated.png:Zone.Identifier | 3 + static/img/sourcehub/ttu-relgraph.png | Bin 0 -> 28218 bytes .../ttu-relgraph.png:Zone.Identifier | 3 + 41 files changed, 637 insertions(+), 5 deletions(-) create mode 100644 docs/sourcehub/concepts/_category_.json create mode 100644 docs/sourcehub/concepts/zanzibar.md create mode 100644 docs/sourcehub/getting-started/1-readme.md create mode 100644 docs/sourcehub/getting-started/2-account.md create mode 100644 docs/sourcehub/getting-started/3-create-a-policy.md create mode 100644 docs/sourcehub/getting-started/4-acp-check.md create mode 100644 docs/sourcehub/getting-started/_category_.json create mode 100644 docs/sourcehub/networks/_category_.json create mode 100644 docs/sourcehub/networks/testnet-1/_category_.json rename docs/sourcehub/{testnet => networks/testnet-1}/join.md (100%) rename docs/sourcehub/{testnet => networks/testnet-1}/overview.md (100%) create mode 100644 docs/sourcehub/overview.md delete mode 100644 docs/sourcehub/testnet/_category_.json create mode 100644 src/pages/index.js create mode 100644 src/pages/index.module.css create mode 100644 static/img/defradb-cover.png create mode 100644 static/img/hero_grid_black_1.png create mode 100644 static/img/hero_grid_white_1.png create mode 100644 static/img/sourcehub-cover-copy.png create mode 100644 static/img/sourcehub-cover.png create mode 100644 static/img/sourcehub/cu-annotated.png create mode 100644 static/img/sourcehub/cu-annotated.png:Zone.Identifier create mode 100644 static/img/sourcehub/faucet.png create mode 100644 static/img/sourcehub/key-add-output.png create mode 100644 static/img/sourcehub/object-owner.png create mode 100644 static/img/sourcehub/policy-ids-1.png create mode 100644 static/img/sourcehub/relgraph-simple.png create mode 100644 static/img/sourcehub/relgraph-simple.png:Zone.Identifier create mode 100644 static/img/sourcehub/trust-protocol-defradb.png create mode 100644 static/img/sourcehub/ttu-eval.png create mode 100644 static/img/sourcehub/ttu-eval.png:Zone.Identifier create mode 100644 static/img/sourcehub/ttu-relgraph-2.png create mode 100644 static/img/sourcehub/ttu-relgraph-2.png:Zone.Identifier create mode 100644 static/img/sourcehub/ttu-relgraph-3.png create mode 100644 static/img/sourcehub/ttu-relgraph-3.png:Zone.Identifier create mode 100644 static/img/sourcehub/ttu-relgraph-annotated.png create mode 100644 static/img/sourcehub/ttu-relgraph-annotated.png:Zone.Identifier create mode 100644 static/img/sourcehub/ttu-relgraph.png create mode 100644 static/img/sourcehub/ttu-relgraph.png:Zone.Identifier diff --git a/docs/defradb/getting-started.md b/docs/defradb/getting-started.md index 739f27b..6143f3d 100644 --- a/docs/defradb/getting-started.md +++ b/docs/defradb/getting-started.md @@ -1,9 +1,11 @@ --- sidebar_position: 1 title: Getting Started -slug: / +slug: /defradb --- +![DefraDB Overview](/img/defradb-cover.png) + DefraDB is a user-centric database that prioritizes data ownership, personal privacy, and information security. Its data model, powered by the convergence of [MerkleCRDTs](https://arxiv.org/pdf/2004.00107.pdf) and the content-addressability of [IPLD](https://docs.ipld.io/), enables a multi-write-master architecture. It features [DQL](./references/query-specification/query-language-overview.md), a query language compatible with GraphQL but providing extra convenience. By leveraging peer-to-peer networking it can be deployed nimbly in novel topologies. Access control is determined by a relationship-based DSL, supporting document or field-level policies, secured by the SourceHub network. DefraDB is a core part of the [Source technologies](https://source.network/) that enable new paradigms of decentralized data and access-control management, user-centric apps, data trustworthiness, and much more. DISCLAIMER: At this early stage, DefraDB does not offer access control or data encryption, and the default configuration exposes the database to the network. The software is provided "as is" and is not guaranteed to be stable, secure, or error-free. We encourage you to experiment with DefraDB and provide feedback, but please do not use it for production purposes until it has been thoroughly tested and developed. diff --git a/docs/orbis/testnet/join.md b/docs/orbis/testnet/join.md index d36a07e..441a9d2 100644 --- a/docs/orbis/testnet/join.md +++ b/docs/orbis/testnet/join.md @@ -1,5 +1,6 @@ --- title: Join Root Ring +slug: /orbis --- # How to Join Testnet 1 Root Ring diff --git a/docs/sourcehub/concepts/_category_.json b/docs/sourcehub/concepts/_category_.json new file mode 100644 index 0000000..4d7732d --- /dev/null +++ b/docs/sourcehub/concepts/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Concepts", + "position": 4 + } \ No newline at end of file diff --git a/docs/sourcehub/concepts/zanzibar.md b/docs/sourcehub/concepts/zanzibar.md new file mode 100644 index 0000000..06b2e32 --- /dev/null +++ b/docs/sourcehub/concepts/zanzibar.md @@ -0,0 +1,252 @@ +--- +date: 2023-09-08 +title: Zanzibar Access Control +--- + +# Introduction + +Zanzibar was first introduced by Google in their [whitepaper](https://research.google/pubs/pub48190/). +In essence, Zanzibar is an Authorization Service which powers Google's services. +Its main purpose boils down to answering Access Requests, which in plain English can be translated to the question: + +> can user U do operation O over object A? + +The remaining of this article introduces Zanzibar's Access Control model, how it was designed to fulfill Access Requests and propose a model to aid understanding. + +## Relation Based Access Control Model + +The field of Access Control is a branch which studies how to manage who or what can operate a certain resource within a system, which is to say, whether something has a permission to do something. +Zanzibar is an implementation which closely resembles the model known as ["Relation Based Access Control"](https://ieeexplore.ieee.org/abstract/document/4725889/)(RelBAC). + +The primary idea behind RelBAC is that objects within a system have relations amongst themselves, and through these relations the system can resolve Access Requests. +This notion of relations should feel familiar to Relational Databases and Class Diagrams in Object Oriented Modeling. + +To illustrate RelBAC take the familiar example of: "a book is written by an author". +From that sentence we can identify two entities, "book" and "author. +Furthermore there exists a relation between these two entities, a book was *authored* by an author. +The key to RelBAC is noticing that this relation can be used to derive permissions. +The book's author should be able to read and edit their own book - meaning the operations "read" and "edit" should be allowed for an author. + +These relations exist in virtualy every problem domain, so much so there are specialized languages dedicated to representing those relations, such as Descrption Logic. +RelBAC exploits these relations in order to figure out permissions. + + +## Zanzibar's RelBAC + +A very important concept drawn from Zanzibar is that of Relation Tuples, which are used to represent a Relation between system objects. + +The Relation Tuple is defined as: + +``` +tuple := (object, relation, user) +object := namespace:id +user := object | (object, relation) +relation := string +namespace := string +id := string +``` + +A Relation Tuple is a 3-tuple which contains a reference to an object, some named relation and an user. +The 3-tuple `(article:zanzibar, publisher, coorporation:google)` represents a relationship between the zanzibar article and the google coorporation. + +More interestingly however is the variant of `user` given by the pair `(object, relation)`, in Zanzibar's white paper this pair is called `userset`. +The userset is a convenient way to express a group of users. +The users given by the userset is the set of all users which are referenced in a relationship with the same object and relation as the userset. + +Example: +Take the userset `(group:engineering, member)` and the tuples: + +- `(group:engineering, member, user:bob)` +- `(group:engineering, member, user:alice)`. + +The userset `(group:engineering, member)` expands to the users `bob` and `alice`. + +Effectively usersets add a layer of indirection to the Relation Tuple. +A Tuple can specify an Userset, and the Userset's Tuples can in turn specify an Userset. +The Relation Tuple was designed to support recursive definitions. + +## The Relation Graph + +A key insight to grok Zanzibar is to notice that a set of Tuples defines a Graph, let's call it the Relation Graph. + +In order to vizualise this fact, notice that a Relation Tuple can be rewritten as a pair of pairs: ((object, relation), (object, relation)), let's call the object-relation pairs Relation Nodes. +The first pair is given by the tuple's Object and Relation as per usual, the second pair is taken to be an userset. +If we assume relations can be empty, this representation covers all cases mentioend in the original definition. + +With this interpretation, we can start to see the relation graph taking shape. +Each Relation Tuple actually defines an Edge in the Relation Graph. +Each Node in the Relation Graph is given by an object-relation pair. + +As an example, take the tuples: +- ("file:readme", "owner", "bob") +- ("file:readme", "owner", "bob") +- ("file:readme", "reader", "group:engineering", "member") +- ("group:engineering", "member", "alice") + +Would look like this as a graph: + +![Relation Graph Example](/img/sourcehub/relgraph-simple.png) + +The Relation Graph is a view over the set of all objects in a system and the relations between these objects. +Through the relation graph it's possible to answer questions such as "does user U have relation R with object O"? +We can answer that question by starting at the node given by (O, R) and walking through the graph looking for U. +If we take relation R to represent a permission or an operation such as "read", "write", "delete" or whatever, we can use the Relation Graph to answer the originally posed as the object of study within the field of Access Control. + +## Userset Rewrite Rules + +The Relation Tuples model a generic and powerful system to represent Relations and consequently Permissions in a system. +With that said, Tuples are very bare bones, which leads to a redundant tuples. +Historically, grouping relations and grouping objects proved to be extremely useful in access control. +From a theoretical perspective, these features are required for Zanzibar to be considered a "Relation Based Access Control" implementation. + +Zanzibars "Userset Rewrite Rules" addresses these issues. + +### Rewrite Rule Briefing + +Userset Rewrite Rules aren't extremely intuitive. + +A Rule can be thought of as a function which takes an object-relation pair (ie Relation Node) and returns a set of Relation Nodes which are interpreted as descendents of the input node. +Example: let A be a Relation Node and R be a Rewrite Rule: R(A) returns a set of Relation Nodes which are descedents of A. +Rules are associated to Relations. + +A final remark: rules are evaluated during runtime, for every Relation Node Zanzibar encounters while searching through the Relation Graph. + + +### Permissions Hiearchy & Computed Usersets + +Permission Hiearchy is a big word for a simple idea. +It basically means that permission to do some operation implies permission to do some other "weaker" operation. + +ie. the permission to write (in most cases) implies the permission to read beforehand. + +From a pratical perspective, this feature greatly reduces the administrative burden and complexity associated to managing rules in an Access Control System. + +Take for instance the previous Relation Graph, repeated here for convenience. + +![Relation Graph Example](/img/sourcehub/relgraph-simple.png) + +Note that Bob is both a "reader" and an "owner". +Suppose that in our system "owner" should always imply "reader", there's an additional cost associate with maintaining these redundant Tuples. + +In Zanzibar there is a Rule for associating Relations, the "Computed Userset" rule. + +A Computed Userset is a rule defined for some Relation name which dynamically adds another Node to the Relation Graph. + +As a way of an example, let's add a Rule such that "owner" implies "reader". +In Zanzibar that would be done by adding a `Computed Userset("owner")` Rule to the `reader` Relation. + +Now, let's walk through an example to see how Zanzibar handles that. +Suppose we ask Zanzibar to check whether "bob" is a "reader" of "file:readme", zanzibar would: + +1. start at the node `("file:readme", "reader")` and look for any rules associated to the `reader` relation. +2. With the `Computed Userset("owner")` rule, it would create a new Relation Node `("file:readme", "owner")` and set it as a sucessor of `("file:readme", "reader")` +3. Continue the search through `("file:readme", "owner")` + +![Computed Userset Evaluation](/img/sourcehub/cu-annotated.png) + +Using a Computed Userset we sucessfuly added a rule to Zanzibar which automatically derives one relation from another. +This enable users to define a set of global rules for a relation as opposed to adding additional Relation Tuples for each object in the system. +This powerful mechanism greatly decreases the maintanability cost associated to Relation Tuples. + +### Object Hiearchy & Tuple to Userset + +Before diving into the Tuple to Userset rule it's important to recall the main idea behind RelBAC: the relations among system objects can be used to derive permissiosn and fulfill Access Requests. + +We have seen how to relate objects to users using Relation Tuples. +Usersets allows us to define hiearchy between users and group them. +The missing link so far is how can we use Zanzibar to create Relations between Objects and consequently group them. +That's where the Tuple to Userset comes in. + +To motivate this topic, we shall use the familiar example of a file system permission system. +Filesystems are composed of directories, files and users. +Users owns files and directories, directories contains files and for this example read permission over a directory implies read permission over all files in a directory. + +Let the Tuples in the system be illustrated by the following Relation Graph: + +![File system example](/img/sourcehub/ttu-relgraph.png) + +The problem at hand is: how to declare that Bob's readme file is under Alice's home directory. +Furthermore, how can we declare that Alice should be able to read file readme, since it is contained in her directory. + +One way to solve the problem regadring the permission is to create a Relation Tuple from the file to the directory. +The tuple `(file:/home/readme, reader, (directory:/home, owner))` will do the trick, by adding the set of directory owners as readers. + +![File System Relation Graph with Relation from File to Directory owners](/img/sourcehub/ttu-relgraph-2.png) + +This solves the permission problem but a problem remains, this approach creates no relation between the file and the directory themselves. +The Relation Tuple only states that directory owners are also file readers. + +What we really want is to declare a relation between a file and directory and from that relation get to the set of directory owners, as shown in the following image: + +![File System Relation Graph parent relation](/img/sourcehub/ttu-relgraph-3.png) + +From the image we see that the file is realated to its directory through the `parent` relation. +This representation explicitely outlines how files and directories are associated in the system. +All that is missing is tracing a path from the `/home/readme, reader` node to the `/home, owner` node, completing the chain. + +This *could* be done by using a Computed Userset rule pointing from reader to parent and an additional Relation Tuple between the `/home` node and `/home, owner` but that still blurries the line between what is an actual Relation between objects and Access Control rules. +The Tuple to Userset rule solves this exact problem. + +The Tuple to Userset rule is essentially a Tuple query chained with a Computed Userset rule. +It takes two arguments: a "Tupleset Filter" and a "Computed Userset Relation". +The rule first rewrites the current Relation Node using the Tupleset Filter, with the new node it then fetches all sucessors of that node. +With the resulting sucessor set, it performs a Computed Userset Rewrite using the supplied "Computed Userset Relation". + +The Tuple to Userset rule is very powerful in that it allows the application to declare a Relation between two objects, thus allowing object hiearchies as we've just explored. + +Note however that the main benefit of the `Tuple to Userset` is the fact that it allows an application to create only Tuples which expresses Relations, without requiring additional Tuples which would otherwise exist only for deriving Permission rules. +This may seem trivial but it has profound implications, the fact that Zazibar supports Relations like these, means that the Application - which ultimately is responsible for creating the Tuples - need not be aware that a Relation Tuple from `/home/readme` to the parent directory needs to be created. +The rules of access control are inconsequential at the application layer, being contained entirely within Zanzibar. +The Tuple to Userset is findamental to decouple Permission and Access Control logic from the application because it supports complex hiearchies between objects to be translated into Access Control rules. + +Finally, let's see the TupleToUserset in action. + +Let the Rule `TupleToUserset(tupleset_filter: "parent", computed_userset: "reader")` be associated with the "reader" relation and assume the same Relation Tuples shown above. + +Evaluating the TupleToUserset rule requires the following steps: + +1. start at the Relation Node `(file:/home/readme, reader)`. +2. Evaluate Rule `TupleToUserset(tupleset_filter: "parent", computed_userset: "reader")` +3. Build a filter using "tupleset_relation" -> `(file:readme, parent)` +4. Fetch all sucessors of the filter built in step 3 -> `[(directory:/home)]` +5. Apply a Computed Userset rewrite rule using the provided "computed_userset" relation for each Relation Node fetched -> `[(directory:/home, reader)]` + +Another explanation is given the following image: + +![Tuple to Userset Evaluation](/img/sourcehub/ttu-eval.png) + +Effectively, the Tuple to Userset added a path from the `/home/readme, reader` node to the `/home, owner` nodes. +The follwing image shows the edges the rule added: + +![](/img/sourcehub/ttu-relgraph-annotated.png) + +### Rewrite Rule Expression + +One final passing note about Rewrite Rules: in Zanzibar a relation can have multiple rewrite rules. +These rewrite rules are combine to form Rewrite Rule expressions. + +Each Rewrite Rule effectively returns a set of Relation Nodes (or userset) which are combined using the operation defined in the Rewrite Rule Expression. +Rules are joined using the familiar set operators: union, difference and intersection. + +The set operations are applied to the resulting set of Nodes resulting from evaluating each Rewrite Rule. +This evaluated final set of Nodes is effectively all the sucessors from a parent Relation Node. + +## Conclusion + +We've seen how the Relation Tuples actually define a Graph of object-relations, which in turn can be used to resolve Access Requests +We've also seen how Usersets enables grouping users and applying a Relation to a set of users. +Finally, we explored how the Use +rset Rewrite Rules can be used to define a Relation Hiearchy and how it supports Object hiearchies; both of these features are critical to ensure that Access Control Logic stays within Zanzibar. + +Althought the initial mention of the Relation Graph was extremely helpful to illustrate how it works, the reality is that the actual Relation Graph is dynamically built by Zanzibar from the Relation Tuples and by evaluating the Relation Rewrite Rules. +The synergy between these two concepts is what powers Zanzibar's Access Control Model. + +Under that point of view, we can think of Zanzibar's API as operating over the dynamic Relation Graph. +The `Check` API call is equivalent to the graph reachability problem. +`Expand` is used as a debug tool to dump the Goal Tree used while evaluating the recursive expansion of Rewrite Rules and sucessor fetching. + + +# References + +- Zanzibar: https://research.google/pubs/pub48190/ +- RelBAC: https://ieeexplore.ieee.org/abstract/document/4725889/ \ No newline at end of file diff --git a/docs/sourcehub/getting-started/1-readme.md b/docs/sourcehub/getting-started/1-readme.md new file mode 100644 index 0000000..6eb68a0 --- /dev/null +++ b/docs/sourcehub/getting-started/1-readme.md @@ -0,0 +1,27 @@ +# Getting Started + +To get started with SourceHub, we need to download and initialize our local client. This section will utilize the `CLI` but equivalent functionaly is available using the programatic embedded API. + +## 1. Install SourceHub +First, we will download the SourceHub binary which includes a client. +### Precompiled +You can get precompiled binaries from our Github Release page [here](https://github.com/sourcenetwork/sourcehub/releases) or using your console: +```bash +cd $HOME +wget https://github.com/sourcenetwork/sourcehub/releases/download/v0.2.0/sourcehubd +chmod +x sourcehubd +sudo mv /usr/bin +``` + +### From Source Code +You can download the code and compile your own binaries if you prefer. However you will need a local installation of the go toolchain at a minimum version of 1.22 +```bash +cd $HOME +git clone https://github.com/sourcenetwork/sourcehub +cd sourcehub +git checkout v0.2.0 +make install +export PATH=$PATH:$GOBIN +``` + +Next we will setup our local client wallet account. \ No newline at end of file diff --git a/docs/sourcehub/getting-started/2-account.md b/docs/sourcehub/getting-started/2-account.md new file mode 100644 index 0000000..eebadeb --- /dev/null +++ b/docs/sourcehub/getting-started/2-account.md @@ -0,0 +1,46 @@ +# Account Setup + +Now we will create a new keypair and configure our client wallet. + +## Adding a key +The following command will generate a new random private key with the name `` +```bash +sourcehubd keys add +``` +This will output the newly generated key public key, address, and mnemonic (make sure to backup the mnemonic) + +![Wallet output](/img/sourcehub/key-add-output.png) + +### Importing an existing mnemonic +If you want to import a key from an existing mnemonic, you can use the `--recover` option when adding the key: +```bash +sourcehubd keys add --recover +``` + +Then input your existing mnemonic when prompted. + +:::warning +You MUST ensure that you sufficiently backup your mnemonic. Failure to do so may result in lost access to your wallet. +::: + +## Configuring client +Now we can update the `CLI` client config to use the correct RPC node and ChainID. The RPC node is how we access the network API to send transactions and queries. RPC nodes are specific to certain networks, and must match the provided ChainID. +```bash +sourcehubd config set client chain-id +sourcehubd config set client node +``` + +## Faucet +Next we can load our account with some $OPEN tokens from the network faucet. You can find the faucet for the current testnet [here](https://faucet.source.network/). + +Using the `

` from above when we created our wallet keypair (You can access your wallet keypair using `sourcehubd keys show --address`), we can have the faucet seed our wallet with enough tokens to send a few transactions to get started. + +![wallet faucet](/img/sourcehub/faucet.png) + +## Verify +Finally, we can verify that our account exists and that it has been loaded with the initial faucet tokens. +```bash +sourcehubd query bank balances +``` + +That it, we now have a newly generated local wallet via the `CLI` client. Now we can interact with the network! First up, we will be creating an ACP policy, seeding it with some state, and executing authorization checks. \ No newline at end of file diff --git a/docs/sourcehub/getting-started/3-create-a-policy.md b/docs/sourcehub/getting-started/3-create-a-policy.md new file mode 100644 index 0000000..f0521c2 --- /dev/null +++ b/docs/sourcehub/getting-started/3-create-a-policy.md @@ -0,0 +1,63 @@ +--- +title: Create a Policy +--- +# Create an ACP Policy +Now that we have a fully configured `CLI` client, we can start executing transactions and queries against the SourceHub network. Our first task will be to create a new ACP Policy. + +The SourceHub ACP Module is a [Zanzibar](/sourcehub/concepts/zanzibar) based global decentralized authorization system. Developers write policies using our Relation-Based Access Control (RelBAC) DSL, which allows you to define resources, relations, and permissions. + +- **Resources**: Generic container for some kind of "thing" you wish to gate access to or provide authorization for. It can be anything from a document on [DefraDB](/defradb), a Secret on [Orbis](/orbis), or any other digital resource. + +- **Relation**: Named connections between resources. Similar to a database table that might have relations between its schema types, so does the SourceHub ACP module. This allows us to create expressive policies that go beyond traditional *Role-Based* or *Attribute-based* access control. + +- **Permissions**: Computed queries over resources, relations, and even other permissions (they're recursive!). + +## Example +Lets create a very basic example policy which defines a single resource named `note` with both an `owner` and `collaborator` relation which are both of type `actor`. + +Create a file named `basic-policy.yaml` and past the following: +```yaml +name: Basic Policy + +resources: + + note: + relations: + owner: + types: + - actor + collaborator: + types: + - actor + permissions: + read: + expr: owner + collaborator + edit: + expr: owner + delete: + expr: owner +``` + +Here we are also defining 3 permissions. + +The `read` permission is expressed as `owner + reader` which means *if* you have either an `owner` or `reader` relation *then* you have the `read`. + +Both the `edit` and `delete` permissions are reserved soley for those with the `owner` relation. + +:::info +Traditionally we define relations as nouns and permissions as verbs. This is because we often understand authorization as some *thing* (noun) performing some *action* (verb) on some resource. +::: + +### Upload Policy +Now that we have defined our policy, we can upload it to SourceHub. +```bash +sourcehub tx acp create-policy basic-policy.yaml --from +``` + +Then, to get the policy we can list the existing policies. + +```bash +sourcehub q acp policy-ids +``` + +![Policy IDs](/img/sourcehub/policy-ids-1.png) \ No newline at end of file diff --git a/docs/sourcehub/getting-started/4-acp-check.md b/docs/sourcehub/getting-started/4-acp-check.md new file mode 100644 index 0000000..efcad18 --- /dev/null +++ b/docs/sourcehub/getting-started/4-acp-check.md @@ -0,0 +1,54 @@ +--- +title: Access Requests +--- +# Check a Policy + +Now that we have an existing account and created policy, we're going to seed it with some resources and evaluate some `Check` requests. + +> A [`Check`](zanzibar-concept) request is how we determine if a given action on a reasource by an actor is allowed. + +We are using the policy we created for our basic note app from the last step, which has a policy id of `a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf`. + +First, we need to "Register" a resource object, which will create an entry in the ACP system that establishes who the owner of an object is. The command is `sourcehubd tx acp direct-policy-cmd register-object ` where `resource-type` is `note` (as defined in the policy resources) and `resource-name` is any name we want to assign to our resource, in this case it will be `alice-grocery-list`. + +The full command is: +```bash +sourcehubd tx acp direct-policy-cmd register-object a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf note alice-grocery-list --from +``` + +We now have created the the `alice-grocery-list` and registered the `owner` as whatever wallet you used for ``. + +To verify this, we can run a request to inspect the resource owner. +```bash +sourcehubd q acp object-owner a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf note alice-grocery-list +``` + +Which will result in something like: +![Object owner](/img/sourcehub/object-owner.png) + +The interesting part here is that the `owner_id` is encoded as a [DID Key](https://w3c-ccg.github.io/did-method-key/) identifier (`did:key:zQ3sha81FK34V8PrB7rbUq9ZbUvRKQZqW5CMqyjer2YQdwFWb` which is the wallet public key we used to register the object originally). + +## Add a Collaborator +After registering an object and verifying its owner, we can add a collaborator, and see how the authorization updates. + +We are going to introduce a new actor `BOB` who has an identity `did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS`. + +To add `BOB` as a `collaborator` (which is a specific relation defined on the [policy](example-basic-policy)) we can issue a a `set-relationship ` where `` is `collaborator` and `` is the BOB identity above (`did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS`). +``` +sourcehubd tx acp direct-policy-cmd set-relationship a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf note alice-grocery-list collaborator did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS --from +``` + +We can now verify that the access to Alice's grocery list resource is properly enabled. We can issue a `verify-access-request :#` query which will check if the permission can be evaluated for the given resource and subject. Here we will check for the `read` permission, which according to the policy is true for `OWNERs` and `COLLABORATORs`. +```bash +sourcehubd q acp verify-access-request a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS note:alice-grocery-list#read +``` + +Which will return `valid: true`. + +Lets check for a permission that Bob *shouldn't* have, like `edit` which is reserved for `OWNERs`. +```bash +sourcehubd q acp verify-access-request a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS note:alice-grocery-list#edit +``` + +Which will return `valid: false` + diff --git a/docs/sourcehub/getting-started/_category_.json b/docs/sourcehub/getting-started/_category_.json new file mode 100644 index 0000000..ed6808f --- /dev/null +++ b/docs/sourcehub/getting-started/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Getting Started", + "position": 2 + } + \ No newline at end of file diff --git a/docs/sourcehub/networks/_category_.json b/docs/sourcehub/networks/_category_.json new file mode 100644 index 0000000..db0b27b --- /dev/null +++ b/docs/sourcehub/networks/_category_.json @@ -0,0 +1,3 @@ +{ + "label": "Networks" + } \ No newline at end of file diff --git a/docs/sourcehub/networks/testnet-1/_category_.json b/docs/sourcehub/networks/testnet-1/_category_.json new file mode 100644 index 0000000..5ab6ca9 --- /dev/null +++ b/docs/sourcehub/networks/testnet-1/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Testnet 1" + } + \ No newline at end of file diff --git a/docs/sourcehub/testnet/join.md b/docs/sourcehub/networks/testnet-1/join.md similarity index 100% rename from docs/sourcehub/testnet/join.md rename to docs/sourcehub/networks/testnet-1/join.md diff --git a/docs/sourcehub/testnet/overview.md b/docs/sourcehub/networks/testnet-1/overview.md similarity index 100% rename from docs/sourcehub/testnet/overview.md rename to docs/sourcehub/networks/testnet-1/overview.md diff --git a/docs/sourcehub/overview.md b/docs/sourcehub/overview.md new file mode 100644 index 0000000..1eb2abe --- /dev/null +++ b/docs/sourcehub/overview.md @@ -0,0 +1,23 @@ +--- +sidebar_position: 1 +title: Overview +slug: /sourcehub +--- +# Overview + +![SourceHub Overview](/img/sourcehub-cover-copy.png) + +SourceHub is the Source Network's trust protocol, which fascilitates trusted and authenticated sharing and collaboration of data across the network and beyond. It utilizes [CometBFT](https://cometbft.com/) consensus and is built on the [Cosmos SDK](link) to provide us with a solid technical foundation to enable our decentralized infrastructure and application-specific chain. + +The primary functions of SourceHub are: +- **ACP Module**: A decentralized authorization engine, inspired in part by [Google Zanzibar's](/sourcehub/concepts/zanzibar) Relational Based Access Control (RelBAC) + +- **Bulletin Module**: A trust minimized network broadcast hub. Used both for DefraDBs Document Anchoring and [Orbis's](/orbis) [Multi-Party Computation (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation) to optimize its network communication to initialize and maintain the [Distributed Key Generation (DKG)](https://en.wikipedia.org/wiki/Distributed_key_generation) + +- **Developer-Lock Tier Module** (:construction: coming soon :construction:): A SaaS inspired pricing module to streamline DevEx around tokenomics, abstract transaction gas, and simplify user wallet experience. Similar to [Account Abstraction](https://ethereum.org/en/roadmap/account-abstraction/) systems, but native to our protocol. + +--- + +Although SourceHub is an indepdant system with self-contained functionality - like the rest of the Source Stack - it is designed to work in conjunction with [DefraDB](/defradb) nodes to help fascilitate trust in its peer-to-peer architecture. + +![SourceHub+DefraDB](/img/sourcehub/trust-protocol-defradb.png) \ No newline at end of file diff --git a/docs/sourcehub/testnet/_category_.json b/docs/sourcehub/testnet/_category_.json deleted file mode 100644 index 1fcd03f..0000000 --- a/docs/sourcehub/testnet/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Testnet" - } - \ No newline at end of file diff --git a/src/pages/index.js b/src/pages/index.js new file mode 100644 index 0000000..2d7c461 --- /dev/null +++ b/src/pages/index.js @@ -0,0 +1,79 @@ +import React from 'react'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; +import clsx from 'clsx'; +import styles from './index.module.css'; +import ThemedImage from '@theme/ThemedImage'; + +function HomepageHeader() { + return ( +
+
+
+
+

Source Network Stack

+

Welcome to the source of our developer documentation.

+
+
+ +
+
+
+
+ ); +} + +function HomepageFeatures() { + return ( +
+
+
+
+ +
+

DefraDB

+

Deploy decentralized databases

+
+ +
+
+ +
+

SourceHub

+

Build trust & interopability

+
+ +
+
+ +
+

Orbis

+

Distributed secrets management

+
+ +
+
+
+
+ ); +} + +export default function Home() { + return ( + + +
+ +
+
+ ); +} diff --git a/src/pages/index.module.css b/src/pages/index.module.css new file mode 100644 index 0000000..38a2d2b --- /dev/null +++ b/src/pages/index.module.css @@ -0,0 +1,52 @@ +.heroBanner { + padding: 4rem 0; + position: relative; + display: flex; + align-items: center; + } + + .hero.heroBanner_src-pages-index-module { + background-color: black !important; + } + + .heroContent { + display: flex; + justify-content: space-between; + align-items: center; + } + + .heroText { + flex: 1; + } + + .heroImageContainer { + position: absolute; + right: 0; + } + + .features { + padding: 2rem 0; + } + + .card { + background-color: #ffffff; + border: 1px solid #eaeaea; + border-radius: 8px; + padding: 2rem; + text-align: center; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + transition: transform 0.2s ease-in-out; + } + + .card:hover { + transform: translateY(-5px); + } + + .card h3 { + margin-bottom: 1rem; + } + + .card p { + margin-bottom: 0; + } + \ No newline at end of file diff --git a/static/img/defradb-cover.png b/static/img/defradb-cover.png new file mode 100644 index 0000000000000000000000000000000000000000..3f701831138b40e025e9ce8c92b6fff64bbbc1d0 GIT binary patch literal 123132 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
5+! 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 literal 0 HcmV?d00001 diff --git a/static/img/hero_grid_black_1.png b/static/img/hero_grid_black_1.png new file mode 100644 index 0000000000000000000000000000000000000000..470c4081d9dcc076c742ba1553f1e0687302254e GIT binary patch literal 58747 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⪚iw;N}CTqOwx*juz=kP-q%<>m))9Y?ei?{$8YP z!Z`iij`}4bCu~^s=e^BswA>mZh%jncQRj!l@sdbY$`AqCIAXQ3-S3;Vy^OT^w{a=OC{d% ziN`S)XLdB_Y{0{8<77tanWceuV}Z$cCJUTRd_r6F&4d=zm#%{cYua;Ipcsclz^6sy zTiChR4=j>n!Q=3D*EW4J*Tg<6lC)z2RS>S=QH!_5Pg!ryeEa5{y6Y|d*%!}9gJj$c z)P=*tJYYCf>oUapCozJ8p?st#?M;a}ULgd|c9>XNi6I0N*k7}8xrgsAr)JBRkf|eZ z3_kV&NqK);w@VAQ1D%#fXuy3F@YBv1d09oUuRT&oA4lKmWFr`t^3E z#jLo(eFmydg)zJal^YU1M^i_AvdNtPD+-IKMyw$MpS~y`D*Q^HApAjZUNvEchi1c8 zI8`+Ij0Q0XT$~oS3`WLl+phy|uoTuDjm@tox#$U5VF(d`R<0cNL4g%cBaeyR##W#LPSu^ojP17aL*_?vPd2$)-#-hKtO{8fW#jK#F~U& zfB7Ku3|!qjX5@Fm?WC1DktQY+Pu61R(r93ujxXUs@x!k+LfF!D%N00;KSh%;OFEvb zkzlQrZM}Pga)sS4X$PM-T5c2%>oZvlr!QV<_EJw`MU5?|b?^z=sZ{}iV=*w};q_7; zQ2l)Pngid!ZqU-c_CaoAqm9m@tdsk+3xP`hoX}TY(9KSeFS}3X5sw7U4z#(12gzTg z!IiG$Ka9j8Vg(2_v;m=Kvk_joF)E!=LHq+GgnF|CT_o8upNF-rTlX5IXSQoSvqW;>%&q*OvqS7ABW!SrZ9e?1V4axnaA29s0*P zIK|ORqnq_sTJeiXM8ITQ70on$ZeNdFQp+3}T@^9x!lgSJ?e7%D$~u z7{+(T!^}eGLX=5ri&(kMc!4M@B9cnJ-iMJ&M{`GOwy{s-1P(SQaPT#RNqn{TY~x}r z+A#Cs=@aKvsP|@p&VtYP*%^A=@M^YrtL)j@!s;||O|)Jg+H(VXbP*Owu+_%K%<4Cg zR@eJ=;<7!tGuT*M&bd!Got->6{PFi+9Nu{kKHEFBd!GhJ|2WVRrXKAug!lgtZET!aP4;b3bpFHWi{n+dfWQ-{OyE0F_ycq+_<_LS7)BbFB4NT_UjQ}f zw(WG_6sHku?$>-P1>FG^)F_;@TH5t(BP}GdO*U_N#HzKZ>G%~ag|a9Fv^_Z;;n1^L zaz}x2gLc}GkxRR^)zdotMZ}HqCR;fD+!40S>*~ah)oaxZXQg-zqXZw{{&B!(fsTS1 z|6M9k0X03NgDoyiwHM*qb2Y4%oG>k$T(^~IfJJhk96z!_ot$}K1)<|e&cx~)ZjU(x;L4Fy@hjx#VG~&OsMn+&818M-Aq0la(Fzid9$OO zfgi?D@&ZQZ7_TO%J-hO$6KEf^Nqn4B9W4y;i|*IEe->O!k-!=2GTgWu7{dy{9oiKU zmbiJ_qV&a}el@|7tDOxGGwWd~{-3t8!Bw=w6gHyrZxH>GaNnodw9$*s&BGZHYky`x zyJvLX@qIBMHd-r$EiW2bJ(;B&%r`@;xnr7lrrVvZ1H3z1=MQQ0388o2Z#?{gz3j(l zD`lfC4di&mh%6>>g4ytZ&Z0#wDCYRKTQ0*sl5eWy40Gg<4K_a09e&;$a@}s$*|e>R;*cJ!G0vT3}409(eYI zSn76S9u_Ea_pl4RuG}y`oGVe~ivA$?US7+X)Av~1fd@&$d5dBO>iWlre*CqM7rPKY z#98wch05Yki36|O%p^P6_pfuo2C!7R%Nu62RaNVuqWeU_R^vw`#Bb!<)s1stxW{0N z@g~;ZWeokR<>m3nC?*=Qap;47yHKIaM~#{~u!_~zICzWR>>b%+Dq_00NWE116!tieu_H>(R*te1|B`>Yg0 zJHveBCEfN~u}mtqSKR(p(z#$yG`7(01TnR6V?hq4DB1P}C7qZ@7PAf?hESO-+G%?tMv);4O(eQu#fG$-uiWpOn%W>U7k=EzFpg!44;XLM{-P{)04{OjqHr zOv$g#XRA@L?U9>imYC5T0bs$3fMRgG5O*#lOX525UC7JU&Po(sQ9%MsOcPELQ!rJ~ z0>-H@#r8(~53D|&J@i9Cbgm2*8d>%FYuYi}H? zDfa_d09h3O z@*io?8?5bm<)_}&zoXMgc{K=guzNo$ooLV6Tx+rT2bjkFs{rO#k|X_JRA+&E!lDVXW+g)+(6z zfQhXZjurj02ywAXm+zPa$63oEkFIIR=I<&hsLKiN5^~|EqXyaW5i)r( zkr}O2{X||H6dQ?-02c54tA4mtWgPCh@dpexmOZS`>jHBVC`IwDmqk3vX&-AGU%F!O z92jgnRpI+N=(l@x2!pjxhn?`Fk8-Ql=`Lp1OJcY$1VK5j3xbqe{P8TMbQn^ zI!8wf)yDT16p!?dO`r=&s{q5bQ!#*9WMMM^z-BIMYnnmfR=^9c^#^UW*N;OlLTXuR zJpQ9h7aV=CcLxJ#$^}k;kRN66P63)`c=Gc=vO>ZhY6CN0Q&YU?7ptV+#YR8A%Zyg7 z%*px>X5?VVXAW6GeGaO=GGh9`Bz`h)@zg*MwQ-WsJGm5L)N7J?yaSADl`vA0cv11G z+B*mcoN0(V{@G&j?LYQrNi)2E=nXHQDvW@_yF(@s2BeTFuo>rH1mUT@@?VoNG9m4` zJ!lf$gLw^YMH+${=;Vb#{UQkvI9BGs_65n)auYNTq^$7bsg&~=Aoc!k5JvPe@XDRd zz4V0D!zd8D%~wg#D=KQPS!uu}2Zf=cQ-^EAQ>r)Ps=a7%EGtk$^Z)AdvYeI~OwM{|E-?bq3txslAghXy}6I+;G+DAan2&i4^~p zSb#_YF3~>PI%yUllvSW7;(-4b_y5K`;jI75P&sBy@fwq2^c(&KfS=1cM%tAahw%Ra Ds1OWk literal 0 HcmV?d00001 diff --git a/static/img/hero_grid_white_1.png b/static/img/hero_grid_white_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c77930c47c44c1671d0ff0b9fb4061229e1114f8 GIT binary patch literal 22353 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 literal 0 HcmV?d00001 diff --git a/static/img/sourcehub-cover-copy.png b/static/img/sourcehub-cover-copy.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0597276cde15d9ddb5d84c8c1c3765c3ab9d9b GIT binary patch literal 114371 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�#Uu=dDmykw#`U4=WFJ9`EHmnggToDmeaQ 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 G-~R)E(*Ym= literal 0 HcmV?d00001 diff --git a/static/img/sourcehub-cover.png b/static/img/sourcehub-cover.png new file mode 100644 index 0000000000000000000000000000000000000000..75ef1be0aac744a1a6c7a8f5edb812b65ef1c7fa GIT binary patch literal 158636 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

R9tO&R*a=TFAtm=Me!r2D$RHtp3SFQ*s923 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 K%qp+BCj18^!e4g) literal 0 HcmV?d00001 diff --git a/static/img/sourcehub/key-add-output.png b/static/img/sourcehub/key-add-output.png new file mode 100644 index 0000000000000000000000000000000000000000..24018058a9836e41504be545ac5e4d3a5af5cf2e GIT binary patch literal 45706 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 literal 0 HcmV?d00001 diff --git a/static/img/sourcehub/policy-ids-1.png b/static/img/sourcehub/policy-ids-1.png new file mode 100644 index 0000000000000000000000000000000000000000..16bd5847efd11d079e7354035c98ea6d2e8514fb GIT binary patch literal 12552 zcmdtIXH-*L6fTMd^{AkTNH2;?6A+9jL5PSnBfW!w(j;KO0|W$tSWu)(mtI5Y2m+Co zC?H5D0fL4Sm70VA(jg?d8$Iui_v4QD#vS+H%@~lC?6p_cnrp5(zwetn!q`xk>!{FC z4h{}3eZAYJ92^H<0PQzN4gvo&G;az5Z~J^rb#HN0_KQ$}4+kG=8fbEGRL33LeZUEP z{^zltjV}iWciZ0IzE1CA7Y>fgS^Bp%&7U~XC*aYdBUy95olhwr0t-BS-hMpn{_f?2 z&gUgM!j44WAU%tZSN;WS7kC(41bIofkxE^BO0&%BEJbF4 zuRgec|HrWdz#KU^p8dPT!QlPV-KD|tYP?vj zI54WSxFoPMQ?0G9j?oj8R%iP@K$%f%z=fMa`!zY9RerB_)>U5VY;g#j;bY|NOa{^9 zn_POOa)O;wclas$fOUXk4!+>Nr@XbZ)N%Kn2b+WAQ?A-l^OXi>Ps_%_cW1U4SspX) zN(_ybnb1>IeC0PhhJxpBJPo8<-N4#>>#QP zW0a*G1ay@!Si3nGCgcBLFbsEI;2`h~2gl$Ue2$R+C;g7Q_pW_>JUF>8>1>y6|B^0m7{xP6oVjK)vxoQ7YKa=i=RKlCYe ziX`s#g)IK=6dwrrmBd;qR9~MN_Z<*rdG(S1ok_O3*b~b}cD5Le)dj74TzS|p;=BC$ z@ComszH8)1lOdb-j75B{A-o5;ACf7yv*20Pk}^)r9n)WNL4|8n1?sI3B!g{JGXo|A zXQva53{&bRngW*kC&C+HvOoPrg68ww@cG(pjH&vm#ik|0%C)(M9cr0w;j7uB-|OLa z39%Ew)VP)DOy7RN>JtMuR`2>i-`1N@E*W^~ZY9YkA47$E=>vm=gNsmA9;#eJ_u^Ku zYXoR`&$}`y?Unl2cVi}Ku9fYX+y%3?-5`G1rplVYvdu@|YcALj8M_f_L-Q?OEznd2 z`1u@Xly3Bfqz>dTu&r*l#d+4YS37od*h(LlDT7P-@tVlrCpJ4uYwAE#ocr@KUpqcqS`ZS$XO$wLOe zy8<(r{^-Nx96DU1jCUB=@$pBK&8k-`Zd3AjM{Cyx=Xwe|O>{+FEz7Nyf}JkyIABiL zjGfHDBEQ$TN^W$*!}pt#=0HJl1lhaChs(bgbdqs;0$89@pLx-WmEAe#b{_QaN}G-=R`mS{hiETeSan{wCs%;-(F! zMf&lLkvw=bKD2#)ZqLm!6+>p^92+JTbXUJ*bOf^wJ7aGIETsJxvEYpyHjJ${UA5HEnc3(TqxyS^J=wgb$aZ22 z#Tgy~*>>O~+G$lduh7jV@&yQU^sspF{ZJ;&aV#L#Zz|?mdWl*1B4)_KqQyw+46l?S zDDk4f9ad!`KXVCK#@*0O=8waW_t1`U#HhVL3`ZG4XDk6jb*(&IYIzvSTFsH_>3@D$ z%pJRiQoJx0`0YV>nijX}`9S9HI3#H9L{YV&U+8KE`FxH#5JVCO+?xpXx{O~rZyE&nLR&?MckGRoujd`t!N1#i`xHZeN4cmu zN7acU#w2p6uU2j*W!uml(yKz~o^9Kusg90Om1TyL9>bHs%IGeE?-lz*I1%4nQ@NI= z6p`D|)wLlbsh;W)gE#@YZh0s-;2C{gEm!aILXi5MZ}}8S23v|R6}|fKe%*}ZYJKiTLD7lJ8WjXLC zVlfZX4|G(^s!kh;o6nC*aCM9xdndwH*+)+_JT?CC3wdstc+g&RbR)`8z`KcFZz5$% zIukP(e^~6v{b9NwYlpA-H_mQ%P1XmRQm8DkZ z#XCpX6BV*P1NQ?rhM?@x;)_|kYJnJkbJP<4h&+F$8FnI+LGP+5pl{%sBIxt&$?|YC zL5)Vt7MK|xu(SE#)>qs-azvP!R11na+u`5t{xUcae%mHgU9P55Adp60L4~Xjwc@3P zt(MXoI)Hag>)*`{uaCzR}c!Le_=J@7eHTZM10(BA2jMg>693p`X zBs(8X3AnE9&9)Qw*CSU(VtNNRsD-Kq(LPkOz`H$m?DO|lOF

|JnvFSvj4_9m#Bk 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 literal 0 HcmV?d00001 diff --git a/static/img/sourcehub/relgraph-simple.png b/static/img/sourcehub/relgraph-simple.png new file mode 100644 index 0000000000000000000000000000000000000000..98a737ce26217c18dc6efc10bcc22891f66148ed GIT binary patch literal 26725 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

CI%?f39={AS`;k<4#2yhP7l_ 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

2#(&O~g5np1z6c+R?bHCpz* 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

5b`IUp>z?WdZ9ST=Y}FMqq^|9&L=(m{^Gl;Bm~j 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¹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®~3v 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%0AZTwiVPAV zJ0<%aLEx##;_8VYV{jYlcx?TS;u+lpE{VxTrRO!~cW}ny99!1CP@gzvQP~v7+sMSQ zlrP?+PaK;!3|K3RUk_s`3@u_UlSZ4y4NM5X=jqojw61o((@z=Ugj-5#k&X$>^bvQe{693g3O9SR#bs+aXp^J?={x_2pNb|sX%YD2Qhe6qFF$9b7Ef168OH<$Sd!r~p{->tEz=)Q?$8Gm+`{pp zk>0E0EcG;4Cl)M_9rBto%5<|j9v@@YDwy2gGG#%TOw-ZnOT8TNj3Zu!r5(hR802PaQh0c72x3Po$IL zvHtap%~eY%2}b^ACx5v7<{J63#~$!tlBNO(~C7YvYFgn!`=+ z)jM#%weuCu{nN{Q+pz(O($Ya(t|0Pq193~3a^3oh%Dn<1OwM_WK#wmWtQ3D!q;G7#eU)4dngs;W=cC}Q*HCrMnIT0n6#puqUlP(~}E zz~t&*0O2KW-whgB3W56_V2(N5)W5jx>7g;dVSmZ+`_{-am*EXdp#a6Yv2;c)A#Z|R zB$Go-__fb*EEnuVV8Hasjy34&b=_!u@eg#JSU{acFv#J%9Vs0Rv*2C@4ZV-UN=$~r zj)Qj^4`I;Ri_8m6$=aQpQ1de+@d&xYxpY~4K}!b16&TNSQOq6M*Xy+hI7R@NZS3mx zEw-fhONMeG#4ebx(SiS#H{}TTVMS>5M#?0M#$VbW0xG^bWi@x^>SlAUL7d}lf6n)C zPpChM<~MYMHGn@j-Rke9y=O~kDh&91rX_M>ZZ8g6U;Z(m6C+L*Ey$B#F~g4xxP5=B zCMp=hSyY((h*v1+lf08X6qS<#DqNn?o#mlk7MC6(csN=?=pLRcudQ~I8@u|PcyqMs zt9+)kO7_23pI25ycInEH8=|FLi>|%zc0bW!(2{An+Tbf?dQNAElw0p_%YDX%#j3?R zxVQfpg8e0uiv0n29Ii9p%iGbF@L9(hC(l*CU{Tt|b(4kGx!BDSs#$ z-G4pfFHao@<{3UE!&ct>JmwuwKBf-P`3I1Q8Vb;FYnR?A`F^)$cLJK#u4vtw9c$`X-f!AvRoqycLh@y?G`M)xPZX?Pbz#MH)VH*WWk2QcFd-a=F zd*(O~{S{%NCr3gLa)U6ujOOVlf4j25{%4IlDG-b<7G=9c;ch-VGfe}(*ad3VO&Myn!m6BlDox&SMPj-u)1IVMSR7=d1kt@^TONb9ucn|uXz z?A#@VZ|EFq#NIEVx^bW=EmVT)Gr+tx(IS&=#&F!%X>Ov&cg+id^%Y4DoB~v1rv8cz zUb_99qt=GzSN&AvQImK0f(SsR>|})oh(fpgKu7xb0MPy89k?lWcmEL^W8S>QPw+@} zV@xnGF`{(61QyZDG@d)34(iSH4|E;+rZt>PN+U|_(5U%RIb&7xB`kM$68G1T%)hhn zPS}n`GNYN4d~G^MLo)h9i~Y-kW0|z1lGelH71f@is@bP2J#RJgE;aw$<~&!3AvkRM z`2QINu{)3;DepJJ&fdxkoD=cNJfZ%JBa=10}2Or z-1d18TK$~gQ>ey~>bn_P4?ADJ{ZYKDjK+ybx+PgGv$p_U)uFTud;;aK!>t^upY)Nz z>!0Q+Bbk2e&<}@sFaO)!U9@X=obEPDQNZt$MT(;>HC#IlEZ%*FJ{7RJXh1WTdOs3O zXF=olo*{KU%l0<4Jf-}DJ9ZKo2)wVd9!~fsv}+baH?7=1vTmKxIhNy7YQ?qjor9Cf zvTz8J2qa>J{_@7W938T?PCd?b?@x@@>ViAtKNXUIn0q#qe-35?x&u#I_+W~@6C}Vx zOA2Fzmb0F7KYGh>=4StT-Dh_UfC2{)RxXIKrkC?mIcbP`{W^m9VUnZY9_?S|Xrf`Z zRe+x8y)mA=#cco~&2ttpR*gKTgkNhM;HlQQs3k6pM(fvqmcFV+g5kvekz{1&?9q~h zJZkWn&#7_KG+d*L2Gn7lhsWhu#HjYr|G!eiZKtg##B?M14&LYFGHfnp1k=O zCW3?V(EHQWO*}vM(p&>Pbc8kUHfveGL{B5U!};w-5;zTv2&@j6RXRt;cB$}W=hW9g zt8v%5aq$eGk)KS7vwPT48_$gmm;0fn=+YtT;ZE7er~oCJ&5B=+fBZYO-$Y&nd#slx zpG8Rz$G`OY0{$Gzekyx{KHoDL9N-WzYYEyn@Kr8~k4#{-ltOKa8Wpv(WR5-ak=>Qn z&W_KtG6mi$7jaSl_2I4OGFY9R!qOEz0!7s>Yd;O|3;3gRGhb3@P%2sEt-oH*8PxOc z*BsV*lNM#t!WQ*9zcdgXEE{OO`5E!kmw~fg;wnUFFt=2*+fu^S4qXay$cc}oM%goC z0(&DeJYv>?;BAAct7kPFCdNP>gJlOc%8CFU$?W<>*FvqNV)MJ4-(0J@H*R=8PafV} zb>0k&vA%U;qYo#y<^X+cQD(?Ao)ydW&ub1(;tCYK>VK8K3CL``HsL)nF^MDJPAl5U zGL`Ml1o58wJh2;bseGzOPU(87RNAR-Oz9k#n}HZAf4pfPX!_0A%H)T~eP5p_5cPMV z9*+kRsYk^9tz1mvt~_V((w_!&WwFSIVwZF7D|G=vD=Q+#{)*_=FZgSKE{` zxM?LEEPLNMS7y2Tv&3J&g{$J7f0L{Yo#&^a085F<86mR1>kVkM7x5foOOkfv;%W99 z4}GdD7B-%zH2Lg$k@9=E?GkLcoR@jg>Py5;x*d{a5^Q_uw;+fjX?HI*bsIWa!5%cj zJXQH!sdDy0-h*SK)ml<~a)%$l=lWC--0aj@O5xJgBID=|5+}5EYtF$-O2}d~-p3BJ zg~UHvYW@VZlcj+e7yC}2LUGL-_BVt#y&Wv**Ufn1$%{DEW1{l)Ps@Ru`T%(l>Yo5? zTq3BU7XKv%iWl2?M8waYF@k+OedlDBtXVpp@4q{E1)pq_ZGNneh`EFsCBc0eivZeb zwKj@9-#jP$B6s&4+>VD;FzjHXjpY}+U=znO67_%dS7(FrDJR?Y660&_pKslQpjHJ; zmEi@cdqrn^dh5-lw;*Z~f6rM9!CP>zCZq(TWZ3G(O4XU`m?kfe?P`2_3RYx*-}iI< zG|TJuVyf+kvrZj{1V-xO#zn@!M{^^*_9M4r)syHf?E}3zZp5k(I4oe_JF7l+>0GkS z2Ibm|%!Dopwo%>VgICR)tHZFJ@Kt-)PnT8QC*4l+$e9zCS%z+h`mi#&VPygQ`^-s@ z28lB5OnUbn-|`7+fK4rNf%9Z3%dc9C$Pu&N&6E}8GkZ)EkLq4)xURa9@qsOV*}B0@ z9+*yF8Vw_@gP5`NuoIL3tyYAcG zrkgLcROTPX+=jLRBdDi7!W3>EG?=WhvDPe9RdKhmS-@_Oq9L$9vuMU={*TId21?;d z(C9p+Pu_ROwL8;|Hy+PrD~h}-**1oavoo(vvkpJ^A5?;*QdT3&Zy@b#smcAmNOADD z;3@w7%}S+<+5Wmq(X{c|sZKvr$r^SZ7c znV!lYaB9M;UU@M4^u9NWI`xgXLrA)p_8^__21~C2SzJH+%sXqP%BWlCZiUAxze52& zpM0@m=|4>g-}Q5{q6xajLq`w)a`QGh&B3hno(%g6=R7vjoA_gCU@`N<6!*_7X9 z+6j?4jB{+<8<^(|BN$(Cpt-xEYhwZ~%XbzITZhz_tHsxrJQI=j8fD75iV(M=(8up6 zXQr2;Wzcs(#05Nyq?%Vf4mCPy-hB44Zoj@RD)sH;A0yI=UVp&qlNaW+x#^a zGgc`MqtP-ajQXW!++9MRQjwB`OA3Sv`f8Sp# zBSiXOI(CeR9|DY>d)Ddsk~9<>U~d9`3#q2U<6_M07G<};4AVGTVT6h{?xg|Fs&9}j zn-z`#$%-&DU|2HYvP*3AE~3Vyj->JboG`z;ZBuu#=%wZ4)7LlVmX3RPL2lF610ncI zuYqAzhptmvjQ-1u1hIP{(qtZEQdySaLVWod)wqfAyDnVwsaRcUK=O47M#xoIQBF*0 z;Y#88$Xs{IgTm#qkQ*S{xmD)uDsSn{l~y(Zb?*wGy|6hQy-ps3t9Atssj5w+fjXVu za{7-FitebgF=BLK@PvwLx82SgRVxt@Y3}S4Z2gn! z^C{umYoG6otu&uJ$XNuiZzgBwGPew7^mNQ7IxCGrfEkW+m%vy{mCYG+NV1gqO+Zhr zJ=*V_@~nmCLyZsYdNaa>#%pBovj6x&--bcxGfc}+9EFzv?NPHaMV!vlYH*HAFC|+6 zmx4!B)a@<{uk~*R-q2@#JU{cPPemBQT>bBeHSt{B{o|L1O^%R=GbWq%mecW5o~f>+ zssK;&9oZ9$rYf2qdNC{yIQPp+Jrm0Q-^xN@G1&DNr3!N98;QN`5Ews@OydgqIeX6< zdV5N-CYvhHjl6Y}xc`@fH8UGC@%1i-%qOsythVC9<^5KV$<*DnXkktII7aGcJMV69 z7#=?KQeAYzHY7eY2u-MqJg#3Nwjdv_T{w6yY_M3_t{vl2lfLTW4=#`wYz@~vhZ@mZ z{|OgP%G^v9n$S_6$KjbzD&&5stWCPHd?9p*koH+N*vTn&s@}0~YvFJe{A#tc&xJpA zUs9H0mW86$%n9n9y+`_ro3PjWjn4q-H%Jx2)^Im1>D4?7QFW%PI)c`eCK%TH$`*%0 z#5KA0PK{Bbuj<`v3yg(O&Zv}}1xGJ0*sgG(?*}hNhqrV34Yx0kV*>tyGEZyUV$`aU zeNfUF@x5}d+*^3Cu;O@ey0oWbrV&^Gxe2xubt+;-Ko-s28g3_|NSL10Dj&V+icvKT z$vFR5&YP&h4x8;P5rHr|`vEh~1LSvYFX|12GCa=C1y#0M(Rs2#ST_1+ciS3_*=V)- zRBGkoC?5k1dZ*^dwkw`kGeBi6H_5w4Wc%ePYR?3~r%&0kfW2pyBcGa9Z%@Tzu_n*O zhR+NK6wZ{Y9yxZsOz5|i-70~4nhZ{f0kb=%&=e^}CMi{|Z)1%dcfh5`=jr5nEDmPL zMxuc}zlT_r+C_}I1%(=B^umVi-U%=-E2a3CHmwqi*dTPHh$rnTkjcS_N3%KwPOH2%QX^|gO*7(;XMsDl%1mghUy{$l$=c&{(f8CQ zo=P@Lbov~pEM1ynk%yNh#FZO-XV&~8F&`f|<}~*{?{)lJ@YO5q2qSD0kq=$} z!lYkkN8gVkdFd(wi=iiEq6TZUStPZ$a*RL^ZwLRu*AwK`K%wwBQc9<8=Uc0 z3`{F<(IUUAsOd<3o+^~3wxYsSwHMCsF9;?2fvQC22l+)yubTWvr=q@u{id8^(D-h; za(%A$pyM7=uC-g3I{?!_1hwvvM>wttE7wW({l>E$Xjx`G>KPCp7eE1^WI zPBkuymrKpMkB{)@yhUDJx%(7YIQ50&`P07gf3r)`QK=|IKgJse8g_ydq`pqeKC*~Y zk=l*qZF})Hoa59t+G-1}ZpY8~Z@PMD??$YJ9AHYz#( z0|#e<9g$a{iVb>;H@H~OlZO^`yw1j0LJT;Mo%~JvMMh(!wI*`ds+3k$v=4;?=|M(T?IgIBDEH)%G?oaU>lJ@X1N*Rg;2iZ2_Hd^BbehyVKwL$B)1L^bup5ttp3FhJVZ_|D3By zE|V!zQ6Nj{A@nLO$m26-Em_uA&QTb?%V`usaJBj$kKEWNSk4`0fM@xXCLF~Dy4o4K zl2k)Df9uONTDl%vSjdm}p0I~LdOG(fV^DXlQx@9)K-fwon$*R9Mv`gULWYIl2Qau_ zPRhQ&;$c^5*Vs)g#^*v_96Hi^2a=ag0H~@gL|Bb|ofYzF`e$Msad7XEF!@ zoS*0;fuL};_P23ytQR-Y0fm#70$$aNR(4KZSv+3O*v{%E3v~AvRhM}U?d57C7s_p# zDWvHvRI))$-_7w&^^5~6vZv_$YCSg>6ZM_bP{RnejGgTAsX!HlN$8#V=o}8YHDZ** zf>8>MQ>Ev|TD|c|wqAHu_Ux9cU@n8a8@c*M4j9906V0Rot$Pd*?Mu%Zei_A|cah3e zP5bg0&VcL@E47rtyBvn;3Hw;_0Nz_H8YkmZuYy!;3a4c}Fx{vpQ|XuHrS8(lETTAy zcOc!h5dQS9Ed_E{=joi!Pxw7nN%*u|-BRjLPqSCb103jitJmR_-8vQc?T^k!O2*y6 z4L5xOm>NP?jYFL(zUm$}LY061(^QHU2Q%Bm6lULz)pa?)>~yfJfPP4QPpDzI3nfZQ zzhTZxHH)dUe*!0BvDb?9Ed!;|$Ogt)bkJR7>Gvhd^PWdQ@jV;2@mU*dI!0ECrT`rt z*6F(?wyI~o?H}!rd_Tz6Mv$0snwS15h>pWlN1j-K-m3Wb%hu>{U1y8dxu#ZEd+x$u z2b1fO)cS5V4V(9K&3g>xw^bLdMCuNLl1~Hdw$i+@e#}cbr6vQAn!DoCj!qivGzEiB zT1m_nTd@dFprW+K%fiYl+E`gOi-YpYZ(;2t;r$=atFG~Wn$WpxPBwk&@+0wS=+H;$ zXmlb|uC)oPW?i!o=mb9fsemApeoY{k_UG{!2cO zzx}B}U>)l@UMDKz$J~Jp?*~%;%a61e5g*?cY0%c%O|qA)I3w!jV`#Cm=4tETx4<;q zM>23U&oO3g{gkYf4~mL&@{>W!EC-OF$;L;G7?hCuA*R`GEM*C;OWcogxN+p&id6x% zTThAaFwp{Ea{GU$sSn;(7@p)lK^|8gVw-~b--!5NYlr-MPRYAtV2A!)p`$PY zN%majckrvpd7O5X1bHHM1f5_$(!0})BtH{@3|4u}8Y2t5+SNyv=GCF5tE8Xb1x{AM z(<7?&rlmNi#s{hm_Lcz7f@Q^*BK=iL{_Ej--*T=ATyc()q}Vyck>+@W|7#-9{Y;0y zCXH*kAlJWdD2h>LnS5tB1}WBvLLuH95-%ikstv>8%qs?zFDDl-niNUUm78x}kEY`f z23&jnXgv{Cxsyh`nAlP8;#!RzMB)|zqg}x7p!G_8zzvmpq;GG&C*IJgDyGW+IHHR; z`~J%j^LvwDYy{lM2G@N0UopskSltKB4xB1&++K&o$=R#)1v`wlW{j9y0*; z4Mc$jClco2T+ifKrPwpAfY()`!gUix#>Ivdl>2OHEQge&@A7sdbH zn)6uxi=n@suHu$b7$yf$XMsc9=uN>*E6OK z3$ipzTFEae9p56!k@BZ5Mj`v?QJSFI(<&{y7_C!>4NZ#}ZFkdy;|Mx^d0G%RZE^$!X7-o*%pEWoYKI-OY4!mRMi`tG}4&^-IVuI2kMbCs!rXNgsQoXn?%1Ui9 zY@Iq(=KG{;_v_A6y;7ZKrf6#ZpbZ{W-^vpe@C)D8a9@`v&AxawscqR~YEbj2eE^yh zbEox*wR%G21Xs=zk0*C{PR+>k${(_ky5#&bdar1|CnS!%H7Fv!XG?oQad4w_{SV-g z0~N~9b>>aUcO4JKlHw+3s$y&?JT80X^TyC5*iQ#~^g zeZht_koX%5#{34~IrN!Z7;B-G%Q^mt#H`;ZxeW0OL!%^X(X(nzk+LTb^kYb$^VN5v zMlXPQP67%pa&?7HZrSrD0%1okZ9GWYaQ!!{w##I0g73}Al|8Y(k*?&1{{Vr7==5OS zR}8{WJ?`Ht2Nva47t99-bVg-(ZcrMs3MU40b$-qlz4d6)<4+XWm;>QIqSu_Gez^3e z+apa<jY-CgqQ~9Ux=NQv;xh65F(T_Z zO-w&q1Eg*GdIz1(>LbOtu_Hs6ss@q~=MAIJ_TrAI-{A&a6XdeZil3Ele_V9DL?*Y> zj=-%SM0qau@Jk*mT~TGz-IDlg5hFDNn`8EXUfC@j>!)=kgcUrQ^%WOJg&)06?fpZao`~$2(fyK{mVi z=qL$_@{~rAFsLEl&A!nQ75E+TZp>=U8W_E#O5H@f0^~XctjR3uo^kK7e7Jx{2AsWY zBWC2!+R?pBA-XwA)W&4@Dzz(rvaH1U9$}O$g+Bl+GWTwake|4%m`|#+7lu6umwEu) z9XLX}kQc_4LZ~bUUYEp}eimoQ7dtfvSa6ZoMr&-7Taq{On91o-o=#9-lbTG1RGC=T zezICB#$cJJJdL!UyX`+$EtyDkS5JtCTRgU4&xkJTTc5Aphw=o8On`c{XEQ9@my;r) zaX{s^1odlraaV0*cID2HVZ!hJt2&D|v%nZay7iBD4B3j#|B5OG?|yO7=s#4qr$i)= z_vo_+@&v{&`gZ0M$k^jQ+;1{x;4FJ}-R1@vBWs2z@6)Yyb9mQN%8Z;x76z*jx9zXrdGYLR^!p!B;xH_HEDbN@H}wg*fdBDWfG(C^3aUhs060o%~)2lR0RQ9Rm<>$SaSUnp%(jWB&W^G90oB>0in5eRL7~ zm{L@YUV3rWzZK)$`GTfIBK2tFtPMb_5lDrcerLsaTkJ<;@tHfzFz>>pNVp1|aroFM zwuun+7CJ9NjwKLr31_76gVSh9Y}L#b!4Dj;#2lNAfSt{y>8R$-2RAi6e8K<9r=2=($!#+O^Tm{Zy!ia=+_rH&%3pmV%SFj4rSDbb?x91C z53-X#%lWD`Y6>0mtD97;Yz`d#P|PNd%q@9u47N3);^(w~zbmBBknTBli4sZOI$F=h zF5tM}(DpT|9vw4VLA;;fFCdIvEhU{AXyF$u0jujvV{$ckt$pNUx^Z zodI~)Eu`Ofe$QiCAQ6Xzo%HBN8Z}J5NWbj7#IP}BMt{(y!LMuU%{`(UXR_Epe5xd5 z620qgGk0=^CRZ7mM!FuG!CK6l3Bhaaq&f32IN2q-*&uN#Ha|cfQG^ZRzxUqKS*bp||MVpirYLn%70-X>#sk#AvWR{gY=uhd$|- zmX#h!&g_^AEY(LvxO8I3>3;{F77#lNpS)CA#y77SRK;aYB+&0X)c%#!SaWatPeyTo zL(hp}HuPhs?ZamgCnKQMap>HX9v%9Aq)57GyTGS4@iJBnfZATil-F*{e9as$H(h!k zRk@`&R_R&e;5#6&^ikTVUwU;C4ThaWxKGIdpP`&PjB-PPM*va&U$UpR#8k&>9Oc-n z7(Y|#%M6%WjO=p0?a%^Rb;xJ3U{u^|y6uwI2bYB7PoS@=pZ|zFYwrT`%V7`G(+7cj z_VE3N3C)9zK2`qlsb*y(UFnmswJ}Xc@2QHmcu&NEURLh%ON^wP z>l)y1Lm&2h+aIqJ2nDwQyB+p$fTd zElp0g>+S+AR=9sbfi8o4NU?o=n*-d>$v|DViaS0374dbc2(~j=u7098`7r5!zk@Jy zT4GmEm3hw%ZzV@~HD%z6yPcuo7*a3-!M=E!aqfQ1(Zl`uk(njQJ3f1S>r$0txa@>w zf=5d6U!N@2xFzI0t66*d15Z|V3*eN)9v!v8`~$^uA>)Q_K_jNRO(Lo#Gqt&JbX#DQxg;ss%L-q#Aly2-eg(#;4}H;;e?O3?kDJVe zu-qDYo!NtJU!P=4r=#mGaY^3fw>iW&F}7dK9LZbrJR28l2rqmxSR4hTINeAJbgiGK zt~fWQwvZ{lu#QXgBx~AMq%XhptfHQBTgdfavYrNc4?I)t!-RTmwBfSt)lvt0Y_gzFxu8{clYv&xgzvtJH!xCUaO- z)KLorDy)5oNsAMD5Go;W`Cu!=ZdD@Nm~C8@Q*D;)T%h@VUbI7o4|bYCZGz9?P6c;m zfX1cVIlItNxLAXl*Anf*QUWg9p?X205oL0y2_u|BM5`s1YnZjvV*LAKuOwxwNiNJ$ z$^$=ydozJitD0m?NhOjZ6U7_1Et8h1kcdQSwR7?_r#A?{wK=FO6ZmNPyf!Jd<86%K z=i>kCCS3yIOWn~@TiAAXQo~12l-D4^=3=TT;4_vqwboBaeH2SONo&F%uLD@CR4pen z^BTYbo6d0A&d}?Tw7X%KQiZBR{)-V;lG?|H7Lnqe3`m&os%q}v!+=BDZ`HCkCY=5< zO-GLq8lbBg+nw2|I^|i|5>ytHZhSTU5w3;2D$)w11-f?gj|Rl}H-O)eRLs^jH(@PT zlU_~y+~}U6I#VW#)AnHaPt)^R$y`zo>RcCxhZ(3@Aocj+c5FI!|NjQ>DO`6qRxudg zI+8nHwtk*>VW)TK=Gu5AVb*9o4sqy8b9VJzGg{n0k}5syOvDyONp|*xnob+lVdXr= z3`ES-FRnjB`Pw)x+CWC1l3VKqH??_Qu8V~3@}9|3qo6#Kl0lu$>>GM#T%GLwktsgF zS3lrSJ8pM#Z6wM*E_H8OY%~|U#2N&a3rprzUz-CA;bu{usYE3OhA>Ai$*mwEKsIRMH%3 znfJL8{j7C#N`G|qf2_3O)zf=UNUv4l~y z<-RqW8-6n%No{uO{Y`rCk=_1$TPaVJGj%d7;DlhK8tl;nW;3x@SkQx;2)R8Uau>=yD_SO5ZyE zS^K<#M&nOQl%0Pe2oo;!H-`I!9oFa^$wU_J)7mPpp$qUNJ<|P9e`)BR(GtBr`r|Ro zCRNZ2iAx)uC~gX#a>F07=#a2Ix7R&2W+SY+-D48(>)oEc zUNN6P1?e|_N_!d;sPq=V%N-T?sEWc;NRHNRglF^@+c>MpzQC1UCW67UG^=auHCox+OyeU79=MGkr){bBz-!)NM$-c+atP?s0qaY&$MtF&eM z3Zj^+89jmZNEK9 zdDHgJ?|t01E&Kuow`{I{ruhPBhjXL?bu=np>4K;GN7;C-Q}w5d)5n5QW;e_%>V!8( zgT?1eKjLm~rQem5CuPt5AD+&_ugSRW+ao94-5@17L_&$tN+U@3Xc!0+qy{4tke2S0 zl5UU`7@g9fbb|ReXHEs+^k(LNbTL}!<%a|d>BsxyfbUvwnQtP-3$a-Is*P@Z8_d8}e9EADG89Gy z9Ig5PyFqk~er%(McAeKNWr_#P4WuMNy+nV&=etMKDx6@~DvHP}Ct%4XBltQ})pC==mzeBj zrH*$#Q3`e7DUjkDvt~zf=r+bKgF8`Ht5noJv2=Y)A(XN3#e?tKiwB#MM?uR+$yeaPce5_7r7I(s#qU9-PS@|F_B7JypBTQWVQt=h;d92l9MR9z+D8r`&Z~j zXcYqsje=7`Vpe3&xK$^0ytoRSD&UUw@$>XGbKVf_Uu}`j^ga!4RJ$x(acg}Yp-|f2 zx|I$59~u1HL>L0GSD9g!ok(np=*f#7YENfmA8kXDud_vJf@66(#F^_LM0V8mzRQM~ zi)WHVmL;fXtn$gC-9YFC!`m(1A0CAIvd>qqe*WCfb(GLr_n+z&wN&PRf*4)2%5c%W zm3s31_;TLv>iu8K=yu}NQC*PRxzh3OM_pv%0a(Rh$o1Gn<$Lb)emTyzqlMJI_i7?) ze|Jixcz2c-ANKUuu76!ZH~JE$CG0oue05qU`g!*woEEP**+vKPl7q5)Z??bcxGqsa zvlNb$wxa39j~%;j8Z;E=PqoD%W|j8yRrmg;mw||WyHNs^XNiy~s?zR@chl|A2U&aG zZCE$W99h09hE}>7tLksvMRQ(Sf;bAOn{&in_qH*_FIDJ=JE3K5qFY&)3HEztw4G<) z@u14N4pPwaYPb>`t3;qyN^sj0!~iWZ{ih9?rg5KP*+PF&UmUgUxb6)tS+Gg(>)aL} zn4-O(?Z?tjrO(oYV1WeNh{Q8*)uAHoF{#;tgGJ(G#841@fxrBl-3A3>RcG;a*FwNfKR$wj8V(%JsXQB%ZKXir z0{-PC4&+Hx3o`Eg=Ic4)Qb|>(7bGIHn=b}#BU6ZPI4YBAfc3;fuP3v2kACJr<~bYk1N&KtA@u zzH>*HdGqFXsYj5@S?Z9^$16bMzXCnU{&1!P%*g(obhYRI^=x+1OR)i@ct^TQkw-GA zQ5)-pBBP^kkKB2m80-p=SZEFacPZ2t6-%Ud1Wl8TEw&BmXiWY&a;sc}lL_25!-z=z z9Qzq_8k@CSIs5C$q-7N};v(dAWd`XLnY1gdDT_sfX?_40$lm5b|1RarARe}oy9SE2 z86XHrnTfM)aJC0KHp8(OT96BXJS5(gRZ0o@?ryaSt+0)7{+#b29;tt@#X;Su!b zPd~<{`o_Pduc;rpfdR|Szg&KqR(#xt1SDg=;PsT;MN8-p%DB=tL)o-G7_!7;iU+Gz z4(^b0A((LV*A2>gWMGEo>KDDb-<82k&69`X84&&r-;5BT1hD(BwIIW0bu zs=HN;aeUAdzDX)D7B0$n%*eaN=VmP)|9f7Bcs>bDf;_Y8jZ8kOc z{M6`D4JU;d?#6TIje^D)5V2n820oNqmL*B^84x`)-X+GPvq8)p(aFp@qZGh19FIPq zX#b6!;@Z2_% zL~@>-fhAKm0#h79GslOcaT5UT<+SexI(J>&7;gB7 zW-YJYmOip!#ppmlHo*gvf5RqOs`^9!*e9Yx}S^H?1?eRfTw%f#x(hrw-KWTVMEk5YHH&mQHnw^7r6@W@YCV;~YER5T zZ3hN0%Ne@DSo;OZsnvDCYCWW(`B-V)XE@l^C&qI(=wA24tem4i={-KYBdC2rt7x_3 z)wk4!%xGC{VMf%?^Odqd2j3h= zfdr>@35+yOCLBVZ6$VSQXKa-Dd0X1{848j2tm`g#ID951DC#dVbM>i1g|Iw4l}7s=&gTjn&J|{t(^Ci}VVt&L&qVw! z3>2TmhIW}$@ZzoEC?426!Sy40vUXs8zWzU|qW|au@9mIUfftb<&NBW;+z<1aCtkFy z{0Y$A3t_qUez{gyrRWd?McdgmS!`!3Xip+!lw0a!CE6{ZJVEh)AY;I+$Zf!M|0iv_ z+)C4iXw@S=@T%}<`}nA909QB%IeV8`BEKiT`yQ(` z^Vg0lKtyd3uoz)Jj_^Ug2(=hzv+QfcF6(?WB2}sMkIx2Ql7AMezhR7O?bytQhxJ0l#3ttHs63)>xkwi z3NCKWki|{3CSJMH{9)E2gx<{L&rXzYGA8XnP=Ml6?owx@1RFHx?a>c_dB{DV|(<@1BdnW^H>!925dS3&8%cwL9aybMHsB8Ki zvn-$$hC#GJzM1^;TlFUmg-o`?L9@NBZ2NtMOk;f=6(cdwovMdMSdy;fA8HvW2Y-A& z-sgGI)idt_UkpOSr(9}090siWx~~7;Rf13$y4jd_PFq*H1fkJztgH5R5&5DVuzG!_ zPZ|Lv+L<|9mcM+ng<14N?JV?AhwHSBT;!>D z+Y<>UAAAg4-Yh2Jnaj^@W=zZpJ|jwFPu)H*v}t)AP2P)Kh_bt66J)oTVu=zK?#bId z|FBmeErl5_leZhvirkHetAj>7_?SfP_pG6$0^*+ctU;)(3yW%Lhau3Xc8xj4f`d2x zEu%wTL`z}a9IF(vy&{c*^YT&aiQM1%nr>5veinqkbG45MAsKM;ZZ%AK!=p%{q(72M zQy}_QxRz{Y?z#WC;JqIBjM#R9q2*@*S$PNu?ytQ)?7U1!)zEMP`b&VL%xV=SlIu#itn}DtC z@nEmy%qwgW5{H{7V2ee4H^JOcjbY;UB{h5m5+y16p142?ffV?X)2$p@zq|D9rLFZC zu7m88#pDEg;&fd|y*U`B2|?5Hx{k3+hx;M{Zm88_X>lf>Y4=LtjTBsFs5cx41}fi? zQJ-v|>RN1KB~L}9Y6ol$o5xjt{OvsKP9cGAcl;G5@=3pWY$nv>;3#!E^pdIMq znNvL_Z71QJSV|t=%QNlcaqZ38DAj;>p^J;8ENyfrsyKze(77AXtHlvSc?igl&rHpx zz8(|{eA{2cQ-o|3QyRz88>5{>TY65L>31#c&pge4T_-Tug;dGB!zVFPdsj(B=}MtY zEECjg|703SVBXZk>$>k|oKtp+r@=p_H!XE!pEh7BI~V%fx$bV4!{hcl;x~bwtH3J> z&i(HjvoRKNh!KWl{03f<-6NFk51PC)Wht&)?+se9!-9uG-E2}+OdSbMUP^W|0pG7W z-U*)1`e8_+5!5C>aZ-dicRIfdOb|pCRIGaPDyA7^&IUImqlHvlK3gA@YAd2UU&E`p z>UmN@uzQ})ZIdi*Y*KFoLChDStWGmJTlVk0a^zty%RJcV47U7wx`|wvM73*ulJ2z_ zQljd{`77wpygd|S-c6l2Lj(TpUk#DPI|5kx$!S<}LS{F`ubO z<9mRXB|fgUhCzTE%yS)gNc=}EBBV(1c5ua_GecL<$Xi=h4{VDggok{L`7@v;|HLik z3t2h1O)O&#SK@b&KqMGmqd`Tk`&N6_-;*!?vk0rPOMSV?UaKD=Wvv@#-4DKgGVS(( zi>XSmWPg&cN;n}#l0l48L)66Cc{4sw$SJa3YlCNeYt&1;p<{y9fCIDQ;*l}rer+n` zWf4Y9vjX@h_-y5eqr<=;Z2OfWj0#h8|gYq^+;{ShbRQ*8#%@T+f=3D!dQ zjIVJ*1Ungt0@|$zxBlRUyUvwX#{uKivMctizaV2d4>ltNjCmNl2o^uwe!NpB$>YJ@ zYf>9w@>v&<5L|fNkEAUhd`GA4*LBJHacO9@B;#5r>wmYesq48z{J9JPYhpByEfW8X zfRg+N-*QjHS-6TpYz3Q&HnU+zc{!HlNv=i2V6OtXjq)VhsYJ2dt!DGZTq)LDh984U zOjlfugd`aos!{0xBHrC-*rwHcWC?o`O`jkZ1JjrosrvM#&eHf>(3b;S0gTbfTgoAh zL={;Wsq@r~SDTYBnp|T4PlK*j=goOwQJ~*S*p!==tn@8j^e?ZdeNMwbla(nS(HN0x zMnO2eiUZ@s*$WkxPPYG46zo~uN(&#g^#9%aEZ%H>^DAfU^~&Q~>@PI4N9LnZwT+!z zrl1D4&AlWW(utCQNuu9|2?=y#Sc^aSn8P85FG$9Vm!(?@f3Y50*~eFKvLBWCN2^5U zi!B~XM2>m#KsptR)s3E_Dz1U#>cZ-`1>2r}dD1IxKI#*yc2`#TsxkfB*qxF$tk+L< z8m&aQI#$6f4O+JB;_96v5}_u&Bc7|zUqAHl{q(r%MR9q5<99`@<1w}Ai*adq!*XVN zi)mdFc!CC08N5Mwp95}e2t76*M8vupb&lhY*0=40oUCIU)ClnSS*wtWxE^U*5STis zK}#BfA-tgYN}|n*q%&;s+1o@#Iu{DC#W;qtyAvea>42leIl6--4LEvXHWb=S)=}EP zblZ(0@W{EWQYf9jWO!`XPN-SwyUK?*dOz2xBWMJ~1^uafvNWKO>pOk0H2xtl9Y4W7 zYUn6qR_8J^DWv7*t@Hf+;nW3Lxva!r$XDKgVwxqoPQMi?(Cp4Xyh8r(B>79uEcDHt z*y%$64<)zeg}*rPYGAG=SW|N+*M(CNm63pwP;T$MSn0e)om>9+5k&>p6fF9QQ&JG> zU@E(F+re}zzIyAG4JO)kPz$C~VEAPpJbiUpu4L7cPG zKefp?50|!c=5T7mJ{KMlmR6gE7f(Ujpykp}v>vTHV>Zf=SY$^B56wdzfUT=u0MGYr z3LEYD&_Xd_4oG_*h9~ z73;m7CVwO?9%C~zP_7T&>STsyr2swz8Y4Oz17;^S9ri!lKQ)*Z3+>#8Su)pBZwf)_ z-e*G z;B@sowwcv<1dfk>icdp0n?k zrY=HUXr2EZOk*z0muVyQ_6*i;W*fqmbgq zVxyT(pE*XGzoXMsdrb-e({v_Xym*e967&GB)Hh*DjyCLZj#Lc>BkAt5BVXlAT%Ll$L{5`6I)@>KSQmLVhNrcuB0IqftB-x^p z<4jr1IWY|IM2O`!UAFi-bZl+vx2xn7q%=HLzNWsO0XlSa#OS!n-*Z%MV^F&XeLE#f z{}>~?V-iECeXNH0vWACPn_*(OE1YDcZ;FJcc!wMv>Qu$zh%#%By){KV#FOlvEu_H` zyuX>ZM~uvOXhwfOp&G6M8RUd{g?tY80o|CMD3KZ%E*JKDvfM|`5o9bGq`kUpn>@fi zqmb5u;WUXTONN9%s}~l%l{h;P6(&t%IWK#9UH$FY z=lVRJ&XZAqJy*y2BF(_79?FLX1hBgPyd=ghzED$3s*t5uJEgI2?2uIZh~^eXG@tytZx+; zvPgW&!=KbJYs006ep{vJ$@}WrimfNz zu`fgbn<_3D-)6~{C+LhIRP93RLB<>|l5Wgyvi3_Y-U3zj2XhNA1hl>~EOzKu;~E!? zB8>S4NJ3@V2Z*XJr2Xk7nbN3}7~pn{69?do0;f%7qkf^;X*wO_O$fDdJ*DmTQedF( z@0bd2D$moiAzuc!$F`8yvH=?J6)SnjTxxG$hqt}c?HV%dvI%`I`S>pnA%*ao_Xw!U zU_4i_GjgL;8OOWv6Sl|@|2(1J=W-!cDVL{!p|VXHE_e8~S|%8OP=DTc*Yh_JV>S&c z$=dubmWqEF2r%gne6G@VtE&E)!t%SM;ag)~QCA4;?%eXWfpa+M1RlZ~Q*rE<_wp>} z8io5lbF01nkOTe)FyxTc zpIA(pon}1T5l4G+KW2N=duX!be2Aerg0{rbzsPr1eIHICF>LRIg>kiibRYD5-C*LU zOYvL^aHqoy*osepx)Mt-;%Z2e`rPlHf&0%vs&l{1;8a!$uCo-vCVMFYle=+QT4}qs zTR`@}7y&!O2I&-;|1RUxyxK3d3-@>!u>Ufs^ieRIn;qNpc>XY1gN^zr(d zuzW|``r*vhiEcWXH+u)reXLw8j+o>wQ${e8;g{loV6;uYVKm58DaTom1VXcAFtVk+ zWC}046v+i~$WHWMN)1H{r)Yu7!f0p6q@>=_i*KFi(RoK@MY8Q$m`h`9VNN%U#rz86 z$MJWKI}qR^yDybYa6fx*2%PNAH|_Fd$@TxVz5YT^!t52sAId%=tw7rP zF1kxHl5SE&j1V%N^aO2&%>X@p{86fgx6U} zo6^)5Az4-5eT(0;;xA$%D35FzQyq_<(i`8xp2RSa9|8XcG&+ zF$47etRj8B>2y!LdS}qNyc~0rdvwWNbPbLZazHEXpnC7&#pt9$KX%E{*md12{7p^A zx(4Ta67%=W{W45dIgPM4f0!|p>kk^C4JuTVA=I#CW>muPNoxMZ4-XTRCr*{|%u4L5 zwxiJ2TNnTJ=4f@x1RUAI0n1w0#>{qyn@Pm|f~;&}%`APmOP#MZOqlOFG3eQ?u^En& z1KtaAFT|-op``mu+7r>aCz8yzdCxyjNQKU8yGd4Ii~igiS))d~jeq{6CL8k-m^cWs zbjs|WmZ(rx|3QM&RDO2d#BNT9(D4ShRmnZ_Ss~}m20HSaS5!8$t(o)#dzyB zOCL5Po_s{~c3=o3#K!2*G;$r$@v0BiO%7TjM;go&y zi%NAFv5vd;VSTtFf?V~?aBb)IPh~5GAq`>~g=KWn=)@0Zs4OzemJcC%;yTJ?YdHG1 z?0tnY3F-MMmTTgQ11l7HW}_`dp(JN}(hxE8|+h^{0);h309>B?`GtUr<9gw!UAPv##U z0Q8P+8!+0LIP+?xm3^=a;+O-DK>3$g>-3#g;q@|mfDFG?i?}$Sbg}3wSVy^*{3fh_ z+Hv=^rYm%pE90in*k7`z5Gy;qm+u-JJlcUWbC5=P{pg$Py5sY~TQnpFqk76*G9GjnGlON_c%v+V1OyY!PO*dMCf2|;Z}7gKV5 z`99Kh5DXC{O@D}1;f6n^e%-w)xkAG9)1gg18i(sIy9A^MmXp*I>Gi}jPE0485Nphig=^s_pJN3RKd$*bClvZmfj1LgyiKX)vfLbA8_w~Rke zXQ_;AUC0w;|2092P79JriacLye)6Dyc$~wOwv=tK$6t#=eyfxFTK8Rmd}XfNP#ie^ zZb~H8mN%|=i*hK{9w%|Bo1QMajYW)c2wI+f&ZP8dVy-|exl!Ux#DV*xa^A%joku-(LCIi7T#0Ygk*@5_9XAZ#fUcBsQj)^5S(}`MglIlINikK8q-Nhlbfaem`|=vr;WA)fng|4 zkUh{+cS6f={J4fkeDZdCAA7pL4ciAMcKX7CX548^%X!@(t^Xx>2!|4F5zUo3;j`s)l9jNCAJ$ z^Wd|&VzlZEy;$%`HdS)A{^Yw)kP{j{0oXk-uKh(9v407SfBxna*eNVxEZbS;ObkA= zd`o=ao8U=PX`$sT7{Pc@>LHlC>9n*QI~cDqWgG~#QrBCzYhRIajlqgAp_n5d!I{Y{Bh&xGlu;q^TL|#Z$g0(_)t@HiR)r1X|ur2x?{`X}9lt zxZmj*;MD$$u#h>?J1sbL4trViF*9oR<+ghFMP6T*C=;`8{nxfJuLI z-m#6Hcgf!SynhcHj(e$=KYawa&YH)AxldYL!>HoemEO?$H?`2nv)*z{sJg#cCMVhT zM*B&R=pp?=i%d(c**X5|0}!5xX&}P>mP|sODQi$$MR3%9p@df_V5dQkWyxXIlaQ|7G}hY0c5crS9+J2q~GnODM5hG?5y^f$u^G z84Gyu%o%}hGN3hAh^0N`KG>w%Kk6XL6`LigW=4oWv{{6=up^}mPZa}{t6!ubg;Vll zbPu>YxAT@SLP%Zz%<*X*R9>eN?JPHcMz;@3@Vy_4F}OgwH~*=uxEj@6u`7Ia^Rj25 z(a3hIv^|#Yg#F{>Z(AMnsir4T_%!5qA4L7P&3AT+g>7puiDEVlCq57YR{A`qzsCY= zv;4Y@P-DNT@k(;Gckydk9@9@Ry+4#3ITrLz=feuFKi_&{z#b&M$1-y)r6(;^)pjb~ zrBn1-hs}910$5SjR^cuzu6+56wd^uDzhOLUEt!Cj7YTlB`t(gT=llfoDQIQ3Z@7o) zoHrw`znfb!fy02mR<8?%2SM|5svZPNO->$nVXc%9)$ZZzWkCn2X?z`^IiBnbt!y*K za;e{`{h)l*8#M}9_YS3bqU_RFT?6H6k%Ivy1{X2l)3_Nl35*OLN?TsMk|GrYw*4YNpZp2#0nz=_sgyQN&G z#1|bQt){Mtq>;-zI`B;v3`Xl-vuA&*m&-m|uBtAoW+PE2n=!fP0^If%m{BI7I{X{T zVt|_`(qT1-ZMweLL;B~z+Z@GB=Q4@K;C+x(G<|YF62L$zj>Fa;8jLgK`Q2KlwgcL0sy_E8+hF>i zLDi`tcka18F@eh~ll8%=&Cb4l1J%m@W6X8sIxW)vVg{f!_BkKl5&=(`*NMp*byUqg zOlyqcU?}>K4Qp+%!_^NlEaCE8{VCG<&56l3P$~6{C5|9?VJNfe20${PohDovwzenU zmQ115Wt1aKwnbs=khHDqUO!3kMstz+u9Ci)^x% zo#y&iOg?!wCX>%c4(ZOs6d$X#a-#>TD0*XZH9RDgWpwlV=ms_(KI`S3Up+e*QKO)4 z4@+_cT$*LG%+t)*5KZRH2WD*@M5|2C$ivEVL>M&mq>ZT{`mt}fLzq3Pf3n!qZ-+OR zVbtKR4rjEIuJct_5qb37Hu zl9WKgL$(U~rEBPAkzYbQHfTS9UfZs`;51mfwN@MABx|gmvPcsUZ~FCctJ`t?(LbJf zhwSgts<*NheVUW&c0u-JCe2S~kf@#Opk(aq_memy^65S2cBhZ;UF<=gA_}8?)HHkF z1XNRd@TCDvCCT67>+E`Gt?bURt(P>KXq+=6v1s4?Jrz!go=6wRRomiD?$@O@DMGl} zScEd_#>}M45=WMc_t*GwAhp?}u+p6KXT*pXYndbc8L%49*GD8jMXAbyeN6ZdQ;>;J z6%^j{MDdKPb;bGu=E=o^>Jdms(D}PI@W0gPY^RFsVD_?DTOlm{MW6U~2RQUEds0nh zM_f%RQ-I2De1_OhnN6yMSq6_@z{0kZJs%4to!l$6@VK+!v(Ee2@%T-QvR_33tW7*S z1Ni#pcE{hS|65blN1TnPEeJ#k(D24H!HKiAZ(bTsk%U&*IB1U1_e-JHgktMVLtt+l zq~c(r{@d?D|EAPlaiz;;pRy%j1yDz3eU4EP-FV`Vc{=z!BQo#IgMoI_{u$Wzi4se1 zgAJC=qHm6Mq8iAa#j><4xi|k}Y+<`gN_x8TdK%eki200s)~HY`q! zvDx=DU-mk9kh5{=0F2ic`c?l_;!6*J#q)HUL_oPj$^ z#+y8_TZnVrY(=^nHSXn!z{z)<$&85t>{FNF`I7X$`h`rcXRT~gV+eZFSo-KJpdoFK z2jlk3yZL(ZCCXb@#JMeHl4lwQGy_e5XNe^xW7$6cSh_5_KV%|D>S^on=A9YsRM8O2whMz*vWdW z`|8KC9WMDN$cN4`rq^u8zJzE5HUNXaQ_uf=nIb!ZB&}~e9Ee*R^iUpJF!Nc|Oftgs zT*7j2`wlF_dAlSCfG`FY+R(Xl^L5s^r8wufJ0&{K7vD1$go|k&Onn_#SS}YYz~Ky? zW!%UmvTYDQiH;SaOY~c!MCq#waK58LlezVA(qE=@$?mA$Z4|299UG}<5i$fHSOwZ}0iPlLeR7BUU@0)r= zj9b}RSNh`ZH@ebyl;6h(uJY~l?ou^PaT3gii?CdF#CUyb3XZbOE5yOIRj9NzT*#R< zsMYZddVxYjd-0uply3ZSLs@O~`$N+4$PiIXiffUOFYU`@Q1OtCvifVK4<(pJXTUb0 zN;|)Jj2O1Kdvn@hM zx)WTrB&LI8m*m=WNs^^(Ji*4YG*}5=Qh>0A5EdlGsTnF`xFP?1V%c1&9>Q=E1D78&P$l>eL68mkF{ zv+zVxW0RH*#1Oo8mHgdfXo2W-#B){`l>3ru zj47$9K_nXEIh}C=uGjFvzm;+jMC+Cb&~v%Xl}`_TH8eMyuWfdh6x&CS4y16sx1LT& zx%a#O19`BejKtsL%vdae)0Q>$8{{smK6!aFlw;4?tfUKuD2S>eL-kIrSb7gwYTD<_ zs>d{?Q%!?O9-&)O|2WEVm{bvj6U6l<5N3F`d8I8Z;C;z*UKCSrTZQ<>ucU*X#XRPIAv>m2@Q}InamkryBgE7n3!_uk{tae;T8W zY=U%?0L8Un(cqVPzN3t{3Q=XtEPNaTX|VV9uJxdKRnm99#62+}K;FKpT!Bv3;n{ zvP-4hD}%Rg!=G%DP4(0X>9Uxh80FIOb12`g9vFyYF2$K(x>flFZsZO@V$!ifT7}iI zoZ#?P2L)+P*v$}FR$KN_{Tj?@6Qi9Rek4?m;%Hn1j2nHTb& zAm^oOi_u$ErACvCvaqROi5GHQsw?3#0ddax<3Tn2DRjkb@RmthPDHf!O3A4t${heL zbB>X@%w*9fo>&TMxypWy4mzC5x0y}`kG9Bmxoti~wed$s+Fx%legzzr*S7^Dt z+7@;q7Rt+7P#FqC-!ohH?zK3XY;sI%mayzXZpkh0c)UVe{1Mx`P?+hW$!hDGc+BBq zs4e5G;MoGsiT-hShl9x_I)xIU;Q~?I)N4@_sZpDjJ6~&_Q}tKNP%lpf+%JM-N-bP( zcs?%YD=WF<5cy!Q1kB31C`g@kwFlG>lBB7A-VbF9lwG#}~gY%7W(Bcc(!|9L$^?SW}>%@Yc z==Iu$dfhWpxany0Q5YyBMuvk3iQ$KJK@j!nn1zu*OSViQ4;nNgVl$pKyl=wmRLM)d z6C!R78+_9vb&}IlZ`P0nQB1w2W1lE_lP#6~@Zo#3Y$FzO0ljUWY9EkNYi9}X&&#USf!#o$5_p^%`pVkT4I39pq&7u+y7R2^#{yL`mhxfucx%T9ufP z;~%&ssl7cNF`%xi{Kw1@^w{c6$~*?cQ9VY~WJ%n!AL9!JB7DfZ>RJDhBl@OX+@F_~(Tt3sjbyP|EwmAn6| z4=x|dX%C+*SfQ2^+`o-1rvpS(weTiWT>cx!1b#Ms&&iWK?rR#tqQ8pZd5bq(U;6_Qt~tmRrsI7 zQZB5^jnV zxV31R(bko{zZEZ2h9p(Gr7y!F*Piu{wq+;b-w7{2n#-F4ohzJkOq$skeWMz^Cj;Wv+EqfWP z^ekd^?h}(%c60>0QQ_;MvbmhLoxs1{0JCumDEKA%&=j>{oU-Nl0)~??I{bE z1(B6B&1pdI$Gc$)usQJYE#!Sug=+eA!JBFJ90oP=uS4h^x$l`t$}$G*W|tE~%iH354W`F7b@{w+j|kL0$GVi7Xd*4^9_ zZTCTzau#uD1pYefWxw0eIfYt99S(dbeo*(0EZFFML3To50LOQi3|cpJ(>%xSNujG3 z_5?G781pgv26j2NU&Oo!XLZQP8nZ*ESnvNqNh!X`bi2V_xsx`|oZFPCPYhj_tMADo zA7wskiiHM#kr(b_=^sz5Y9qT@-sG^@%wk{iu)uSUoQ|bg_z{+Q(8uEws0}_dT?*)9Fj7T0#FwbCod- z6maOSi17|H(LnC|9OUs#P*|~EDbFTJ$Kw?S?2U;Dv|>>qhOk{0)tE!&&Kxm!uYgP9 zR{3vEXUXvPy*N{LLP3nvfm-g?kEjfkeAaeci38yag)5q%kuRm+aPCGJM4YG7cR)@Q z11j?Bme=@}(l14k))=PUnL7@2 z_)AsKH>M)~i!+g9X+4wj;Sc&$ z|EJW47m_C>xDg@?V9F(q18R>^1cUSBcUz3@MEwE&TW?7u)0Jg&89(jy6*4BeR3Q;0 z8JGb`z|c52^}grLa>v^=xdRLydkZ)H_sjRzX6*2HV2lFIM``L}e zjbB=7UA$}xR_X=-9<|6zu}MB0f$<-RF+S?+?#2@&08Jvm5Z_J#n^CHkV`1d93*ls1 zXgFH;hgRa^H3fy}(ax35Lwppuwh{WN!j)P8(FJBu{F@p3+WVbjmo;S2O1Kw|PZWjv zh}}OoTVawbh0Uj*h^>k`tPNy6!`nN}Us;_ztbGJ%L~`4=N>N5Kaf0buFy)8>udN-g z-RtP8RL?VR?M!y65>0m!48~4Ru*(I+#tICskn<5)qj?pk{gFM;RLg}Ab*c4zM1Os; z!fkCTbtLuWbR%BmR=(YN!dWt`Rr2nXcmeb|py!Wj^W3eo-v+KoHbP!j$h7m%g$~LH zCZd%?p>1}b_?_rrw$@ZQSjP;P!tB?xpxPDsF9P_4KOR3*jc$CctTdfwl}x%m|n(?4A|*82RsO>(mpEn-zKFMg5J^t~fMJiB9`yN_*7 zMCz_h{SSbeTn92{YO~2%YjcD$omEyBJc$71Sgy0E1C*=IYeq4k1hv z`(bCULnDA6#VzBd{;a`s5D*Mcf8~WY>_`x!z>nx;UqCV>ToIE%h;xTV=)buFS^Eic z9Ily$I@G`=8^Ljc~7Prg>c^;nJo{7c9P%fsksbJDCqZ^cV!x@xm2W=&K55eP~bL_J?o#f zIktDG8;B>i%kK65Ly8w|BDj58#ZR*^mFt>g%*_8e$#@rK`t{7nwY_nc)G7l&9O|Gt zz}b)AHK4{ZpYd&R?$Ts!1|1IKA2ljN)t`A3)HSc&|!#OtJ1wEqkBcos3 z_FqrH%PKhdg0C+RcgXte3=0Nh;ZpFXo5`Ou%l$!oyYqY=#j|@B1T?7tsUjzmb@a}0 zbYn+%6{4)mJ(dauV|+;2D?csHcZAzV6BqN+nE(INfuPR6(C&m0Odd`dIvbqbjkG$U zBp|~Ca<-n5mLQjLOVno#nDi(4{H;+AMF}Y2tJjOWwY<*QAYw9+Bm6Z7Q`mEwUC28U z=CV~BcH?g~BS3_MuUnDnPkPQ24pf9P8m@}X_%$3Uj;gl}CDgevcnVN{bMpm&bl}gE z0i)Z}(WHX#5Rl)NyZ(=kbh?U9mudM86}&BfT#l#d5+hyrUTuMjgILZlM@!Ap<^V)f z_03vR2FC?`J7EikId^2s(g1~VcUw@STddQaJOQDS7C98VEzEU2GO%q@ zmc%jTEH^=xMkU6Bszf#tbGZb?OkJVTDC%_)lF4;i`T&q=!du8hz7~)y=kV*hMw;CGKvV{>2 z3p>7g_SPGTz@Nj7&VK5)>{FYJC=dS+>y)dbmlvg`xlacXjFQvF4gcPuTApmFjMd7% z8u?pEA3J9T`Oy>eriV6RpTwa9-!Q^UcAUqG?Emrf)(=hoaohLC1eEShk{awk1^ zlAy(&8!eS<0V{`$&|F?#bdOse=j}ps{l9)nx1b84hp&>sza_eMelntt6+NCvdKmE} zzH$B_xJcW^W_2Jp$}s*5Y0LZXe{$t3bxU*o27(%Jq7LhnRl_6?%d$^FOP;kpWMqA~ zW7XeS*pw@mIQ@vmvZ`J&0yZQcU?_7`S!1qBY5GTJczCfOA1iKQc2k%(C-PP-Z!iSP zX8n5nxzT|fg7so-MBK=z0%MD`l>6xVKu3F+KK-WLxyW5q+)DXtkG$WPXF~w|^Zo)~ z#^k`ZxM!aT{G^c!8W*~B+FM*hCQ120agk{8hvUIust)%X-)<^7S6p`L5BBYJetCQ2 zsZ~={RQ2+Nq@>M!mJGI9ez+AAG`Jr(ge%Fn0TOnyr~{y1db9OubMGM__7TqCj*-$C zwBi4@Xui&#P6*S~=}pF_h*{vpeI#%`Qh>d%S8*E}d9~ch@Iq2S3#$1jOBc_dV)Usy ziZA~-Tiq$#0;FCQ2={R|jU1>proJG&qGkYja6vqp$b6PqAH3SD8%dp+J3aF2ex`hM z`9x<2$j^S$`SO?6!aFxE;GT!w^?mi;@5A)EK9fR-e+JwMN?lEsHN9q(SXK=s_bBGvfu@7d5HT+5!q_F4O@4?U>X4 zIv35WY;4v9F$4L%WmY*miEg?Jg!W_yHl+_?=I$Dd3(`U$i1bDZ2DK3w`*D}44=Ia4 zK-xlm0dYEZMDq86&4IBJVlG$nefGqRJ(mawS3_kQ@+L}~u`Vtk8p7nMUI-^3<{;nj zGpDQ6C)n)@QRn6|RakvztH}WSTt=tP)6ae|s4pE|(pUP=XM)r_j%~R254g31RVd;| zf=^pFs!XT)56oBVe;u3kU3f`+5jN%GcW5PD{dF6g<<1l3 zK{m9QseZx#EzspsFI?wEW8D&5#=Q(lzg>*QO0(}HOuQW>DRij_6-ZBAW372_xj_S z@Y1&2NF}u9azLV@^!vY^K9|?RVJ78eX+KXLqZ{wL^pA!q|XU!Lk?m$QvuzpW7KS(L(Q|?r+!T)aC1Bq*aEv;li?;TC>=uPvK zYkGUqOH1n&f4q`;;iKovE6MJ0&}Qmy9_qkb1z-Z@W7sI{X@-;HH(ZUPOM-+4Psi}F zU#K=KLge#Eb}$!^pD9+NiZ^^4*im{Q8NQ^fdV)2qosCsb+oxBiYz#;aXB?#YL8L?^ zNrWK((KFeL_abeZutnHD`9bu2qSA5JBkQ#nQl(JJ9@M2gE2ol39A?axXgdEQmq}X_ zl}emIN8O6}|BcPTBF9SLFUyCVv)aR9c52z5N)onqo>&zreil*22tbC>1mi&2Rt8)@ z0r=ghiD&9bM}`Cr4=z$N)rNN?`FtJM4#Z;H(oGQX)2gi-Wq!k2mN1aJ97fjvkG3G6 z_yD61(1}DxXf){IlYpJ40#1^=c;G`2DWMw zjC=SaiD6wn{FK8Jw_-S2zD+b+FHn2H8%Y*VW86FZ>W{b!Mb*kD7)ii?RJ@P%MiTY_ zef#p3LE?t0jha?sna-t2*?O|7nt+1Qbo}>K6cnbD2wQBTaliR?tgQ6-DS3SLp4YUM z>iY>T{7~-xiPaJ_m)G?T*fY!((?yHM&@eriCC+BbP4mRB;sT#rWONkpnJz{?19`SZ zIpAy}#~fK5L=!=bteOb&#hw=@U9D#%t+qBF0RbBBp!=3Mzcb=nE)D{>FX`SFOL+>S z_s`L{BYq2`^}h^lS5is+nD{0b#%p;%u_aC;KOsDZaa9*adEyIJItyLmR}=2ePO0N> zR`NnJf4QIu{*jOV9J5L&%x{ zuGAk!-qS9UDK9@2lk01l)+K91!KColXblN>+##ao`gsXO_R~RmR}IjcHv11=*n~)Xu7LW)^X?NV?*Do>vg(BMDH0Y)ui-kFBJ){`|C0H zP0xDDI1#uff+Vr9C~dMJ9tiuZ-yQ&^GA~w9P3|XYdamPBf9I%uX*SI)Zf0fcI6q&n zC*LpY_|w3pdD;*@0w#bAecfD-)C~hU8tVP4P9f%ca0$*YS~IuCIZq{#k1v?beQX0= zu-_1-r}SAGW+o3{po4#+Ur)cG*p2XK24{(V6tO){-9hX6Gt z<)7ECF$k>F{WB0G_~VB#52qm&d}?FR+l->EFY_ODgjuc18g6lfTr{6FS1l^L!Rb#f z{YBLU^jPCG$VPVim%8d^ZO)VZSYboW|dfrr*VgB z@HC)1EJ;QmV^xd;^?wX&qNy)+*5&cb+Di<9DvxjfLv#Bvqd|2Oy~aZ!y%*Qpo`X~2 zBD^klFFPYHE^5V^^L4svY#X@8g3{w^|y&%4O zKPTZuA#29ukh>P0w(BVR5#Q73Pf}PK^0!I366)ZW{YAtZs8VptsJ15Q8>Q(~k+@<6 zgY*xA*eVu_*RC>FWceG&l2X&G$WCbc;_BjBm@|UQg3052Ei+tu=|N6f$O_TDB6701EGFef3=1*y=+=1UL|2b&m zAGIC&@g!74VI=blCyQbR+wgTgzmv*$XXlqEzVY>SK@oq1<^1V4k@FkAucx1dw`OO- zi)G@nlBx5LtM)E+lE(#EBn#<_(u%ZW;OZ>u~za&e7jn%%4IR{xB$Y z|1}Ue`X>L2{yr@1!6<*lBePd5?khmiQdAyyhqIs6bVC^|8=*x6e^_QZF^{vXJOI6) zTU~@~F%O=+Nx%`uySTXP@T><-g)Kq12=1{ptE0YJb+CRWF4e`ag{Iema=e(%6DT(buzvQoA z1wBv`;2N~>M8w-(-?$`01x!A~p*F#5hYS$$wK*(+o+FwtTl@P5=S+bg+qrDI*-!y&0&wsC_DGD+d^f)-HF|eJXkB3NC9|qR(_Y>XAz$<^ zB-4>XlS{Mu8_ixI#+`|R8~1k`%Rq((#uf|GU-_o$;Cg^$S4InMqHEjkC-zOrF|NsH zP1|F0lpbIY1D+y`fUWPIX@%Nh-thm|8w$a43w+1N_E~Y<8|Wkm_nxh~pT2rRcY{i{ zaVftq`Bnc7n$WH{-(K2u!;mC<^0x|r`{qSn~XEt|(w8=t@U~KwTS2wqdI2zwg zoyhM|y&}0o)B$GC-3}3_AcTd(9q|9?d$ejy?ZsowvGzA?uZ# zh?Cer7EO4lt#EI~BAzn{kl_nSEsv`)q?|}4)x+ziiaw-sj@Pd-6eSb&oSxo>%XaA^ z3`ekOz6e)13&avHg5NSI9@x$?e+8trlGW73zePMY4jf6`j)X#Qbyf-ZcL>Q9ls6OH z62Od8yE&j8!$`v!<8q*;)4m_yxNvm0_l4!`B8{nwzfj=cuGAYP8R1EWU&OK1^TTB$tT>-XQg_5BWW&H<_w$1OJz2 z1)Nf@@N+oBlpxj5_PGTZt+g{_tws4_pt($uBXnMAfx=(-yQM^gi+2ePVBV-_D-`#| z+!6H}8>yDGtOjUb-vGx_mpb*sSA?MCQ~mSm0ZS;Ae3UJ zBU;Yi5UKSDp6ajkj8~3drI)AM?zMMt^x3p{&p4Ne-w_ABY1TFifBf8E@5t7yO|BT3 z+;dmy0s`CIV zv5L%m6V?Cs=5~ z6uDavIHbcpLm)SLNe||8b8*wlY1y#E*EXAbro*&YBjlGRyYyY`UJAI;kq0%{b0G_B zYM#EsYAJ6J4DH2|4gPgSP^fj|Uc#)fAgZd~PJ~qXIKIt_@*J63pzttOu=Ib#Ob^|- zEFd=KmkSJO-tZaVJPmH~^6k@k6?UOhAlt(aGJ{PJoSf~Jix}zQpN9b{_%X?^xFh?{ zu0=6#qP(@jbu^S}rzub%)NM1t9mv*pno17Rh4KX{4pevri6l_qqR-s`f$i^PFb4>n z|3OHxkM|*qF7UF~!L-}St~-_peW8f%m)T@#Kxblhj^sPVO}rd&YLWVv3sw^vA1~;? zPWLq`Um*8?-gvac5!TEtDaj=sntWsSvzyb0O4MgNM8tbJlZMQAu77Vy2gDY=p7Ezy zF9>e_Krm?>J)dd+AYT_z_TkA0l@Vm*y%gf79BfuCh+{{!cS|@o^CKI%G8}9g@1_-B z(~L(h1nE58tv}CPa22t^zF#w7CvzG1vw;cco@RQ?Ql&e@K%4lo5iy7 zN*7;Vol_8PVsw?iuA3-abV5rVv`ux%Rlz#O=w}5qOyY3eiY0|;= zpGbShU)Qp=M;?=PvBiTpx;iG`7og;IK#rlH<9NBK!VoJ5^TB1dzGg8`l}pN14uBn2&GWGLwpl+m_Z5a7viqPUUrbgPWT@>a}Q#Z4INXcB9tna-)U{pfKNSodFN;b+~QSy`~oc7}sx2eo_ zO0SRgbWF^BoMPB3%7G{RydJs&zuzxZXY5BfMTauP5jOS)0#+ykObU zXr9C-lh@gx1sZYZi0@x<{-B5=gq$gF6(Xx<6+-bBlWpdY;LGld(Ry>Z9|zdA&WBqk zExbBCDNC=i>Lx~bs95?k=e1p{v!VUf^4GsDI1~sdU-Z|k7tvFaKf)r(cIm}SQ??m z@$CVDZ}_4qhsRSV!k(e#fBbf*dWnu*2cmWY4appEl^2^Z8%V&;lY80JL7-5@HrZZY z%#kJa_x5)T{1|(}5w0?rj}oI)#P^;B?a4D&y2okU2LYRyte+~b)W2qaV-maXN+Rl~Bo`3U>A*J0|2Dx3epO&*x zRJrnz$Y7;6#MCWaWoAf0(fZF6jd*YgmL`GuDfa!Bxyo`FH^~x??17gCt}2U6#e|+a zDc!~sBUs}J>5uEo#^K9EK50J)Xkk$I48M)A!5ckduD(B0j;Z~NEkgF1K~aD248P3( zT21L9`NnYe;dK~9S-gGTs!1}6QR2jW$YtAsuVZXG(~-14?r)pp zRTz^lFWRRY@xf)Zzaer3^@U0scJu{dwkSl3C+G2=YTll%mrFByy*Uny>b7S*D*jde zQ-ME_pVH(*DjRie?|_P$P)%h@(`ve(0BEp443i&horq5j-}ESW$Q%|J;zETgt+{?7q+7l=94Ml{na9r6Rd#b4JEce-l5- zJ!&9X3Q zAUR)WSb-R5=#2#lortbhOo6DVk(xS8RVX`4(M=$BUu|~Ki=#k8>Yrt0P6I~pPhcB2Ykg2z}tkwNaeGgCek}GXoQKB(#k%<(1 zK0%b!+H~ZW$(BaIEuZDbWCjUb2_0tH0uD-SUMRID&XXAr#h}%J0fF?eG99m%f$Q#X zlxG%_T728MolgUwVL<|OVDngUC{<<<3sGv*q1$fz|E;z=k$4&WJc_)#M(DrM9*H7O zknbQar)j_^kuZU5maIChswZ-A_X}-j4rs`_oi;Rm(+AgT&v5?tu?o#q_#MOu;opHc zy9eN$2>FV1>CcE%ACL`U>2O$T62yV{*3S=tDQ&S*^0Z!#2+g6F%)@v$VGf*jY|1Cy z#;v3`vp^`66klF24V{1r z7Uh}c1{-u4F@eg*^(PC{X;1cXZ^Vat&eBhN$$tX&>9=%NA|=XgnTFP4t8|U)cq@!f z^n{oQYQO)XVQ%*2+cG8kk>h3*a*h?_o^1Jvu4x{1^?b~EN7I~Aj%tg}IHftK&5lupi(fP$m4nrZd_PZHXgu^`y%6dG3#HP`HKC{!@oH0<>&y<@9JU^c zN|$2#t_Or3LcEncib2ACPo6S9jx(zhI8XTy|9n`iXZEwm7O~Vp4%QF(#K(V%V!Zw|GX={x);$&zCz;>D|n%o zBZK_|ub0Qr8NzjF0mKk2{a%;Trm~^Z6Tc1`(AU}6&QXyy24MoE_Qq){6iwMsC2^!Y+_*#fT{rn>$ z5W%}}ek{muUNPOQyvxgyAsn7jCB|4agQ_H|v3K=14ZNCUx{Sy+tD&lTd5E=dz3c{g z%!;WirTwQ**rfZg;F^6AU=PUS3XK1`A0y2i50!txpNR(nQtM-R(pR5_evf^u4ey&q zXjls1@kR}8zYJ9H%RF)onYW23na{R}KuQ-U*L@4JJ8)lDRU}|#D=}0o(5NLhFVG(x z_%A>8iRIIzn5X#(AhZ1q!ix6`>y8Q+8^&uRjP-p^E?6S_=Kbu>umMjohO!tokTFVO z;LYn(N(V)MmbuX9!9=m;O6~dVaN+jfpjVlAw8(<^|Laz=pk(w>7$+acl9WYrvbMZL zmn<%PqKg%@Fb<$O6KIt@a}Ti2=og9=7vnjS zvgc_IWniOLV(!D*QjDh``nvK563!!`g!wb``5Prbsk8(FJxhw$;J_arlA=>f!dZX;_suPPzKCYK)LJ}$I{%{eQIUVi$cDtXFu>H%{ z$cOkPmO@bO@mBKJu)(n2_;#ADb9YlrY>LWF8*8s9&J4qN3U!0^UO-gXt2lBOJLF7e z@cLO%0nV*dfka<>fq_gIYbmT8w+Z;VQJYvK?}_6^dhO7b=`bGk zGhoKXA(lelMVE$iuxj}yG0y9-xj(IX;qxD`zV+dwsN!Qb$43`Cc@J@U1g%b*98RVs z-U{^CR&p5SDs}L(UrWsp+ArOBJ#?G=XSYz`em|)QXpE@1#V z9+&-*pyAaH!1|QJq2cdB_7*{!3}pb4W}~;{W)M5Xy=z89axMgW`|nlDMD{|5TfDxS zW`kE=)486y1LCJE^H7QT(m!e&aD=OxtL?eQWj?qt*89-R9P$5Q~GxV&mlzjLKu7!Giey^CuxQNEq%Mseo zFmyj}#`0}`J_9hsT8nugVV#01J9Q`Np@D;TcL9BUqvt{s;85O!TS% z?2i~Vn}h$lPt<^e&`I?mV3uwB(7DX2iZmBFk7J8c zxm;QOGN6gh$P$CwhBIr?KIOQKl3Mn-1Mme2c&9m%s7D9V{R&zdq= z7Xplsa)YC?6*hF$5AO{o-&sJMH*TH^|RX$?Ck zP3ifU6A?ewSr&x>1`uI3$DS*Pmg=XT)AZq2FQDVw5=--Bsb&5H*d$q;5e(MO5zj9N zKAt(wG5M$5r=Pi1_h=wa@0G?JFXvdjO?E|=P*CTd)N@ds$2KkT=NgFx@O2aYbo2iz! zk5!k9tEm)I(_+H_9yl>6J55sYbC%aQz*kRRs&mu z?=K()KP&=Zv|u=m)-w?LsQz<#iJsT*u@+DPQPAflqmR;MExew2(EPWTHkM@~b0wd-4ah=-hXy6H;l!=*kE1AmIXVlvd z0UPfPSZMljX)49w;xO;8r%|jAS|%2T@l308A69Zz)(L;f;;(|L6l?`bhtPZ;myln! z59OU!@oU>0Fz-Fs+?BC|-eRj*@3#K0@6~_|eTR9G%?c<)&zhxRR! zFA>f(Rppk1-4S;krB6BBZ?Gos8lR6`n$nuel#-i2qYkPhXn>q82rOjtHFHyG?}6hj zbFbC@n_(R<6n3D1Ns%t%unWR5{zTqy{a=WC^RM;XXCvM=#9fLFeQ5&hoq^0PACB#b z;A4s~a%QGJy#O09xeMt)>EIoBD>sA1`PRUJLJqDB<->vXm63ML$~#xjKX2;{Fcy1f z`hozzE9QCgFM#H?`jfEoLl3^#-fK#A(fz?4e61(yv6b)QqV zKCW?#b5H;Upo93VnQ5=wm-;%W*B39r)byA%?^IOr49wgC)dcv4mOXEK#Ic3yck3ly zr1yd8KZM${d&;ZmmII7R9?VqQo}Sbs5O}6{67Q@hOFz}-9%G_DX^a*<75eqbW&e!k zcH$(Z`M;=ASe&G0KLhCe8=K^E{QbsBo7o&TbR`iygMW``ar0uj2}61-N9_&xQ}+_= zoka+`D_6{7(Www@m1>obd}MRX%TOuc;e{t*w1y8Ftw&{iotE$gR{^6#i&I zVX@v#a-3!qo-1SZZ?#QEzi-pGpB%(Y`VLD*n4O5C=*$A*o+$}P-_GV1J0D-t?#>iT z?d{o)XxDoKFyVkKr;Wm@nK`on_za`^y(TU_;~s3@<{wM58MkWKh%9yVLeoF3c*0k% zk*)2~83gI6mXHneT4&uakqq@5el4&~)NW10f*lYll;CDxRl~?2bt>$nEP{&{qa|& z@ts%huVyY`LV5%vC{3_O@0x(10IovK1LITow&?8Z;+UsEKSWmb8l?F0u#~|sPE6iY zHyHoIez#{abe92jET|aVnT`WV+T=Wl9w65=i!I{hO)7VPvlOqqE6*HyE8ibz+Kt+P z=g6=?H|;Gwvh_$iB(a@0z5QMW6zd*t(sH1@pRzGX^u;U=n*XUC$Qt+hr4ScrGAU9& zbvuXD`eF$Yrct)b%=gsEkD^fj5f##!v`kb?U^iUn_Xf}u$)1#a-FpL}&)QQAFdHTs zrV!z$+PM$RzVW9;8puOxJG35p2EY`RJ02GSW`*fsf@}W;bx5H(pSL)qs0Zt8&KI1u z{>5M3(w}w*&0{N0voXd&dzzCE8 zi1M%S?<9riAZD`TFIcgz?y>EkP@$tT!=YY$#OJM*@)Kgc5V1_En2g!&D6m(pEdz^t1t!yOBNCFp{Bf_q&ose zIUkD$Dfy?Fjor2xdgJpQ2iJa;HcJ5jk7sX`Ug}Xn~;CoX~{DFRVxBkxT(<1D>f~O~7u+Fkof}SFeHreeL_3y*F7MukGfRuVJ}_;ok;}6L&tM4fnUnuHgWS#t z8Ncw)7f1UMycI67?qAuT|8lISob{$@Jm`A?mGX6BZG_$AA`tpsX_p7aApUGI4FE9{Y(yG|Iz9Rutquci zGFO74tLnngokgdzNAdD?X1YAHEIC!$bBhH zEGl9%u1A2K9E&ZZv(#$AqT=m;cfmLgdEx%E7X?rg%`rYvq5~<{m)0;F*wsHA*9mX zvzwU=UuTzIwYg8>$g5OOG+YvU3k2|pE(cWn#W|}%jh%Pn&*jrhri2U+RQqy>^y^np z%2bc5`{mn!RL}3w#H@R}jYakgNa4QYlOQ?_y?sNT@zCm$!AyAxR zncyJwM$wR1$n;p5m`;!jBDnP;Bcb%vDb`?Bo_^DU-u-y>rPGOj@Nsh%=}X`~C)Cbl zm05Db;q788xxVLf0=E|`2oBK(YFOVH+--tYy2SIB+$%p?4zYhnfq5KM zm83s7A-D7?sKvPkdz#p&+JzFT`Y69htR-)nr5eavI0rneiBRbchZ)@?`pU7uGDH~# zVhM`cng4iyPHc4WQmB-;2gJH}hN%OUnqWNnbnCL+rMf_7(eS3(l6#jgjIqi{iN@ zLup-jBo5!V9hY4JExBtO1HOUk@2QioB86Q_(Z-3%{)eg2tFRIestaVbe0-Bhl~Vu& z(03arvAh~noPP8)MtnZA-#LXJ(ygT)gE(p#mO9n7Cy-&{;pL-yId@>qL?~{+?D4+d zG*R(K+G<4Yuweo3b2|LOs|?`c^EqbQ>1hR%EhChn_QL16?wtxmhxep-Qh%9jns7dN z5PQA)Z|`})-khnrdBO>pSc}Q``yR9SgsN^(Og8nmtqOhi&hWYTCe#=c{Ql~1Vtt6^ z!mb$S7>;FRGjQvj%f^=hnkxV%m=T7uM=w#ek7I4z7pi1<;n?&do7GV?gRfIBXZpEx(%bURCeclUl}y40 zv$zHcs;xtt6$>_r_CSLRb|-5~x4 zbhb5*`}QrfqJTUkm)WwlAH*dhapPLASs`5(P87lb6I)cgXdPuJ(G!XqTbe>0kNS1t ze1ff-(VO&6W<+rRb0CQw)MZ3w9-g^RvcCE^`0HVS=Cz&)9k{_vDgtt+)}D;3Nmu&{ zntwbn0ZxtK%)_uE-PIAz50loM%RU8z&1Kx6l#}k%dm%~z45_JF!V(yMmML=cs#tRY zyQcj3!?yQFeJCI=t|*`wKX%ire->DIw!4xSPY@VSq~14q;PI>g?i+5k1;^>%9Y@1* zrKz%BUOK%Sq04kCeqZcLcOwJv_*KDh1DqN-0&m(1C_wfK%EaK+(aUoGUHaOA>~QVa zZVco%M5!I+uiHgUjzERiMN_cB_Vjo<8ZCFAxEq4r|+sV6-P>EYQEm|1S*~2o?Fb6UCz~dJ!v)S*q4|^W50Q0wE z9a|xdr>H>(QflI-C2P?Gx;7o?N8x4%Jmy(eJodIIMr`RK<5st!e#o3V1GgS=q)9wu zscfpuEG6>x;iO5@L-ti*P@mq<Li7{%RAty`O05C=as{xVdpo0J~nTUZDbhlHaCTHudl6-z=rbJ>j}{X-fHZ z{?vQx3$1^-au~G{S0G0(p&8PS%ksIyEwFz)_oA!vcdaC!#cJ32jTB@(--1coa@l|< zl-bBRS-7bshegFH7t<{N*?Ae6f*(el5F&LXHd@J3zk!7*C=184l{6(rk^8{svRWf# z<|2r)HKlP*e72z-4~@?f{Q3MmtB2no9-io#KV(DgGV;i;BI=LLjc#1LD)1x`EV!>Z z`}OJJ-eV!gLRKmn68i4WEOHBtp9e8FahNiY5|WpfEi(47=ke~esn^*bydwGFyRZyH z;X~#LmHc7ufSuSW6FtTn6rK>%jz^u}(ATNnt+Gt;kJ;8a*)Ygc)USK@hGE|=E3=Aw z#djkGb_=Ubooy-FtrTWs{~Grw8V-BVYUJd?{uEks(&?{~J%WBXB+h38g~QR4{MS!5 z2>y)*b$d;k{iV6>aqiu!9^@Ssl6$QuiH%Gw(0EH!<`w^ZzCL^A$k4oJjLkrDBxdq> zrsw@p)TCHjsB9!vY?_B%Kw~F!q&DpZ?v1)o8-?Ib<*@s=9Bbd`L0I>p@ z#~JHkrRUd+;E26Ih(?Joth3gr+^PGfs1fwUZs)7)&soa2=Ed;Ek<69&1X|Z-S_iA& zSPqnNM67&&>U^3Ia?M6<-Ry$)5OX>vMA6l-QL!f9eRGI{IjblzbtU(?v&45+HN1;> zMow7fm<8P9%BhUpQykfrC#%WkjF^TwknU5FpZxg=9cewP8E@$rQpU|wbA(OQUDPn4U!uT=s;E94qLG??Wm4h+&YIrZ+ZHd4mWEm#J2@|(v5_2 zx)>g|R-aj?9;0J&46ecqg;I*-xbry@q_nJ8#GAw-uzsTeH6t3b%rvXNpJKQsvn78v z0}$oHjx77+XeBPi93x~z66ZCopETUX5CApIlQ=IHhb*JnN#DuXiQ zBC#%0goZZe$XGoks22|ew?J>@Ep^l9lVk6XgW?d0L z?V19|2Ads*aE1w%+c%0PL%&>eK^(TG8RVB~?R*Z|r*#|=L3S5uatE(4d-n=!ZRVk_ zpa_Pa?>D8p=8s=z&0G(yf{@qG^b^hO(v9wv87M|YP_6&5W=iCQ%{OCLva-risWug- ziwwO-^AXLWgnoDpj8srY2Cw@Jelp665Z$~aP5?vser)-oSF*%9g~b~HRK=asoJZ%; zJGT}Jx30q7LiJ50;>cbYcl${)JPsRv(&fnj4WfJ(;+`>72IZVqbYn|x%bGzTEq~8w zXDL`F$*`fY``BL0E(CN@&0j~xv|6$P)0>^yJ?b)SzS@}qGGkuM-TUz-e`D3(UB)~`^i15sLyad3NUFY~K-W|t(E2`60%S>~wY%%NIf3*ya(6gMMPtS2TE{>Y!ThmyF>p8`Jaqup=hv?0cTq!}U1{Yp8%*3&g+R z2!}%-|4G`vhF~UBBWzr)K+KbOSp2EXhTxE!GYV3|U^?IbKI@C*3W8+;>{B+AUQ=w( z5%BUw?yW^|H=5zaT~E@uV(t4$G*QApVkyS}wWAkfODOS^(R_{q-)%~Kn$UUxx^$4NSmixJE#w*-}UlrhF;Xu`=MrkxuWT19zPz24TF_;oW#qYG7w>f#Gbn!qf=|4qN1`eA3J7Ai zwEy(-gdd2w0dIPp62*uyS#A5+Q$HePAK;91_*L<8-=(h~JtlPNJIGwaEy_f*elFh2 zbtCRas}+BPF-NmvGT49-+%rgoXFc&i3*io?n&QW$y%R4wpRRIY_sFsR87;;Y8aOOL zFKuOENPzT+s@ljV`em}D&^ic8rxcTxxg=p-z_IjaiLj8gHK-zNOBln0PFA{}0#QT8 z0ftiJIB2f)FTPJVp9T%vrPH+^Ax5>|IlOhB#L2K~pYOb?Dz>pi_x${)ig)%ixYod# zzw<4}!r=3E5@r>y>VLFP_~5JF?PzMg9CznQ>ziz?p$B2P1iiMyYC+hBc#@kJ zZ7-oIHo98Nb{$|V6CgY5t&9DUhcUR(P;FQ%ubTzpH}gaY${^=UN~AwkT@To=4x3^^ z)6_5vLNCqWMF7Mmubr*SVABQ3Ij+T7_SfQ~0u(mAW$&!-?NW3mufq}Sx z8Uq|4OuGN{1XsVNv9udt{tG@lOQf+ZFO$2A7ve7}L<^d7of}%{pZE1z)4;#Sd-Mz1 zxm93{+^~rg`Pq_63&7D(`b_IA-jlNrX|4Dpq^T9sH zYex0)GFa|yS^)a*@!TU_>53TRX}rXLjNY?62Az7%el`)6wb6<^w{5@&zuB$ z?tTtV&uzR!|NY+fdr*1OE?S!OM1OKqe zdcFb?>8x3c*WYmZ<*`1HT{y3E(3s5rofgfEs3PbEgJLl+tBm=ETS5~mP3V);20ris zn}E0Zl)^0b$0mkva2;azIW6KS@n7@l;4bmZ9XQAHbhn47akCo9<~K5>uV&mAy&-#7Ja$cgSaC7(`^(rk6mm59PN$g{krWuW$nKQCNFsg(E4OXRw~p z(3M!8n^MxYy*n`Y_UIqedVBbfrr*tX(;B;Zr_vQ5aYYfPtrCWMk(?C|z@^R8qI7N{ zM8vFdcj1_<72D2+4Avm6!;I&Fe&!o)ulGBGJ0OZZ5JxC>;FqwyiFIi{ocdQQ#FH3V zW48gB?m351L>8RXFMiX&~|K85g>w-s9fB{Qm~Tigs~E{ z+GrxCf6KXBlpeVa3U_~5)N-j=%RNb~#hFssn!nhc=o(p|MHJYgu@B3OJ6y?29fXu^ z*WhF)zNF6&urOr$9+Kf1>TTxd6f5X-n8n>6xZKmO?5PvX3*S%( z%BKL^#*cb?v~Dc6q^FFv3Eb4dg-@hzxKoO@)^j8vvjKsf+P^I$9mVNmR&u9RKfWH$ z?szqkSejGpR~3Fo`q7MoNw_1vp=|W5wEFZ=ntJ#%J@hX2>%^kw*}}%tso^6E<6Rv& zOnX$0^@V!m{DY2RZ-Bs)9r~X16{AEc$v{`$)x33H4Vt2}UzI&rnfKQby@h7)-OdG8 z^&x8*h)^{i3*9SHKc|6+)P<2-SjiXRK!6iA={B>BZj5V00)5Cf;rN=L3ui)~>-q0k z#vzP8(|X}KD>O?8f`5cK4d2*AX#s{ATP3wcUY0CUeM?9Q9Y|0AS`{JYu5V*t{!G*O zWBqV|9s2G9k<223+QuVBC%sBZ%UU?P-1{dYc=# z?#ttj{o|`y$}|DbOd>^8ucG)PuEam}JdnHOX_$NO2xbO12oq zadGu_8ada_r*qL`#CuLd$Ck4We7crvo^#e|Ui1}vZO`zhBvoda-=VrkIZZBasEf8` zF5m3Ne>MgiVfCLRGe624wmts&tKSyd^Pl{`dgll#)sQN(quWZ*U!A<0#n~e`(+bOk&3!MgH151 zfN@23IygIz=_HbI;&vH5UAI?K`k$+byZ!u0e!`{iLO`v?Ulr(Gg=eMzlI;EUSnwNt z)B6a|$oM6q*q<=BO8&UmaGPt<5g5oq>3o3KR7O|gBl+~#n z110<0(l}2F*{rt{bJ_MIUXTQuCs?%ph(ktbL4a|zxtypUwk)7+h6FWZcB0z3yShDh zZ(EalVXT0DYw^p7XD#WA+sNC@g(^N;A@T)#@LU7lP2F^>l;rCM!hy1oHE3fwSjSu% zsZGOt(Kz&fXgUvnw%;%88$}gWRjWp-1FfQ}s1-WUR;~Khs1dcd+A9gAikfZJs1c(| ztM;C;H$m(b1hHZzk`Rd}zvp>9f59j7zRx+=b>7z{r3(!g)>WB}2BE$HABKPKzZ6Oj z@IVdwh~k+CvZtE7*rKZ4%X94;Ku#buIzftdpZ~!?+oK%bD z*a{wxe+i6Ii&7d|0Y#gC_|{fc2#ny}eEA|*{7?Gapitra{K&(5+{q=<4i)m7*gkuS zN5k>g3)~SUK=*R9qm_K06AVkQMe^oLQlt+6R<0ge#Jg=&_!F7X=mJ)TF z_KwQkwt^<)0Xdc7?#J%NR0q!BoSKusV#N{Or|47Do@rI7sE3q^$tBExZPPwsL0gb0 zku>O8M434xY3o2TwT3sR%+Vzg8lRDD^3JQ-zW)z3tj&C6vLBv5}-|m7UJ<-}Dg_lhIianc^PXhAI7c#5mLz>n;$7FvIp z0GRpnPv+g}pu9Z?C6<%Ft?u}AZv7ATP6Y`gNLedVTg820KIA3=FewAY1mIM{&ED&u?b6R`%# zwK-)eEGR-to{4;!qHS+`DEVzTqFWyRu;O+U50f=VSlh#{Kfp{B>7&YhC|jS!y+?^W z_;w?EGswz=8^7~}eZch$I>7nseGi6vtoWjBLB#05VKeuyiRKfAA6^f+j?}HhKi${Y6>#63_3FatFbU)-%wokj( zpPP>snI(FQu9?nAQm$)&uSDy5$OPQ^;@+Zj74-8%l>05Zn!yBBzDQTquN2+@I#vB8{4I=n)5Ar_l91mKoI#dz{^VgP>BRnA(8DmP zBc{GMxJdaTv6c98r?e@Bh)as#)X8u^jmDQ}!P2CO-ERhM-|vc7+5mc#gr_vOy14cA zLr;;Qapj$VKL}vF^o_pU7mVNjI!DZJ}Y0dp2gX5xn;^M5?zK!Cc3D@cM^p8(s)KLC;#BQv_e@ z6gti8YISY`uDcM3Q-ZtT@Ny$KNz)x6!E!{^<4gIrkAZtvFEQRMAbCZH54c$c>yLvxeSK%zZ7{LsIy$#Ra&8uA;hetuZJs9?S(M6cdlGWF(2&)P8f4DGKE zc)TmT)mGQso_g-B=EsiBy{LBUH`nl?(`;gU$)oEC8eM{5A`iOJg zBB?dCxvwj@o5$pZ3br~+CWYZEkCbMNLb0A8w#|)C=e%ZAX;pRfx3arY(%sB%k<7xI zm=jSxE2lLBPQ2MOg4%viaw@if&N#LAiDq$4^lK>=g}E4@WQd#;QHmZnHN?L@RDzHD z+sn=wAyPYFh?$d|b5%d6Cw}WZ^W#Oxs7^o7B51quEVXF}FTA9F3v=KQkn2KMus~#E z|2>nIKx@Wi(tFbnmkDVia)Dir`kO|2fnw;A4RpmLO%WwJyt1UbAp0)quX4Cxh3}<5 zLVR=n!@^}(qx-n;_f!~k82fNB?z_uv*E8fEQ*z_pktcR^Wd2{3Tfh(-)FFWpjm2?` z(VHEM9;{9JyibH4+$rsZadlX=Ki*)F$Y0|R7(+$)$5%AwVpO{?n$Zxg^lFOapJx{u zeDg*WhRP5hXD)FnyVGHxlY(70s@L6#dreGCPo8qrT5o)XNOb92T+vt?xAB}^m`YFgc;&}RH z$o}zW^^UYkdO{%Ky;blCP`^q6<$7#nQ5I$q^qrQ@btIr~=1ymqH(b+xy7MlSIKH(~&j`-0Nm< zy0>&YZ0)(0eidoh>FoRg;ptQ={zr?j%-6b)?md$DY-30_^VudWcR{TVQIIq8c+!mc za9-%IZY4$p6n%iZ1);N(3Zp?hL*h=X3ll3hrW>P94fzq^PbUv2QO$EC)egQ_qU_y6 zSCu?JijPD}{CWQ=@3yjlwO>%x1-v|Y;PC(#w~0lMd6=dmDmi~sJY29FY=7pmPp>|P zkxRDienm5`xDIuyO2Qg!)c?!+D4}F>H>}0*5f@zGl7NX&EnC3_pBxRuVZ0FF1pCSa4&-0-V5@=H7E^*mRBj@MA8p0=kz*O{;-k3LFA$JNrJyKKw# z|9Y0cI&_B1@^bS@TcmkZQbcf%P_gGz+1!4xd&@&1Jc4{fpKXWGPQKcjh0K4s1O_Xv z#$11{rTeBKxtwm7eBA^wS1&1ik|y_%NrD(@F)_-s(n%|JMItF33zLyX8xNe2r7!L( zT>L7Y6THh(Zh&OWf}aSIuTx^u{7c)qVc}*HvYs_{H~7rvUTb7z&Dj-e*ewI33|-+~ z79A0yE5;S3H=0H+C0O1Mw3g+J^-B_lW@;1YFzgpq%y%*3ZDtn*iVojQ~gb9)MPcaIOpee=+Oq$U}^K1AE2~FPM%+c2EiG4s%!Q_5Y@f;{)EU0&QOxvmTV$a?{wx|hBw$4_V zB3xW;>m~U&fU^0e`gA)$H)MBYy5l~0D6d7C(D+Nh3iD=&E@W7K@27_+qECiHc3M$f+z*$ z-rOJ;>1*}}fhS{$()x*uJF~Qxj}k|{`4JaJ%qbcJ;P0D$ExW}O{*xZSE+IDP^`G-w z1}eUgW_|~T!Y!<_vk!Oq3WsYK?x;ave7^zbBuD2KziB-({E&yxdUTmtSs6nVB;21lDR=OS3)S&|$BigxS?>kTU)63Q zc64rwbTb6urM)Agti*Lrw8Kx#syKIfb`MF|#9lh3FCV9u)C$(d{X@QuFedGI$K~&# zZxmln+Y|dh_NQ<49B6CJ{qvHkAf9Mek!9&TAbP6M|0JH>DNbnp=dR1TR!k9Z`KUup zw5ToMCMS;j_Fv)Jzfq57ZJ>tC?U(FQSU21meAs^bq;Xt8b;6^1*!7U>S@?1(@ zHpkx!GhXAwbAX@qgGZfhIhuGvza}tPJ`u?kD$XGM?%&LCx3z5y7h>>Is!bDZV;+5B zE-LVv5U^f7hR6fgFdCa@28^B0+`O}5&nd~W_OwdZ2+3M68bSYWYiCC`nVIRQ>#OEQ ziKirk3qIL1!7rCj~myAp5pL- z@)LAZ!Q^p#jJ|M|G-ZjilGA!mv|K6-dj+CS*C&tiAq4%Exd%Vxk$D*3s<~Axo|Te7 z?np&W!%wijUD}BkCb8EAbMyc{ag&gb!Z{1`hDOZE+JM-eO1#0mfy%@ri-zMc176vt z$SC{YVY?DwQf=|blpjWX%}y}=fiki-)x?Nzl^E8LQ1a8V$ld@@)Y3a zpn?BXqAgZC zL!*a~Yqv75b&WhJ5oX@WwGeVbpRS2e1jeg*LYiTaij90pnmjZ7?T z2B!S&EPao~&IrB6fsZW&R2K^&q{Jj3 zRGz_vH5XxezpFwBJtBK$crR3Bbc0P}s$r_PX)2mAC;z$h&{y?@X3HIck;JJ&Q`KSF z^%-QQ@lV^BoCF%@jQ&-*D0^KIvy?}fkO|hy*k&pCQ(~O8T*#)zP{}N=HAX#e1RNhz ze~IKAD`eQC0rb|kbpJX3t`_+I5Z|~{N-WktB=y)*2?6z4>Kn4e=yU~KoEQRiMiwh9i&%Q#U zCN2gLW>TBi%+k?}at>!tw1pj|`f%f*(iR0v-?2L*^S(%y z-#qR@SfL?W9bfAe+{QRXwB7AsYjswLJPutX|9-{^@lnRbAquJxXW-Li7F2p|1(giN zNk1=5ZCz8^DnEyY1h08;>dFMKREl6f5Iz;dAqJ@t;~t4%r@4ta@U#k1 zp9XjQ3Ja;o3F%_t)QvhvsElWa?0zFaSM!l9R7_I!d4^Rsj#1WXg0q%%9*i(YhAdH1 zst>g|Ul3dNTafK6EkNNTg5vKQU1mpY&GbXz+G(=8D~M2uDM0EgDP)C?q>dLRoWbzr zQ69aeD(coXTQY%5a^rVFYWFNZjIeIS_EJ29za6vGaZ<~OLTO98@E-$8|2@C#mM+z% z^re&5s(c$96Nu7$?|LdAydE^dSL0? z1YXGbS4Dt~tGG3rdr)tvv!J&00$u|ij<8V4%hhBL6?0yd>-TvQVio}><@m8%OIahT zSe#YDgQWx&H>^qaDJ!pT@H?zy>5AeqiPQ<8rtNtla6qhpe%TpJ1SOvb+Yo6jBs_$xm45w14wi`^;msg`h=Zh_yR=TLvl>}i@`j}6Y zVtt^#<8&)H#$DB;ChGan>koZwVS@~#r3TV=+eHFV(^rz|zn_r2AEX?ZjihYWxUSc9 z8PLyY)y{@Gzs-=LD@!m2?LXHTL28hd(7M$x8Ejm;0%ANhlUe-#u7S4xJoUS}?N>^IzVS2Yo33%xyi}`ialE?r{m(;d zD1K1)nZ=Y#Y6|%ELw3i?hFRmSgH_w96!k?Zy!O{bfbCcP0R9W$ zeB!vIc4lJdr)QDcDIICkgvN#+5H6O7KgA{su(WBBlR&xH3W=Os+A}EX2(h33y+>A$EMw>bR#GtC#p1aK2_ZI~8$8!_B+9a6Dkv#9oTGeXo){ zIZX}`q!)Bucjb7XPM2;mTD(|fX>!X!d3TyUc;r+!Y4}C5rk_K{m&L_ z1prGnx$&MN{|++ukEQ6w%kTQXuW0i(bG_P^rwFmjzpx~|-fbOmK2;!-@-5#YtU-Iu zHGw`SHsD@^J$H>!2{xv|Ue|-5^4Vp8S&(hq+K@dq-t<45IeW+}@5ud8LM0;OQ9~SJ z+lFm&g-W`S)3KK4@DMGe`M@sJsNCK?WDuFoWTLrPKUzj>JK^im^9QSc`$=@yrrn%H ze8cY?{b(48HgA5JTO7wN&nDEfW!rouDQolM%OHHkl&MgZd~JtAyAw{cjE$ zz97}0M2*Ur%vJRcRZ>R>D=Z$%YtM=sPix-xHlW+4vkU*90H7wGAgwO5+PnghEv_*u zRkl|@YStE_7xXQeHx}NwSNE><Mzq*prqG%D?GVf)MTu%j!@EOW#E8UNf zdOl1bUzMs}DDpX^m^kJMonL3}wx1ZeH2Z27>UOj5j*#NsheFYM4bwQs#3%M`JwqBZ z74exLY(64iHXs@fFKy0#cF+1A2HfSF3!?XdQ2eF~c1q#x_hZK|NiMaA?r?+34+2#| z!Ht?*!ck}XbI|$TU#W2X@bBp$$Yk-kTvp(?II;>x`BgopMbr`WsD}o3a1&m@)HV)$ z58BJLuS#x89$iqa`?2UB;uJh&EAo|!R^Qt+;a5NU%BialUd|MT^+0R zM;rfAJnL&|>*-Hl763PWt$N6(_>*|8V(h*hCAh;X@s&(azt4CE5hdeZJF7JU>g22W zFpoO$bPL*RnrcB>C8BO&50XmGnw#ca0_0I5&=50{m-+0XKg21R0MsY&=Me4{w7}{e zgL{y$Wwydp(Bb$0&94fz_fIa$)Ym*XjqI-0-fwUX9?B2Eq4d?3b;k->7D6GQxU(Vg zb8(vDD^vF;8WO2w7TQAojnq?{;@hvC^OnN^eG9SUWE8O${|}O#oNWzB=|j`{1p-e-?|xx}i>QX3tjW8=HDX;%D;{UcgAGbG<~!&@CjRVlynY1$MBB zZ$LmFwHzLsKG#zy3&0)z?@d82o75?Fb?k8y=a78wzq)FwILuoJ1_tE~Z^^=xZnjWs zWR5Yas&ynB+sLi3T@waGDkd`|7ZxDWD%UFUFIu2oI8tFY@EN?4@J*)`UHfI(y5g`( z8!|(#?%ivmB@&EL)nV{N88;yIPl$lrTrYpvbjxY?7F#c5sLZO{Vwpc^uL|}vLG82? zND#fTQT;v9PlTi#6(v#`>JZNuTVi@cZL_3Is+YlK6Q;6pYYznOlD*QM!}9ID_mp`N zd~nTa{Y63}a89Y}!sB=ME+K|fA`n}bgURm-lK$MPBqb;3s?sU1i`Wum<8Um>tF`4O ze}-kRF}5Q8sr^Oe&UbBi~Gn|KHC-9G5a|KxoibSqT^w{ae5!&A?M5#T*25k zI^pKU4&E}In|V{|2x+Zg)sM2GkCXC$%Wu2Dh6)tCgGI2dfyV#J}6NE1NO;2GT0g5szyz=!?BH%DSFn2wIlA_q6 zOlzb93e^1P3qI7%*~pzQ^8%8<_yZzOXjlbqe1j93M3zw{|MI1#gLL;H7<1%L*MIMU z2@Tl6s_esGz8x4~x-^iO>^m0&)0degHneUEQlp;$W;Ybya=7z zNBB`d{mt#&;AKJ|u?j-JY~1D~s6YxcX}Y-ec_+xWE9-&;{6rdG_0=JklFx3G2)w+$ZB)QjTk02FdmDZyVpb?K-I+ zCLVNY6y01l6fb#2)LK@Yw>kGHs5W$PB(r+$`VYSCqIirvTU%hbzebR7+B8|$pj5Vj z*d1PR!Vp7Wr_fAo+(B|ETI|QZnklRQu~vCfM>^xEtcfsRq#rYaI^}u~Sxy=r6%9ab zIZS~Bcw7W++W~EDq>`h=IumDd#JpM`?}cVO4qjm9#7#u{rU}u!VD)c&L_I7w*}RYM z>A|rj2jH*0n5TjtUx#oW1p^ImfpE*;oaiqUdTUu#Xcf)@UQ!;=sdhoWI9;reA+_M? z#c{ofpAD?rquv!VAINBL9lH!pyi#fSbNJAbe@Bix{jz2}B@WGZuP44)%G~E|Iws6p znqP7%wXaas)JC6fL5758(QRk7`Vj)cZB|I--_j2(x7S%=T6nW@@2oY;u_FDmq^@Th zni?FkfQl|2#+>}vsJE9XeIAFA{uNCU;n%mbr_VD{3y)QLm?qdDToC%x)>In)?58_W z#qHH;GFX%v#^yA;G%*t>t6S$$j^@=FnLP`Y5%ZKxdzEb&Uz9T(kK9fDsBo8MgWTK5~b z+^c;OJos^652m*F3Ev5@O4$qSRaE z3&qXjD=7qh$x<)~t*!*wF-Pf!sCgv%lIKw)K2uY^2s128c#aS`3}CHrZpetD4RI*M zfqkz;`SCB3-EU*-UGOWMAumqnQPh;n$|T4Xh9&sqKwEvicMYf?nnym&DA`%^-0?k7 zIafif*e{_}Q0|ofDdq%=eK0xWr$sT!_L-#ov>c4^2|p@aN7Dv2?~XLp{|pt7l#Rru zNmG03#wShA+c$g`@t=BopVr!>TKeNrN)#$5Rfa+(PTLi?y=mFWV)>O-qHp>iWM_UU z%NR~(M0zx-&-VIYRL-N+K7-cT{&b-MO;Mo3*y3h=(oz3byZPQKI*=@S{$tOJC=dQv z+e;fpdCw7<$fOE#10r#)@g2-ed3Y|OeR8xEPghj zBM+Y4ea-@4C_i?a%t*74k$xndu$9z1TH7hoLlP&CiWOtRjYe$ zw>{I0|3T)8@Au7n*5F0;3D@{=liSty_57JL0r!Owxs9h0W#l3e#kC3#+jj=yoQ>WS zobip5_EsGxqL~aEt?oCh;)mYTZq-X++`TrL8hCIr%tCnmkPV`xx_QP0sbB1 zJy#J8rGI_X*EenHD}o~9kB(Vc-eO?r}Q(9r0RVZznbs89a;v{ zM`_yF4K`;JtDv{a+f|?!C~`X|GIU`pfg7G4!?0va1pi7k1v9#M++V=9Oxt3Iml)Xs zdZXMj4(5G}%lzx`Yb}6O3Ro`MGz16VzPB}_59y)^x(A+D_iG9M#;6n1w|>b8XZglq4|)U`(4TEaMaWMK3KPBVF;2J&%Mh>)`9UHE*>t}} zTy`k0nb^BWE)qVzB)wP1FF8t(CC>OW&W-;#*XKQ2Qhgg59~md*0&QkDJJA?K>K^{?^{jAVzH##=r>HXD3V6?Z z7!y!NKangj$WY`N=lVfTsoKcc+D-u|XDf?Re_RXg_B3JUYt7(W$_(AdfA&QVE0VFI zsg_Ws;?!eF?bTz!%HE94{;N{N$k-CIs(aH^d>Wz>M))weT>tg~Z-1VB+?zz}MM4pzjcd(&iI0Au=p=9rEgV*=$))sH9uvjn z^QlHrk7k}*Q|XwJZ7~{R!g5ho6G0gH?oeN zh;7YcTJM6W&ZCoNrw2SKeUt4H^>3yG2s2&Kng~(fx=Cs~ANFVOy^*|5j!{#_ulslP zgI>+q;8;|MBgOwR{pbBstEa6(PCAl}#vJ-1{}tt|e{15?IL`w-Sj+_Qc?RK{kczE` zS=C1a0Y}AJGAC30Tghd@Sxbir(`25IKw)<4kCTj2!)RjgFVG4xMjx!8wqsWILj80l z5m^R3-ogJhX_XiDo8Y6wN`(NgvppMw^S*ea{I(7HHqk#j`&}P!J-O=4zth~~Fvk}~ zUP8LjpOxM{O=Oxy>ZvH2=c^~8Tsc8@6q0ztO9XgI2l8ak1m1WLOZ;2+3n6qI1Rp<; zO&qCnI9AeMiHp~zo*YbY0jTbL56*rZ9HVMLMY{?AZzn<3fK zBH95HRT#49qYJ86+4_ZS!9LdG=@V91Q$8~4Er_@r1dqpgZteO=zb*^uoJYz)Pl~Gt z?gi*&m_q4H5nR-{aj<>{e5bR)6s(i#GLdT4hL zx?LbQqAHVhux>O?UJCtmd;$lfa+=?tKRY8J zNa5QXLGAUL?rfANke+l*iiN2)-a?^Ok^SKBwC;a*^~?Ro_y;@48iiiI z8ChJj???mRNyvhus(h%ZXBDyv<#Ba=DX{q-`i&neyzHrTu8F(S+e4Q2r)0BIlOsVrmWX-(BX#QAsN zVL#$Gx7RM$$%A_Pa$tyRVwQ4YRd@A9dIg5$HVd_~!(i%JogIJisE;g4_+IZ5e3~$Ap{X@2c7jE@bvAhQtC>ltmfo7 zqF`SoLhzG7V8YPdlm6+)HS|gJle)D+XT_W7Uk{`-8fGfW~ENeSy%avsx0lCKo2_4b?V58O@%5;$G|NqmKI4IgXyp4ZACb31hwrG z?~{lhm=;N*&HRfgye5d?9-}y}pfOm0FgQ$RgMxR2zmS>TKOWIu2xui!{&z3^s)HYM zv^o`0zIfV}!Iu2{LTKV7NL>v~6#s>jiJsR|v)}J67zQ-Q91}B3;i*A;oBO%hg?Sr2 z;nJmDU5ZJF$2%5?c!kTVq(uTVscbKFhgwG9zyB0|SRt)sxeiuU<`-yL=zMl9AfNnA%Gt1>J4yJtc1`Gc9U{P=SO?Vqo<4BaU_KMN)EKO@Suqv`!m ze`u?7oo;04LLXG3pVc0E9&ttlJyO(AajPcE(`9?JuAJgt84H#Vi;82_wEd15k=|VQ z7_Se$^I@-HywHnigD%-+4hRQxBP*CCT<=-mSiIeHmGF`l{;kyS@*N$q9muu=*lwH% z_#z*M(W{BjfpYd6EjXZA*1MyBBDN0b@x<=h%{m>8+Mrza&}J?oC+Vy~g}22f?o%z3 z8AKraG5Ic^+BDN>jWLPqw#W;isy5uSQEE}#J3GO7Rj{dRat2>d$;%ek+8D}(%Y>@< zbBBe$gdSh?@iciqyW_K_`u)t++K{y0KLK}6ql#bWxBbrXkmtRvwqyggV*eNOO`TCT zn{Tsz6e7*M%Z%qU0k4`K6iZ?eiS{h3m76WKtGyOlTT#3kt8874?kj9erjIPs%2d1W zBS2!O;iv^h8yQzCx`#)|%jvSbCqy_Q6Pt-;`o&akJkE* zN0?49nUo|L{9)gUw-{Vd7pFQc{nk)-8KOG5xE+-C?QK5^~h^p)~y^}dZnw}1Qh%HAOJD;ql9Q$Bt zt#%sC*$v#PgSRMW9TXVNUip?6iLWWk`c6HFQZJY^HkZdbdEwtCq2}p*J-(tUi8RI0 zT>0$anRk%(-FhkMTZS+{LgZG!6yHLRA4>>@wkYk~i`_jY-P;mZKM7K%lDMn<41>FF z`Qv41sY^E7?!jZF`pL)VZs%%)O(p&&JLgj#oq#1yi@?J>tq=G{tw_HdMycsw3-j|H@7oOhB}b}N`d6VIpo3@fQ1H#CD5Ysb*F5v z2rT<34uTYo5=oKbnMQqpq@427%`-aqhCu%b;bzfDBiJE~HiW0v?d%N!7k=cmVIJ@` zL+ibAWwKW*u9z4)rjdVrN4yB7b;<6n3dg9JJ0F@X&Y-)Vp*R&#k#NT|k;)o)UB@ae zO8xX@m1)$duq$6LyN6L+@q5J?YhjRv7Ib0kVy#TNOhWNv9Xj#M4{uJ7%Z}^b7|mh1 zIFI>-nm~Bly6!(GGu^hFbzemoNAm07i&)zH-t9ZS?oFcd1{E(2KN673y^ zKFbfZpYe4a_Ma56`3Z7LHA|n!GWB1&{4{knkp0?whPh@ycu~ok8@-$pbE^D@3)hV{ ztD-Z$Tm`6gS*&n|4Z`HUL?#lJokF7z=4+e%HQl?#@~Qu6RrB1CxgynNg@zWpxyiHG z-!w&Avu`i=1m;U6cwAhgYyYb>2W```R0^YQ_wCr6U62TVGBXF!utG3R6jIphqx6~f zvUfwOd8)2KR$aG6q{p)QPJmW^^aWq2wOwk7>VXfQx7siJZM`6KVB+ zT|bAD_e3$%36jhI|7dsn0W#(9=solerYY&nW2#h~eofE69&R0X)75IWy`dMcMC^ zHTj#>YleR4UPnNwv3PcL=s_nSKxNeme>B}7T=(`g6aj5Ca|Ow|!^*)G(LwIYJDIrg zViai#9}BYDLiH^9evg01ZLQ9QB2;bsT0F&f^`2n85kO*i_4IcbxymUtm=d3><>*oe-HzRIg6KAAw9n0B(FZb@yd`?(_+8oj*Xafd z;+2CYX!uJyr7-W1rh%fogu2TY+}^Tj?7Iu61+yOzGylk5h7Z3`q^zfoFW9STme zTv|UKmDQroT?J3{vFVqv;+j|mt0&3yv}E$ZclWQa7~j+}u1q{uT?n4)iP3zMyd3UK zJ)&>m30S+X@WID&MNely;o+sory%ap{O9@xjTT?TGG7Uz;l*3ApB2e0wem7ww&{Hr z)r;ClafzBnGKx~ZfYOO}n=dHuDRw7Tldm?d+uqK@CQEer{&L<;xe)>oueiV1P?>Vk zQ2c~trcaq$rx+dXy9b_Ve<$#8st*8`hG*dv*0c$p)v-LJ+a>W|hNyl%v%@ zJVWXmqh+dD@Eg46?Dk)auF-)1wb~&bz0a$+>hfxslVnOueYLezvq{?8OA)K>p!s`T z{^%xdtVC7fCidS+{YXs)x?Z%CizSZ{OG8eKJbBLsKc)rH)NR=+BsdE;zx)@GWEkSfPdg#Tci~K*Q;J)=&_yF z%z2dzm0fp1PNq8K;`^xHLcggcX)GC5rc(&>_h{T}+!_C!;gPm+xfi)^ayEh0 z5E>SxY@V0C2(9a#xSgbEs><+(aUlvnsiN>-4xE~?R@ycBQ)Z4hOC{&?(c;hWRfF(s zsQ0XAzO5u~4tIAU(w1I0E8cud}Jp5A~Qi z!eG$O~O4jEl8@2(F)z?KrmZDyQPb3RTZ)cnK3FW^1)B3s?7>)5uR6$vkUa&gi-+EC| z9NMRlkd{76-|H+y>=Qnz(7c=iyhRZmb(D`Mpq{T$I9O`+`Y!I==2u_K;NYLe+g_0K z+SI1WPpwe}SkEBie|;Z;9G5eWy@^c!8S^>DcSBz?m90` zpN^5I0g}C|En`+l2NxD@tctrv&Uv3%i{Rhi2at@nFZV^)5A1}Y=PjUVA^(o7-;BDe9Lt?&xeg2YU5CoQLV!km2;8R;cxwB}WwrIe`>(f4O#T@B!bX{%kuRkJXI-#z)I6htfqrQf%oqbr+ z{IFGkjKoKx;Wo9JTY0hY^j4f@$TLsR<`07tKa2NopY0FT{cg}Yfrkri-+?$S5oFi2hM6-ejK}!gYwWiHgPm<@@@_ZFm%I;9K13=-Z zAg~_7&pYLvXPE{!JZ(FBsq`&CRxmmhe*Q(%;J%&RhO5m zX`=(!U`>27l}g;595foVQln54bVc zur`kxCesDaeBhB;vOo_9GlBd1e^%0vj?v3jq+`!d_ehJACexfIuY`QA{A9aP$P!c} z|M?*Hu5sc0~;SmRpYL;W`?7pyPgg(sFWe9g5ppWHaqe=c27Ji zy)&$w6lXD)DtRN~MH9N&8?ABS-F@|!xY*SB>jWXH4NgET%WACpfBU=*Ov?^qpsIDs z)ab+9nb#U=UKK?c6X-ieTuBS54aloZKX2Ze<;E9g2~J_et<-(16{6#fZrP7y!+UGa z?sH>xfj5O5@Mkk}mC(lV^DD519bMDVw^s*O1O5-(gn#yozN#7bzUjbry#F*Td# zYTj_es5n$Ym*D42m9+f^c;`*G_Z+)>$UAzXZl^fn+YCk>8aE+44mY16+6V0 zs99b#z2J5BynV`5@RqwE&>C`{rF(xVJAm3vTYl7^mxPc7K{}r52Y$}emi|XgEGsAL zUnHU1btxPNMMB|04VA#K9?HJ3Cw*a|`T;z2%>UoAAFI{i`*vXAGqLj|{Z;IKU}*564r)0TZu$as zKri^~oS0cyfYbvjK!yiScS^F-b?7=RuOx-N>z`52L!>!6B%>#MaHdRw6Al@G`4#%i zACpC+0*7STtv6|unWul6A2UZi(I0*+Hxq8t9Qh^vF^&(!EQ8sP5{x=hx&i z7jeH$puVfXJ$>PKVOK{`UpOot$MO7g*ipB`J=i$uXI>BE@@K2yjt_^LO?199KLi^S zevw+V*l|u^(oH?3kDH|@y2~qTKgPiNv!MzBPPhx!j2V&UE0tdvwu}00MJBF>2)6xS z%4_*VxcCq1?MDoS7;Xcf)w~5*<|FuNj_Z&excSP%mg;AKV_%Xfr#!{ZxHO>yGw+YWoxGIX{E#c>06$xBwgd2*CbY8v2UU5Yh_?^zFP zkcgv5c`&X{`kyGq06+`E#5=?32JkEgAGIfEN9-0Xjm>8LiFyB94lIa8sLc-CZTQqY z$xG_---d#Ipn7`T6LaLwn~&Ug>A-l#zs15A1wEWUDYl26;A)^ci3)c$Bpo znI_wDw)%NAo(=$L`KRzdnkfUtjvIoJ-5?Y8PI0 z)f-ql_J8WPUg?lqhPmQW$ZjAGI)2%tJ%_%P-4r}>O~U^5o~%4JjobekJ{EE-l^{A} z{ybz!`|x6OQz!r7yPPbfDOvk)04sw#47~%hKD%0{cJ@%yL1t%h&5*2w{ zFn^MCP`>m{z76=dn~j?P<(=KdrOvaTSClF~G#-2wY>7V^y#InN1zn{=A|-}XoA0Q$bNOX6Z`=9@l?4&GwP(j077Ir{>oJ&)}bC6=-4)si9<{QhHLHg+ci zZCuH(@-7~dLT(?ipR^TR^U0iEdc%B2pVx-n`%2txMn6>s)6S=!Td%dA*D3XJJV!m2 z)WGu{{6zZ-_Ws9K&^J2b8CYz*bA8=%q?gY_?t}=pO7*CJp9_0NNolDA0apU(&@RsL zVwG+Xyia&jKH+S1%oFeoj~ZTXVm7ah>MYpgr!(he1$tJPo?CW-rf#_zo(`D6zqR^y zr0&)%5NQ?*$Xn$V9r0gfp_H8$R~yZy0;1vS%4VkIpjQ(~UZ&BI7qDR1^J zl!6_{0Es+<9bme(g(y)H+Bq8~Mq|XcCIfx&d`Ls9R)YaE$8KRWhOdHkFDa8{(C>S} zbxovweUGZ)4eESSswMS1ev(^X2GT}QgtyKi+SSibWRL_EpxFQHDgWG54W}$acYJp- zdI$AiHbLf+V6E7NFdrBjG!&N#uOHyc4*>TWLksSfwl@EdBoW(6bw@vkd5OILPZief zsUJ0MDm~K!bLIcBvJphhC~8}rUJJRoHVEFCR^C|!x}@t5UJ!5D?LL=T^qXw@#U_2G6})SOcoksf9^p$Qt4g?6 zU_FirRYBQjYz)uSY;4ho7BWFr-(7!9PU#ct5n|4gh+~zcTU`d2+v5L+r?(Dk^8Mfc zX;ex@N@9QtNO!{!1T4ZJq+!xAVKi)nQW67^Zc#w#ZUzDy-MImyM|Y0;?)Cm0zu$j5 z_UDd!*L7dl^Km{-H_~Qe;7)OWssGA@tkR2Ogf@C}-|v^EvYV|rb*HSd-_}0TX{o?1 zrvCHB{L(<6z=!=#6G59rVYPs>b}5*i2&2|+RO5EwhX3QJx^exb3yI2)SQrSd#L+R#3S6S7d+D-c}gKSslN3mhbJhRr-7r!-k&Oh8Jy%$Uew@f3~ z|MOtj%)T1S5#+f$bqsqvSS3bFjItdgikTWp;gIK$=m|%E+x{|d5Ku7omXzmW|Fz$7 zTu`cb4vP&*rSuxL#7e5OG1zq4_iu>aZ^wRU7x$V{46&nIK8d7#zdEa z9hRN+QPa3{1x2`adQd^YJu*xJUy|+oRmxg^H~5*`SqzDm9@-b8xs2=g-zo8Uxsn~6 zs!q(lO}u4ZLY3i33B!w;vlE;0A}tZM1=t=|OY zlEOqw27zP?XVYk_v`T4+x*tQz>w?|{WbD1m4X#q$JKKzl<&C>c%h1{RKHxgBlgKwxU)*pX|!qOl#SBUDgmvE5tn zm8I)bcfo@5!n?oUYxL92nrilYCUg)ULth*L?DwaMZU5(L$?8Gw-qgm>7zL+#DXU|3 zYv2oOdW5Qiw@{PU4wK9$0c)NjVw2ALJtXU8O>?q=V5${yXQ>M0UB}lx*FVD+R#mpf zUb!_(lqW@vPTGmdOiR$RPX}l0Niy~=ZtiV)wzn)VU$Fa!Wj1A z{=wZkf&FmG0!?tvi}Z++xDTx@{BDuRWAw}+Zb{La=aQ!wFu#`!V8hzRO)~BI--FBD zd(iTdET6+Po0~~3xn0+-RUel(p(vlgyPu)B{`R%H(*2LDZv^RBL_EYK(eQ^8T?9&n z`slh#H^>KWHh(fwxA?$7ZP7u*T#*2zAe?teE|nX8^WhALGTfINB-TG^q2d`ccy!7Gsfxt3ghj}*c(QNyCF<$e#Ps^$+2IzwU1(GVSe)6pJJN; zeAi6y-mVAbb9cr_Dr3P?EpLLjkl=I!%7d7Xr8PD`&Wb9IJkA^i0T{h7pcDohZu7<4*eq4hq_DL(6Ng@*+OI&M_`uCRhh-V%I$Ss-l9YhX zO~a&@y#?miJ%3hBe@vKOC|}RfM21kZAGElS{IPAwaNg&i`aX$y5Z-0XJV3q7 zvYa-IQJIZflpB09P14@{PqAVzU6snZm^k{`ZC2v~MIy5dNI$6x;cQ!|^@!VulXBk7 zsaVB(10dwAbKbz$Vcm~o9Ie7lnkOwM+_a7cS znGR!%>33lLI+)R@o7S%;8DpX77^oOki`Ofml%;C*y*29p|NAK(Dwb1c%pfgH($~+q zLvvQx#M@XqL0UR?rFu+I$jM+uhusT1G4^0Df9FU2JFAS zDYHj~&3k>hTbjY%9&3)#KZ1TJYi9JOkD;ShK8n-%rMKI1{bHI^$z>Pn_H}jb&^~R0 zbwlK`nK1jg0$i^lj=!pp9#GU;h_8-cG|O&Z4zUw}niH=Z=y3He!pF!u`gjDodpds< z2M<7_q$TjKch98H$Aw)NB# z36=~9a@|6FeD3<(`0$dHM)&OA9p^ZOIkTmG!gl|*%vjXr#`(3t@wb%l%IqjR)OL%= z?`(cplw7Z}_F7&-6WMX!@yLo$4M$ZR>GNoE;1&>}%D7a%GyyEC{bziFOei>PlipEP zNc15uUyZ&G(E>!G`2?)`9=<=c=tVI4BzZ@KNNtt-?i{^HLB%?-664?Iex)k~CGCfd zSoeTOCJsLcYdx$AS(;#wsi%T;X-luUpXQqK)jUhK4cyXD`^^8B4Mg$i+UNtT;{j<; z*vvZgCdY=Ort3jv$^B)t!vk*b@qvG`4-EHEC`}@We=d9B#-!95D&-cxi)Y%u|D-lSzJZ?Zz&^`32 zEX>iu+aIfmv>Pmv)yeKk9;&qve#K;VCUis7={E=IufoCxApxR`;M!S^RE~=&)2ml) zfJ;u;--R@6(-?TvFJGbfN9K7S?->bAU}qB{oi5hAWj(0HWVW~BzM6vieLP{@I|mdr zAD|0b(>#(1teHB!vzB7~NkC3mkq1{!VCXtwAu}}uHhsc$x8($VQcFmR4N}Ma_|FE1 zpF0g$rn0(FgzQ#n>;Mm2cBDkKu`SC-?$>hWuLwKLZ2v!HqF4|Rq&>T|El_}as0XUh zl1ymvU9_LWv3pI)7yF!!Z(U6!5WGQ$B?8CZ{H@BhQ{LB9gQ_=H%iMliKrB-f4&&&@ zEfe2zwDKMr#8~SD#Tc6}A@(D-1d6@Gj^@0YpE#Fye%TNUM&p8qDPrza$#$$z@31@qD^-lziSIG} z;mzZ7A#m$Jl}@8f zl`b%(Ahxwye%H&F$oHwb<-nT#lts>KX?waQGax!SEo>0>I zUb-I{f;HTJ-=nq;QMa$ACsZ&hQbTz`5C)vN+lKT&d(~Hf>9K4(#$p zC!tbt;bLAxb+e03UubaLA+E3WiwrIDQwL-#_V}vm3um8G;^+AEYfS>)_gke-i0|irAylJ81y>}yKRm?h*%G-Wlt@+ z9M?-p8`+S~I;%N*j24?1IU$#KQ40mjFBwlwp%~_cUl}_`faPyA@$G<{f3^h^5p`WkZktAq7Y6^AO2HaV79!&Mp44+AuJ@!A+UiFe{1U20Yj>U z71bBq`?1#L#xctuWbDW-nx?iORTUfHhfIpk!K`4Dt!d&&?bL}YzLTbT&%G+5B7vSm z-L!s5Y+ce;WqzkIVDh5?GpV)^Mq`k^nAlur{a562T8@dTpw3O)?5Cb`t3gniMq3;U)t?;Km|{Z` zv+c^ymY2$fbgWCB#F8@0?=XKpzx%KQ>K0oNjT|?;>q?XTLFgW3E0V-+wl_y}b*6*? z7JD}`pQ_nn{{ey}QZ5R+6@_x#%TRhJn^jy~qgeomtv|V6{2Z$qnz6<8nJw_p2{5k% zip{aHREUavi2Anc2tk3S$e3rNX{Z(48BuTVf&fb=K+GD(Nyf^>Y0D_ zbZHeddh+ZZQ7WJC9(*-*7DaS$49*i47_7)8MNuA*!plR*DXkR#D|` zyBTw_*982@pP1ptN}}<+xtpKBfIuv z9X;~=Cy>GFnGE`MY7NcXldlmMYBwoyD$9q!O^hYr%zXDo+88LC;ki-1KB~!)sC*XW z^{aB=Ox5@LFmvGwxc_T(l;GEkyd~0gXkrn4LA%byR(F-$RWUEX3lqB9!VwOqVTPCO z;BvD~V5F5lHVMsWfuh^GPLH$1YsvKNW*7xrwu49=UKp5MgAl%Z1jkJ=;u?5fsF_~~ z+s`;!>J`?$Py~U^J0i25i`AeiOvi>EWnH+rG$qO1q>C7zziMdR0Kj&ej<&&>3y6>i z)HorY{j}K%aRmugUoWa0cnv%wW<>8M&$$k%o$t9dxyj(&zg^>WP;A3ch1)}PnhKhucT)%?|(~xgaPHHvm-86 zY(D%_1;6!H^GtPv4(9z)ez85PFRt5qN;C;jasA~Y?$KQQz!@4h!k7mB4m*g?qKxbR z*yy@tW{=ug_1xmH6$`^m(H)0QSkmyy7u!fz zRqvOD%JTk~KMKh@{NU$b6WQ>ZDfHBU{1TMzkd-1v4eQ1Zu3t}mlT(il{%B)*Pw-Nm zNKs zVMnx`t(JH87%4M)KQn)jX7*KzCi;&htC+vbmjN@96{&ZtVUWovJ2 zY@{oZ4|{EP_0p|&>`2W2cCQ8OJ>MOYp6(yaqZjluL$~Q_%9up76H7$t93Cjfon+Gy zr(iq2HCMG75vL^}r8?jy1HyoR^@&u^d|Gio*S=U}1+f9|5sHq0+MH&Y7WBKke!@ew z3649q$&%IYot8Yph3tl!h_+sFXmJM8`TS6LKgW{&L93eisS)RGs`%$wo@h(s8`0%d z$C8(}S$@yz*!DF0^5OCWh~p?@qJ92Ru>T=u9Ug#(5YABoc}k~K<4kw%RjxjC{FT(a zc7CD}Wgvb3EN>5cAQO_*AL+dnc@in^5Uk9(g){wJP5`|1)AE^`=jCkv>=Q!M+W5<1 zfKEW&Mn%=l=DC6(w59x#$p5h6+KQNQ4fKU7-Gdfp@bovY(t?uR7$9n9_7!pp=e-;s<0v*u(@tu8>>dW zV&T90s6c0FG;eMDhZNHW*U^bG6QTAM6& z=?%nhL0n@}RnQ}o>hG5>*M3%ZHED%1(c#BWX`e<}r}<J%=^FHkEsM1y zkJPfx>70MsTdd${LbY~eKg&eq5lwd+qpWGr^pkcOt+uXNelIx5F;s@wHu%Q3!+Pb3cJ0p21~ssw-G3)649j5+GkLCHsEG!<^cq)nU^F=qxZo~Z#w#+nGNsLo z<9pO>xs&Drxi>IQMw$6`2B$hHeupOMzx4-fQ+a~}jO`qn)SuE@79ifA&)8=W)20sC zK}I?zbj3qdT)Tj5fpNyU*+Ja_qBke3jj3P78erj0VN@sAJWpOq$b$~$j}R&am=LO; zPiFy%95-jPqexaPb}{j#ZMv%&+6z1RJCZQCVQc2g@REK`?_bF6HvR&xD;}S63LDuc7Z1D>f76b-X*OLD!UZdK<;Ky5X3gk#XX4@_K|W zz}<&dTNrWn8@v|+ozY-65v-Z(Mfx6zp)UNulxbBpV!X#wrc!`L_`WeGs{G;^(9?X$ulG1>_rhW> z+EL*|k823BBm7pIG`dn8^Ha#-r0_U*h}JG@8dU8{)?>Y%Q%{pwS}En~%@K_oQEAFM z82M@+wc2MQkU$&I&%%NHkcjyNGys6AwZ1_7hC)*>(;b7gVdxiv&oV&v|hqXI=>UvwEbs zkCz6-!@%HHS3gdFSqQh-}q_9hFrLho0(8UheC(5M3Ggfg0Knu963he&#tfQ|cu%!V@#_K5Hd5ZZ;Ahxc4iQV8;t?{+zI>Bo7 z*tudwO-W|2$X4+wJ0acwi@~5y4Zl7JTc~{n8#SiYHosY|ExyrQxt=_ST@{)qp7>3- zz&1_$$O&y~(!kb*-2hyx@~zK+OTzTILfKM`xd5f<*GHswVm~8xa~Hn06lk_9_Jdy6 zRBj_*F*H*mF@CMShxE+^)5epkL9TLDuh>@)hk7H)DIEJBtG%=*WtL!<4ItVN%339< z5^@&lrC(0~&-)*oXYZrZO20*X3QaV(bn|f`#3{yg4Qi?_6$N{8d|(AEgf3cFTB9Ki zY4@hL#oOeMC)8IAGF{qTI%msnRfivM<-g*n7V2w!SHjEHEuy~ari_*nc)^?fAH}e~t7#?jp#kUQ~aW-<>*{YTS){birw* z0e}4@f-tjy$gh98%=~n$X;Q^-z#Tx_QQTDSeMitFyl@;`0Vz7)20#ojj|wWWLzoub z329<$xdUa&33KrFQ7eti-u2BwDlp+%Gc*~exDPc9oc>v2Y>3ylLOLj{cov;p$`8gkD`vGt${|gb`dLn((_df;VeNDhP`< z@ye)+r-dyYvSKe|dMkE@Zr?)=QU8xa2*j+mnzLRvNKI!+xo(>P>jE$!`lP*xFvf*geEQ>A~x_oplv@v2^a z5Nd*s_A^Lw{{E2t=EZ%vaY`YJcORJzc9=tkfO5Kl`AjQ~x#e2g8BVQB+ zw5T0JR!J9Mx_l?-%#SB|I|?>f{ijsF@uoghYy2WCrbPs1?(rw(rz027IS6YtTp@Js zDPyUJY*_v#Tc_UHwl%RoYo&CGC8X1Q%|&VK9#s!R1`(oH>x3bUaksJ?LC7Zb>OU;l zz0VbuzgddlDlW%6*tcJR=M6U4E(w-C$7|X1&c}l8ExQQdG9tlu*KbyWFaQj-kE8_K zaImuxZlKm3gF)X(G_Eh12@kJL_WGe*9BhnTH_8SJ-S zVFdT~;f+~(izoi0eJ6wdUQ4#lnZ^+~z^hus#j5eVRT%sAJp!^U^Ro@JSq^{I zD{MF+oAri}CTl(VK3ulX#7LgppcI@dd1H`q^wU+Hs z&|&4sD}mqdbrd8-5*KCu5OvsP=ExEIau8)e{$1a9m?Ri6F8jWuR;bFUl#=#E`10{y zRmJBXGy4J{cbn%9b1I39Y*}!E2IHF4NAG6?J#&)uvKW|KQ*nNhJ+K08R^n#LtGAHk zeU0?`2Y4Y=q}OOaXp**Qa5qMmYfr9Qu#+odY9(N z{p#|l(UCUPo5q76Vpw-^I-l6hngKi2$DqW`fQfU%2j$RDpjN$n8KI`OV{1mic<^+j zx{C0S5nWVFr(SF6&x3jkY{VLG&D+mS>bDgfkfJeA&F;^&&P~kb>()D>_etJm89W1K zD|SKIR`_77su--SHpp`3TUavilpICmatiPK&?msCi!-Kn8Kn+5dJqEo%I2(gC${~% z49rJ#6*!U6uQp|M-FwwxzCwylBtlUlow!e`MM!Y66X8K@IC{IeGQUE$fMJS9j{eS= zZvgo78U|XG3|*jHQBWeFI3DhNR2qFd1LOujjr8H8V+cM^PJ41!VhoLDduzaWyw8f+gHQThST$nY@cBO-midk6m&%L5e@E};7Bs>e%T7UPRzEjK#_(Nmwg4%FpO(#)7 zWtrx#m~GzOtK_3UI+r>|;EZbjps3pHT6&040HNgUK>D<(G9m^0aQ03GJ*Qj7@8tbLs zvjOgQzs=;vWB{Jj#ASIn)7@oH*wmkytzi!AkR#>v%OiTmsyKLwVie1e3NGiMAy;o|W;k=8NIUntFS3Z2)=EpUhQ?NLqiO{$4 z#T?F!+-9jktoX;in)yr&Bp4P)5loZ0+KgEkwJv2vI!@jEgik=S-&&X3v^iRJ{Sgt1 z#Sk;IM6_Dez9dQz5_hLBxW#*@g$RnUqvY`sD6V@)5Qbw2tMM7m?bz0WPk6)B%O`o# zTxs1=pI*q8d86=>@P(a`&x*o%STeTd$j>Lo-H5}Ypqb0K=SpkBd?xXw+;i41#`Iu< zE9Z(d!u)DOMqEUS*WJVtUzSm$Q;TTdzN)P*i#=z$x#C`RIh;riJNqfg=poRxxmnl1 zRBMJLX|2bZFV~WDtp4QT_GDHng#*5aIsBYNi6-Wk-X7-?@KwHg2qZ%u`S+{Gk{*dc zGsTY5;|vRwUKl%x+VQo;g0q3Sx@H{^V*WXh7;pB0uDJzk1!;3eMU58AQ0=}$7R72S zhRZKcTnwQj37J~J*?ziS2&Mm9`m?sv_*yrmiV}2dW0uuQCU*cvx8G52o&4q1nWI+l zxTG~PfCmIfB)6FANvvn4lWP(hgG(177jsWp!VScUSJOk&ZNJJenr>g7JqetET9O-R zCDJJkcN#J~HOPm5rhPy55cN(S7-|;w#<+Ni6c)0<#^f9oITeV%#nzilnU>}z=(t7X z_R9Y=0K$x11Gr5w)>}xA3Ca!S`noedc70zX({0zA&SkFAH1ffiwyec!W+0r_7SQzO z*6TEIO;_=cHCYlKNX~W{vRtn51l>n44lAzEKT^&L3+#{e*?;!IZl)qjOouC{B<^`q zqYB~P%gBF2xcc_U;AeH}Q+5fWs<;r8JPbl_kYSYrFj$$byK7F?N|+~N(8A*ULnXF1&$rZSRQ_1O}SR+>{CkAcm;d{QbV7V|S0j&E4-9sNnrl%$`@kTpJ zbxbJg9%sL<~^Ef?;a4m5y)EhW+l7%5}isrsI zEKMA6(be1&7y3A$Y9C_U1obCs(w-cRg&V$i*NU%Ylki< zh)%-`QE#TzYKp%bSrZMP0S^o#TGsb_Qn&xm`V;}wKwB2QX37ezb zQ}9+C(WS4@DHE!kr>^u*QfJSq_sqd7?UXJA=1h6FqURo5?jz;CQdsQ>@8&Mxso@xy{c z>5W?i@aF5mW9c6{I%XT-?<)`WGcWhJp26_;+8aO4+kV#+R^%L&Rwl7IJd(_0b(6|F z_yO}`;y7$)%A=igJ$iRt`52|J>i>schk zP|itvntp zl@eXulp}K{bVVO9m##UFjVmLGeU%+l&Xw@qDxe^HeDa&2P+#h!Qy-hZx2s8;sgDSy zJY13*Alt=)05W_iF_((Zz?#ZU@jt`+Q`M&9epqH6P~F*mU-(OyBYoY+`i@(Og(@FV zAuNzh1$+6N&BJ#2ikzK0G_12jSEay5RYObeZoQ!9A)7i!+mtfEqGHf7eCs_QOWwDM zynQX08m6M+;U_^Jl^ElSRKBsh<!HMsM zseBvoh0aRjG zsMe$TaLgT4aUygWc{@Sxl;JKE>|9H&MKO@Cm!7dN{gcwUSeF%Y#AeZDD}B_d9>?CN z@PX7}>4G){PmFxpwa!(KucD1+d7NBbV{C2ru{OZOv_%kxmBpgn7ygC78nu9@L7S*p zo8UxDO^?KRy6f&!$bB@Ngo7$)`JueE#vhtB5K(+a9!NiPnQz-@y@h=wGq*vJgEEM% z(3EX0e@aZP?jI8z_#oYU$-%>HJOd(?EriR>f`aiRQkxu%s(an?1_W3?Ahg2{2S5(mZ!YX1@f}<7pSAOj)9(XCYczLiAifx5v$P4LO*0#Z zrIN;Ly!+U&`3n&&I3SDZl94|kY4lkOPAKA#E!Ax6a~rSx#d3Dk!)*3!t!FN)<-o6L zQYav0rOR;R+%bCt!wzYd8spEt*;AS2*o_1)Hhc*mF4uj6Oz=ls=_Mkh4*u)8f8z4Q^!#L$nBEbhQno7 z3AcvI`rfp7OpV-M?+!9MW265olAf{2;r-2`JD^vS;+^y2O>dY54;MHbz}r+Oj|`0W zJXHM+r-P9@S%IyHC#wF?eroO@UM6y&{96jGlpH7&H5L;H_-Y&|yP}$x)$lXYgBjI1 zBtSZ1*fib(taxR2C@kU6y1H4<1jnvhRJ8CQ-N)3Jdwvt5r<{l| zbeJ3Mv-8$BVn>cNQJsZzC=!tP&_!S-21Nw&L2juG4jbjvuGCvo*x@@h0KdAYYTSIWPWQy5a#w#9$xR~- zji-@^&G}tEGvlat1L?sN8lIeUFV;1gr9hjH7UiUq_j$g*RpRb_%+0$pb<_9AlM+g( zlZn|yJs_)UQx`2e2BBW|H91EiAuoFf0xfl17>x!_K-;p|xeS-vUPsG#)D=W~=?>}&> zrXQ+Q8nHPtIS}Vree7>1a8moxe^SE)QCO`#Mntlk#NBkRCY^ zmOfTZ@j;(@#gNUgXcwUF3~ACsjzPTk9GuvQJ|ZX3`-Pmi!Bec_iu0fH*01VH!kPGs zOu_qIsg-B?#)ThVm}aZtC4O(0H`$Y=K$sLP0!Fu{d!Ge)@FM0rKPnq+ zoh3p+@GB6Vym$?qiR-Y&Li%b-P?5Bcq#lUYf$&3JFs;0im&37@7~D8hP1 zCV0EerM}fm2RP_OP+j-AYi1al0w-)>NfZ{SEjxV&Vn_2dW+MD9;$3Bu81el;GY-_U zY?5%FP%=S3R%^fZ(t+aa_JH;a7R9tXbE=h1u~J+ONa;K6Ib@Z#6q$tNy(TDNy{aYL+=vs)R&(gNJaEfA74s?Zpe~Sj_{U{ap`_oHHE!%ws`yi_}MdUzpS;ZQ!nfsvP#|ew$HZu{ZGB) zaH0bm|P_c5V9%8jr7A2sKshCzK zo(k$8tM>;Z zAscclWM6}_goyvpT)N#)ia=_8ag)@<>Q9&!i^bv-QCCWp;4j&5PoL%K@^2xE<|-L* zx+hG(L(UVM&%|%v{V3(-oP;tk97EL*O?|LsI~98SJ5fjOY{@wrkxD8`%RzT-$o%d7 z5o}HVU%70xfXIOuDS?7=9e)~lej=b#9_Zk!=>Djrzx`T)3Q0US@8~mr1QXx=r=*{V1d*GJD zI8=`&Gk3PORW~b15GL}00ZHBILAltsY?E&;{siR*i&`GKBfcP+NP4lnPuD9_M&ad4| z(YuAWDeUHAbMyqN1@SzJ44-Vx_8k)omWIcz?5bYV|6c_p=JCeu0;>ZuNn*Oq#Y^>v zPEosueKi@$r|g@W7A&<=IL#ML z2)BG$Wf6*EH{Xa`9-)318d6-6k9C*JXW9#_xoij)Y*|>Sg+6m23>*(61G4<2>&d9~ z1Z}>puU$|U(5zj3#WN88oyz_B9&oM;N#ou3P#*2UCu{HDL{2K+sTN3L{zhyQPsiLt zr#tbG`9Q#CF{bnGsO(YnGZ5;`AuU3a(2cBp)S!9@cV(o1)9sEXBgV!y6JIDjAJZ5^ zJVsi8ZMT{p>U3YFJzou*tNndN)Tfim%evV3enZfzeUgkCG&{^%A4}rxd#k~DKdb(_ z?dJ-d$6_7=j!j`9eP{lk2D-mCkjF9|eDmvW+_So(_N z-=F{&`E&r{xw#7-eup|yszKp0!pq|Zphwt``lUW#3{vJBBv#{z%z zcMWA!cq&(>s@eFrS0-nzu&4B~kd%cF zk)TY=_ls65n0N@4o-?UmRUCW#3dhw^)Xucz{4uXypf(b^#a(xGO+yyXu}VEF)f*y7 z#VGiqSGchVph>v0eLCyCq-t*A26N&484>%4zUC<8$zAE)j0o2k2VFgiUMfRu&cY7- zpg%WF2Fhjme-ybF$NW3XMlD&4qTLXDIGt5`j8B@quEQX+_Zf*kHLF zxK9d%iGpg^6rSMEXzHKo&+a}rmH^a-Yym7B=eXwi)#_ej>KvcN95S(qLa-ecT!!7! zl-reLswqiwS|?F?7pm3$QqXke8OHLf3)$F79WqaIP#0_pZR*<=W~-c%`Z-N4#e#SZDA6G? zsoZNeXcTK%%ELozdF(Hvr_v&772~isLli1DLW-qAwsJDV8U=#NN=aOE+fZYQJ@4x- zu{IAbX;{>VXl%Rn_%wVT8TEB%Y44;cQLfM@Ld;lwdF3s}t(Q6R-T$|{AMxgYR8c$X z*i6<^&U|pZ++_q+naaJ5=DjMW%N8`rETf{l8?ZoHMQkI$r7o(X&q0)yf#hv@^0xv% z=EBDxlG%HLT)f5Xd#&q~c$ijsa@&s2?21C_txfn(wnwCL6wZM>tOq*nZ?*+pTB3}Z zrD@r*Q;K|DyE*%n3q(D;OTM((Fx909WrAqdk<@PY8E^>4i8twB&RT<}Y97+K22OX8 zIX8pDsak2H&h2;!YlK1~V8}2VcUrFIuL^w_@VXUtNt$h{f25XiPpKXNAzX-M-R`NC zq4Ly@mibVXOJOsrv6?6&B4HVhYO?VfmNrY%=5K#NE*Y&XGKCm*ZXdj}@Bcx0(V8s_ z^|rA%);M-o6;`Po)1l7vB9!~Fj4iuf1bvK}EbWTQUva42WSE5m6oh`(&gNjDUz6Y% zphck&m+(E)Kb!gW9X10~65xPUX13weSMcFS&pD9(y zK#_L7f=2l>ZQffxv4#{6E`xjb)CRNI836yQE!KF5`-{$ zfkLaoLx(xJ90#na>`4N(E9vR&mp%#4!W0bA)(FDx68EfkJ~%00hE>0YMAXDXG*Kmi6y=!Coag7 zubFp7(_ek})^dWgX5(C?i7VS?mVYXyU;z?&i(-S=d9uY*8Q0!9!=XYSNq{ExS1rGP zo*OL_h9nI(DN%H-B_;=d@e6RWi;Sf6$ST|AwX;S4yvljqC`4bE%PL~PERHNCVNbXvGiUUNScu@ zy|AEtk#DJJLiGHNEe*5X$2s%yK0Z0Gg|HHq>$r;;rQIAQN3oqhN))mr>@O!wf5Qp- zpzT!692hBw&U<3uox^fEo+Lx(*VY7;cHP0%RI}IWTl&B#Znn}fr0>*(GU}ZT4fRy> z9XULyHoU=NJD+Rp1c%D6WpV9$2l@KDcsi^lqbKKstV_W};6`d8j(iHsfkuyn{~!D* z4ezEO{2+;wNYCyQjk7Wu$cYCH!jta!x7{rja&DLKKcV0}m5;s9_t$TXJmF{-Lgnn= z|L&}%^`Sn!ubG4{8*rQ~Gznv%89F3dxzEF-N9a5YcU_iFw_*+0p9Qi%tv!BFAdv5V zc3Dny_r(?|A3fm@C_xcT?3N{nEdk#HqK6ZXQMVOh7( zGc|b!izrO*bAWC$8@~DLBAefF^^a|91q|56TGE&FU^`lo&Ngw@G48lWNGxb+=X+r@Mk zsL1U1=?P|7aq(0P4fR4dH4aUeNZ`9H*A1ypdnOEg!z#)Gx(N)W@M3K zF8#49uQGzu1%43YRYYIvpU$zQ3D~8$DxS!T{-7x*@^5yMifJqgv*y!`{&0I{Lf9v* zfpXEIQRssVqOdBcv>MIj*i!IEugqEFsQ!TzCADe<3#;rHgZ3Ar9?>K9Qp1&0#*|1%UcCr>C1p!~SS6=Nl5AWN zHZ&fUO2a&+=5{tiR=PWEs92P|iq`~c}xQW~itB$aL$x?={B7#fDo zp+>qv56^p^_xua{y7qnVy}oO&&lu9#_|hefZEa3~5yF@|dvp#qTlZM%^QSE+oCUxY zXhry_ZP?BmNzVcuSZG-@OS2@^WM>;ZXum1LjH-{qt@RD=H9|M~$=A7#_t*yofAvco zpglIfg~its+!8+E#&Z_fZBV_ z$}9J27Jkon)w2PWEAqa|2ggy5-Vrmb?1%g+vwP{DBuy21ankf+V}9IOYkVWV7H0!K zb4M}<<2?Nx^E{68My7))O0Y-Cg7hZc;Q#(={}}*5k2Sl;T)o^gZ`R!gXLE^DH`F~e z8(QBjb6^82g-{D@(Zk%@(WA|5u(74sS-%McCtL98gu9p{YLdW4NsnyV=ek<5KDNd%h& z(a9x}Ku?r}#>R(LCoQlrLmb)l{K2Y-UhwDJ{*1u_G*QHUE;7`midhgB;KKFH1D(=ZKA$$b8Z`Pwk7U6 z^GoS`(ReSNw7_*cgdl0z9R2%cnEL@!$;@lCvSibkV@!6xUn0@@+r>q`@Zz(;LSoA= z<}jfPA+1SCEwQAejQGs8v}aG$C~T~hQl<&Xc0R@x692_Xcs=rDIj!(05FE_Q{~YpH ztOyE7Y>r^KK-=xucyFqP%1Abr5wRP6_Odzfo>R;N@RlTQ^TQ4kuER;` z{Jv63-d+@b-(lpL>P0SYYF#LKPVuhPi(#D(sGQ=_L?J?~;7$D?JV7-UsKph!>7-eK zd?|XjsbZr>(p@#+0ri`DHc=c?m{x@*a}u{HTon}wR`kFIMnclLA}xSM@NblXZkbi#QY*45YQft?>$X~RNtOuUDSJTHB7;{e}Aa#{QA%Bl@l?3btGH86@RS;gR;0^Q{AutVy(wof4~szCWhzsM(5Hc^yQmvnA?$7@_)*$KQ z{NXnEHCmg4BIhXLL@}pwlPgP%!g87=XA0ZJhzv&+gb(bTnhHbrbT(COt$u$3(aH zZ3lGPPd+;ycRPDf1@djZD%zT0Qp(Q238EaCyp0Tyb>(tNlP|F@`I^5?ORAA4+HK5; zdxQ9pOMc^p8;~r#I7%g=y?xU{2T$$%x(r&Q!^6s^=VEb3Jj@wa`vyTqLms%%S9Q;K zJVTobQO((r8(#7WZzp{x^IE=#kKz&SgiZ~elyEAJv@74 z)H{RljXp)<)a+y)(_l!y$Xej&>OLeK#=z2~6vY%ZuF;TCC;5DHJ%$IY7G>AzQdd~zB z?_6{8q*CULm5#ajaOz$c!q!P_6hHL|>Op9%^35(Ebm7dMbDRvNLFe3R7A3dg(X?Le z${U(##vPB>Q--HR8vJEUm~d6VOF27dMurzG*v-^#vY{TQK;9-$Rm8e~B58!1bCuhj z)%a7x?|fh(TA0hpKzsY()TTK7Kf46lUPHAA-h~JjsEwg&qy0{jKDHuDJ`}y*KE@Io z#b1U$r~vpdTxnf>%Cfk@y&tfUJ$j8U}P ztAsjZCPc=xgNY4Xs+91u_Q4rhATwn|v!T8?BncTp>8 zK5{~M_VtehLMH6_6(xRQ!mW4r5lljF66Jw7bLe^D9};OkrhIfZ-v6lwz+C&kV?zG}B^9F<6Zd zum0B@*TeMoo3v2>|37ddSXv_|kxCeB{ zKf7S_eQ-WP1sc&#q{EuIjfIjS2OEs3Ia0|K&2bdJR<49$h1c@M;d&Kv=StykR%7&A za*wlF-shdXcBn^lFQo7jo!?d5La577YlZo}?6T>kEreW6ceF#75hs(bv1RQlsum(6 zHb8M+%E4>&vu9^>PC8@c7T+=R^5(WJIKRSxriAp8!hc5&+or{_+@eS85;_lOU(?d~ z=VwC3Y-N;YW`u^OX&@8Q&X7zxhGFwU&GlpJEQZI#9d&GUzfL#*no!Iw_&DLSpGNNe z46X+>_f+c+6Ln|$CtfO$PG%v=Q65g&a#~7tib2Q5JpoRgRzYw|`BJ5ZRuVSg=q#%n z7{&29O6Q#ev?#y*+ph%HNwc4UTpXvI0S(k=mtOK7ALM?Z-S@e7G~D`edk)#rYD#IG z?+tV1C^CV0AoEuF(7jC9!^1^u!lQm`ma5_37MV4HPYe~8Q}{pCGzVxvBFym$IIpu) zJYI3jSbdEpv5oL{x1%`{e8*3;ZY9{CW*`)d+wj|W9v`%vM1nC~ zc3~0Yd5<*3%>Tj?%yGcb+eWwYSMBP9QY=H!LBr%~XaRHCrX_|=_7_sHEKBo7(r%7> zuKR4+?2!$I8m2kA^C3MT9Y03ktq`8=1#=!BJb}n*Y(zfyH`C|SYL!Vmits@xjhK_A zS4;YC^iE6;9VAylU-1e7J_$8wha+iZT8jHQw7dn1VTo`KVJtWpxV@_PtR*~Og; z=_DtfVZ>eTNNm1CGX2Uh2*=%~oY-XZ_aQ}ACt!#*T8%~!ZlNUD^T@`|k#vmy$r#lr z0oGiP??)A3qB@pp7mv$+1wUosxsWzuy7vD8z$*p3o-lr%aC^@bFiy;<<eCKomPa3k6y;NX5vh<(ZSq`C_CQa*xXEuQQyemoaaAyMVN5< z5EIMRXOAKoc92CnAYari48(u#D0Ab-k|!3&xDFW7KMM$VNBV%T=jdkSa})e>+Y-iQ zz>-k|BclC=iQ5pzqf!a^mFr4u>BXgmItrCvd{9Tps`%r z2guzlY$Eb2W`r#$qOFd9@`xdvUP5*6G$3gEdiuF>(nnK>TduHFUv!T`XyC?5{}#`HktYg8w1WAYiaGwQt0Z zE1zBPBSqyO%7}3mV(0|r8Peh$KTFq1y!n^2L6e%24P(?!cRT(T=&fY8&I}Mw_-426 zM?$9~ZM=k#Bgi%tKQyEm(L@hn`WVQvrAzq5@RB(1FH43iQZ9ay;FRtM0V%Byag|iZ zF(N!j^oM;3Bi{O)*NVaPv>tr5KYLG?t_8BYHekWDuv$Eeyoyw|=gJfX!fRLs)0{(zVpa^5H|gDXV#D~y!XyHm z1S97o2RPp*l`CfunxydxP^4R`U!c0y3Q4Ha=7Kqv&5fCMw|FPSf`gq zgSy2mFTX}EcFnwiCCF@B#!k1MGAPG(@jbUDvW1Ox*$&7~HUV^4oFe^L=`!|;#vYwX zB|>er+*wwH)XqYS9os3^OS|VEQ~jq;J`Bh!suH4dH&%^5_P%iIhQ1E0 z%iVccg9#!w1^*^8TgnK~lAa0W`9AIV?k3MForVV^CxU$?lFko;Q)j9{6d#u9mA7Xj zLg$rVICiP)#u`?>2|Cz|29=mGPw9~51%-CKdYm|_qnR%ja)FR|%C$2baH{xxED7vU3s&UI3s zHf*<>Td_OS)#l62{#`Tl!tk!LM&x@r{nyL-B+(-2jm*~St7NxWw`aaAxh7_!OUX8@ zv439VDObr$IKE7sk;v?orvE9JoQ7lb^sCt8+eZ%@Fwv4j&xuL!F(CL%8gGM2nPVd~ z)U8eK!t+ePoj}og|7?{b)8=9Fj5}TbZ0FI$Et&MIC80`+PE1^Kab`0Mptb9pBr8u3 zj#ys!3{!euadr-@yTp=z4%&)?3kp-s+n4yk4IbU{*)?I=d9C`=pNsHkh>mHX7AH~m zvCU!(O!YQkW&l|QAQiA}z}PKe8RDACL`V-7#KFpbK@Q%O{LlB6yNM}Tb%0K)1{TTS z)n$9ADZa1)0#Vt%V-pgu-;#+Ke&Qpq=Mmp=ojKG!m?o#&7PS#2CU1)?_H1F?GXDeU zW4_^tXTmNv;*tMmw0U@igMXVwrre4hTd*WSQ&JqiArP-AW$UgkZo+_c6EglWQ{w7b z@+9W>#X7<~8dgiJVimC(~tM7GY3^XUx_A*<4tm{Ga<49rWlBrUwB7458~Ef`t{NiHq!lEf0q=Wt z36)>Y_FjMpUA}AjUCGAR0g-*zF)}XJJPMc$y(LgcD894eR)!qDxZtk^M-qjtA!%3t z5=-aRhU^9u5T>ZobKSa;J)?YSrP+0YKw+$zP{`2~2#Lriv8BxD&Rj4IVMP?-u4_n< z-w86fb~?)F3(=#dWkC)0!u7H=rmz(26m;MbFliw=#o0VZ zG2ufQ%Ec<_@W5<=!c8QZ@>`&5>x-q&J|n_$!Nm7v96@{xO~{86=O9~#Z?eN82(2OEfpp} zR233ehxfrt{rB}asXSqs_mj0gv2B3_0{Fm2Utq3Y3MkI)KNU($Hg7qt-{u#VPMnU| z38=iyzdSs}st!$YV!teEB@tzR@J^s)BMid#2NExBDYj<>RNw+@R;j%L@4N_G%)`8T zZa>hFo#@|*2BdO6?qHSLbI-8@MM>?i>5raWyl(Y+q1UE;Yg!rqNB^Rs8Lb+lZf@i- zn;l_CpfHZHH-#VbJOOTSud0=HKIDwbeFoE8z`A=KO=(#FM~d1I*A{-Y_xXwz&2p=l zwX;=Q0gNUOQ-f|k39Oruqo=H4e&c4Utq8rD3oqVYr}=qb7+T>V*%&lBe2O*50uKw1 zzT|Rqc|>+TSShJbKyFM;J}#eo6#dINfXv@03*tan1`7K&M`BY+lc^r4w8%zw+-s2Y z+nqXquaEAFbs4?*LL=hYu|p_%Yvpfj5V1A);36Bvsn>2Av8sFT55B>9 zl%28q9)>RLkT}^HXEN|FWWZBid|{juPo>uQTxM=2E#2#X1?99v>SbqzGPzw?Z|kqg zeWjgi94P!Eosc7qe@Ik^FJEjXML2tT!T)2@`L>FH2VR9^IjB=1mXmRC&)(nfH{AKO zIVUC)c#_{}3i_zb`tCchF7m*{`_wU(sgh>Cs!D7tB@;mM1SgdqKLx)kE;K;V0|#ZF z1;HU3|F5WvVAqaFtY`!0hA?$@R(1;1kG0Li;B;s?kja|~rbX6049(>j6y=#UZ*~-lz1+&F~#Ro)G zw_geG7q4F!>&8^ftg+~s<13%pEZxX&bQ$;A+*#lNBw>u>v1 zwcEqieXQReag=7GDYy5*LW|5BF+N#Dten@GNSk5-dzpmZ5?(@B;Wo)v9(dO9MqZ|H z#0iNMoV4mcmSnX!j^7ZVDKEY}fAwwD0e3BxZ~|6x<&$?-w#Ag7;>$|O)*(O&kpo#b zLkZJCxQZ7QKR7TWlJZ=aF}3S~L-BNHIi8g%izTVLOf zWm-FGJU&#cph=0+q(M1OM&2Xwa{-o(;oJSkh2#XQ6F6bnFkkxIL0v}GTWV69KhFk< zZj440xPsmCTJ~xQTSlWDIm(Jp%HUW$+Z)cu*CzNT9;1oc30Z_nZVeyJ;%(u2)_iCa zt-(#M6s6!e+ou>&oytm0g(cPw#g`U&(r>#18;9@wwo3W4mwiH4>gbSArapA!XXS|2 zf0~LO{}Iig{cO{~r7l466P0#n!`i%Yp3K#q)`3&+aTPJ8Hto*f^Cp^6FyWBW3kg zPm4`Mgbr{%#jO$gdpnpnu;QEnm1MdyJ*>wKRdL-IN=ycdDCO2*$r^~`t7qiE>F%i!&=v7U4K+sXWH*S)= zk($2`h|@(;>WHzFkc~6^H~%#7@rJ|G&xGRYil#goF`@Ug+qPV8?^?x3G%HZ5gS(7> zuu3frrz!r7sD(#2fb(-NgcE3higgDJC!A76sc~71FGQZ;DhWAR4r(!u-->t*6UlS> z-RfkY01&9^9q?Dj#g{mm1ir-RN$p!6psIC)&ZeN_^k~3dy5adU4eOoK#6;S} zMdV2g736D2Q2#I}8QDZIzZF#|3m75!kWuYZhrBJS5J;7uGmXr5BOb1L#UQ!}=Mr{`Jz6HQiI(O3$OgbSO}!n_cxXbDK@$;vbBtOaJ&8 zFx0P^@)%faz`4!aY#Y$EqQ~mjttZa|7 zrx5W_X1S6eJ+eK3Zv@A>L#JW|3>XqFQZQhPI3zVtEbvRn(}Pt0W`bI!ji!D>n+ zOPr*iRq0mFgHC90kdop zDg2TYCspP~iL=PVqMm-PPisG_~@ zS%mxkqXe%l0m7Y)gND7LoWc|500WG8rxj!9jmQi+VJ(eL&hX(xKNFxvFyUro=14j> zR511seeTr#M@Jg45F&dSsy);LNKwnmD;8pMI0ytixwVv++k!~g(y%-6ooM|mCIuakwPH>uP=8zG&XRRuKmf}p5X;*jL{EC_U}Hd zt|2#m4hPPsfQ~BQhE_}qfqbh8xu&A8bM~I$t#dx~TxZ4kgyQIaBzrL0(acNwk!bL>|}K7Z+$erA1GgN^R$rG-D4@i7x(D$np{)v>E>iHR`cX|?Z3}@$N7bV zF&Wn(pdc>$#;w4z@#7@5`@yfBgNbm2!a1S^q?s zgngKsg1vLbqBD{Eg6v`n_UA5HysZ5bvKK=koLA3%`>rfkUN>c7wwpWHB%ptp(lO;T zjoNh6fuz*UIZ{uRrXPY(KQsI^P%1V+jUydcY{)Ine%r*pN}xOX6Z$7QweHaDk)#K= z-~GS(OAef5sJ`bvY|!B=F0R+aPpJE13m(%XDh#}eB76!?Sp~)sP5}qlLRIg%b=gU{ zl=1uX@}4;<4*;la6Mdrp|En@cXuQjuiAJTlrXL=f4%7IFO5bl+cWyE=*JB2;^8?+i8*2ZK)kw z3LZS3o|mgERi_=jp0y} zx5EUPJ4@ghqE_#MG@z!H;Sf>N_os#cEO1_;qUXCnR-7QPnmXwa^AF8(ZU}CU!3Hs| z>F(T4k;tf8clGU+u!LEU8hoF5hA_pF1BvSW-rwTPRS3%1wyb3nR_HlZ#fJ$FSih$K z9u{a+&2Sod%X`3LrAd)f!$>(FHR~;Qahv8xN3t%SY>X@S?YRAUg;T3nInmC_TwM(6 ztRuuVZ6=eM1+$%9K<}I<*1X#}S3AJ|U_8Hy`d$rcSb2U(#v~^o>%O^!YfffQ z*Y-$1BF5fdP}QzOf`~tAs)At~nEnCus-Lcr*dG8de2$XoWJo)nDegCfpV@}(I%wsO zfjWXMKxCE0Xnp{9$NgJ*xztFEP;{wJ$9BZdH3=Re}PGoUhTy zGTrz#)UxrrMDU8z4R#gx_w1CY+kNZud`V4?Zyp0eJ`OU5wof-0H-h)%2g=9Q6J<<) z*kh8yy|6URCv>P3n#6%CoPWNUkkWzlROD_0@#?Q^hQ%2cX1`JAVfmvzvd1~b@7o2i zqU&d@KeSzx3r^$y8d-i;nlc4zvSj`Hmd*C17^3Lxd6sKJCO)CioC99{h|QNB78B?9Cw37mpzpR6PvP(@*6wR?|%*U*jaZF~5vg zV*5{cAiTpm{v5U z2sR?MIE9PPtu=Z+XXX{k_pxTaT%NB!w984}-r!WTRyy^F`PZR0c3b#jC){D@rjg^8 zj`rZ`i;vSHNmfsrmM(m_9U`D%ojV@=etqAhDpqd#BPe;?bCqDQ+RH4G$HjJ}lUEI; zPQ)4jnUJVmCky)GDdp3!r&~g-g$9#1SRORbmrH*K z;$F!g3f&DYzvDX|YO?t2_3xM7KgTzFj0TuB7PaC(rJW;|jLwXna6{r@u#~X zbLnk~h^r8Eu#J;S^?-f#LDycMx@oqP{vo&=+M?)o9p$QV4h@P-X?cy0{8>&tTL zRs6Gl=qaVPFOMpo;y^JpAzE(bdhE;fI|9Owg$Dx#YKWwvcUK{8BryIVP(6IxH_UgT@Vz@=? zGaWi3Xlw|$@+AW&JU5;mnH*H=1#FU`%3-3zx}zR z9KwcO3hC=y^Z)#fLg*rarCz~ad0l2iBmFSXbHOaV=*iu`g-;y|sC1 ztrT6L>z9z8_8WJ%^Ur?FkDxPn{U5+B+oMhZ=kM%}w;$IT1JS=VNmWv0YaRa$629CH z-KIf6C<~|A)Jn#s^57Lo#@dmG7IRD|1&r3#Gf55~!S4noK5J{n<%XHTIkEaBTb@l6 zc94Gn@bDqSBM8oEDuexfg@Fe{mLp9ZcA}4?9tb<<7#yGVt1Jz&6=Q{b!e?OLI~*FZ z3^JrFFn;ej>}a|tR=rE0)#t`4we%IGs71WjAIn+?3=eEz^-r2N^<;Snd7R8BR^Do8 zLQ6eOMq47T42D)}jPkt8Jki43vi*Ewji-g)k9JIQFiB~?6j4=dy`P_K2s*>zhBu%R zmlp+IjQ{jpnzHWIM?#}ip2{w2=DJ=`vrre)tI|qpnptu(LU+o_iuwIG*N-z_FSkmS z-)qVCMZXQOcspW=2bJet+n0_jB~P#*6Og8(=8pV+O7?R1>VrmqySZ!8W&OXL5#Vud zw9x4K>@htGu_8lW4WM7l4s9|uiGBRe>Smg8SJ-AbvbHWEgyx7HA$k-v5Of;4lJ<`B zADDGc__oKnQ~D7$7Lt)5eE)U|$pJ->u#_)LLYUD~PvYn}@-1hw!V=DFgu4ax{jwWX zagB$&qd^&K;yf({vvE_M`@Ub+v-T}8-kdJ^tLEXEqD(YX0uO{=jToT6LB-72_$OxU zLb=b3>Wd9vgz-a@za(8HvaWeVhms9HnapbImRT5 z+%ULEM-H-@sG56Zd)?g_Hz(ZDw2_GDT)P@|d$JV<%4zV+Dv|kz?NNjeJ6O%Rk=F(P z<@Vn&V&7&A>h&(ksNp0J@T$lak&SsN{*uIWJ{~VZpayY;;)*vas>Zz-`Cu?P#0R_dBrvy4lJ^dstF{F7VkgyZ|0x8d@}PAy_aGsZAL%7yI4eQgez&$%1F#$ z^iMyIl|L(e!^yRIFf1mGIa&?7gV)h1Ft$jbmj+MnY{2oXu-C#88tf-HXkQk*g-T3j zQ=(4;Q1B_wTKkO9HGml&v=Y4H=++~mH(x;+Ak+0_5blqMNrT>G22ar?PI#D_%c<~+ zJ(2b2K^iEDtc)c`p?O)k$@kRHZ#xm^h8R5yWQkkqQpMjYN$a$3^o%^$I-#}xiYJ77 zc9LV}-0cMe>#o{=FaEF!RJTca+;yJ~CV7+E(Y47sd^Lxks#gl{OJ=sbs0$D-~DXQT|U^tu$U9n#Ztu7_{0TA0M`kR;GvCWIgWFoN*m_d=!(h zy9Ens(*oDj%JLKYVaFtAU+->wVC}a5IoC?K{wHGDio6TwgFj66;N7M_0sI)D&5bwd z(KU{I$drCmup%}*%}_VmHtqUto+&d|_f(4Ru&w5nc=#faVjvOyi)-)l&Bd#;4a%70 zIf+5uZKUi&{?zP=%s^BMax!f6S3408W!&7(V@8{1*Cgt<&twn+)FERZH)IMp3Wnp# zRI`+BKOb$-n%!o?^;p#%AQjinhuyExBa{~+6cXP)#;w(r5loG`55W>%mvc|zc;Q!k z5sQzUsD}qD7yO2W>!0UCP@ayz;8JmiJJV5WkB%S-(uHaMbE(2SnDf%(FC`?FctLr< z<26$=N79|8_Z>vgT=Z#Xxz3NmZymjl?L3cRJ(0fYM|iTgk-1U>)z~;CD{%?FM~Al* z9%wq0z4B>?MP5tI(&+|`TRZ%elACLZ6fz;&`io;BE^n^L&fe*4TSj1{@q7b#t9@}x zaywr`Npnx@38NzbNN&K%Re;3%$KA3Dj)lMHl^I;-G*hurWfQI zoNm3p6lSf2~&i~zz@~P7|iw*3~L>VGYkD}-AjEPFdSxS2X zK`Q&|GYz`=jWhpIU=0JG2+9igzBNmgCUzJ8@9&9>3#MMMf^D?ZpwPpnGtL|d)M0kn zeMebcT0((3+-T6)LE1h&$y~3-lNr$8HFfex7L`6js@Zdu5WU}ssdBqfJ`0CMo}Ras z%vH6u{%@1{{?~(U-C>Sus$mHzV6go6(M7BpT~S`RbYr^j(^RhgAak)N&u|BQvou%A zHHO*wzqJmfs4?(^fhvskUhRifsl!$MZY463|DH9MYL;m;x)oyaAP;y3m~&WP6HacT z8Q5#G1UN<59nJGD7a-8h2LKmc?*wTz%1Buu^`?-3?h;Mbk0 zD;|Wmx{Iin+91xf%=tR$6@8|S+kDlE`RvYmBZMw(uf8U)y+(-X; zXtm_?p_vEm% z-v?Xuo-*WEItsjHrSci{@AVNx@8YTHdk6sX6EW*JW|a|L)=Zwd)aWV{{U*3jJV>BB zz|zYk6hZENn>B&Mavoilh^a08FOKQd;CIGY;6>C*b*%3jBZ6-Sc%(|n`uD1VDGWR= zfWpq1N1BIW8_O$}$a{g#HNpc_mwZOxVq9RnRKYo#+;b}+)?jqLKD|M5-Ic`{?IJVb z!ZWzRY@UYXW%raTQ!RoEQ+6%jJ+_2HGiwV(eNYtG#?(lC1oo$}?)8ux?t4(b;3ZN%$*bvd4>PQ~((f-Oy>t1@&qhwJ z(JVjIz-zBPGn6jKa3BCbt%?`e0q6JdYul-tVS7>w3-vAK#Qv?26^WoY_p9lt;ggp} zbf%4#*-*Au^R;X~Sy=CziwIlVuKmQc8h{rB4B z_o?0}*U@-&-^UGfLsE=!miX*e%M?2z+x|WT2xVQ}sD*8C zx^I1gn9qd+$sojpDQdd9GrTZY4&WON_3X)sqltm=LSwt3v1{fumaolTjp5#f`N`c0 zlr*RnReA^BOAu()9SUO=E@M{xY-(nkw^eey+CcQf-%09!zDhQ#a8#b1jjA!)d#{XAum(ilacsG{)Urje77q znbZ_#sjOZ)SF>lvT-AWkP`>W=0>Qb)fnY$+8B@(i+3yL@JpQZf9&DN2FWc`i+R!IO zeH9(Xs~4oR2yKvxrQhfMBH*GApFP#-h_pU#q zkk8ya{JDEzX3nlyawdD!*U_J4J)|#$_J6VyIn70OI{C+~G&0Kvh;gcoUz3J0Wf7w6 zO!GM`uHX$brz-guYb7XTvR5W=k>~+wrVdx;bc$Es{n=wd6q%KNHhX}rfi&2lxI^K* zC;y%x?Z2T@hg!Sx48*18pv*W!w^aWWAw0OUT(ll&Mdn~y+7WW`@{ICpAK{*%zk!+v zQKM68Qk~_I4_1f9t1DY?A&K7^DYMc2sM+ncbh(q zie*-_lYQ%ax=41Dnh3Vv{!pFg?Xs=F+y*{vy0@;p zE`3Kit+Q=pZxzAvE#@l9EgzJ!TbflT90;hhxmO(RF73(s1*1|VNkH>b@x*_;FIZ^w zEdrQgXutGOh~3Z)QE{&IUq_faG4*%r)O=-yys33b$m?95jgIlCP|nWyqdS)4Z!KUo zpINdF$6NTBZvLdJY~kBgsop=vY>Azq)xzFOQcWfh!av2I)B?Kb2lnw*iy+J&zP=Z9 znoqB>r>w?Y*q8`gb_s0s8H`K4*__)WacA;d;w$3|NZ5=lCSC)chU($p{0*ZEqf^ek zHd0_R8ns=gRPI==@(1JV9GTl6Sii^Q_S~z-tr!Y8hl?RjBdn~rd@I^Ivx>E(U5Po% z*-^j}Hy!tbu1qAVE=Ilq!8?ljhYl6{R zL`(~Fk5sc@RY*yDZV!19|Mt8`qe*3WOuygHx~ise`=yzjqQ%}F=!XUL{p|;dS&j7j z6Vo23a_`=3ca4BhnNyQ*XQid-84tJuYwxh}26tC3w)7|Wamf~;pGEPo=zH*y66@@T zZgiCN;PuAm;~+*P<&&7r#acuKvooqIpS$FG^eV2KNntOr^NGp%qzpE1g%ZG;#5_|0 zS)rE*vh>>=Y~%HNER)hcNY4KTY8q&zvlg!F5jCFsfZ>wOB1&Ht9dwc{k##8Eonn}# zt^}J}m$TR$tmUli_~G13xlU~3JC&P1SPm%Jrwpjz#FXE0Jz2 zPeqEv&VS5czjzu8$9zsc$YNq&`p5j3YOxP9!`N%}PFx+k=F8 zgm%WWXa!#(1VUieQlKEh6Zk|o&%{dD?eT~K(3-&S#RrHupHl=>!6-I4hq9tNJRsGs zpYO+YxVI|sus4gkOhUUYC&$p*C4pOt(UInlrwLdUTEzR!O`nac{A8|`US7*{ zY6^$|#kP{);l2D8_+vV#&MsVRE}f`AU04gR?Ux606P%>q?M02^d^wrOJH1%k4XGF> z`f91G$NSvlQUc|?3|);suqlC-$A0tnBe>I9o<^=J( zPv&=FEPt0vp@ybbl_*FydzF}n1uHy|w%&)LemMDH0rEy>PsGJ5>wTukqgxSOVfedZ z<@=yi^aFlKF8B`Z$f){hv-$w8tue^P2 zK1+}k^AJ5%^^i(y8TdVVPRq&UrOCiX#btbsRrNdMHQrvSfj?^*`0yjI|9jyqenc65 z2YX@R7efXki6{U0eo#bGn28s3&N#>%44y%ZBQIu5_tGUs((rh>jD}gIh3u-UiUuSl zyuvqJ`VnNZ@g?G7!8bJB7#Zc;xnrkSz{iYgmf$<>)-9Xlpm-125aZYedyliZJv=?R zs$D61Z)21tnFABcSX<4*$agsAV zjGXM*_abkjx-mwOR6!Q(!J~;=$EpiE8SJvPIWC$(^w;x(>$1W|CyMZnsF~-;+lcHj zre6dp@xz${2>6~&>}NB#UKyApcV=-VJM4Vi^yhX%niq3whPeXS!9)ndY->j4u*iWv zmbbxW24aW}Gmh5H7@$y$nF~v%x|wqN^J2%;veDtY31(W-p5e1A&thX7Z}(_3A#u26 z`6DjR#t6aQ<$6gR@BvX-P&#>Z!bS+pq8xA<=7#cMAh)|8x%f*now=0xlVA3z{prel zd5b}!4y6$0lHZd_zgVpFUh-Q2`+U%A2rGI_RorT}GjD96p8hms>C@McXM{V-t3|Yy zWR+b`ZpmY}%I5@fIVYLJKc|Yi)Q96NG^9!VWj$&X`;w0I=_>n2cx5*VTm>f}_pZm+ zpn;$VW3ab8x%;yx(ND%()NQ2Hcsgm|4Kzp68pdSa7c^OtvCRPN^=E&TC4> zrBjr@$(lY7B=k!-mn!*5cu*&)DwiokDy1<8o8YjjAoxI4SUve5CN=SI+)x-53lKeD zIm6y4HE37rtsKF(SEM^$h}{(}b5}Jl2B-3zn5TO5vwt@l?z)PuvfBv$BR%zT_aA^z z`HKqy8;K^Zr55F!<}KluVNu1(NK2gtuu}sq?J2JQLs^ z?>GY%v~w7s_F^-&-o8&uYS5BoNUJHtM<>A+ZNPNMY_v{qJX)_9J|an&yR%p-c-KOP zWGck|zT);*VBnp3QXF|%6<8}D*FzLFPPp6jX-31}oT-Sr?s@};{%48^5H;5HuUh=t zC;|21S#S`vcpYE}^sRKPeK0xG%(g4i5iBdKCNhAwKPlHOgbbKy%+#cR980zIIaO;-M{M28<_PANzrRHxqsRpjwQExGn753^IX(ia zveisdVraZKh7A9G_z)Td^sg{NJL&6WHeI9CzU$N+D=P0lyxxCz5w0>l>V#-sd5|L0Q1)7ZeP*2> z^_^IC{NT5*3atKPvGvX#|68tqg-aGzR0wijxUvp;nO&CFLL16~Luy|`U!vJlWt?{& zjj;DP*l!CZ<&tHl_$Vimw`WxD8wZV3zUS4nEea*KJI){!5HEi?h9oYd7(RFqpKT2M zho(xsc^|ltkLF;Y(ingf>rjO`2EeegX92MbB#RI+Gtnw8Rltt;xX!I?3S_!kE@YJ& zD;d@P%$lAy9az5}SbpZI*D~5+7r;(n(oi1A9z|CPt{tKLV1)OhD%_0+JF{?7St9*L zOtahX<}CyUo}L)P{F>>FZR}F_H(&jq<+U_3H(T)56?Lic|%iT&s$@I2pQh;h?;viX}Kt zbjl?OeV51Mynr^$hB|MBJ{#8mw-;K*86{ZkrnBLtm9hW32R8nAM?D+w;LAeE*M&h_ zc3!>WKhm78D&vq6$DMjooslZ3Zl7tZfy}IF*8#OW7&q^_`ly-J0L(Q(iE?&yZ?-db z;U4Uv%GlQ9@IHGXebw+HM|S@r^@8bFSI;BeHpAmZ$L$uG2MZ~to^$8yGn@T?WLHmj zVM_a)gV%yK3%5p$1F>G^@*yBB2)4)$opqj2-&_gWjjm6 zMGdg{)#OO`HB|x;Z#Pg9LE+#Ds5w=)OA=iNqG{zko#>g;hZF9#CjJG~`~?wUP}lCV zeNQZH+UM(mj^V{x-)W{YT3ScbPWEsNxeK%GPTeq=uW@grkK7m&NEEx|X5x5gKAxIo zVc2mySZ48qjDCibcu3`Nj3<{zziH|tB{yUqp6O%CkMPfaEKLz$UQhs;E3D%DgpN$j zGqF5VP1nk8(L0O*L9!X2-CGSma8(#JLS?FbnEc71IE<&EvA3r#v#PS^kM}!KilXAD z>=7o1h}ja&1)&Q$we)TzFl@-+;XYR&;>AAt&Cp+ps~43@I(`iwDqoI+ZK?)jWL8q# z{(8Io@2WUW51NNwgyl%08M3x;HteotM76JaN@jFP{aA}T9P#UeR1S@t ziRPwWC3`54puM<(}i)YOvdoa8sPEYe~abMChEhKYEKep#r zZQXRT@yINT37iB&SZ_SS9eK9gLy(p$SHIB+PxvvTGbUkGvE8_yw=M7`gQA46Bwp4_ zaKDQt%aITNOgaw4SkuABIP7((ywlp0DG+3g{OUYX4neD62U^wJi=6zoi>Iu0vcm1o z5xpzqCY|B$I`faEW`tYGhsZD16EjH2y|pR|IdS#v$(TgEwJ0o7!af+kA}q+@rq zdt*)a?;h@|OTHXP=nhS-5UeO=X@f&;g@%Ed5#`cCH3Q5twPE#GpE! znw)ZC10$DIJ9)?m%Z2oM`#{OO`ES2G3yCk&eRWRahWUKm{HmX*Ab%C*+HJ{TgNd6z1-aDMF2W%g&D!NEpMa{I;R+m*ZOF}7~ zbl59Mi;7XR2#L|6HBz6p_Exo5N$fpaVibuTqY^}{2$G0=^SW z6x7UkTrnyI@f2S$t1n?CA^u^Kbt!n${c$7 z#^j`=zO(YYPRD~sST17C0@KbY%Ntj_d#`%$LvWsNk?vOB6hCTyNCv74Wn2g)_9p!7 z)){;8YIsuPW=VRN1$R3%jZtDSKnI~qvn{5tMOh-ZwP@P*8_{gN7bhT~KC z`E+Qdu>R>OQ@6dDDvs@Y_hYi7)~M;z295P_b#dLE<>}Vr~cGm}mFDeAj~nTaQuM2Z5&ta}}`e%;Ki*=G@I5XSRGi&=@!N1XeD7f=Go_$s(lK!L%Zkc#!f5HN%0%Xu=f$+mEAH&Y zZ)wg{#E5U?32|Nzr-#5Ar^nGx$hP-`OJ7}DG|7Dqz})>{NwFeb@^vpQ_03}NEnJER8go2V-UP?&h7-_Oe)=ppk^;sN z2j4dL_P(z^tR9}NP&ao?y5lYN!)+NB+!M6U-Ck;-RCdmE#N&RK{c7>Ci~`@$=?dF% zb!{nCzrI@#;1=Pu!0+XcEj&IZ$n4Rv&V#hK{WV%|W9mPbRT zBGDLrYC);OzzgP)TC-lA(q{bHJ$zbViB@c1QLX3)Xwh?48QiM7y&boBRGx_UN#FDf$I#W}cbCfshfrF>349UIsl>Wc3 ztzYg7U)W3Q5c<)#U6-0@?I)e7m&sqNJr9PyiDhY^xqOwKa-S4%SEKa}J^|!;$;Z`p zQ+EG*N4x*BP|-!O+~nB?p~u35I`!U$e7s=hJGUcqD^k?6iBcgvDp7HPx$Gms#eny_ z@7qAtNr>?nXXra;;72XrW4;-J?f+RcoXiI)R<+jyKUAhbS7%1pU9W+TdVlG^W8?6J~*0MC9C;`K`=nIOP@i}(5mg@VE@w75n>9+af)YlK~&cBeg zoH(Wk=k*QfT&x?-5gsWD$q@N4!3ns11_`-FteQA^Y@#^s{;7#)bto3a3obRHv3llJ zLwn!|o?i@U`*FcItR%pR_`egJ!3P_WKK_Fg zXORcUg+9-&+bRuTUgigmJqQ|e!y%-eCUry|sxYFRvwW*-yh>ybb><%MN2z{oN>CZH zEvg)T)n8oJu5nqpG$xp<#{!EHnB6TGBNjyccSCmeCU@D$58-nvM_dNSzZZ`-A34NX z3ar^!4e_Es%5fR9!|Xf0KD}EU`YcHry>XhNRGdkJx)yVQ7A}}}>ZS-743B9Ian zfFd@Ta)TJUo97m#j{jN^jT!xJOWZr|Uib>0ioQ=)Sv?CX2o{NX8Cbch4TX!#6jIyV zf9A0i@19f`AOb(hx4pLxzaF2@_^Nl$@b=}eys@RznsE<<{KXFIZdLM5%a7mgXReJV zm+~p{1gzdQ3)agq(@Q>O)3Tl^yw-!h5wr5p>#Am?|CEP=bATD-wU5-Kulv5BHKd*TsEBmwL=)Ho;dej|!VYc@#)v}xEEAFL9CZm61_;2_Y zW%N6|R*4*HCObuRXLCm>+T!xIhee0)EDT0!O&8ZNUI#s-A|_tx{`@8O0mVP)OmFik zLvLu~JCApE6O=p#Ra=>+Et)_;XD%<*5`*U2=5X9 zJ4|_XE{jajdAtFZ?K1z(f4sJ4;nBVN&>625q&JZAQ8jN~5#++u@4$qn%d2~-uv|{sF4pX=p_`LRr4znvK8)8Sl9#GdZ-HLb&C)Z} zP@}KK*Le1udUQ`}qQ!n}Tv|P%JPHG3S?a+wS@YsWt{s-|Z1=_OLuy?f2aA7N%l!GA z*!;$=QzS?$sZu${6BOouH@arwp3iCYx#7QS5g)5U>PtQ)@83F0XMDQ2dSCR>UT`M5 z|Ap-DB!2rh!$ras8NVk1h<^^i9am#FJWV0C7TiOB_`aO>2* z;)CmfA4FnM0JD!14$I+ZRh0)PtSZmFEzR* z;1O0dCACZ(cX#Ckh&fp}u?pTzlKk#lic?7RzOH$02)U+fY-3`6@F`r z%s*dH*b07yLA7O?7H@sG2Wu;2*u7DYJZ5^q=(G5C!LR`{M#+D+CNN0py1o=afA@3G zbq;%r4YkzF7|gJctJ^sTK3|K0ghHmGGc_gcSS4n8B|XFFFRS9s$J3#vd`YTFWzuIv z2f<)fV?BJbvZCe{?Czbr%Bq1~TOe|e#JOpM{R)j8ZPIlu!}gN9>zin;DEnJ~J7IQu zr)xBSiex60>OvN+dkRKKRfmDG=pPJ`P`?B1^k}j}8c6##zK7|C>)Vq>KO52Gx|;t1 zb05}f{*(tL`tI{rV3?uSn@r9E)brH-Z4S%sj0Z)Y3(nEqSsoN_{8dVdy7`g*LgXSQ ze$Trkht@y1s;qxaqkq24MIC1wqJFt z3diF~%ylSPxk+J`b^Nc6Gw!^fjhd=6UcX^pFb8ZgYFjl+Tc|hT6h`yL0Bj=wZMrSs znqIz&-8)12dr%UA+374l{^g?%DI@HD z?z9^1x>3c0&tL{UhhI-ARtah8`zfWscNZa)J(78I+GvKLF_GZtxS3b0ESWq4AV8#LmEWL z)rcqVX-M(0zcfedCdVQF?)XdZ({Sba_dxts6Tm`|M~k4 zaa(ZHOe2fp0m)!ai^!J$Vns<=lN7?+4wZpDMH_({GzP!K~pF_o~^?TF7vuW6>0 z_Ps(bswS$o(6PiZb;J9GRS#yi6I87Zy9}mX0%pjzHJXbSgC3q~x3)rU%j=e8-B%}{ z$bDkI?q1>q0|pFGZEG7>qez~$_DH+J_7|E>irLgn7Cw|v*TJ$Fz-R7L*?5MO9=d2w|Y^! zbbodRv~)==dZM>SWxDo}rGoxCXBt{mHQjVx@Q)sf3L0|5qxTp^D^1YXnIBLy+4{q3 zWNBjFI?j^z<{84ZfA6mQ{z-1de+vG0bYykX>PkE>gqM4ssY~Mi(f!7;9P!szWVFKU z3@Wk`b4#DnaPI$xy*u`Vk3J%PZ95|I3SI7-M@u}LdhggOSNYel?un=NA>NIeLbh_^ z$}N1a5|U_7DUN_Rs9cWU6yiUgi=UrCL$pqIR65Q?V6ru)f(~_II%5^M+eS2bWgoYH z;bj{EU$*9XBIj26x&F=cYsh%N@_RcDH4FY2xNG7^Q~xa?Gj|zHS>756#-BBoEKn&x z`(Cl~%_2s1!@w0|;hwQg+;cnm`ZMw`_g)3#j-UY_mDenWgVH_phv}(tJG9BEGGL6f zqg9G-BcJy%mqG1k&Zdt6&OSKE#Amat5!+z?E#AMe5^W{rqa{OXOrZmR!QID{O$mK? z?qC@j9n3Xq5}cgcoM1Q%vU%EP6kUCkac%y9gw@xP4)5lTvCBQvJH`3F`fgCYf@Lp(fl&j?T1vc7 zLeU=oa=hWcoup^?cy&(>lt??=Ona+cN=T{Mo#JoU{T#KET#e6eDjcTq#uo$QE#K;e8&jnpw2-4ePf4PBHv+aM*=f=k6U+nbhdXVcs~!a|9eSr zBS;3dv556JWG*!m_DlN~5v!y-VFGJ|^pNg$Vo-lA>8j|XHeKLBQ(t1xu$DB23*>*e z%?#?;j&TCrlWtA5Q6Mm|kd`18e%2{qz#CF=Pz(tdA zO6D@!kF6<_yB`r|WGlt^vS9<-Y2G?fE&A`m3R8u_+sAL(#|>6SDw5u3NwU@yW=JwrGo`3xVqh{_x!ik zOp<#pf3_m$q1tpHBzbC}jm@d7Qbh|$DvHIWPkZAIP!#A6mIPntu@=;h3y9H(Jg2-i zWl|{lcmBxrnMd@1<1n0pfm~d_`o>CfupY&{_JxY2>Gk$RX?}O5%MSc z`W;-xC%2fXtkKhhH6a0|m#UH&{&B}*l4p_7F5&uwlYw@NY4n5W4TS+tj+x)6lT<-z zf8dpjRb{7I`6%?Fqe@@!DCp_+XUnq>W8cH6+{WM3unGlT7xo_c#PxVd7)00hyZ^fT zvqJpC?G5)?-iq8;Llm^iCPXH=Gy6lPpjhy;`O<9LRZQH+@U-S@m!_#8`1r4*-@`Fa zO^awz!M1e&G&VHt9wd?tx#$Wd{RysflJS40PdBuRq}Zjzn1iqb+i;)#cgxaWTQE zrA_P(E(*_x#As@Bj4d;92=_`5H!rmEIZieNIv6 zSqj8Al~MYr31%(C@=0rt;HjyE%>Cb)7Pg!1ggEmCIsYC7bbN=>2LsU`OXsGOGA{)c zL;#*bcDKQ{wg(G@PZ#a(Eyj8<$V&!@9mT#r$d(N84a-MUo%5PQl3q;l!B&9A&`fGR zC*m2&s$XjMJDA<1(Omfd6cc;C zCw2y&oo^DP+k*{z0b2V=25Zmfp459-kGy{?s|8wz?U@dw4;!%lZ7*l;i$*U8hL)+X zVa}Ck4eDa~#=x@UX3Rn2pCp3Jrp#nQv9pwlORL^(iX3l)74V(=yA?Y#r73^SU%aRhH-#AuBv*TL`<)KO6=CtvsPDETYQfK| z*YAMgMvsb&%wf4;guUR{2u5>n40_H;Db6E?ics9O8g+Ore_|Jv(M71LxsN$~k`tW4hjEDR(vPo?ZWs1vH9`v_q3!J5N~(?t>A z8u#pCoL$qYGFOmZX3xf;#>-CSnB8;l&vbNOP`(ljTupPi)v&$EuMWTo!(Li3YYXW= zYN7YM4-Rxg(C3ZEA5yC=4EQ{e=LS_Q(vIpB@~Ch zP!J#qn7=Z4Dx{C6A)!b^8(Wwa>+J0%r>Cs^{#-Soq?}=LYV?{V_ub68n}yEsx#rzr zRqe^siu;PIQy=}Qy8V7;G;QS%iZ0q?m8fnRtr@+>=DH%5G_Bi_J9cSI_`Z6#crIN|b9mpmP~yV&>K1og3pfN0bhbl|J* zajuM-N#KtS-EOn;t{hQEe&2n`v7?Qc9NxMD%buIUD0cfYk7=>2%}d`gd|geHb@h{( z9dm`mYgQxK;D5aqrZp;|!Yj2dbDg4J%HK%8cFzzA5QI2KD9K&l@to?>Fv8KBUvYQa zD*okVt(jY4Kvu7;FOPrKQacwrmKK(l;UQE^{hN|W%hUH($80-Z=;tmiEQnYvLE(yw z?z!v;Z}krG39qbl9*v^23MV`7J58!;>z_3OmT&fO<-~ihLOV{ys6_rt>o@38NMA4C zg@%s>+$}N6T=W?Tae^YRn9I{!@xd`51DDlbf06UljK=BxZgx<>96&RO4kWO$p1zhg zICX2(l%EWfH|Z8bE{P!iBHMTPq_(4$8V*T-Nrd$ZIAC>8WCN8ANmul$4IZXu{Kwo@ zm=ZatzPYk$8hd666Q}8=^mOq~A62V(YWM@#{xe|uaLg%K2fx;_p*j!{f(WPa{nP+6 zrM(>KI1f56yLIO~a+{qnH9ara3=D1=MDkC)ldU@YO+BE+DAA$KZ#oz7W;}8|J;nx@ zG%$alO}UalR8<_W>teYud(bLd_7Yd}oiqIt@E2TPLW$*nWLuL^y4%KYUp>{&+SNE! zl-b`NV?X`l8v3Dub}2*2YN9BgABQmRlD2Nx-nxTad(~97I$BqxGEZ+_H4x98G~t{3 zTAFeG`ge}x@V7b=up&e){C<^V9w zw<>7A+v7Rgl$7}g8=CS6MEn3p%O^=G^=v&wPx!g2qiNxvhZX!>wD>W|)F`PZfxK5r z42i4eavk_6r6AhDt9ik3B)ou%6n6KxB7vw33B+>k$5>>*fD0k$7*F@uyqWtk+$FhJ zy^O8!h3et3&+HSo1GU63CExo>6l|&CgP@B{bqTIhNqGKuSH{Xmc{okW5tmyrFvQQP z@PxHrzT7E9sPNp8Gx#(S8vG8MvH zwHE!PJMinTC|?xL6c6F~r_FSKE3_eJjn5^JQpuO3T z4S#AJDP+Z?xbxu#laLjD7DnlGIfLr?xRK$ZC>?hS6!ZB5pX(yyuBlFmd&uJHK2Nz! zBh}Wkoqxh5OjdcR+OW4(+MLxaXMwreIrFW|^bOHiqzi0g*`ndWMc=?Qn+(5Pk^{fz z;5;7X2&Xp8*xx3Hf}KpWm!>@V;+?Ljta+?i{DT4XYJYWJt^F-mdaPMp>OOyzyr7Gg z(lMa00SMPNIH$m8bJxzpPR*{Xdg%{49+#K86z@I7;B7!}yN z-RQ(#-LB3D+0!=&2ed;~;63Z%U(>r7;F9kk3k$K#V8uYJrS^jfbwQi_;OkX>NE^>3 zudb!URJgl3eD}Yl|DIIXtRk6r*Uy!O8@#b@DD!&e(scHlQ-T#@8JozbHHYY{%Gi3+ z=Z&ByCIXS80NG5&jm#rk$42MG{=?s`P5Z+4Y707pS6TF{p%*M&0x;H>?lrSg6Oax) z^9{|5EwY0MhF~HI#JSvH(zAZX%{~23JZI2vVs#AXvnK@;NMN#AVviQlUYv}hd$ai= z^&5N@(r;Fdje`5_fGj zg@76dUFv4lZ{TO)^m(=~d&xa>OMV8hFrGz#0;wId?6-cI(*$Cd;-3z;&hPW&X5uYN z)L>0`R%fKG9 zT5Np$zMoWAhFUs}=6{#=^1%hqBbXqmEB7-s?g!^_5Z&%Te=D0L6d)q2=y9x)h>&;b z+|{Dw2??~R_w?ONynRpiwOlSsg_?TXZYT4`Quxm&1c-cXy!da%THET@H2DQ~AAf(w z{@90~J)^|N9icHEY7}jA@8Zr0N*Xu!eXq1FV-Yj8qw!h>dm)Nyyg@U^S!w05Q4wQRK`Ng?cm{!MHxISxKeTfc?r1?Aj+ZX(w(dckB9eU&ld*_j!j`0LH$5{UX!)`ah z^@I<|He?0H@0$y{-QadZOq;@xTr-K3ee1ESb~FzCbNBo-=PxVntI|1|k~ubZ;b9ZL z-ad7J%f-;3b=cu9U+m-&m8|jrV%Q;U8>7tSd&T!Qmt|RQZs4`H$L7y%@^;nv$59pK z0}l*ghM^h%vWj&t)`oZcb-NMVV z4kPP}$yXYCS4znTGl28tNyRd{&945yv+0WhN!&5fv)SdIrMa28KxkF!2X%$28zm|a zGvzAP8HqQl1qviTviyEVyE@@Uf?7~^MYiw?0cXIN8H$#*9Q+*Z!bN+nmH1a_Dn&U> z7ghw`5b^kE0ZxgXH&4;3w*BONEd048RaR|S>^Z!@K-o^1+fR5B)T#Qz-o5JCV>Gg| zL$YCO#mf*Gq=!9zFr;_QUH7fuSEo$n9+8;vjj94(8t%p0B@sj&U>+jH0n6F1Od-9pe9eQ;Z|ltQ0<0JXWd`#|NJ zledrET?;X(do^iI|Nbuhxg|F^G%j910>(wWnR3SahU^#i1Ab@z`Dc{mFp{aX9E@1L zL|6oW+WQ89GrXpzrUL_7_8JU{Pv3a6581&h+j)>f-#%dT&XTB2g2!Pwq#+1v7Cf;H z+VG~t_)s8hEI|$kpF$0^*fT<&PCnf~Gq~QTl-Oxhy~zD8sNi!Z=)n;KoxL-S`*e)F zY6|PaN-vU1J7C&t%>mh4ls+hOm6T9^XvDrMeXQ!8ij?l{zpjwhx}|JD9g=-w1RkXG zSSz_gt`@JwrfqW*kYKiQuLm;{X%0Ftt&td*QEgf&Ph@W(2sN79FTihYJ2$oqGi#^W z4J~8f<0X?aT1#*HNI|mK&F|?-YXJT?x8>vn_!y-c4D;=Dy8?Ma#s~J>lx^8Zy84 zSJjSkaD8#BM;WTgKaY}*O?KIGJ6=4tDcVu6<%)CAfhZY_O)T3JTN{lG(9D(9uVYPB zUI!;QwiBwz6B)a%fYWe+(m5-TPXZmVp*Ii0ixdKBAh8ecu z!MY)*IeDiBBX8kNqELc~0jV$*-dNK&H6vYgUuf zJ%!Xn&l$NRm}45NylTz4YOfJC^0i--t1z>&-*rhzE4#FeF#X06pR~|gmx5GT;u-VE z7o@S~qTxC&gZoYHCE0G`y6DFCJ2Eh{kLRCDXf#_air3fT3UEGhk5U!+RLb92iZtOZ z<4Upx#-m2x&6vs#slf_mqPV(?ef%2aH{`p z{c_$v3Gtg>OX22dK)8b2zZTnEtz+*CZ>dL;c)W4BzpFha%-f;AQ?|a|;PU)@UKlD_ zpD_MT-0uz<{B5qAv0rZoEiIVWza!IC%kS^nR&c^+bauS8BtkI<6F`~P=7Q>p)6&!KsPaAQYU4WDvfn2XF@QB|Kch}jw{8!jcK`hz66IpT(1^(GezI!@~LGIoz z?@({-#WVuM`=L*#MlADNdxS|spsa<*{w5!v36=D6Q`D!97}y0OwOkY-N~*h;EJm)p z-IQ6d9^?nDY?U}qRMY_%FX&y-285||L4yUlpD*=%mYptm{c9;FgEX$rz7OA-qe}o6 zI&W^3BMV=$FLk4{1jL~`(!yK&BFrv{D9!U1-C0kfq(%Y?)WfM)nHPD>$=`;Mt-b^# zz1!oUdublPoL@SN+K*paf6spU!b{TBjk#f?srR5HrTCM&x$Ye7v|mX;DNnzApG?q! zWCECx3$_KZ+%sFI=fc4b^mR5pypO<|No8$(o+W{UDq&gd>A^bYw#nY%e@jgSW>bR9 z;r6QpR2|DEfsEWNP1rb`1zI1j@Dbk83#^cOBbd6a@#gJ6OP_C*o68}YONW<4780%f zR=g(Q)L_2QT4O>RP#Y!vmG4;p}*-P0ZDv)_;Ct5lS2s1KDmN;hHf&K17e07`z^yz188=nyhrw2}Y*u+y5KA?9YI_z> zC-pToFV7ynf4-%&lgMfq90Y6+pfhhbO<>&{8xMraeP-Y-gxH{<88V?_n&tl9BKTd+ z&ytZ($_xIGw>?Y=6)PFU>dv_XA9>6fq9tJv$DpY11-~xc69f4K4ebS!yb_I?sN1SY zYE9pJ1fDyA%pL(i)&uw8^vE2be-l}by(G?FT$Op{fowq8+8%D3$w3%G5Hjg^Qwu|! z)60E?SRBsf$?pMbHhg-fe*Ud^VBb7NScgsr&z`cq4OEdktZ@ZXIKEWBj{|eSUT_?M#BfGbOz#xZ^ z^%R0q23?{Byd_wX57s`l4{Ry{lvn|N@_8p=dZiDLU~`)b%Pc=iven08HTHBJaj+io=q68);rg8sAs>1A*eo#(sC(EoW{M@ppIES)|I7 z-qS_4-W&+j_M;^+39qKo9uz10T?5nl`~F*{tWX=ql5#U}Z=WK_wetd~=(=`xtD-J+ zA}ThpL$_aWpG5-_$tNvwxnqx7Nfh&+#UOpRj^^1{dX(zV0WRbez?y ztOTBwMM0Sk1-JoRwpiQ|Kf=N(Ei4te;~?$w#3RX2>8P*8=L?Iva4`*+aEnVD@>$Yu zS-YTWaHtJwNd;==4v>*uG`3WwKEj5sel0Q)kIW^G%4oW3Q%evbg+e9vSe(K7GeRu4^<#%6iPR^45x>GJ(8Ix(;{V?WE z2^4w7JF@Tt!*3IRDSSVyTsP&;MRPKUM2kS3F3p(=@stc@~kJ$A5 z33>eF3rM@||0cobRAj8>r%Qx%~i)PKq9f<}9%emN&X`^3gkRC1&j-QvY2h+ZS?di-G zWS>_H$BF2FMFR&Q_Op9tn(zluHJ(T9*0jb5m zZsGH-#3@97Y2yFj61UGWcSYZ`MwfICC-~&cku32<87=zTvx76uYrmc(lC(A+9A>XS zVK2Wy00|;{Td2<9Abdm6FE(S=j$QfEk3!IDnFH_FA)3g+t=nCYoq(VE8{_ZT2fH5Z z!)>8GdZ5+FEzWaiDEA@jH){4HtMUGWd)AoAz&g_nz{ z#Ol=eTyUJ1H}k0dy*pI(@mP8OR0F3Ut=;~htUC^s_K>k2eMiO1JB@dunfFfz{f zm3ic8?@1$jkb#H6RQftRxVr$@ox<%4JmNN%8aEhltCaB?Bd<+U@d8%RVRofYY)*~Q z-SnE=VlH;$Q|-y%=CWSU;eA=Sxk>?b(2EFA4nZI(VWMw&3RI_HIt&4QhG-w2br@Lm z5o&Z4&a-$U_N;Kf)V&ZDO#Pruo~Z$>+SKhMQ`xB*@y2Z3Ci4IIQgtpXk!itJnd$jY zBAb^X^39_w$FXadpFL}7Y#7Tp5^ExQR7?+5TK9MF3(**G!R*UOpetISA}-K<>*_~; zFUQjb8Sjo}c~*(KUo>Ks$WS|76LS++j|7$4r-5i60(94NUtCSmr*zB?O`49RN!5^iYq9ubaz!eaLP9B(C0C!D<`#x7uuGTtwwXs=`m| zFR8_n2UXGNFX)nYvMhm4>SeB8sv7p3>jP6+RM?}jsma##q`1S`( zlRC9}<{c=Kb!0)J&|W~HO#F+jUrEsCnA$O-pv}}>5s!=Zv66Q03F!SCcxqI@?k52* z@8Ape&&d~{rS4mK$%a_*eXFmB*&#QyzU4j)t9-?`)lBc zB<}7LaEI51%Jl-BW2&1URa+8%2a{?p^dPxsk5-;DBg93rKNNmE@UJc`{2j>Luy2T6 zbi4#kuok4bo>4@UYa8nr-2&~$SQEY32c_Ib`r_to86}(iGCv&FW!(|pC?@<8_n%b4 zziZjFGnW-}lqk(-DOfd!vpq)5!3*gd|5^f-F@x??THrmYzETg?e7IEOzxN2_KDwco zwZdk4v!7EmHkcr(x`}6Ox>r@|%xgNcrm+h=4yUFP9EL$)hy5cJVJ)H)pk5dd1nOn; zUIATcIQZPh+DKo>zr1DFQ+~Vo-`~E79<9TVSd&aE5UVWn*Yv?p)!odK2TKq-I?C#W z^MEWWU~TX=@=&CF8_=-s(}Q||1K&oB1A^Huvg7Ma^xoEEEgVO3_3WP-(Qoj=|5Q9s zUhOB7CZaMDeK7edQwp?h_Jp-{i|s>CZDBPmrQjPQkOe3Hr>yjYjp4iAwzZmFG|BxI z+JA&+sCUm42V(&BZ8VnI-`&!3p_V_w-_0iLV)z?(mCLO%7~+H0a_aEkUO2FxR@K24 zkp0`GG}DK4k71N^*!Bd1Ip}2{oP<=Z4-%6hwzfr(VkOKBwsJ8%kSYp$>lkcw@X|v|> z#yjTJBxnIL7+xzi*Na6-BJ$*RH~yE1GDu)`@a3zOE3zYJw~2?h!cHJwGI-<3tG62~8VeGXmK zRed{H@pJLucyWuEBPOho=%eTYQPX%bUK`i8ARJRZ=LE~f#-ev*YJaR6qpWG_ck~N% z<214`JKNMSbx9aRTh=$Ee(e(?!!VO1O?peZWN>x+5Zk@}@!Ejsfv(a1#8fD+ipz)_ z=V0~ndL2gPK2X}H!eK2-E+T}bO%&UN$D}(9&UKLm8V}d2M(OueyT{6K&Eb)2({7pMX+`W*i*IPPeP{U2PFyY8xzVQBu zqmkmrLZl1T-9I2;x5ejbPvKkug|Zh#0E21;c&A_ZgYE@ zi%*H-b9~mtGP1hRP=UK1&`FHcw&38qcvL;(*zOUu$YM~8x2_>I#5bl;YJ6GF{TB`x z9^>TCo8P`H{_*&K$=I-r@Q<<@NnOfnqXrmVNO5JQfC8U?(~kttNsA5You2rp0XM7? zpKh{YmpbB z>yxp4(vbl8K)QNrF3-UQ@4Ng4FXEX zT&k*ST6aBJQmH-Vq(iSsHM_*HP$R}~&9h}L6V+@mKLvKaU&=fdm^qG&r4>c|;n_ zNxrGmhH&-kcJ^L`YV&V{>r8G0{}b%Oo7rhbN0-13$_kqOTs zSBoI(<;;dL_{QDxgj)xA60d6GJbxn0ma3K5!kki-mxt4D$^K_aNLK2LMv~tjY&e*1 zw&ft4i-EHXX8YUWoQF3O)#LY6+YXpNxz{ z3|y$K*|eX9G;;dvH;K0O)*FF%ni{dAv4bzGj?R~*E)%d$wXF`SldO?%84T{*r}eRb zn=K0Vt`>WK_jdP%8s?!b1G4gnEf0B*;69EyUm25YgS01jxV{_%K3oLTpu_Xcx$248f~MF$vFikIGYgoQ*tCYCZuDksK_;005e}P{N`U@Y9DJb#5s8E3ymeO73cR<$KGZol=E~DzdV$)4S1zx!W^3+qjxMe86Jr zp$3vtja};NNpt*HS7)p9E4lV&n}*vadX$GgaQ^966gvd;v?@4LNgs^rxMuMy#jvkH z{mbml0iKdb{MSl;O>6iOr2<^n=trC5X_>J3gRN|nf3-N!uJW>F4qvgu>qN0ZtnQi_ zdVCxL4N;FnXAGI~S0sTWZVxQub_7x|2i2qdAG-55_Ty-x1zTVCl0IlBj_;7=>?rYUIGu zx*0(5m^xszs=>Xdk1}3_2RO)qOtTgaV5|o2{}b4HWu*1+2wuIt7_FnwxS9J9dL+<2 z%Z13O9q$-uY`OTb1{?k2Zim{G7ys-NJooag5^jyjZkn2PxO>R1TB3Xlg}YaT|CZL` z(W|zzF|QwrS&M{VnnBLdVrIh~4%&X-4=Xew|?&CzJl<6Aw<<#9j9- zov9u#0jnOlWXv-(D?lKSHXD1u|HYHy2lb|I7*xFckOAwII98iZ7FMZIx zT%)Gov}rNey~-VBG2~r6EmhWWjBDmdH^aXufCohCacq9_?klE6XUWs>nfP07hLQ_^ zMTU>)wyD^2E~o}D**bCys6%*{OFE9}M7c4l)gO!%8I`j3%4gsJS1Jt~JagQQyf{cu zmSH3md5$iLzpk44JAF~KGerL9xx}YFZrm>ApWqj93OT;D?8;<_YDinKnx=qnM?Jkw z%;Q!J4t?g|YF%6Gx1?0R4jSFJgSZEkgcHo9doW!`431{PUZ=;6j^NDOl^>Or>*?PX zktuB{8&X%&Z@{|M%&JyHUnLy;Pb$h?o4G%-aVV;xEkp;jGr3oaXyF11; zuNwZG?XJwS{stl68SqgG6kq~QK_yO2xk^@^kEwG+N;um3a2V}qj%#~mPQaMpIynX* zQGL#Ke<`yZY}PZp(DbXjR#70wtkXdAZ~ITD6Jcs0<7am2bOcZJ+Uv%N=T;&JYu4RO z5f^UzEvz0$p>ujk!H?p_-*n9Nh1o1%Yy#*@|Bt5g{%3n}|2I{%RaCY1Xsd_Qp(wFR z=%O1{drNC1c4~`Jtx+RYr}o}E91=UI5v^U45VJyz2sIKU!Z+vfd4KjxY?q>d8?` z+b3jKQuqT-$hYxreJuLUB}CJ;W4?0Fm!W+pC2yCH`2$w>9<~LCQPt#iBKbXwr6dsz z#1$q}oy%FF`EB#k>**yk+S~#izbgW4`i>At)T{HJ|I&@1_eML$*aMH`hp0iD5c1L0 zHG!jUouf#}?vwGvcW!@9M*fQgtC{5CPlIxQ`qu2Cf%NEaf^)24Vd-ItsQZt3>ABxA zt}&gn_s{$jlP*5l#LLHXYnM?%lmMKMIu75y$=wvz9LBcJeexj?2eqwj8%m@|0%@uP zLmojgC&(WMvEv=|O1#3z(M#=xK7NpGTk-WAtKWu7vVE_%+ap?3(upPSVR- zvEz7x@}sUMa4s>k)22mpfgD35TeX%fpMovWHGH;5OJmcfpxy`$RP|OFOtpxs$?wii!Biuaua)+BdR}Mz|HagcA&{iOX^@-SRIoy zI{lXRg180g2{i&|3ABrey1Tf&B)J_9WT6TKT`8*5ouoKfx4}l??;_2C*W3#NJ;Dj+ zcEdB$J)||I*Qd-tKWj9aqAX^UlDj}>1ML1D97_d0yz$tI=4pK7tIcZvyI*`=r`!k;*S~OS=Pb z=kHRCAW5JX`W{z;?~)!SR;vN7Bhe--qWOeXkZ%!8`16*mK zV#@fAYZ+`E2q2l`cDQ^gBE&vknPB9D_!KD1XjG6>D@)~$V1QCnm~6h9@FkeGQ=^}# z|9_dUko)mDd#*C|`DZ3%17MvmsUk?{*iser=@RJI^y(H%H7kxhJ5}bDmR@|1_S=(< zAR!%xl`g&-D8;udNxKkqf{%MZ9?zic&60_*#{`|si3*vyh}UE)8sixs zn%;Q~-R2U(Yl=?|KgDp*TrrUU)E-X$aM@^vhNa(tQ1gEeR{4KA;xO8>y5xWFvwLBZ z?qbm$O72Oo+#Q|W`V;5F>eM6JPH7lz#iL{4P@!Kd3D|CQf2EM?xUBRh?W4Fo<@``W zi(1<@BDE1saX-#q<7O3x-o0Pq!k=_DXdc9V$1o=ZO{Wb`1{DtGB_!AMbLtt#BH9fk%!rB>X!X1Hwar|%$|NYzrvPAF& zYN2N-xT}UfdFv?K@aT=qF{>wj6g0aZz<;bgX*0q2brb~LEZ#Ccdg~cp*_B@JoWlBx zm$11T*}GcJG`MT_=XuA`Kg$ZoM+&L@Ex&nF3|e+EhXxsor7!IMd{4ct5HR-qHCA+_ zdHZ0oGm)RgV%Hn^-e>X~ zndr9zYW(4fTzs8vz49lm^O2~(qUGSoz1V!Nn&@8!%0A8Z2;~cf31f|3rEgo^oqA)u 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 literal 0 HcmV?d00001 diff --git a/static/img/sourcehub/ttu-eval.png:Zone.Identifier b/static/img/sourcehub/ttu-eval.png:Zone.Identifier new file mode 100644 index 0000000..b854fba --- /dev/null +++ b/static/img/sourcehub/ttu-eval.png:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +HostUrl=https://raw.githubusercontent.com/sourcenetwork/zanzi/dev/docs/grokking-zanzibar-relbac/ttu-eval.png diff --git a/static/img/sourcehub/ttu-relgraph-2.png b/static/img/sourcehub/ttu-relgraph-2.png new file mode 100644 index 0000000000000000000000000000000000000000..2c1aaa2e346c30bf739bea29ba7a739ca1d8ac26 GIT binary patch literal 30789 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�nDKl_*6F8fzxKo>CaS=oGt2$v)vGQb3kn6sZ^FF;JhxTDiF?JBt+ohh z5j}w!E7c(Xh?65Cn7n)n9k&BRUvO_HxlDKF?gNL1RbiY$gStO#4u8Qu5%{BFXvjq2 zIB3fYQVSMuI=nrJ*m$5`I8d(|Y=ng-z^Lwvo=UVM|H2#J>gv{`{Q2Jto`|=gtLv~YC!f0} zD%$_GG(vp3aPcA^KR-3IG3-oi61`DP+$YY zYn-A_5K0g49Xhd&Lx?ozq5Fpq9XKaio)~Q{-wg_6Gv-6TuwlmBJ%=VR&mB#(ym@P7fnJfI`) zeCFSIDzzT(?0i1ie0JvroOb9TJ-<~|)xlbJv!&vB;ReK5!xnX*VOv{TTR*_dA+Gth z0dWu~8wymc2_o=e%Pc$96)GP@h=*G z(vOdIb-<}c+|`KR;osQsu5<+)YS7ks9fewYiibgutLR)dB)50Y|YiA7u&ymd$^mcb`J`Y z=PzE|v2>96+t>DelLKKLufaCDvOJOpe ztE=sJy^9#)zg_?f1Aaxp-d-H#0CTt+4Gh0XR(Jy$-t)u+G^jrby6w%RzRt?^C-lhZ zPGQgGpS|2Otbn%Z2kHl2tWKaMkAY2q4;$>HvtCcvmx>~p>%6D+u001}$Q;Xnvk?H2 zA~Pod2<553+sP)?=SaZ{$L)KJHs8acLMC|LQzH3Kj=$R7zT5h9YU&G2#6=yPS|``? z8!HpsCNk73Jp(z@NJNuY`zaH!SS!_FSy#=%cPw^Mk>8txZi1Iud+K z=ZHr-K0ZTSnAv?W&EThFJ^m`C_Vmec=KWXV02~Gn2k^R@5Btn@T90dFoC4OcJQNWgPW+lk*KH>`%R^ET zEJ?3E_L}S_th9v0dFNAf-wk0M#MscNqIqcjkG3{{EGYWMF?YgonmZ4cm*}-hy|+Gc zN+;wR53^J8b%&Ddgb!OH@?(cHQ?G}dY0XTq=GW1wrs5Ka05d?`eZ=(Ik!sEz{J>Uf zswqw5j`A`)1c~>0X-q&9UD6vA>Av4X5d#k&qSTYnUGAzYKU|cp_{qy{2L%KV|NG(l zz9;CI##?SJHXlbn34Zs9afijf_uuMzv!Q7fe#W=xBc$>zx$s(9#&n~_wYHq->=hWO?u&& zvkPNH^_jiF+2br;Q#iKuVbTn2%md+w?rp1Y% z)|Me#Bh{_SegyA~E2?!_nKvL00A#(sPN|k-sLi>VsQR%z5#}45au0y<>VYXaos)IK z)n9FmiV9Coc29YR_lZ&(yZh}mmhr*LUM4LI=)l8K7ps-iGD!p{6r1_rzS`lx#Uk>6 zJe5p{>Of=&fZRuw$vPjp>v}#)6SXhBx8^Zodgd*|Wi5^~uuQ*m!ARK52XwECWt_y0 z8a?{h&6U?tl)PMJ!r%$U%7~HI^YlWl6;Uo5TCKK0=>Z1U5a;O+#7iP^D?~W0LkDbC zmYSaLxp3j&9wl)f8JaD3q)>bIEOpF;VeZ|;;bm+fPh8hwSH}6oxlBpa1dm4OeEz)s zf1UIwB8j=^!!hhtDS;H)wZ15q%EDbl9OR@&krIda6wcH1DeI! zb7R>k&ZfKf+7dpn!%pJ?k!Kb|JJdi5L%aU{ z`-?anqx{@oXKYGMT@j0lukL5jWWRjk2xw7Fnk4n&03$brP0ZjeqzlNbrU6tYCnx8- zkDy+s*(A%qktI=f%su77FpV@(^BSBH2PUpFTEz zl2lKac{j<^*tRWi?rigpjF#-Yn~{=!%NTtNSmgtaE)sl*ifLY6M+?j5lBWC&Pxx9e z-#9*>Q7;l?LREFC)GH5~r(vP;x|iAA%>TIsgIu(VpcAj3b{f~3IH1l?eEtHm61K1h zU&gy9$*~J)<0==u(m%WKI=1#J*q_Dp!nL^5!g`EYG;a9-583$eay~2fIFrjLH~k3B*zbo&EPzwUvvS zN7Dpmk%Iz;9fcSr{djiURuG!(Je~00>=0py3i>mr(!IL}>spZVun&|#{e$xfG!G;Xl*;94Q z!#~|~vQ2;v3P-Y6jk)9w@?}O<1h(sD&0XJ~B-!Q5_ zfF+9Ra=?PDLg=-o`)i6VA+}ppUwWIDWg{%o?-9t`0i!Rj0~bxt{kS5DT5j zcU+mXVpH$ZL_kvsj^P>QiA1rX;d+3r(?6{BGO@h8z2ixe#303U)39*a=k%CW41#$x z(nBC*t1A_i|G`rNDPDy_=K^$Flx%?HSZMasKHPrKo;~<`2B?OJ@o3Nw}zMM4u-sM%Elp7*L-SOWG|CZc){NK6Ihdl=lyb>@W{G~Ggc<&}pxW0~zfTQ_W`PXy^8t;^y`~)Q+-$r-W!+GyP;vxz?b%Z? z>|Iy5DPGXiRUeq+6_k$y6`3rDvxIMvIIP)b}gw(gc;pK{Vy!oF5;9ERoo=z==6+(b56jW$T!R4N*8i2 zE0*VFq;Q#K_#HAi#>gGSGY6hqoCC1fM1bfCEgB;Zyc}tNW34Y*0Uq zgywJO*~z&KEMK>t1WUjZl^d&g(oJvCJ3!GWdh|*L4k2&iO}qyP?SEz3d7z5(Z@W;p zBDsw~FTiSHgqUvUS)(`nA>cQGVmbsaXazN?JX(F$ejso860506puYpX03fAC);Kzg z{Vks+4jpPStoFNk^V|rZ#Wd!6`p0(5y}d6(!*5n;-)X3kQJnMs?c2k+8kzzS^$wyv zB9QgY)HioDC;F=LPY?;1hu-38G8sQU)hm5fHQ9kRD{rOEzKDTr%${!GyYe;$^EM7W zKexu$x9myqj+9c&W)*eg5D%o=hu(g$au)G*VrM|OV^H)7!<6K{0LW7(Tie@rrTDx) ze*gubB#C@{b$nwrb&D)!qQetAnL({+;-ieQCbXo*wEAELZVt|mi~DFZvY(g;KvXqG zd}7oBo3N6tf0PM?iVt1#P(bw3h`_)XuJX3h^8?dO#-^lV(So}(M#ONaQ*0lEH|Mjm`(LIDHL?tQ-l1u_)nuJ|I&!Hj_L^;a^MV*Kz0$d4+6ZqWeS9kPBSl1D?5Z5ZyWu zgy&J$xwGCJejlTq)nC_hl4Is-lMQCRXetxzs*pKGk&(;S?u#E|u7AJ-=*mPiD4EF%JcgOHnZM2xDWE%;^r#Og;=itYT?vR0NX(2V-g z2Z2b-7i1Br(M16+a7$+4lV(kejkR=In=C?LTDxgYUg-V~dP{lm;G&dg)Z;x!Bll0a z2d*I`?d-{|kJ38%>@2D!XvJk#Id4`D3L%l{TaR^A?kuUm8H%cn{qNgjRBQZX*QbB~ z74MxaxEFdkFcY*(ndfI%X-dmHsqNy2Oh^(&?hivpjOc=bD;GtzK*p+@FZ$mzD4uug z_HBQs0)zFVhh%Hh(0%9r>Ml%z!eUtCh`R50BsE*>_tBwkNtyNYMQBLVOs(F%x6k@2 z6ce6N{=`2mg4yOIX^R)9BrJAiBQ0PL$`ONEJa4qNmN;i_s4b0!r2pt zjT+S*xUb~SWL52YUX3MouuiEqBLxn3uY+AtF|^kKr_JNH*k)JrUkMyNlccgzk{^Ydx(#FdER(e}LArZOlizr9IJ zupWRJn#Y_`!iEfg_P86_!!WsL`aRDh3ymjyYP!F-{tw6htas_nGK_a5jFKt3K8zI% z%o4=Oblj4JF(U%+kDX6Xh9-qbjLYn##*7S*g3R-Sbz$$gahDkPb!=Q(4YCQd%`9H)B4X%Fv=&JYSXOV85EQp@t~fA zCdB=;#dxnf3ea>(4+Du~qydd!SqYn=mnW&jbWf7bxbTa)I`J9jN4;ldSA+mB6x`hy zV4UAXo#l=dStI9rZsu=fy#(PNkN@IsSZJt1!NY$L98HbB;&@gB0)eA0=lg+ci1e7= zObkWGjDMzTLrWq*f(X#u<%drAJ=!-}u98yTk` z6>NZF9EE%1jT#uPf7sR!W(CJjdaaeq+Ma)msGn&f{ zf7mYgD7-$3^xv|cQvql*e?_KFzgOluS^MyMNs-6*QUkH>^7q1*Uy7oVK7hW+b7n#% zUCkD(JO`7KlJXLJ?4QRRWR8fl$lv{VyzAD+Zt+I1Sx`QkNS~ICh~9Ak0}Hw+{Gbsw zh2`P@3XiVQ#@%xDrx%oCDkS$E_-MJ|0rk=ita?jD|AxVEx#4*PVqcq?r6c)vt@oI+ zg;BT!-RH6Ln#OPR`;0U&*eV6+(eV*4C)wY~xJ3E38+HpcXIQyjeP{$l1{;E++2nQ=lPO~I&1CII&44>mDk9QyTwlQhm$yQLGJ`LTVGez^bm3t* zmGA+Pt_Zkx?caaw^~o+9^(}A8DRy4;MpsKp9Nq2a{VV!Ovnl*G0b2Am4tGgkh~9yL z&PIanX}gcaw{+2-y#({o)f+eBM6AfIk|ZJ?7$QD?&wAd_Mn35Unt(D_IQ{iv^&&xj z=iMT`_lH*8$guVH9!0RX#5E57dUXd$e^Zt%Wr6>*Ie*YwghGPp2v9@kr@D+CtS=yZ z0gHqLj-csi(){T*^?5FpTyv>|VRhxFkK-$=)lF~4r0R7E>6|?4zyzOm_*LjuFS2?A z9?XX5m5kcY*7u5Zy(1<<+dtKdY`h_Hx zo~{foq7k2tc!gqULE7Su62u5FG;>A69NnkWHqIY)I5l+}n%V&*yh{=W5(yF8X6HSf zPb7+brIf(z#%J)KjbEj!ZM`0$l{?VuTKr^9JOxqC!JSwRd+j2P7W*kUM?BEbHWzU=y;Q z#SAXaIy|w}W+tUP;Ahil;#e8OC{eKwsS<`FiR|w`e8BtvEqKQZ&Bd_@VJj>%)Qu7^1EHqHD^@}lR#yA{jxI*o zLn|MZi99(8hZ6fa3guhg9hlG?exfqK3GTy=KbW(~0I#TU3ut8}F%e{(Ep_=VQzv9d zC~^u!pT?+{*nM^ulE^G6SOv?X!7jO+79OW&_scheu=AKDVIL5RjYW(Rf>xm~!&_H1 zDjTnrn0DVHLtn-Aa{teDy=iTBf4xRekYT&+dUV8br{6}tKFAYuk3zB3n^i>watM); zz;yep>-slDMoGmXtPYJ0>WiE6OSKIU=E{uh;Ii1#8RIS7Xpccd=7y;WxeMS$y&zMuU)TY+i2BAL#3%| zhBG}?fPdwQZxQd=vMj(_)^9v%>;xi2Czd|Ot;QFhMTM>gIu)Gv@SSh$+W6#t1P z6KQlM`|n5mCvVFB@3;T+m+!wF{$D>o8!0AzpUHp!J}EVof>htt6@33b1?iNRm&_BD zl;x7@Y9-MVC!7m&ii#xj^Yfkl?Kd?w{W|nlFy8dW4T>X2j?DUKYHEJHew^g1#qaO$ zzm0V2P{gO^=KNY`j6pKdhMP<4@@2A-_Oh1NR{0bS=i<3NOW<;#018vhmNpYXd?xc|nD8;@#- zUcY`#%q%2i_xB$^I3sGVnVD@95fN$s^(%<#?Ynm;jvhUF&D3;jp+2>gRI%+n^=h4I zOIur|%a*0Zb)9i~o|Q<~__NZ(Wl=@>OPLQ{bc@ z8AYPw1)0JiJqyZi{UU$lSmFJwG@je<`^s9{+XEjw*rBDRl~7W$e`sjv)vH&hF#L?n%&PJ+s*IK1 zI!dWbVjaGJFY3DEKe)>``Xkx%(v8mphYlTj{r){g!mm}Du8u%U^XZx&p}$?kxQ>#) zvazu-xtr4yoyoh@z0T*6lEnwoNp-JXol!=hna?VX(!Jw5C@{N+n}yFEX*pVBfi z3VZYB_>(730w;~GUS;M#a^%Eg%>_L(vx6+GtnYHvEF!FJY&auTj4dsxSXo)mrfBF~ zy&4p&_1O!?nP)&=#Qw{=cc8bM@|3GhtV)VJ29Xw)S#Z_&4_{#Y6=$*I`d6<~{jMId z*VJTyEnL#p4oFQs1Pig~%FWGXl#+ZWeEc{)!&NCMDeSW)Pr>I~yu7@8dv-`jNCb*c z)tkDqM5-LDcAB)CG(EYn8W|bcZ}Cb@ej-I6be#YF_|Y4h@sX+7rbhNhxKk$=UYe@Q z+}~P18u;2nDou9vjKy4jl|y%xORTWCIHT!FOrX7^<7TDn=L>-YelPCb+e)#UrP<8u z>U96$g4hXB(S+BpX{)NL`1twdFI@^(8n}GrO6qL+O5Khw$~_a4lU1>b%bnfTxTPmwcN+Weh{Jnek+~G!r{QJ|r zs>6-J%rH=v!QtWLgai^!F!3Hs%k=1&r%#_g*epKgFy;m)qEF8sCG#`k-) zEZj#ze!f=l@PmgBFKK8boj56Q>=+}1pmS?$D~p4{Dzz<^BIJ_X!jOELge&=IsE`on zu6>r{`sy62H_Nk60jb}Mggtc8WeDHj*9zjJe! z^!0=L`%U)j+n4n6B{?x40f95#-euLZTj+zxFJ8Q8vL(r;@U;lT1e^LXjhnw5S?(W#MwLHViy1Ean+Hw-HQ2+k@ z<2!m((b$-ic&C<@UrC8{$S*35bgebpo99iMH?{fp+&-!)*V@s+9~u)C6_xz*rD92M zS(7}IB_k6nYX!DpYHG^f#ijME^>!NeU21A-ZfUmqDGBcn`fqkVT?jTKH%j$tW(=pOx2kIMs_m`l*^=)%I2usCvUZS4;q zK76dJyI7LD(S{kT?W^>-U}l!G>;)gEh#%aHmi5%t6NJ~*_#;2JwCt6Ym7STLr7M5& zd6S);orTxW*!4Zm5tjbJWc-SNh=``?SX6ARL4cUr`sz@B{}yv|b9Uitx+lcNlarF< zlXq)w{t&>U4GrU}n{VQ<RarTam1BDac6E16O zbIZwb{QC9lYi+H9t*zkSzke$?ckb9x$zg+dhqoDjeZ)DluuxT>sL(e)zEe(4&dt-) zF>IF9+}LaXloU=G8Me{U(X;2zD_ps=^>BXM!@ z4cphUmta^iG5fEZn-6rnv+6hME1T)GL41W#kdu=iIBL!B49!Wjtj z$E&M}F%J*(Ry!*MQ2S?RXR})+Nv+Ge3*h9ds61#-pemS{u%0EC+u^^ZtgNg*0F$6P zcI?=P;$qX8-=Cy)zft73wqC(LbHRh1Jb99^RG(!;MH~e3-%84%X=!On6~oihVF?Kb zVAUgq`?92d{P=P9+__Ix4;jPb;zDbqj&TbJ?AFdTJahj1P9AzHX&ITS1HEl++T5py zLvGg6n@I!7`lBT8zwZN|wB?xeXfBrmhh!xVy$Xrtn9N)5a zD;+IueXe7?cSK2RbMpZa5r*{i^bby>^ctF)4u8Hg?_p%zI&$0NlD)mq<~89~|380j z?Afy?aP{d*^Cjbz5`Dpd+}vZtWA^Ov`}pxxFuTn2B>|cAoSbS*)nResYRKa2!osUD zH+XJe!HJ>VwM)^>O(K5z;cg2A4i@3N^>I{_(Xp{?c!uz;!LzgbXlXw-g)N*)(cr}L zVlXU|IvyU99mpD7R0D^aJ4LV;veI|*E>f;uSyi}$al-YIMXGFLU|=A8$YdgI+iq5| zETaiMif1MJ_U`R#PS=!h9^3Qy@#9C&pFim8(kF@6_3y)gA3dTa-@ct&LV}5tlT)2< zkB8t1)2(W76B-&Cm2@(FW%fnx@E^oyq^0-M(a{A42L8U(Vc1$<@2i=1v2UayS;Fzp zuE!A(;SmvAe^)yt&dk{R1q7Hb&-78!&|qoo%9m%2vvT#zz1hy4J9qZt#eH@#C-ro# zM>W?eckiwWq~jKHna~O5kc;blZFmKt-*LF^zX9X97=``6zh;OWA1f=#y}i9nj`CKz zVimhWg#N`@FO#q79i; z%t=Qj)hlYTlK$}3Ow7!mdV4u40%+RKYL%9h%wN^7X7XKIyZtgXwg0pK&a)RTR24c7 z+mALLL~i`~*RQLp*SWd4ggoX)$UM9J1@~Z8muCkgJm&dAIpjiLzT_bW+1<^CtuT4a z!p>f2&UJla--#0^I1e5?qk8jaoXkT^EHNczo2{)a5-obW#Kc4j#uDZX93{N;W~CFh z8tXzt=2w@JY3b>?4rNr_-#sue%G~r8AsQcguyrq^p#H~SZ_SajY(Ibgd@z&nmSp8H zB}GN@>R{%rc6N59PYZrVw875zOFB_fQBg_UUKYYC)pvC4z(xwUvte13LRhNI-A%JN z(lav|JllvRsjO7Q!I0+)|M>GK&A^v1WhW=mq~v7xqP*uB8T@M-tJ8sDVP80W*6w6# z=YDQ)XTs<)i_ae%286uV+~69+7K?JuuIIS%^XkED?e<;FuqCGEK%!UQ- zn{NO9tm!0{T`3wtcp(oD&+jm~4ce`Ss3R~FdF~u||7KSQW>cBwj*bWU`Jy4wf(H+7 zLp+2l!pa7QhAOG565F~uU-V8=&2W5d%zp4I-F|5|T4Js~8`5wkN}>CMf*5$Yki)@Z z;nJJTgqch|)HO7?#BK*rv&oy7aOvvm(!&0uqnQ+yl}-CAgIt@xS|gU=h|qFyge@<- z#Ynr;EBbx?dR8@7a_>NOh{E;jgKX|Ap4Gdk==vH{&P#Z&Nl>#%`t^FR?nbt3@9L^- zZGDuOBm;w^vUC2whtgbOHWjCg zy-Lj3Z6-mm z{q@_oO|HVsrUn*PRu#`g%!w(luPzPDk2XCz%flq+Exqrkj<5UNpWR>AKO`oStu9Vh zmkNd){#r*vI#3(AOs``fGeUz|cscP||0UX{q?%zk+ zqT*4mRK&@6zP4%;oaim*z}iI%8E?5!7n2@kc^4z+-LEvWI$h2!C`gT?W|7Eeqn05)6t5Pxq-l7o~z9sltxaz*4*z!-ZSJu3x_%xb+3xtG&JbN4UAy*1wJivz!=v z+U9w_X8hmW@NAvb^tIu-SRpa7>a~A!#4BL-OXClFj#uxxC-lPw|JMHAh85MYkX7r^ zEQ8{Gre8u^Txaw71q7;6FT9xfWgdSzUCZRt-ED4z;mY=H2ClP|+e}>_B_(lL_m;5{ zGZZu`3&wdW!Dw+#TU{ISi@et*Hx_bz`kK__kb}z}Qi}`r-^pmQIPvRsK|!1AER*Th zk1d(ndDyJm>kDm!(?vX(Y1ULTZb&*KF4OL=SuTFcL4u-5*0Vzn3qx>Mj4iM{~`_Cgg-w z>$QJ>hxX44y997^tu1!iwU@YyQ16%Ug~RBdEa+9be*Iq{;5$D8z1$zZ%s{<0s&Ll5illoN7u_OM`Y4Ntj2`g7LH5HIs zr964E$Ke-dZt?BOVNv8B&n2Dt>F7e(q@F5;u?v*_8HzGW-TZ0w++G4aZ#p`|P5$&9MqsWq~El& zwM{jTbHAUe`b-{G%^nU8weq#UJFn{MYQS;P(M|q(8^G?pY`o4QuyY3~%F{^CkRqQxb@{h;F+w|1<&2u_zn4rgyZz|=QBv&Ky*ow5b1|?M zn8mq7_4+ce)xbcDo)ULOMN!0H7R;}DoKZlxIkRTGzv|&(S=l&*xs}U*`JWW${##vj z{Oj=o6_q8DBbll0SCoVr+Z4T+t^%?+gy9QTmsC=@Pc73YS-$JW94hN%Fh|L)OJUetxgq7iMbyf zD_tqakD~5>uV-XrjHNst{n?PLY>5(0)NSUPB-~xv&v8+AgA%tqrDKA?>_RZV3 z=MF^#v5BpB$NOxYyGOA*2`Bi47JuZ$f);!gDaYXG=;8Ow>kYF5Uuqf~A0t68zHPWV z_%8QH%*hDs_QIRV#fvc#r$x-`c)0opTSyaKg%N;qcK=y*c#Cr}Qo|e1gJfP3(Y>w! zzCpRVx;p>XkVj{4UUMyq?Wi;UppB}w>7wEA}WX=*&1hVba`#<(o1Q4D)*47GnEz07GJ6pF4 zIgO~t+Md_Ov}e9@hy6|rV3)sk?ON2&mSNeb$B*wCdH>tiEEUC7ZX@L~@e#r6#M6ZU zG0%kOQm%rxZ{MC7j8GdZ<||O-3jbX}BUibVM%tIi29S75c3!!7k$T@T!(bGT0|Q}l z?6l=6002InKUV6uFy2;y8gU>G{z6y@aNpS5TCu5)cRS&lnsiz@Iw)<1rgm=a^K_H) zc)NihE?I{ReyP`|ysb6;7&iSg7L9^~gQLr5a~)YbTYR(Z3!9raxd5Z+7TCt-M2yR7 zYG}vuZ6%p&*S+jJ^%+@2x(x3coMw6wH(?p;U;5|^jQ zx(|zrK0y+D?jhr`)W3gk&CU{Gptx8n^2rk?oi@B!Ns%YC1hB^A)?6bsl<3zjEzbcI zVfnHE*r8$K*W1H9JbuIz03798HXVY)NM2d-&@FZmAWJAmb}`>!l^Y%wMpJYBco7Z` z{P+2MhXJKoiBG`0sWo$oG9P*rTHU-k^2|JrlSDkCqtsKp+qumk-)**^J=+RF6!pK7 zYp<91HVTTy#|O{9N>4wRoI{v2%G09poMMZPd`sd4zrFEe>}`=tN?u<0l^p$Zq>)eC zIbI^Ke)InQA;7A{YE^%AGIuU*St1JMtj!|l@sSp7qm)F2fX68*2fIC|OSKFPE-*7Q zJN=Ydq9w5$zfOr2R5Hz2g5RPdd2Rd~mdSaW*ojb%3B|Jc=;GtI3S-1qMRYysykdVATP2p=aFLr^R=VS)Jg_yVg#Se1e9IQ4oh zHNdOzVH-(AT(JBeE!;0Gge*Gw)hoWd-TUFGCA^B?{ynPm+V}3=yOg9KaWXG(+Gx1A zR*-~P{Q3TDu&?hlEI#4$XL%NBH=zqJ#4ZeYSz1|f8yOj8q^ENxZHAVVZEmdQJB@1G za&b8XAl(Du{e)rL<*QANjU%YocuDzYwfj8QX1^d>Jd#gLh&-aLp{vUxGxuF&a9}_I ziGrwU^)83iyHh>Aabp=VIBN&pJv|vnx_KtsVx?R!j!Po{RZx?jB}c+R{E`?aslI%3 z-A=d2=`b+Z#{e#5mbx5eG89~U1(H}-OBA_A+cdA`8kJuJt}7Ya{rYALKX&YF8uz31 z29clA3OEuhtCcWmOXPvqZ{Ad)rluCX@tx_pwEJ;H#0Jy~@V zAbd5o=a~|*i$$||X}VVpPoJ-5wX=A_DdD}K;)V(aiCgc}l zB*G6}c&>=j#U%JhvvX7Gg*~*ir|_*k3=G`tj4@B1H1j%7hRTlj8n6}dzxa(<#!W*L zCM&l+Fz33NSvb&uYFX})MCh^%?z%X6sdl~9`WzX2{Al3pPHcje<&8ueSZj_=*Gryg#e zinKmy=fj=EO7(%ZnbO=t)}f#Ls*Xlk!eY!JMJT0riAK7o!p~l*3X5c9wtx;&(EqT-0`X#un6}a@TU%v(#djA_@ zZ&|p~Td~;t3~qV_IXoq)bbYZ?(TV%f_5|lIb~ZK#5vLFerY^MndIW~?F}z?MwevE{ zBdSvcy!1j&gz=J%*x&w+SVKIu$75W;;n{o33WfW-=pwZHoJkfyPUcYwG<}OaGKw&f z3On*A)rYc41qKr9jD)pnaC5LG0=CNk-a%1ZwxYgXor`OB6}UdHEDlBTeuF7}tpg)m6 zZ8z=f4Ad?xftmL57eby6)(XgOMsHF8-xQ_6mf>EnsQn?@;ZNhzNx+>A#d@ z2@$+%i?66-y`J6$cyu#AZM_94H?akVAH&%oF8iwBAGc(!lfKD&vq z9`WqiGbPqW?~bgT@eYQSEFag-ku2-G@LAL33B7SUPrX1qiP|Tq-)`(4FnD?S4hN-q z0)sSs7`ZQEd}m)?=Q%@h>-JM5J}D_Z{X@6iA3S&ox8hx!y`@w5B=T^g0C^Xo+@tBTNbOTs=DHpdjnV?NIF*?SsYflrB;a>e{MY1 z?pyu|AMow#*MyM~3-AJs?bS~XYw{g9;2UT=!5bPH%EG3l$U~vg@wkonz|zvRx(jBB zAUX9$8kGW=JU$5toq>0E?%e6FE7Ey;W49N8n%LH7BTD@T$*;-?WIig{_*;9df8grX ztK_~!JswnxtnMq|=85n0t-UR)otiR-%>gbyd-0-)K~0)dcB3zVgPs)fk|-dZ0PAoy zZm=7Cus^*&Wbz!FBnkYRxCCTb~$c*H_Z{2ZO8n+p07)Gu8O-V<)k96~X@Rye z(&t9zIaloD)4UHS`)scElAjv*M)oC)gO}7_!{n(OHT5kPXXoI-gWWlq2??i6TbqbP zoAfFxD|l>tyyn}t3>UxVxVuof3>%8uR!WE43ZW5`o{>>Kho4k=k+$#^;^?tKvhCJyJo3w7mzldm!Gfb==iq!_|Ba>9lB+*&#Qf7+rPgn*?HUc z?N%jqu%?(cZ$u{W`4^h;Q|)9g zToV@`ALZiWVytaM;A``r>|NO3SlR6#8VtAATfDVti;GFd_hEk`tcD`JjI&8x>1hFKdY?nt#~^KzKsX=?GUEKSZ53jIla4@Ns>;kw50XS+y{y?AMk zTjdrPb*UB>>uE#Dfq-fjBjrjhC@3f-BGP0L4KTH6*CD&M?Ax~D70}?2)URBjP*(mT zIG&Mve2e&EKv7YV;ngTk9VB3=^9i6oHp^%5Yd8?wkDYeqAvT@wN3XMbC1PZM{`_Hk z3TAg{%v)Pe?;)I^De@1NT5fLc1}ICwzl3nCPQB9N#{#%^P`9?VCBJ+3uGaaeLD8Pg zZChHn(V6XI*KB+sKVZyz zxoye>e6>waz*L*NK&GX+*-4YEkkfPShd6=10xUN&XS0Pyf>qqM z^7}IpIySZt;ErS0rHXEtnYHwNxd7Jx>sLxVxAZ+*p?)YzxV5#ppSm1THP=l@Z4878 z=*^q4e6}Yw*SozJ0Ru!IH``IRzNlA%oK3=If~g0QSI{VV@@R$ErPe8@rH#ePA5R>S zcHoH6zPIb8MmZ?GGLlRXODF?i>}tO;|Ria*Byv zG4H$zWVUQ&?8x^x8CDP?;4o458`YbsZYKectVI6ixmLvCy-aWz#pyOw!g}VbhIW-s zr`nuHEpaf~U;*|>CkC<$dOmNi{oEvx5WD@5h>$kdOFZV5hHiXI8(&ybTK7z*UN4o= za-HfrNgyL`{Xx7!CY6EIVOFJDbp&ipSa9uA0Ue-Bt+APMbSz^%Qz3AG3Q%vMSZ^F? z>ry#DP6D!i20Aq4!Y7^@mAKIze>U+nwLN1zM^IdIYO2*4PJ(>fHfPBpUQy9KI3toT z;@pqKcm9xYo!U=G7XJKcwJ~tMT0JEhi{Jxkj(zR8I5|{0ZhxMczxH1DC_z~mE$N(b zvA`ACVSl8y;im_CkIW#U9Cy+yN>b;O%=gD;fr+jJ_v4XbO8#M%O%@F(sb+jvuDNtCIcTntN>hbAMpo5Dr1zj%gFs7#l!?76_?GvH`6^DHmQT~gGz}U z+AV?vkYwXQv}*_40M{mL+a&==W7JyD>k~9$^g%D%OeImf^EJc1}r6O#)p*Fd8dvpz(u)gYCii#cBUO)b(w+ z^~Lyf$jXuu+lr&-D_iii(V~|0ScSIH6rcPF!}2OaY~ss0_t$@wM9aXi71{%6*b=~>nb*a9stjVV^U%Zb43JO! zcz-u*rRg2QQ=!Z@ne2GipSP#zRqc%*{9YtpS%*ymW~!&TH|iJ_vpAvWE{JE+~mji}Tn~SXk%=0HVs&zBz20&rqbcI@mAZ zGXr4L0gzeP*i-?3fP}GXdOBS*4dJjJae>j$jSLCK+f&3VMcT3Q) zgh2mT+ExtTT&E&dkb$9T+<7F_{-}J|{(_deZG54_d z5zYJlHraXw)Ie=$8FV65{27gI)8UaQ8tN?#Y*V|svum-nBO8;Y{9wpIiZpZnwWc+K!)y#mdrhKAXvk1NVvA+4;B-RNN70g7|Bl0oen zj#D&vCU3xBbu>PsQ>toEjqPD&Jx?FxM=+-t;aG~}*#)*f$=qWlGk2^1B3?HjDWf70 zK(ryME<7q(+tA(rwwG5;S62*@G=%^fj?^eak05}nXZa%=LH1N?I>k%7KPDIvfG#{y zwFJ7jv9VPCuv5LfZX72W+d`Ke#O&f|aoej`BhBZkAy;LgZ>LFkVHy?qI(fyY$g@L9nq0`AN?Ao5y=8aVrHU`1+DM zKnl`zOR#z2(89vPqoNqGJE71%oI!RrkCJgDD@Rd0N87^K_%wZx;=uRJNh)&_@bM|0 zQ-uK_K`c?4v!umNXXF^&o~;rn4H#>4-&+O^^5ZzzTxNdE&3Zy?7P}39S3FnVL3&saVQTn_jFe!LoN>aDuPnmf{ z9m^~`lt+8m*)Jjsd#TQc)bj!CTtIdMV39hM9H<8)R1a~30VL{8{JDgXgcB7G!8R&{ zhfz%JZ_R1WC@DQ?+ZFJTQ&mqWqVqHosLkGJsj7dkx&*wl+g4H z42O>$3j-~Bkz~>J!NCdSo^5T0cWm2eQ(6;(!YEGu{|G!#J}-fxKi{!qhXtG+0s2AA zGmrSbG_t-vk{m`!x&Rr$L%XfcdUcDiJW;_*i5lr&TUss;WQ}3>`kf8^m%z!MFVU*= zqhc6=Gc{;UPY?*Op!?D=yIQ0;Cqy&Hi0 zPT<8E4zX>}hZ5_6GW0()Gc0`$ry>u4ICHt1Rm$b4P1lETV3P_v83lPrQ2LyCA#Qhw ziz`Lr9Jr_BsJ;nvD=aQ<0_MZ(UA{EgnTDrAOT~ZmXft2uPr1#bhW()M|Lp`~Umwn` zYyr&$xi2t>v-omzYpW7+te5ya3&bD5dkakl7Jm5fP5Z*FW4RFIrJ^k3EGm`ys4fjxTQFVqHC(F?}Mr0eJ=;ElYmH_ zk)53a`Xi#WR0c-S1cy^~#d|+TIY_V{E)(sEOUIp+Q#2YNR;(I#=n2}G4fAn&-cHR!xH7lVtULeV z@Q!~}y%>}AP{qw77md*3KL~t0n@!nEfSX&P#PAQ4R2EpUb$;1z-@o&qzz(U~UoDxe zk#4cJJlk(pMDZL_spI0}X|6r)%Drbs^Wd2Yy152E2UYDT$mS#9l1r6yCmsH(I3<6v zB~IG@{i-Ajq!9A}>mRhe6}=7t5COHudo4aId-!>mK6EMB2E|tfBp-G-xx{KKL;*g) z2}XjRHl5^jK1BmE<^31pWn+3)iCp2 zCCrT%x)TCamDF$3=|#?Q!ST;`PSj;^STDtU+>$E-V-i<-H`k5+E-XxHqeDOr*{VEv zObGFFr;|o1|HmI@)c(4AzaJ>%JoFjiXaoS);(?Tt4@F;UtAl1uWSqFRxfb%jURE8z)%*v`6lZy^lk4BDyoJL2c%6WWk8P4qmFV}E!l`Jf$M7g8qO`H z>MzOzyos7!`YhpCq46XzeS%_zOS75TJqOj01-#Ss8#k1|9L!^4jbLha-4eyWm+oO< zQ9&`bBKV*V*kA;Tii@Zg2^m7i8?%RH4_|7+eG|z4#UE@I8*6iFJ9h1Aj?S>=LpnYR zY>1a2mZW(GQLBkB*FA=882l95ug=bhpdhLXv67KEH}bHy6+zu7L!Wi$qTx7C(Nr3d z)G3rq^B^$iUtE0lVgY)adH@dT85t@ts%D(P(I4Wyd(!T&uB(gw@Qq>e*dVSEnT-qLl~ovR$?>MUEVK z2ygUi+GIrk_HAjPYz+yg?^O=;UEO>FHUWiG$xwnaBg#xm!rYNkpk5%jJb=J_Y|?J^ z2c&X}8k?IHkrAaqc=iZ19YS3brcA_f(e~eRoSb(IJw^|DG2Y9QT_OYz@YLxkDQB=8 z2LN6ZYX?K%Bn^&?oFy>&gFHN4F2#JDE9IJPi+7>WBr4nXcUFub%E_P_fF_O^%yVE+ z&}pcg%FAyYHO+F>FT2hBKNZ{ofa28a(%PeX;lhG}Vs-n4Z_tWkDPX=~z}(nSPT><(fW?L2Vo+|36bBY$ z|36Z=*9hmLqN3NpM-f9J)RIX_6pAv;rUki4Nn0TE`TXhLc88hYryC>_EbH zkBZ??*W$vDZKcmkGL9TQT8a4XN4${u2GHxik&!^)ufoq3W@j6!QkhLDAbT-Vy+Xq- z9f-l}=;;w+MZEG8*afK9Q>IPERN-w1B_c9NLL>zR^R2@DnyIR%|EEXno0`g*HaT9M zZ*lYHXQaMWekUMI2Sy|;EF3NCC5hy7r>Cc<7o(;*Dy~`JI-Fqnv8<@k(E3yb+O6uk z3rNrYgHIsX(nD()!X+2=DIQ*41+MUG0Bwlz5OP3NYfQ|}9+zA7Qr`|FD zIw)2LzR1=3bwp&OKZKc>BUqXZqD2jIc;cN953?gzx>sIaUiPr2oh`knhz02F7bu(T z=SME_96AKxgbWI26LTU0N|jUhks!ZM6LwS@3EnT`AqoiMUSJ?4wA(B|_gY;qVH<-2 zABBf=Ry$%a@){cSgkY43iO=QQ1t{>K%ac5&7SEGAc{ox9kMBn{*#AOZUw;>hSaJ%A z2Q}6};lb>>>9Uzp5L!XRbV7kmRD8g2^-=c2!XScUTpEH(WKQ($MfmgqJVpXCP-N8i zQC=rw(5N2>ya1L8`x1gg3!H%$V^kj5Fq|@hsSxU8e1h}DiM^10&dkkKK$1)7^9a<4 z(7w7}+O2^ynJ^H%nOI(oh0uLMUUkBx=u)!MX~C%R;t#=jf?)LfQBJaKrEO_xLH`(0 z?-IMk%p3%pl#r5Ia{o8~xa20}K!Nb_4+`+Zr~fm)#z;tZS&H0)L75O*}ysEe9r zIRYypG<~Q79U!EJfSK#$NoH6=e;GedI!Z0YYu65N414d?;@?ZC2l2T76y=aCBU!j+ zVzLFLejeL?FpEgX6V>_V4X#(O_(L!~I5-$M*-kuntoiVhr%yja9&T)GOaMpNU}1-T zMdC+I?5)C7-~$vFY4c zq5lcxl`Jg}lRnng?u1C4*a>-gc_Hg|pqtcFA;cwkL*;$7{v~OSw9xZ%sHx11foF_U6tz)GqPNi#c!RvvFz<%6i>Kz&!^bI@^ ze)jj&R1as|92$8*sKMdnO!Eufpha1HqW@%{3$hh#3z@Hk=Xo?2E!TB+78?yIuM1+% zNaO=(&M%WPGc(CZ8tHpLC*MJdDJ?CHM^eKOh_(|n6@dV7ov1Nw|Jc~titNb*JwDuM z>%i9ujWeJxSo$MuJ>)qgU)4huNO#{+Y+sRhdZ#-MWVmo3NH}E=kD}%B`on#LgXBnW z(P-rQVK=+14EuY zeE2ZVs&Yjhu>>ns8IH!@qal6?>FHFYYd3H1z(ONd{{4FwcmW04=pdFuFT&i_zN@*H z(zW=|CuL~Jj@%CAe*ikHLZ)wk2qB$9p95ktRDS(SA_oqfin)rm-jv~v*JWtbO$e{w z5u5+n4tnA2Wqp772IB+}Zp;V__n{UCH@Dm6CQq>lEuG5w^TZ^e(7_}Q$jOygBq$J_ z$}Il!oG#78{(t$Ry#Myh-@h!hR5!J!0teq6nN)t|cZt8R7FDS)Dvyvh;G&`6jYMvS=WpEzZK$b{_-Pf?v{y4@^i~S;Eq{yL}8f{0wVh@8qIUT-Xf_sQRT#chEx|GN|=|sut;mXsap0 z2^90_adi51sef?L>5I5YmK~){oJT*>>(k|Gqd)7GZb=)C&kDlg3&Rf~S+^t6sQotM$%jfNjB zZSCZuBHiHLZ?&~2Y$peb5%@wDh<52;zY1$Z=@}WLWD76e^!ZX_bqopwhVtf)$4?fG zrcm}me1G?oucXjPYDg!d`p6a1{k&!KI zo}3H+adfS%M8<@o4bJ7RM!F)RD7c0yGt^Qh0|$9hKs2(1=w7%GQk_rjJSJy7DRm4B zSG_48Kw)HZe?c7I#Mx^&djmtSG8@~Bij1`EHbNh1rQ(&5ddM+Fht(=_WU|%YX7xnXX?# z5{P4nR(2T|tN4$UVPGI#b;980naZgqpL^U++lYoSwZ~aLoJ2YA{@^wve0xJz*U@SR z+$8|B2dz%9=$IgyXNkK45dDO`n-&XDx>*I=g88x;_9q&rHTm{*3Aa6zaBmUel7|?- z`XbMSM2Ab#qLelU0Ty0ze#XMo+bt_-m>BUMT=gfr>9%g+z|WRG4~w_Qen>5v;C2|?dK zw`{6S=_Hl&zPrYK+m)8XEqk9G=+d6HfSrzLn>(0h<>GdMq>>VSQ!TaiL;0SQc9@{d0c9`5gb6t6_i>B%9vT3E35=)@9=zVuUBbfLDIV@sj4vx9oVF z0;>)2`XGhk0xCZf`6Izo83hXRtT)hcbIFRGi!#z4VB`r+~#H&LjhXmGzD55)xrFEtJi-YRTQeHYf(LBo>%#TyRc_7tnk zz@W1)?Ol!qx=M6p=0%-L*Lol`^_kBErkzF=?=iqhey(H7(L~-%k+B*xbHBk4B4eLk zo+@>-&5R{fT}5NK7YDpB8SX8cr>d1-(@4CV=iakl^@G@ zm8U83c)`o_Wb96O{i5Z#j;0-B=Xg%GCJhrLCwUDcgBo@feqWj+%oDq{XjE))#NZ2H z&w1HRF7T0eX~eI6{|K48Lb}$?@6?(cr_tu)k5lFB{7z{tRp5r^^dNnQyfN!o?6OSI zucEQQtwna@&88jT$RMtWTR2Dl=QXFsYomRhsp%;23?-?*WF=?IF6`o_kjJlMo;Gcz-` z4oN^>aL$WnXpfqBj{*~SGguux!q2~jgygXT57HMz;yO9moi=3ZN=-!PVBqWA7~HnL`GgN_$hMy_-APKRulev9@zK#Nk>3cD9KJbm<2Bo z4M)*3o?g^fRxBR*D#r8Eupc` z!1P;;7+fU5Hm<(<-{S@K1Ci9=ewpjn{m_B9a4D!gHZVdvRTF5upGNw`-;W{+pw8QkOq9JtIKKn5)vFt%f|L&Sjbqis^&;jI>g?)SVUj_ z_YaU1(##tN5#tch|M0rv+zWEJMxsp>eHg1Bw6JoX$aiNzz&W2x4&BZZor7C*oW7y+ z743VC9re$mqptx*dj0NQi^Bh=16%-in2eh$R+6!qTA$K^1~yG(3=aW<^j%hvuDA(z z@HkCvzIE+2zNFvH@v(g8`DwFsjWd_XpKv84T&h$NrS~LbI4>$}C;GgS$tYx0xHbAl zQndyB5q_59z(1EoUsX~(@I5dm)vrYT2ikJ`)rd`lxF^*!d7|1Za>QpdD( zhFC=|0v>V?45XFsKobT1jh}JdBlX7U{vi6S171;bzVt%I{ps`Pq))dJ)dK-RD5$B0 z1-v@zDqnRZyg2nnJCcttwa3c8D=7NWHg4Sb9^G(lW*)#LsH_BHO0-)~F zjd>P9D=(S6!aep%;jR-8zu~!n@VF7A*2McL{pHIP@Jg2!d>?SfR=4N%Kca>24F_Vu z)?4geiHM3;qNa2Y4Rm7EDtSyTf@Vq3IT}0JIA5OMNkv6Q3RL9U#U}Y=*n;@RNePK- zAAQM4aV{6ZUCr&M8x?%zc90E*Mgisn4*d%-n19p(wDN-lB-y3t{G^^vzKGvap&K0q zZlQioyrQ-d`Bx#CBvM*KL+U)8U~K1E9(ti_buF#tYhFQ$ckv67FYa1FYx*6O=Oo|I z(2L0x0f?!ISy{X8oFZWzFtd@7kyFTxk>&iAIVDeN>5uQBRqHo|_{2>=P^6G>Jy5UJGVh48Z+C|70z!fktGdH9#_&uU-(1}C$;63Elwy`UPx|)?H!pQLo^inNsEw>c;{6;DImgr(h%o^@s5H2{DLmGPQ5Y4^t8aXB_AnVCDo&ypiT!y0eV z;N}r{rH@~~zKRXKPn#47-WEe)D#XB25L+KJ3z39(t^0z z1QSB+VByh2hJ1Wm+`K3DdCGH?>NHjfRby9;ya!i$uV;sr)r)z>xvbBhKU36>73@;c z+ma&S*T~?!-eWWxWT0!^cC0$3S5D6fC4>SG{b?S0B5wtxhxLTym7a3FhEhA#uB&Nd6RrnlLV`7mPqqQy*4#t27Ox7ZMfqgY-mv?#8-f zQvR2%Bv(OxKEB`Vn8R5B8|Xy99S<|hv!+m*ZXuySz@~JoBEraKNMb8S*}lmZ#S#k{qu3Cm{k_7RfdG-<;z3fG^D6ZvPUQ7PPA4WUXYea z{dw~OO^#?(#LWz4o#*3ZzjrwO-gNv@{b2R!j*V3GD>+nIuiyT#aU9G3%&{CAe#9ta z3yb!N*~g1#s;qcXcMumN5CAV+50K2E`xdZnZYe3&#sVZ%dy(Yg6c0amyVBcstQn53 z_=muLuqLyEH4Hg{KfitJFZ)?n_s1jo?c2BDj1M>ITAG;L1stA$=3ey2pAKV}xn^e< zW?1S0ERhVmCe6;w`7)bOctEgDgKm+);NVJdw3h%opw(d)lMo4IGl8Vw#3PB2T9bYj z9)1S`D+Jo@5JXlW51?aZeTX!HfEL=?7y<270TaGvY56NLkFGHiXX5}6D5$j2YAX-W z2)GK1z{R<_Io47w6=mh^*tX+rTNgZ+Va3-y*2j*uwYJ*6$&1gYv7FA&cTCQ!_FswR z_$hb<8_B|iCgLY7d)_rFuXlAqFax3pR+HG^bIkXF_BPJ&voj+N++F29@kg{6=;@*P z4TOsjsy;wVi2>E@RY&pw?d;RhgQ93d^$B!AuW`i*YCy%`ZpS};dLJKdZfPNN>yY9S zxSnFPIzM`^r_|F?Al8r88~D`#&|V4mzdRs51K?uj$J=ONH2|aiIhnYEvQyO_ua?j0bRpFapRgp z?8U|{Z4etFry)#bmTxcP-dt%uTzdp|2EBd`n;Tx0)z$r=hP&#oY~8w*sP7?l0{}77 zmdk-`1e6dZp#8XH-j7YKzpx+xd>z7w9WVFcfc^?MHURB7jpo?;TqC(DFQ;3#?gC~z zAw=6q219ayUU3cbDuOJ)R{b6x4nQL}GdcsY?ti2zhp)iO!T24(1usCO-IixK0TKv# ztvG#;m*W7#dOP6k*#Iz^=w&>#*~cpIRq!qdbGBtrcY8CR|4Wd(M(Ni=(3*mnd&YU7gsGo z@^HBh3rV+kum5;kE;m2_4iJ9mncPl75%d{&9gr^`P7=Q zb>f;G$b%{&)-i?)g4CBFPP+yL{P=J+;&I~07W-v*C&DT1Ak{ZF57N&QZVH2kQW?JM zPDsdwD4PT>#SGy309@c6&k(T|cMLsxYC8ec#ApA>K{;&4l{IBQqedB&B`;zQgl4PGs zLMTGAjeVJfER`*a5LvRPWQi~-d&xE`ZPG%kvJ{aasib5{r9z6R`*~tM-^cw2+`ru( z^MiTd-Rph5uIpTm^Ei&{{gs@UI`0^HJ_}jg1Qvoa#5yPBkQ+*_WkmfbGN}@#I{CQ% zv8m%bI-F1J-Z9$w-qWX^#?2eq?EJj#O3h-s^a)uoD#`Cne5N)8TEN*OJ~44uw12=V z6gTG&tfm_(*Q z1+QPn(~&VPlaZYsy%D6%PwG81Z=}G1Y@p$^UFO2P_9|o~{SZjTBu*d9hgV@K5VWOw z{paG$RuGdeWVkta0r`DLhZce1#>y8r+~{)Js#!-kmUd=t81do zxK*E^aNV0{*j;BPeC`RMpIRn_QpXZN*Q~uJg$P@PQhOJ576hbz^c$T0_^hlGmEK?Z z0w%D>Wx|h(f((!3=OYHyV_eA4Hhja8B_;(@GYegpLnE_A*k8PFWsc6z7I**tDisga zNO|K$S7Y5FI*OqS9El>&P@R}PGQfmKzLWk7DYxG8e|ynSoH|M!M|VAF&bZ@c%WZ7p zaft#`w@8@KEWp_TPIFzVrrO^+c76Ices_KEOjqKgMS_FDm&@HUzUF;y`gGbZ8r^9~}?fJ5kW`SM-I4bC@$ev3+| zenwMPUq3$5{IqcOQCCSTUIiKJT}!p}5!B?9v9w~LP7dF8`q-ksRed)cUy%yaM?^sV z9Ns-#Uu#kLG-(ArkE|%V2u(^ly7YK>B8})RV@7EeM53D&kD+8TGsCpqL?6)z?4+8_ z^=a|ZLf0Za(yBT?8!iM$k=UrcSRQwtIqr%y((j z(xmm7&-y}RMy;Di{-b0X$@p9hax4>FuBGhRzjF2s{p6s{l`Fqj#@5PEjr8QoH${Q8 zxAb8{n?XzvpM}}95^)J2z15R{{@U>Nlw+@c-B0~V27%_f8}mJ^g-+CLeGTVAiKKNK zS0>SV#3X7CrD_y_SZJ1x4$(WA~h8UL~Y7%bG1+agGs9lGS&#sPm_?+vgi0mSU;{ALJ4#iEEU z>*P9moa;sco+wBtF<$LzZX8D(urX=o8>D8f1`~wZ+!?OJ@oi^!Iep1o`qO!-efvfX z*I2YQjNDwW#(ZlG?a38zgS9wVuSwgpxEMOQj%iq!03;S{mt`P!WF&C&7^fjGoIXvW z)42A&GJ16R90*Df#?{BVcZw(V?r&~frJ#QN`B)4~6S0ISqf$$xXvY%N&v$z-KMu4N z?35}tq8`yKCb7@}#Qi0Sh0w||`KYeqp$sZ;pyQx?B9aTc6GE;#w7y+$Mt5;`xI{5z z`{G9X;kDoU!*wc$aw`U4IyLi;#U2~O0igI1S(@wt=yua15-Q*l;NS7rxwMjJ!OBo2 zoJVwt!<40t0>RmKc(t%oo_bjJX^PE*|NNUBa51IrW((#U`HfMBMb8^IWp0t{V^6tR z#{0~JbP%zv)>!r=O?6CSS5t-{@hp5l#N#TxEsh*MtjF)hoJmPdbtdOStfD|jfBBWT zue~6q6D5ccm97uf(o&|^FO99;8hy))w&(hbO-*RTOG0j5VBBO02Pgu~F^npW1C-Asm(XNm$zjo5kSHiOHvjy1jh4uwh*# z+pO?_9IHa@uXjV4h#&Iwd}>*}Li>7myNi1^E}2UsYzgWlj(Cy)sh}hZpj=q-r83H? zJjy=L#B}uNJUTLH3vZ21);F&GzE%zcq}*knzhcN`P4%Xq!up)`_s`ZTef5q`? zoEXIA<_%bp;M@o~p4lCxM+8cg{w8!IFb7?Lx&)+JE5s%Y^r%=pt7F8b3~}|fyIa%; z+bfu?@jgt5k-OejR}{IjITA2NToMToGqsoP^&$tzNByYqB{y?=NfWvDA#Eh^=sxO-#+q*82`AfN?OPR;#J~nQJu*tupQHiOlvB98f-^ny z&I(5q)7vFElfx(o?J7!nbQS29YQwkQ=yYx~g=tHO79Q1G=M*8+6Mb2(W!Q7V57Y>8 z-y}1}BzmBU+D>Y=h;nEI*Iqq0Pc>l((iq_*(p{yj8;(3R(Qo__NPI7PT>X?4yKT6r z&vuO1KD?&t+>@;Epr8?EW^H3?z7>6G{Ih>%ua>7z=nHH1TuykF7nH}BAo=vqhh?#( zwL-xpZkiBh&QGw&cs^5Q9kK006{3lqQ2rdoz4$ltW2?&#It<$Qr^lz%aHzIP(ETi# z7m`vz7!0E3AJY*(L-EUi9Mo%36LY3!#^2s)$teR+xgVJFw&@AH4rX2|=ssXTSp0ai zN2LQR(d2Y7H0;1zdTn&Hetnfrd)VZnH5`k$n6JK*f=2p!+;+8qyMsi9XxUqHQ`Z)5b^d^ ze!kQ+98j5PC{DX?bX>c3m%F@ZBOj22ajLER(&mvl zTY-)_JfehD=5HRXWN2vUHFRT0>RLG-$b=BpHid4)k+CKi=~s8sTc{u!LKkv}wHg-h zT1jD3PC}zv_tA09?!hLpU%i?m-Mk>Yd3rywk>Yv9&(X;>ePxG~pCvA?o3MMuT@(5Z z@p09FRm=aJaHepc&hX0`mHP?~^V3m8H-O~q!dpX+UxTmbjnrU+V_EBO1&5EBPb_MGN=3dRR|Tv{c2t|R#=&6`UaieMK~|1~e}qtuu1=vEysZf0v@t>j zK(SnxM@U5woaG4O>yy%Di=-YSI zI)4<<{gmT`_`bgSi`^H(E~wO?`rGC36%*y;bBmD_Emk}u=SQl|*|g=nZ07pglWyG_ zupzC@4v1FOII&cz>{4Bi6tVtxDCqar4X2G?q%a4NI8rp&$Y|}`9PptYstvvN?VE6} zhy)(O_PeWHlo{Id1XX0^Ckm28#xBqJnURZ8cBejh@^`=FXA8FdNKyo`gY=WtHh-_` zN4#1JjBzOQ1Nfbq;tNWd>v?;!RtMbp|hdG9=jJeyt5uKY4O4gymIY|HCgU= zlIElzuUtgMH4$Wfvqt;Pn?6vUUr!A;{$4gJoXXxiqk<+vd&m&)q~zp~I?DC+=FOXD zHg8_eKi13M-}IRNdFZE&H@<&Nv4!m2%+oP5zXJ06V*E9nTpwMcO=nG>0a|v{&PY$U zLTKwb`-NxzHC*=?$O4~$k69Ayi?3zOfAv&eK4;1nFHHY`{@GhtR1`{a?)?L%Q!uhx z&wfvXHUwO{v=FkEZC=7|{aB*;Eros0&&l}+2$o>!)>N^X(-)aLY5aIg!k}&WIzVJ= z>gh?H`&;ivinXuKLJEKY_rEqJKofcWG?P|FIqp=PT6L}8H&QHn3@YG>EnABCoLpW2 z$@=<+lTK>=tW0-hxT&(wH-{(rhDf2+PhI^~k243|+$h>ERI%jWptIEFEn9?PzhX z8D1~hW8ps}V9OM0y1NSCk}s=^kPvv+SxB+|+A}gDA_$~v%z|0TYFQwH%5enge|d#{ zu6q7@h2_Z|ZDF>{E3`}mq=pPH6OLS;0aK?=RV1758h;$PY!`17h$Obm7y!-#8YiI? zlA3)A6hPCiE%*`A($i#?r&z47?ndT8R)%*xVH~QcSscZ`%v=I`$b4>DSk$5Y8g( zl;dc+<$WEA$za5LKRN9f-WqKe%r!9-da$AkrZ$1qchk~Vt@pjbvgC2t|DN6Brh~6e zt3gj3VZ44W&5eyOd5#H#lA;R7yTuOxp54w6PMVsPdKRm%Gsf^_CuO%q<;a4oEN8^V zPdzBZPFz@XsofLLw9nrRS8Po`9x?aG1f?lyGhAF;^wX55yw%&_ksW?>ZSb40FT>hH zAO_=$$n)o8Hhg~90uWBDJ`~buJR)r~tQ-&-`|Wo5(A!<^Upe1;SejGkK`XOiD_HM( zZPMAQP?ep-wG+3A?}m%aUW6Z-y#G^i();w_PfRaLLe3zTQB1jN6R@ph2MoSVUyASM z^bM+Mbg{dzylZOD1RCq;1ei^FG7Q-}2t)$_3sV|!6%FJ40HXt|jneveoWJ?j^OK(Q zbHDkOuA4nOvq{N}&H(o1l$*!1H(WtJH zh{g$L>rSkkWd_a|5)!f`O*|~51}3@n2+h8Iy8(T7_O1S`>G(;Lc1K4?%bIcuHkxC$ zMqYpVGW2qPg4(8Oc3&r6y&C$aXTX8zfmw*OV}o!~l;Pr(Db2wZvp1ET$}*nf6!7SI zrD?C$GESDt1m`VbE%s8M3(9>4Wa>^~-8&g93b* zX}&CU?v_Tlcy)T!1I&fQ30b_2Df-~3Ewev(YpJ@ilNy4GW5YZs_7lbcd$OiDIbkTLAVBQtHG&ZmETc72rw!_|dLm%0K-h${|bJM){H*12}x<@?4v?G;6}&|re?^Ag5%oElvm zWT~inb7Gai&3fS(<@4IHE_eQSsi}Ieef9phDk(reIB}5VSIfXC6)-Xs0JOswf8%5 z&u9M3xyFyrOKk9rnETv}@fXAqx$EZLC-&~|bf}z%!+=zdtM_YA z19I&cY;0xr!vK(IYqF$j^xR8Vu1GKbj1~~h=?+>Uz2rlnJdoajZ7h-4ihkq8mdbhP z^>_4hVc@j#3?WU*YZ`JkyJqXg!A@V-fcYG%Zg4dqAPJ8K&6aLucoT;82^V+>IwOlr z#&k|yONqBz`hy>zXDHIPDch}ESFzshT4c$f%5P75-dr-$!{sHq#Z~|XaTL}$1+FTZ zPJ(?PZ+o77;!#@)QrH^H%3|-SC9^PD}5`b7db{TKx<7t@}I2UJc<~4g$*B5Lt_88Yqj5*3^vch}U(b}7W%@Kip_qc95 zsl+KMmE24d9L>|tU+(mN^tCtrZ(b?rY3CMw-VV82=4ISx>9B zUp&*Blz+ditKF6<5ReXl`C5TfC{C+nHNz^MclUh2qKIp^AGREw+CNKZ-_($|POp$U1$!gSOgjsooQqeqs=gxgye7w)%14x?Z6Z|-ee12sGu ze4}JZ#kTeCO*5v4I?03Mqbz*=famu>8KMq9dl0 z46to0ic-|9nQf;&e|~&?x5J*bgA4p=LIY?kNJ?K=%TMYmng=MDta#ux)n|rqRe*Aw z5Po!+SzGfX7Q;5OC4&@$7wgBarOG$h{KfXdxpRq%AQ1WxFtTuLM=$vJ#KVox@05TTDRJUroF|&BK21Y+Pc8dV3;t>+U^z+*@4jJe;jwEEP4lDSvBgF~zu(>t_p^ zOE7>;uuE@%(a?|(D_DX{kOM8@#MvDhbZYSGonm@XXCXht7NBr{u;=i{(SL4DpPp@Z zzxynI^Z3sd72c;$cRm5ARLvNQT9+dn#5-=gHVfm7y93+FA1TL)lUZ@@UlU5lZ(*j} zY{|iGAjssH#em!}0!_8wgtzS~@T2^nEn zD>u`L-C732&bU@(l;gW$@%~`OWYSH%dH?<%@u^D1mA+9A(%y&8Q**?(V>VOMT+2K2 zmdp39`%Jr90)i}JqP`|JO?O&T%EX0S#?G=daKjIpDzc#Z3(yTXFrGMiT{NQF2~Fp+A!TrpcG4FL7y?9c^z_)<-UI4=zRgwv@7$w;n>)4Pmne zqjicIwZhEt9$z|=`W$j%;eZ4Bc1ez>Gdlp0En=?Heb9g#M0r~#(Eex7zKjgdDA_yf zGCZ?zJSrvd(Gg}+gl<^j;kIYbLX9n-TlB5|FpdEGI+hf!3+%Y*y(x(V5UR&(^J$a{mPOhZf;E^P#q7BC$SQofy+y z*4@M>=&y{99)WnS?JdcTJ%iTP&1U&>eJDHzSU5`e|A+0z+<9wynVe2qdOGtkgYGW? zpnAx@>TidV8^km!gv!or)~rgCthR83ji#tQxr|qU)sJr#RiFgoQ2>0qkfcw6Szt84 z}o` zX8J&O_e-Ls+-L-F3Jg+*;kn$-gMpCHk&yD`S~B((>MOP7*&n(CISumeZyp z77>RrnIy1)1O%a#fC=aC&7^HG>DBt9dLK3a%WAmEHgZi zdmq1lYaAD!&#!1tlPY)e$dHw_;~GzKWdz{un(VILglaZsRJXeFbNM?I5%w5VGH?HR zUl98J`Pdaw>y)W?)hr3b3zc1dTQvOAdvJmrCU2cAB5(GOyi@RgxEbZ@EelPVM<6hd z?;eQy7Sd%rEmw+-E8T8sP=Zin#$Nd5RL7-qN0>x zo%_r`fokg@O|qu8c2jIYYnj&UC%jEOIaux)*$z)OSM%^nKQ3sL{*mfZR*xDINI?1r zYH`1AI~+QS_r1IrAWH^I%~*=pMt+mE`u1%uUj0HyAfwvmL|q$oxLNu&nL9Jl5Y8GC zf)=<%G4c_$R!Yjg&EN;f;&{ua?_|4;D$*xQi2&`P)bz4RO z{9w`Fa(@NDuznkVzbqVXZngS#PbZK=Q@s%UAW!iB(E7?3c(Ev zNABrp68E_FFNEM#-@b{U7UnO`VsD2m?=%0*1V;UiBiEp{hrGhek(nf16l=Mg4<3}2 zXV`f74$`#8!lo1^1LHx?jZo?syU1UK1NQLo<5xyAODng~0)$kZ?~(yuzM?>U-ALcPAeLbEZA~op)K+ z`*Lx~!z;7;?jGmas4$h3CV)H~sqARS=GZXcpD>axPR*Jjn{f9~4hr~ARO5a3v5gs@ zw899vu#j$~UE_Q*H!^~t$Q2Et zhsQfcIQI(UrOM4n+|UwF#wq9Sl9w_G1tzXiIq;KK0C2DsZ>pgiKh~9q!#ZqipFet> zaJ}>M^HpJ&Mmv_S8NUv^Qq7u?4L>Bm@$AA3_+dVjTT^GucvY?1a9TrlGB31X@619i zZsviopim&W{lk+FV^D^g3$jwY%@Kqs2&p&=C<8E8PObok2Ac9(C1=%EG zQ$-))1py9=S!`F2J*8y@les#AP%PX(`*#mDk;hvCrkdZ_&<{#umCC_GW>@_E3l5ik zTfi`by9=>Ng&mHT5`HNf;b!#G*m5M&GQsgg4|3k;j$eupJn@H>yZH_uPS|n=6&JOU zT<90~Sc$T%E%geZ$OtTJBFAWS?07==k=vN06%FV|6Db;2BQMRqvGGVpec@3krrbU{ zVeUv+SrNnaNv5Z@dfJJg8E&$KF#5pkhx@_X70}{459$OJOZ~-*7tlu+MCVlQRsC4Y zy<+ZM(bR|*jGKwuaJkO`8Cr8Oo8Eu{1x7d4Yk75CJJPaS%O(Z$3ezw8mG)smZOG!k&dM zN>UZtw2sb!>gdUEA~}_Yshcr7N;nbuvu)DHXDV zLIL~L+ebgW6v!Bc>Z8}SgWDXSt7Swh$^Fu<{A2z?8WHE0R8A~Y#g zZIn0ZN9TX|?tu*twN)ZD(^|iNn!!DYpsGkq(IDMx6Hao`8#r(`i2?MNru5yM)#=M= z2D3%;5A1HS<2d$|(CARq%VrSxuat6*YbAF6G110!p@^iYtby z>&ji*WOd+>UDfBp5zXS;CO^~4$|T@Jz)WBk{3hfhQ85Y?bHaopHb20G@{P+_kB6a4 zr+B;6vw6j){p;ccmqvvu;DW*n4t$pa7bhmh80mcK{Y#)A+jhTq0}U8AZrlhcYvQZ` zVH%3<$X=}zprx>EBzeE;u$Jk6R&0(s{zorLxM}m}>wbzB&5pi)erJ$73(L9NV5PU9 zp8$GlKudEk$uO7>UI-8L`NRc_kz8BQ_tT{X{%u>gMvi~S_BPW@^3{EVqh8p9FS;5q z0tUX8j{p01f2DW*1A7ywkC$pag+K?h?3X@4Bns?3U5 z7#4J#lz@L->U!c(;3Ybbly>ji^+>lmADn+4yfS{h2>U@3Ue8JQHH-4ESryfZn= z@T7gtol~Z6pgbA5V1b6nNZ?`QJ$cuOSBNO!0GV6@pLSbx`>IyKYD_;MK%$iSd*aq! zI+M@*5VwHjd))v~+ji^=cRkW|TsPmlNzYrLFxhXe{br5|H~d5>>GbUBT0I0B9AO&n zaQ>z>XS(YwJKu8(1ZA;N;D@uJgry4v2I_s5{-Bv9D}5lm!}ux5706o$Mb+|-1Cu}x z8gp)`-Cj-}BRkv>(48-kH(8(G9O!(IGsw#VBohY*+RzWqRx4LN*s_ZM1A#bx{LG=1 zy#@~a`^3x=rje2x!LN?(=VKEHvg{Fp*3t3i>}(3ZW+T2h%`!J{sNg(~#xaG5>=2gC z)M#~4o!V_0OkaOqYYgiZr-Gy3Rnr@dtG#`G*t)bY*>u(e=V)WmhhgQRl+AN|(Y3u^ z$`V_Y1_DF?He#1cW7Oopgujk-aaLAPP2+ zjFpp*PVIC-p=iB(yy?i9+HF%#PCb9{o6hv~b$&^{pSyLnOZsP90?TLfa9^W4r}z8$ zjV=rI)7h_xP?~+b>7P^nVGltRa^VE<#2JTY$5uvcJ*eM(i}Rtk@oEyvGyXV!@}&0T zCX!0%2}WqQU3>TMu;6BjL5D|g(xvBp(|Cc+l^aCxjOYm&{actQ?7z-pDIF(Y&fV4P zej+<<@kc$IRX)UA2(*gK2TC@p{2Vm+V%f&+ttYKl8poYw_bmE<_y3l(+PXu^55Ko# zM;J6X`esvw5zN<_5iW8CyKG@ZhFPnuhdr%dzrKETms1_vTy<78X{hOZ$Y99kFWNN1 zGAoPPzr#T-YT3b`f1+x#C*fTF-~a#b|36xXRv*1wwmEAn)THt?^KLfpN^ zj&+@@i&AIl(hQ$+j}N2b)U2HvjO2asI;KtJ{0MKAfU&O#d?X(nP+hf6q5HCDdcQu= zZ#<)HX#$YUotQVJi|Rs|I<@AnAcOq%;s>l?PEMVAKadO3oqNx?;4szH&&c<`7oP5q zKUI8O+}XQtIj7Jbo40CpL}mY8he0!Mw3LmbYI3}L>&C)mgYjk%DW)9_#+XKF9S?H* zwPn(M=^L$KOdK%22&w?C|E{oboxNyPPtW@G3FGzw@=>`wS{RAImErtl`|fMTCjIgI zON>_9p`Z#{uIFHm+ZpKJ(9xr#T6Hj(_-h?({sxMH(>-sAH+2%QszgS#u+eA#_xV?_ zUhx5G$xb7mi^jN3px-FuuD?Iv8r>hkQlXF(iVXF%R@a<*3_Je(`3|%!tG82zY-#_#_;o6bgunuZFZtKh^N7%JyGN z;_C&nC!H-k9Aq#+jY7*5K28&2Fq6u#Pty*4Kos_C(WBhR0-{;N zQ|o6J`{~Ujni?eqnF0P@+%TzcD0|Rp@*gEc;JbexKi)-x`K36mqhOROiHR~3%|Q|rTuRY`(JRV05Oa36@a?P>CWg)X%y0B_c?uIygYKji&x1nDFmMENN@_N= zBYE6*F3JZkg$D}@T+KiTk{n8lH3y-#p1pCS6UCwFh!F~gXRgQuMvNd55I;cD@@u0TZAB0#14+Dm@ds~=I$p3W z;P#)b(9neb|NE>0Y|nObxnx~_`nxAr+TrB-v)U&vJGp+zhPM#J0OUJ!W-bp-Vwh5% zTU*nP?+sv<&?+kJ_ZB-vaBnT$gytw08FSJ6CDFa0z6qH;FG6WMrM=wfOHg?wOnR<* zmGViZ(Nw8Uu46Zh_;0hGnuzz4@Ts|M7n+!oTyxEES0og>BRsDSqegxOCuS5=L!pv` zigpB-NrLlQFW5ZQaf6@oqae#)JIm06=aiOKKsV6`Fb@5wKHatDzNBXuZ3>%7Y!soH zu{ZLJwA1VScbE=M77Rgj04uKEbm3GEL=N!ht_B8e!7zpkx|fDmb9*1{(1ri zmb?wYnZ5&+a@+44qi*RB{tLFIbStPl>ghf)4Cw@TAXRsQ!j_b}4xEX2l&iodgrIY$sfh2bmF2z=uCf<#IV))_l1!XBSjm2Fqo;-7gNoc0$RzDc$*z zEaP#v>63p2^LlY=iCAaqaoJO3iSz)XCzE+1iY9~TK;k6{R%AP(7DXLp_u|ZmF3Ua+ zLG3Lx5MXd*APy(4=XBVFfd(_gX7L}o{@;$tMt;YFs100xH2aIpxvAnTAwC7vsKa4W zAW>iWsYcTKmKV4ha0^Wjadu_E9=@?Upx>s?%S=s8!=m1L_0s*{D^$oe9cE@@!2b$D z#9i(?m&OW}`{>a*v+C0~fs74ez|4#x0KBqZoXGp2UDg$zxfb#VC!uBEwSTTp*W3!rq^lQu)gX9<%| zG=^L@svY`(=O!4sfc}Q%#y^$b{bga%1j9l9w*oY259ubezO2fLs;3~(PMMJ7v^_B7u5y`lF+7slkR+qPAzT7UB3^vfq_KROw{=JDaYS+Y= zT}c9gZa%gEe&PLswbu%*w=zwByU6(eeu!K~1S#9a)%ES7n$OvpLp}X*7sPCi!z1rz z;X(!eU1eouRe3K8|FVwGsY%&LKvR?@zL|*Mn~LkJ>uc{P1C1%1s<+x$T5sfD-L73* z);Tan+09hx=KSG3KVcA1M?o(ax(RC){D<|pxU~FB$y{ug0eQaL=Q@1l{@>V>18+vX zfBUvFr-FkvWb>jZTnd+8>p=g%R{zYK<|%)$-CB4wB2_Iou|>c^XVanZ$AMgc=NeR^Z0P> ztDG@YF2Lnl6*lODP3t~8%4Sk5yf$ZB^*|L@Wsnm(P!sk&W?~p?Hv~)M(hx<69kPUxvM)$^VhyCq!5t=;cs-vd4-7ghB* zV)MqU-K_Cbrnt_(I(GBs=wB7LM$B{9Y(mL_i8V$mMgnC#E zZiNVo*9u3%*}Z!NvjZ85+8Uhm_b-kPU1n3B_xs82a9aywL?1?mAQX(zOfcnq7+kkM zA4NJunH68?kg!lMD59pG`FtkZd-k;5gXJtd`jO`zEhMdrp3~p#%ERC{PneMSJXyY) z$z&%?tf4B8-moF!VeqofLEOX0FP$zJDMYL*YRhq4sPE0HivKEBH;vToCes;d_3qtB zB#_fD--3`LN;~?BhUy32H2SqIA1NI@bVzaJt}`{$h>MT&NIN4DqU;}Y?%^YgC2Q8S zlmQ1bc)8cFG)Yt^l)rFp-^VzR!NQ zXPY0*91tiYEdeSOXE_9$Zi>OT(nT#F`|Fkx?tDl45v(YZ$nWC+!sQ<9n4K&OW4FfY zrN{iu{-8Y-M-=S#2+3V^bed75Au_x4uzXzI{}xg+I>()YmV&vl;VBhLggx%=;;W7j zfprXqH58BZsbb{Sj8S}BO2Qy>ZPKqyzrgZUH8h$>TIiY^xBQ(#d`GWbwyYt1g_FJa zQg(?U1A}7WR5Sm93#rwuTU{cozIW>4(h>(l%V6_`!RBS}pZuYAV9d~MHJvy>TqY$D zqKSzT&mh;2(~L(J-?Uk6`76+W6WUAMLcO?U0}_@Ekc*-WPBe?VUi;{uC(G;Bs~1mc z4C+lLBPcoJO`sUzGnFeF6AK-zuq8cm%Gr9(zs|)Ty}^SU?n~NWM-U1rF4M(XibZZ`G?g8g}US z_GsbpuKW^LTFbAN!+z)G|JU!@Z(r^+ig~&G`f;MRj>kXuOjpj-2vhKD{OHN1fhG%g F{y%$js?-1g literal 0 HcmV?d00001 diff --git a/static/img/sourcehub/ttu-relgraph-3.png:Zone.Identifier b/static/img/sourcehub/ttu-relgraph-3.png:Zone.Identifier new file mode 100644 index 0000000..9ba3818 --- /dev/null +++ b/static/img/sourcehub/ttu-relgraph-3.png:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +HostUrl=https://raw.githubusercontent.com/sourcenetwork/zanzi/dev/docs/grokking-zanzibar-relbac/ttu-relgraph-3.png diff --git a/static/img/sourcehub/ttu-relgraph-annotated.png b/static/img/sourcehub/ttu-relgraph-annotated.png new file mode 100644 index 0000000000000000000000000000000000000000..177e85656f8310d68c812b8d29a245e803dcfcce GIT binary patch literal 41156 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 D=A7Jx literal 0 HcmV?d00001 diff --git a/static/img/sourcehub/ttu-relgraph-annotated.png:Zone.Identifier b/static/img/sourcehub/ttu-relgraph-annotated.png:Zone.Identifier new file mode 100644 index 0000000..e7a8b58 --- /dev/null +++ b/static/img/sourcehub/ttu-relgraph-annotated.png:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +HostUrl=https://raw.githubusercontent.com/sourcenetwork/zanzi/dev/docs/grokking-zanzibar-relbac/ttu-relgraph-annotated.png diff --git a/static/img/sourcehub/ttu-relgraph.png b/static/img/sourcehub/ttu-relgraph.png new file mode 100644 index 0000000000000000000000000000000000000000..bd89490cdb83bfd13da9d6922f0265f1b3dee551 GIT binary patch literal 28218 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 IIQnn-UlU@0wEzGB literal 0 HcmV?d00001 diff --git a/static/img/sourcehub/ttu-relgraph.png:Zone.Identifier b/static/img/sourcehub/ttu-relgraph.png:Zone.Identifier new file mode 100644 index 0000000..d93b64b --- /dev/null +++ b/static/img/sourcehub/ttu-relgraph.png:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +HostUrl=https://raw.githubusercontent.com/sourcenetwork/zanzi/dev/docs/grokking-zanzibar-relbac/ttu-relgraph.png From 79e99f94daf9761e51dd65a44ba608c1ff9d1cc4 Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Fri, 9 Aug 2024 19:31:43 -0400 Subject: [PATCH 23/48] fix: Landing hero image (#146) Fixed the background image in the hero banner of the landing page. Was blocking the bounding box of buttons (Orbis button on desktop version, DefraDB button on mobile). Replaced the tag with a CSS background-image. --- src/css/custom.scss | 18 ++++++++++++++++++ src/pages/index.js | 8 -------- src/pages/index.module.css | 5 +---- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/css/custom.scss b/src/css/custom.scss index f39636d..4c9d801 100644 --- a/src/css/custom.scss +++ b/src/css/custom.scss @@ -112,6 +112,24 @@ body { // Sidebar menu +html[data-theme="dark"] .main-wrapper { + background: url(http://github.com/img/hero_grid_white_1.png); + background-repeat: no-repeat; + /* background-position: right; */ + background-position-x: right; + background-position-y: bottom; + background-size: 25%; +} + +.main-wrapper { + background: url(http://github.com/img/hero_grid_black_1.png); + background-repeat: no-repeat; + /* background-position: right; */ + background-position-x: right; + background-position-y: bottom; + background-size: 25%; +} + .main-wrapper { .menu { $self: &; diff --git a/src/pages/index.js b/src/pages/index.js index 2d7c461..42c658f 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -15,14 +15,6 @@ function HomepageHeader() {

Welcome to the source of our developer documentation.

-
diff --git a/src/pages/index.module.css b/src/pages/index.module.css index 38a2d2b..159251c 100644 --- a/src/pages/index.module.css +++ b/src/pages/index.module.css @@ -3,10 +3,7 @@ position: relative; display: flex; align-items: center; - } - - .hero.heroBanner_src-pages-index-module { - background-color: black !important; + background-color: transparent !important; } .heroContent { From fdbc1a934f9ee3333c1874c929c6c3fba8fe9b33 Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Thu, 5 Sep 2024 21:16:13 -0700 Subject: [PATCH 24/48] feat: Add Orbis docs (#147) Adds the first round of Orbis documentation. Overview, Getting Started, and restructured network section. --- docs/defradb/getting-started.md | 2 +- docs/orbis/concepts/_category_.json | 5 + docs/orbis/concepts/dkg.md | 33 ++++++ docs/orbis/concepts/mpc.md | 32 ++++++ docs/orbis/concepts/pre.md | 37 +++++++ docs/orbis/concepts/pss.md | 34 +++++++ docs/orbis/getting-started/1-install.md | 35 +++++++ docs/orbis/getting-started/2-create.md | 95 ++++++++++++++++++ docs/orbis/getting-started/3-policy.md | 51 ++++++++++ docs/orbis/getting-started/4-secrets.md | 77 ++++++++++++++ docs/orbis/getting-started/_category_.json | 4 + docs/orbis/networks/_category_.json | 4 + docs/orbis/networks/testnet/_category_.json | 4 + docs/orbis/{ => networks}/testnet/join.md | 3 +- docs/orbis/overview.md | 21 ++++ docs/orbis/reference/_category_.json | 4 + docs/orbis/reference/config.md | 3 + docs/orbis/reference/manifest.md | 24 +++++ docs/orbis/testnet/_category_.json | 4 - .../getting-started/3-create-a-policy.md | 2 +- docs/sourcehub/overview.md | 2 +- static/img/orbis/cover.png | Bin 0 -> 106805 bytes static/img/orbis/pre.png | Bin 0 -> 46646 bytes 23 files changed, 467 insertions(+), 9 deletions(-) create mode 100644 docs/orbis/concepts/_category_.json create mode 100644 docs/orbis/concepts/dkg.md create mode 100644 docs/orbis/concepts/mpc.md create mode 100644 docs/orbis/concepts/pre.md create mode 100644 docs/orbis/concepts/pss.md create mode 100644 docs/orbis/getting-started/1-install.md create mode 100644 docs/orbis/getting-started/2-create.md create mode 100644 docs/orbis/getting-started/3-policy.md create mode 100644 docs/orbis/getting-started/4-secrets.md create mode 100644 docs/orbis/getting-started/_category_.json create mode 100644 docs/orbis/networks/_category_.json create mode 100644 docs/orbis/networks/testnet/_category_.json rename docs/orbis/{ => networks}/testnet/join.md (99%) create mode 100644 docs/orbis/overview.md create mode 100644 docs/orbis/reference/_category_.json create mode 100644 docs/orbis/reference/config.md create mode 100644 docs/orbis/reference/manifest.md delete mode 100644 docs/orbis/testnet/_category_.json create mode 100644 static/img/orbis/cover.png create mode 100644 static/img/orbis/pre.png diff --git a/docs/defradb/getting-started.md b/docs/defradb/getting-started.md index 6143f3d..15a8d2b 100644 --- a/docs/defradb/getting-started.md +++ b/docs/defradb/getting-started.md @@ -3,7 +3,7 @@ sidebar_position: 1 title: Getting Started slug: /defradb --- - +# DefraDB Overview ![DefraDB Overview](/img/defradb-cover.png) DefraDB is a user-centric database that prioritizes data ownership, personal privacy, and information security. Its data model, powered by the convergence of [MerkleCRDTs](https://arxiv.org/pdf/2004.00107.pdf) and the content-addressability of [IPLD](https://docs.ipld.io/), enables a multi-write-master architecture. It features [DQL](./references/query-specification/query-language-overview.md), a query language compatible with GraphQL but providing extra convenience. By leveraging peer-to-peer networking it can be deployed nimbly in novel topologies. Access control is determined by a relationship-based DSL, supporting document or field-level policies, secured by the SourceHub network. DefraDB is a core part of the [Source technologies](https://source.network/) that enable new paradigms of decentralized data and access-control management, user-centric apps, data trustworthiness, and much more. diff --git a/docs/orbis/concepts/_category_.json b/docs/orbis/concepts/_category_.json new file mode 100644 index 0000000..8f84ff8 --- /dev/null +++ b/docs/orbis/concepts/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Concepts", + "position": 3 + +} \ No newline at end of file diff --git a/docs/orbis/concepts/dkg.md b/docs/orbis/concepts/dkg.md new file mode 100644 index 0000000..97de470 --- /dev/null +++ b/docs/orbis/concepts/dkg.md @@ -0,0 +1,33 @@ +--- +sidebar_position: 2 +--- + +# Distributed Key Generation + +Distributed Key Generation (DKG) is a cryptographic protocol that enables a group of participants to collaboratively generate a public-private keypair in a decentralized manner. Unlike traditional key generation methods, where a single entity holds the private key, DKG ensures that the private key is never known in its entirety by any single participant. Instead, each participant holds a "share" of the private key, and a minimum threshold of participants must cooperate to perform cryptographic operations. + +## Key Concepts + +1. **Decentralization**: + - **Definition**: DKG involves multiple nodes in the key generation process, preventing any single point of control or failure. Each node contributes to the creation of the keypair, and the private key is never reconstructed in its entirety by any individual node. + - **Purpose in Orbis**: Decentralization ensures that no single entity has full control over the secrets, aligning with the security and resilience goals of Orbis. + +2. **Key Shares**: + - **Definition**: Instead of holding the complete private key, each participant in the DKG protocol holds a share of the private key. These shares are generated during the DKG process and are essential for performing any cryptographic operations that require the private key. + - **Purpose in Orbis**: Key shares enable the system to distribute trust among multiple participants. A threshold number of shares must be combined to reconstruct the private key, ensuring that no single participant can unilaterally access the secret. + +3. **Threshold Scheme**: + - **Definition**: A threshold scheme is a cryptographic mechanism that allows a specified minimum number of participants (threshold) to cooperate in performing a cryptographic operation, such as signing or decrypting a message. The threshold is chosen during the DKG process and defines the minimum number of shares required to reconstruct the private key. + - **Purpose in Orbis**: The threshold scheme provides a balance between security and availability. It ensures that the system remains functional even if some participants are unavailable or compromised, while also protecting against unauthorized access. + +## DKG in Orbis + +In the Orbis system, DKG is a foundational component that underpins the decentralized custodial model. By using DKG, Orbis achieves the following: + +- **Security**: The private key is never exposed in its entirety, and no single participant can access it alone. This enhances the security of the secrets managed by Orbis. +- **Fault Tolerance**: The threshold scheme allows the system to continue functioning even if some participants are compromised or unavailable. This resilience is crucial for maintaining the availability and integrity of the secrets. +- **Trust Distribution**: By distributing key shares among multiple participants, Orbis eliminates the need for a trusted central authority, reducing the risk of centralized control and single points of failure. + +## Conclusion + +Distributed Key Generation (DKG) is a critical cryptographic technique that enables Orbis to maintain a decentralized and secure environment for secret management. By ensuring that the private key is never fully known by any single participant, DKG provides strong security guarantees and supports the system's overall goals of decentralization and fault tolerance. Through DKG, Orbis achieves a robust and resilient architecture for managing secrets in a decentralized manner. \ No newline at end of file diff --git a/docs/orbis/concepts/mpc.md b/docs/orbis/concepts/mpc.md new file mode 100644 index 0000000..4cf4821 --- /dev/null +++ b/docs/orbis/concepts/mpc.md @@ -0,0 +1,32 @@ +--- +sidebar_position: 1 +--- +# Multi-Party Computation + +Multi-Party Computation (MPC) is a cryptographic technique that allows multiple parties to jointly compute a function over their inputs while keeping those inputs private. In the context of Orbis, MPC plays a crucial role in ensuring the security and integrity of secret management without a single point of failure. + +## Key Concepts + +1. [**Distributed Key Generation (DKG)**](/orbis/concepts/dkg): + - **Definition**: A decentralized method for collaboratively generating a cryptographic keypair. All participating nodes know the public key, but no single node knows the private key. Instead, each node holds a "share" of the private key. + - **Purpose in Orbis**: DKG is used to create a shared keypair for a Secret Ring, ensuring that the private key remains unknown to any single actor. This keypair is essential for securely encrypting secrets. + +2. [**Proxy Re-Encryption (PRE)**](/orbis/concepts/pre): + - **Definition**: A cryptographic mechanism that allows encrypted data (ciphertext) to be transformed from one public key to another without revealing the underlying plaintext. + - **Purpose in Orbis**: PRE is employed to transfer encrypted secrets from the Secret Ring's public key to a requesting party's ephemeral public key. This transformation is done securely and privately, ensuring that neither the system nor the nodes involved in the process ever see the plaintext. + +3. [**Proactive Secret Sharing (PSS)**](/orbis/concepts/pss): + - **Definition**: An algorithm that periodically redistributes the shares of a private key among nodes without changing the long-term keypair. This process mitigates the risk of adversaries compromising the system over time. + - **Purpose in Orbis**: PSS ensures the long-term security of the secret management system by preventing adversaries from accumulating enough shares to reconstruct the private key. It does so by periodically refreshing the shares, making it impossible for an adversary to exploit nodes indefinitely. + +## MPC in Orbis + +In Orbis, MPC techniques are foundational to the system's decentralized custodial model. They provide the following benefits: + +- **Security**: By ensuring that no single actor can access the entire secret or private key, MPC protects against unauthorized access and single points of failure. +- **Verifiability**: The use of MPC allows for the secure verification of cryptographic operations, ensuring that only authorized parties can access secrets. +- **Byzantine Fault Tolerance**: The system can tolerate a certain number of faulty or malicious nodes without compromising the integrity of the secret management process. + +## Conclusion + +MPC enables Orbis to maintain a decentralized and secure environment for secret management. By leveraging DKG, PSS, and PRE, Orbis achieves a robust system that is resistant to various attack vectors while ensuring that secrets are only accessible to authorized parties. These cryptographic protocols underpin the core functionality of Orbis, making it a reliable and secure solution for decentralized custodial secret management. \ No newline at end of file diff --git a/docs/orbis/concepts/pre.md b/docs/orbis/concepts/pre.md new file mode 100644 index 0000000..825be1e --- /dev/null +++ b/docs/orbis/concepts/pre.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 3 +--- + +# Proxy Re-Encryption + +![Proxy ReEncryption](/img/orbis/pre.png) +*image credit: https://medium.com/nucypher/unveiling-umbral-3d9d4423cd71* + +Proxy Re-Encryption (PRE) is a cryptographic technique that allows ciphertexts encrypted under one public key to be re-encrypted to another public key without revealing the underlying plaintext. This transformation is performed using a special cryptographic key called a re-encryption key (ReKey). In the context of Orbis, PRE enables secure and private transfer of encrypted secrets between different parties, ensuring that the secret is never exposed to intermediaries. + +## Key Concepts + +1. **Re-Encryption Key (ReKey)**: + - **Definition**: A special cryptographic key generated to convert ciphertext encrypted under one public key (A) to another public key (B). The ReKey is derived from the private key associated with public key A and the public key B. + - **Purpose in Orbis**: ReKeys are used to securely transfer encrypted secrets from the Secret Ring's public key to a requesting user's ephemeral public key, enabling the user to decrypt the secret without exposing it to the Secret Ring or any intermediaries. + +2. **Delegated Re-Encryption**: + - **Definition**: The process of re-encrypting ciphertext using a ReKey, which can be performed by an untrusted third party or server. The third party does not gain access to the plaintext during this process. + - **Purpose in Orbis**: Delegated re-encryption allows the Orbis system to offload the re-encryption process to nodes without risking exposure of the underlying secret. This capability is essential for maintaining the privacy and security of the user's data. + +3. **Ciphertext Transformation**: + - **Definition**: The process by which encrypted data (ciphertext) is converted from being encrypted under one public key to another, using a ReKey. This transformation ensures that the data remains encrypted throughout the process. + - **Purpose in Orbis**: Ciphertext transformation is used to manage access to secrets without decrypting them. For example, a secret encrypted under the Secret Ring's public key can be transformed to be decryptable only by the intended recipient's public key, maintaining confidentiality. + +## PRE and DKG in Orbis + +In the Orbis system, PRE and [Distributed Key Generation (DKG)](/orbis/concepts/dkg) work in tandem to provide a robust and secure framework for secret management: + +- **DKG**: DKG enables the decentralized creation of a shared public-private keypair, with the private key split into shares held by different nodes. This setup ensures that no single participant has access to the full private key, enhancing security. +- **PRE**: Utilizing the public key generated by the DKG process, PRE allows for the secure re-encryption of data. The private key shares generated during DKG are used to create ReKeys without reconstructing the full private key, thus maintaining security and privacy. This integration ensures that even though the secret's ciphertext is transformed between different public keys, the underlying plaintext remains protected from unauthorized access. + +The combination of DKG and PRE in Orbis ensures that secrets can be securely managed and transferred across different parties, all while preserving the integrity and confidentiality of the data. + +## Conclusion + +Proxy Re-Encryption (PRE) is a powerful cryptographic primitive that, in conjunction with [Distributed Key Generation (DKG)](/orbis/concepts/dkg), enables secure and private data transfer within the Orbis system. By leveraging ReKeys and delegated re-encryption, Orbis ensures that secrets are securely managed and transferred without exposing the plaintext to unauthorized parties. PRE and DKG together provide robust security and privacy guarantees, making Orbis a reliable solution for decentralized custodial secret management. \ No newline at end of file diff --git a/docs/orbis/concepts/pss.md b/docs/orbis/concepts/pss.md new file mode 100644 index 0000000..2e2d69c --- /dev/null +++ b/docs/orbis/concepts/pss.md @@ -0,0 +1,34 @@ +# Proactive Secret Sharing + +Proactive Secret Sharing (PSS) is a cryptographic protocol that enhances the security of a shared secret over time by periodically refreshing the shares held by participants. This process prevents adversaries from accumulating shares to eventually reconstruct the secret key. PSS is crucial in systems where long-term security is paramount, as it mitigates the risk of a compromise that may occur gradually over time. + +## Key Concepts +1. **Secret Shares**: + - **Definition**: In PSS, a secret (such as a private key) is divided into shares, with each participant holding one share. The secret can only be reconstructed with a sufficient number of shares, known as the threshold. + - **Purpose in Orbis**: By distributing shares among multiple nodes, Orbis ensures that no single entity has complete control over the private key, enhancing the system's security. + +2. **Share Refreshing**: + - **Definition**: The process of periodically updating the secret shares without changing the underlying secret. This process prevents adversaries from collecting enough shares over time to reconstruct the secret. + - **Purpose in Orbis**: Share refreshing ensures that even if some shares are compromised, the secret remains secure as the shares are periodically updated, nullifying the compromised shares' usefulness. + +3. **Epochs**: + - **Definition**: Time intervals at the end of which the shares are refreshed. The length of an epoch is determined based on the security requirements and threat model. + - **Purpose in Orbis**: Epochs provide a temporal boundary for when shares must be refreshed, ensuring that the system maintains its security properties over time. + +#### PSS, DKG, and PRE in Orbis + +In the Orbis system, PSS works alongside [Distributed Key Generation (DKG)](/orbis/concepts/dkg) and [Proxy Re-Encryption (PRE)](/orbis/concepts/pre) to provide a comprehensive and secure framework for secret management: + +- **DKG**: DKG is responsible for the initial generation of a shared keypair, with the private key split into shares distributed among participants. These shares are essential for performing cryptographic operations securely. +- **PSS**: While DKG establishes the initial distribution of secret shares, PSS ensures the long-term security of the system by periodically refreshing these shares. This prevents the gradual accumulation of shares by adversaries, thus protecting the secret's confidentiality. +- **PRE**: PRE utilizes the public key generated by DKG and the shares maintained and refreshed by PSS to securely transfer ciphertext between different public keys. PSS ensures that the private key shares used in creating ReKeys remain secure over time, maintaining the integrity of the re-encryption process. + +Together, DKG, PSS, and PRE form a robust security model in Orbis. DKG initiates a secure keypair, PSS maintains the security of the keypair over time, and PRE facilitates the secure and private transfer of encrypted secrets. + +## Conclusion +Proactive Secret Sharing (PSS) is a critical component in ensuring the long-term security and integrity of the Orbis system. By periodically refreshing secret shares, PSS prevents adversaries from exploiting compromised shares over time. When combined with [Distributed Key Generation (DKG)](/orbis/concepts/dkg) and [Proxy Re-Encryption (PRE)](/orbis/concepts/pre), PSS provides a resilient and secure framework for decentralized custodial secret management. This combination ensures that secrets are managed securely, remain confidential, and are accessible only to authorized parties. + + + + + diff --git a/docs/orbis/getting-started/1-install.md b/docs/orbis/getting-started/1-install.md new file mode 100644 index 0000000..ecfcaa6 --- /dev/null +++ b/docs/orbis/getting-started/1-install.md @@ -0,0 +1,35 @@ +# Installing Orbis +You can get the `orbisd` binary from the releases page of the Orbis repo: [https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.3](https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.3). +```bash +cd $HOME +wget https://github.com/sourcenetwork/orbis-go/releases/download/v0.2.3/orbisd +chmod +x orbisd +sudo mv /usr/bin +``` + +### From Source +You can download the code and compile your own binaries if you prefer. However you will need a local installation of the `go` toolchain at a minimum version of 1.21 +```bash +cd $HOME +git clone https://github.com/sourcenetwork/orbis-go +cd orbis-go +git checkout v0.2.3 +make build +cp ./build/orbisd $GOBIN/orbisd +export PATH=$PATH:$GOBIN +``` +Now you will have the `orbisd` available in your local system. + +## Docker +You can either use the pre-existing docker image hosted on our GitHub, or build your own + +`docker pull ghcr.io/sourcenetwork/orbis:0.2.3` + +### Build Docker Image from Source +```bash +cd $HOME +git clone https://github.com/sourcenetwork/orbis-go +cd orbis-go +git checkout v0.2.3 +docker build -t . +``` \ No newline at end of file diff --git a/docs/orbis/getting-started/2-create.md b/docs/orbis/getting-started/2-create.md new file mode 100644 index 0000000..caef2d6 --- /dev/null +++ b/docs/orbis/getting-started/2-create.md @@ -0,0 +1,95 @@ +# Create a Secret Ring + +***To skip ahead to using an existing Secret Ring deployment, +proceed to [Storing a Secret](./secrets).*** + +--- + +Secret Rings are a deployments of Orbis nodes with a single shared [distributed key pair](/orbis/concepts/dkg). To create a Secret Ring, you'll need a minimum of 3 Orbis nodes. + +## Docker Compose +The easiest method to get a local Secret Ring deployed is with our Docker Compose setup, which will initialize 3 orbis nodes, as well as the authorization service (Zanzi), and finally will bootstrap the peer-to-peer network. You will need **both** docker and docker-compose setup locally. + +:::warning +The following demo docker compose file uses deterministic private keys and ***IS NOT*** suitable for production deployments. Use at your own risk. +::: + +The docker compose file is hosted in the `demo/zanzi` folder on the Orbis repo, found [here](https://github.com/sourcenetwork/orbis-go/blob/develop/demo/zanzi/compose.yaml). + +To run the docker compose file +```bash +cd $HOME +git clone https://github.com/sourcenetwork/orbis-go +cd orbis-go +docker-compose -f demo/zanzi/compose.yaml up +``` + +## Ring Manifest +The Ring Manifest is the genesis file that describes the initial parameters of a Secret Ring. This includes the authentication and authorization schemes, which DKG protocol to use, etc. Importantly, it also has the addresses and `PeerIDs` of the nodes that will initialize the Ring. + +Here is the manifest for the root ring we will create for the set of nodes we have created with the docker-compose script above. To learn more about each parameter, please refer to the [Manifest Reference](/orbis/reference/manifest) doc. +```json +{ + "manifest": { + "n": 3, + "t": 2, + "dkg": "rabin", + "pss": "avpss", + "pre": "elgamal", + "bulletin": "p2p", + "transport": "p2p", + "authentication": "jws-did", + "authorization": "zanzi", + "nodes": [ + { + "id":"16Uiu2HAmLyq5HXHSFxvxmGcsnwsYPZvTDtfe3CYnWDK8jDAHhJC5", + "address":"/ip4/127.0.0.1/tcp/9000" + }, + { + "id":"16Uiu2HAmR7vXGm8Zohvs6cD3PtGSyAUFRDWypsAcmkiyMYTLhEe4", + "address":"/ip4/23.88.72.49/tcp/9000" + }, + { + "id":"16Uiu2HAmVBRogwVBbByVvsYywp2jUNBqfe1zTFNtaVMRvSyUndPX", + "address":"/ip4/138.201.36.107/tcp/9000" + }, + ], + "nonce": 0 + } +} +``` + +Save the above manifest defition to `manifest.json`. Then we can initialize the ring on each node in the ring. Each node *must* be configured independently with the `create-ring` command. + +```bash +# Run on each node +orbisd -s ring-service create-ring -f /manifest.json +``` + +This will initialze the DKG process and you node will start generating its respective DKG Share. This process can't complete unless all nodes are online and syncing. Once completed, the Secret Ring will have an initialized DKG, and is ready to start recieving Store and ReEncrypt requests! + +## Orbis Client +```bash +# Env Vars +export ORBIS_CLIENT_FROM="alice" +export ORBIS_CLIENT_SERVER_ADDR=":8081" +export ORBIS_CLIENT_AUTHZ_ADDR=":8080" +export ORBIS_CLIENT_RING_ID="zQ123" + +# Create Policy +orbisd client policy create -f policy.yaml => policy-id=0x123 +orbisd client policy describe 0x123 => policy-data=... + +# Create Secret (managed authorization) +orbisd client put "mysecret" --authz managed --policy 0x123 --resource secret --permission read +orbisd client get ABC123 + +# Create Secret (unmanaged authorization) +orbisd client policy register 0x123 secret mysecret +orbisd client put "mysecret" --authz unmanaged --permission "0x123/secret:mysecret#read" +orbisd client get ABC123 + +# Add Bob as a reader +orbisd client policy set 0x123 secret mysecret collaborator did:key:bob +orbisd client policy check 0x123 did:key:bob secret:mysecret#read => valid=true/false +``` \ No newline at end of file diff --git a/docs/orbis/getting-started/3-policy.md b/docs/orbis/getting-started/3-policy.md new file mode 100644 index 0000000..1ff779a --- /dev/null +++ b/docs/orbis/getting-started/3-policy.md @@ -0,0 +1,51 @@ +# Setup Authorization Policy +Before we can start storing secrets into the newly created Secret Ring, we must define our access policy. This access policy will determine the resources and permissions that users will need to authorize with to recover secrets. + +This section will assume you are using the `Zanzi` Authorization GRPC Service that is included in the example `docker-compose.yaml` file from the previous step. If you are using the `SourceHub ACP` module instead, you can reference the [Create a SourceHub ACP Policy](/sourcehub/getting-started/create-a-policy) doc. + +## Create a Policy + +The `Zanzi` Authorization GRPC Service is a [Zanzibar](/sourcehub/concepts/zanzibar) based global decentralized authorization system. Developers write policies using our Relation-Based Access Control (RelBAC) DSL, which allows you to define resources, relations, and permissions. + +- **Resources**: Generic container for some kind of "thing" you wish to gate access to or provide authorization for. It can be anything from a secret on [Orbis](/orbis), a document on [DefraDB](/defradb), or any other resource. + +- **Relation**: Named connections between resources. Similar to a database table that might have relations between its schema types, so does the SourceHub ACP module. This allows us to create expressive policies that go beyond traditional *Role-Based* or *Attribute-based* access control. + +- **Permissions**: Computed queries over resources, relations, and even other permissions (they're recursive!). + +### Secret Resource Policy +Here we are going to create a basic policy to govern access to our secrets in Orbis. + +Create a file named `orbis-policy.yaml` and paste the following: +```yaml +name: Orbis Secret Policy + +resources: + + secret: + relations: + owner: + types: + - actor + collaborator: + types: + - actor + + permissions: + read: + expr: owner + collaborator + edit: + expr: owner + delete: + expr: owner +``` + +Now that we have our policy defined, we can upload it to the `Zanzi` service +```shell +orbisd client policy create -f orbis-policy.yaml +``` + +Which will return back the created policy ID. We can confirm the policy has been created by using the `policy describe` command. +```bash +orbisd client policy describe +``` \ No newline at end of file diff --git a/docs/orbis/getting-started/4-secrets.md b/docs/orbis/getting-started/4-secrets.md new file mode 100644 index 0000000..ad18ccd --- /dev/null +++ b/docs/orbis/getting-started/4-secrets.md @@ -0,0 +1,77 @@ +# Store, Recover, and Share Secrets +Now that we have initialized our orbis nodes, defined our manifest, created the secret ring, and uploaded our policy we are finally ready to store secrets into our Ring! + +## Store Secrets + +To store a secret in a ring, theres a series of steps that clients must execute (thankfully our CLI Client does this all for you). The TLDR is that secrets must be +- Encrypted to the Secret Rings DKG Public Key +- Proof-of-Encryption commitment that cryptographically proves the first step is done correctly +- Client sends the encrypted secret and commitment proof, along with the authorization policy details to any of the Orbis nodes within the Secret Ring as a `store-secret` request. +- Finally the nodes broadcast the `store-secret` request amungst eachother. + +To create and store a secret, we have two methods for how the client will create the authorization policy information for the `store-secret` request. These methods are called `Managed` and `Unmanaged`. + +With `Managed` authorization, the client will automatically register the required zanzibar resource to the policy when storing the secret. + +The `Unmanaged` authorization has no automated registration functionality, so the caller is responsible for A) Ensuring the correct resources are registed in the policy B) They correctly create the Zanzibar authorization permission string, and ensure themselves have permission to access the supplied resource. + +### Managed Example +To create a `managed` secret with policy defined in the previous step: +```bash +orbisd client --ring-id put "MySuperSecretInformation" --authz managed --policy --resource secret --permission read +``` + +Here the client will get the `` aggregate public key, encrypt `MySuperSecretInformation` to the public key, create the proof, locally generate the `` (determinstic), register the `` as a new object in the `` policy with ourselves set as the `owner`, craft the full permission object `/secret:#read`, and send the full `store-secret` request with all this information to the Secret Ring. + +### Unmanaged Example +To create an `unmanaged` secret, first we manually register an object into the policy, then create the secret. +```bash +# Register an object called `MySecretName` +orbisd client policy register secret +# Create the secret using the `MySecretName` authorization object +orbisd client put "MySuperSecretInformation" --authz unmanaged --permission "/secret:#read" +``` + +You may have noticed the difference when executing the `unmanaged` request compared to the `managed` request is that we can manually define `` instead of using the deterministically generated ``. This is because we seperated the `register` command from the `put` command. Moreover, we supplied the `--permission` as the fully +qualified zanizbar tuple `/secret:#read` as a single string. + +In both examples, the finally request sent to the Secret Ring is similar, the encrypted secret is verified against the proof commitment, and finally broadcast to the network bulletin so it can be recieved by all the other nodes. + +## Recover Secrets +Now that we have stored a secret, we can send a `recover` request which will trigger a Threshold [Proxy Re-Encryption](/orbis/concepts/pre) request. This request will first be authenticated to ensure the client requesting has the correct Proof-of-Possession JWS token, then authorized by each node before re-encryption. The authorization runs a `Check` call against the `Zanzi` authorization service to determine if client has the correct permission as configured when the secret was first created. + +In the above example, this means the `Check` call will determine if the client has the `read` permission on the provided secret resource within the `` policy. + +```bash +orbisd client get +``` +> Note: You will need to replace `` with `` if you used the `unmanaged` authorization. + +This will automatically craft the proof-of-possession JWS token, intiate the proxy re-encryption request, wait for and finally decrypt the response. + + +## Share a Secret +To share a secret with another person, we can update the policy state so that our target subject has the necessary permissions to access the secret. From our [example policy](/orbis/getting-started/policy#create-a-policy) before our `secret` resource has an additional `collaborator` relation. Moreover, the `read` permission is the expression `owner + collaborator` which means either the `owner` or the `collaborator` can `read`. + +We're going to add `Bob` identified by `did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS` as a `collaborator` so he can inheir the `read` permission and therefore access our stored secret. + +:::info +Reminder, there is nothing specific about the names/labels used within our policy. Although we use the `read` permission, there is no special power or requirement to name your permission `read`, it can be any valid name. +::: + +```bash +orbisd keys add bob +export BOB=$(orbisd keys show bob --did) +orbisd client policy set secret collaborator $BOB +``` + +We can confirm that the policy relation was created by manually running a `Check` command. +```bash +orbisd client policy check secret:#read +``` +Which should return `valid: true`. + +Finally `Bob` can also recover the secret +```bash +orbisd client --from bob get +``` diff --git a/docs/orbis/getting-started/_category_.json b/docs/orbis/getting-started/_category_.json new file mode 100644 index 0000000..27e66a2 --- /dev/null +++ b/docs/orbis/getting-started/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Getting Started", + "position": 2 +} \ No newline at end of file diff --git a/docs/orbis/networks/_category_.json b/docs/orbis/networks/_category_.json new file mode 100644 index 0000000..a6f0323 --- /dev/null +++ b/docs/orbis/networks/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Networks" + } + \ No newline at end of file diff --git a/docs/orbis/networks/testnet/_category_.json b/docs/orbis/networks/testnet/_category_.json new file mode 100644 index 0000000..5ab6ca9 --- /dev/null +++ b/docs/orbis/networks/testnet/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Testnet 1" + } + \ No newline at end of file diff --git a/docs/orbis/testnet/join.md b/docs/orbis/networks/testnet/join.md similarity index 99% rename from docs/orbis/testnet/join.md rename to docs/orbis/networks/testnet/join.md index 441a9d2..b35a03d 100644 --- a/docs/orbis/testnet/join.md +++ b/docs/orbis/networks/testnet/join.md @@ -1,6 +1,5 @@ --- title: Join Root Ring -slug: /orbis --- # How to Join Testnet 1 Root Ring @@ -55,7 +54,7 @@ docker build -t . ``` ## Docker Compose - +> TODO ## Initialization To deploy our orbis node and to join the Root Ring running on [SourceHub Testnet 1](/sourcehub/testnet/overview), generate or use an existing sourcehub keypair, and update your respective configuration. diff --git a/docs/orbis/overview.md b/docs/orbis/overview.md new file mode 100644 index 0000000..9b067ee --- /dev/null +++ b/docs/orbis/overview.md @@ -0,0 +1,21 @@ +--- +sidebar_position: 1 +title: Overview +slug: /orbis +--- +# Orbis Overview +![Orbis Overview](/img/orbis/cover.png) + +Orbis is a decentralized Secrets Management engine powered by [Threshold-Proxy ReEncryption](asd) and [Multi-Party Computation](asd) to enable trustless system to manage and share application and user secrets. Application and user secrets can be anything from encryption keys, API tokens, to general small sized messages. This is comparable to other Secrets Management systems like [Hashicorp Vault](vault) but without a single centralized entity. + +## How it works +Deployments of Orbis are called *Secret Rings* which are initialized by a group of nodes, which collectively agree on some starting *Manifest*. These manifest define the initial parameters, such as which kind of authentication/authorization, Proxy Re-encryption, Distributed Key Generation (DKG) algorithms, bulletin protocol, etc are used. + +Once the manifest is created, Secret Ring nodes will start their initial DKG ceremony, which will generate a shared keypair maintained by the nodes, where each node has a share of the private key, and in aggregrate represent a single public key. When a threshold number of nodes (defined by the chosen parameters in the Manifest) collaborate, they are able to execute various kinds of cryptograhic operations. + +Once a Ring is fully configured and initialized users that want to store secrets will encrypt their secret *`S`* to the rings aggregate public key *`Pk`*, *`Se = Enc(S, Pk)`*. They then send *`Se`* to any of the Orbis nodes along with the *Authorization Context* that determines how the configured authorization system processes requests (which is dependant on the `authz` parameter of the Manifest), as a `StoreSecret` request. Finally the receiving node will broadcast the request to the Rings' bulletin protocol to sync with the rest of the nodes. + +:::info +The *Root Ring* is a special deployment Orbis Ring that is a public permissionless service provided by the same infrastructure nodes as the SourceHub publicly hosted service. This ensures there is a single public Source stack deployment that developers can use along side their DefraDB nodes. +::: + diff --git a/docs/orbis/reference/_category_.json b/docs/orbis/reference/_category_.json new file mode 100644 index 0000000..86d0ad2 --- /dev/null +++ b/docs/orbis/reference/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Reference", + "position": 4 +} \ No newline at end of file diff --git a/docs/orbis/reference/config.md b/docs/orbis/reference/config.md new file mode 100644 index 0000000..b53e15d --- /dev/null +++ b/docs/orbis/reference/config.md @@ -0,0 +1,3 @@ +# Config + +> TODO \ No newline at end of file diff --git a/docs/orbis/reference/manifest.md b/docs/orbis/reference/manifest.md new file mode 100644 index 0000000..eb47d64 --- /dev/null +++ b/docs/orbis/reference/manifest.md @@ -0,0 +1,24 @@ +# Manifest + +```json +{ + "manifest": { + "n": 3, // N: The total number of nodes in the ring + "t": 2, // T: The threshold number of nodes to run decryption request (T <= N) + "dkg": "rabin", // DKG: Distributed Key Generation algorithm (available: rabin) + "pss": "avpss", // PSS: Proactive Secret Sharing algorithm (available: avpss) + "pre": "elgamal", // PRE: Proxy Re-Encryption algorithm (available: elgamal) + "bulletin": "p2p", // Bulletin: The network broadcast bulletin (available: p2p, sourcehub) + "transport": "p2p", // Transport: The overlay network transport (available: p2p) + "authentication": "jws-did", // Authentication: The authn scheme for clients (available: jws-did) + "authorization": "zanzi", // Authorization: The authz scheme for clients (available: zanzi, sourcehub) + "nodes": [ // Nodes: Set of node objects identifying the initial nodes. + { + "id":"16Uiu2HAmLyq5HXHSFxvxmGcsnwsYPZvTDtfe3CYnWDK8jDAHhJC5", + "address":"/ip4/127.0.0.1/tcp/9000" + }, + ], + "nonce": 0 // Nonce: Random value to adjust the determinstic RingID creation + } +} +``` \ No newline at end of file diff --git a/docs/orbis/testnet/_category_.json b/docs/orbis/testnet/_category_.json deleted file mode 100644 index 1fcd03f..0000000 --- a/docs/orbis/testnet/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Testnet" - } - \ No newline at end of file diff --git a/docs/sourcehub/getting-started/3-create-a-policy.md b/docs/sourcehub/getting-started/3-create-a-policy.md index f0521c2..ad58b55 100644 --- a/docs/sourcehub/getting-started/3-create-a-policy.md +++ b/docs/sourcehub/getting-started/3-create-a-policy.md @@ -15,7 +15,7 @@ The SourceHub ACP Module is a [Zanzibar](/sourcehub/concepts/zanzibar) based glo ## Example Lets create a very basic example policy which defines a single resource named `note` with both an `owner` and `collaborator` relation which are both of type `actor`. -Create a file named `basic-policy.yaml` and past the following: +Create a file named `basic-policy.yaml` and paste the following: ```yaml name: Basic Policy diff --git a/docs/sourcehub/overview.md b/docs/sourcehub/overview.md index 1eb2abe..dd027a9 100644 --- a/docs/sourcehub/overview.md +++ b/docs/sourcehub/overview.md @@ -3,7 +3,7 @@ sidebar_position: 1 title: Overview slug: /sourcehub --- -# Overview +# SourceHub Overview ![SourceHub Overview](/img/sourcehub-cover-copy.png) diff --git a/static/img/orbis/cover.png b/static/img/orbis/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..fae4faa16342810df45d43f781819afbc5bbb76b GIT binary patch literal 106805 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

  • J;uX{YozOI*Kl@re28q; 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

    8|K6D&7?c< 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 Q2K;)Y@KnA;*4X#|02Yx!4gdfE literal 0 HcmV?d00001 From 489e01c4ce35cecaea0ceedc5d8a225c4b59718e Mon Sep 17 00:00:00 2001 From: David Turner Date: Fri, 4 Oct 2024 12:42:25 -0400 Subject: [PATCH 25/48] feat: Update landing components (#148) --- docusaurus.config.js | 22 +++-- src/css/custom.scss | 49 ++++++----- src/css/infima-variables.scss | 19 +++- src/pages/index.js | 71 --------------- src/pages/index.module.css | 49 ----------- src/pages/index.module.scss | 152 ++++++++++++++++++++++++++++++++ src/pages/index.tsx | 160 ++++++++++++++++++++++++++++++++++ static/img/icon-defradb.svg | 25 ++++++ static/img/icon-orbis.svg | 29 ++++++ static/img/icon-sourcehub.svg | 23 +++++ 10 files changed, 450 insertions(+), 149 deletions(-) delete mode 100644 src/pages/index.js delete mode 100644 src/pages/index.module.css create mode 100644 src/pages/index.module.scss create mode 100644 src/pages/index.tsx create mode 100644 static/img/icon-defradb.svg create mode 100644 static/img/icon-orbis.svg create mode 100644 static/img/icon-sourcehub.svg diff --git a/docusaurus.config.js b/docusaurus.config.js index f14a95c..2ce3b22 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -31,10 +31,13 @@ const config = { "https://github.com/sourcenetwork/docs.source.network/edit/master/", // Reorder changelog sidebar - async sidebarItemsGenerator({defaultSidebarItemsGenerator, ...args}) { + async sidebarItemsGenerator({ + defaultSidebarItemsGenerator, + ...args + }) { const sidebarItems = await defaultSidebarItemsGenerator(args); return reverseSidebarChangelog(sidebarItems); - } + }, }, theme: { customCss: require.resolve("./src/css/custom.scss"), @@ -151,7 +154,14 @@ const config = { }, }), plugins: [ - "docusaurus-plugin-sass", + [ + "docusaurus-plugin-sass", + { + sassOptions: { + includePaths: ["./src/css"], + }, + }, + ], ], customFields: { docsData: {}, @@ -164,10 +174,10 @@ module.exports = config; function reverseSidebarChangelog(items) { // Reverse items in categories const result = items.map((item) => { - if (item.type === 'category' && item.label == "Release Notes") { - return {...item, items: item.items.reverse()}; + if (item.type === "category" && item.label == "Release Notes") { + return { ...item, items: item.items.reverse() }; } return item; }); return result; -} \ No newline at end of file +} diff --git a/src/css/custom.scss b/src/css/custom.scss index 4c9d801..8c7cea5 100644 --- a/src/css/custom.scss +++ b/src/css/custom.scss @@ -24,11 +24,25 @@ body { --menu-indicator-color: #ccc; } -// html[data-theme="dark"] { // Dark overrides -// } + +// html[data-theme="dark"] {} + +// Pages + +.home-page { + background-image: url(http://github.com/img/hero_grid_black_1.png); + background-repeat: no-repeat; + background-position: 100% 10%; + background-size: rem(350px); + + &[data-theme="dark"] { + background-image: url(http://github.com/img/hero_grid_white_1.png); + } +} // Layout + .footer > .container, .navbar__inner, .main-wrapper { @@ -37,6 +51,18 @@ body { margin: auto; } +// Utilities + +.spacing-horz { + padding: 0 var(--ifm-spacing-horizontal); +} + +.block-section { + padding-top: rem(50px); + padding-bottom: rem(50px); + border-top: rem(1px) solid var(--docs-title-border); +} + // navbar .docusaurus-highlight-code-line { @@ -112,24 +138,6 @@ body { // Sidebar menu -html[data-theme="dark"] .main-wrapper { - background: url(http://github.com/img/hero_grid_white_1.png); - background-repeat: no-repeat; - /* background-position: right; */ - background-position-x: right; - background-position-y: bottom; - background-size: 25%; -} - -.main-wrapper { - background: url(http://github.com/img/hero_grid_black_1.png); - background-repeat: no-repeat; - /* background-position: right; */ - background-position-x: right; - background-position-y: bottom; - background-size: 25%; -} - .main-wrapper { .menu { $self: &; @@ -201,6 +209,7 @@ html[data-theme="dark"] .main-wrapper { } // Breadcrumbs + .breadcrumbs { margin: rem(30px) 0 rem(20px); font-size: rem(12px); diff --git a/src/css/infima-variables.scss b/src/css/infima-variables.scss index 9ed6a66..06b563f 100644 --- a/src/css/infima-variables.scss +++ b/src/css/infima-variables.scss @@ -1,6 +1,20 @@ +// Custom vars +:root { + --card-color: rgb(255, 255, 255, 0.8); + --card-border-color: #e8e8e8; + --card-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + --card-box-shadow-highlight: 0 2px 25px rgba(31, 96, 233, 0.05); +} + +html[data-theme="dark"] { + --card-color: rgb(29, 29, 29, 0.8); + --card-border-color: #313131; + --card-box-shadow: 0 2px 25px rgba(238, 238, 238, 0.05); +} + :root { // Colors - --ifm-color-primary: #1f60e9; + --ifm-color-primary: rgb(31, 96, 233); --ifm-color-primary-dark: #1554d8; --ifm-color-primary-darker: #144fcc; --ifm-color-primary-darkest: #1141a8; @@ -46,7 +60,7 @@ --ifm-alert-border-left-width: 2px; - /* Horizontal Rules. */ + /* Horizontal Rules. */ // --ifm-breadcrumb-border-radius: 1.5rem; --ifm-breadcrumb-spacing: 0rem; --ifm-breadcrumb-color-active: inherit; @@ -58,7 +72,6 @@ // --ifm-breadcrumb-separator-filter: none; // --ifm-breadcrumb-separator-size: 0.5rem; // --ifm-breadcrumb-separator-size-multiplier: 1.25; - } html[data-theme="dark"] { diff --git a/src/pages/index.js b/src/pages/index.js deleted file mode 100644 index 42c658f..0000000 --- a/src/pages/index.js +++ /dev/null @@ -1,71 +0,0 @@ -import React from 'react'; -import Layout from '@theme/Layout'; -import Link from '@docusaurus/Link'; -import clsx from 'clsx'; -import styles from './index.module.css'; -import ThemedImage from '@theme/ThemedImage'; - -function HomepageHeader() { - return ( -

    -
    -
    -
    -

    Source Network Stack

    -

    Welcome to the source of our developer documentation.

    -
    -
    -
    -
    -
    -
    - ); -} - -function HomepageFeatures() { - return ( -
    -
    -
    -
    - -
    -

    DefraDB

    -

    Deploy decentralized databases

    -
    - -
    -
    - -
    -

    SourceHub

    -

    Build trust & interopability

    -
    - -
    -
    - -
    -

    Orbis

    -

    Distributed secrets management

    -
    - -
    -
    -
    -
    - ); -} - -export default function Home() { - return ( - - -
    - -
    -
    - ); -} diff --git a/src/pages/index.module.css b/src/pages/index.module.css deleted file mode 100644 index 159251c..0000000 --- a/src/pages/index.module.css +++ /dev/null @@ -1,49 +0,0 @@ -.heroBanner { - padding: 4rem 0; - position: relative; - display: flex; - align-items: center; - background-color: transparent !important; - } - - .heroContent { - display: flex; - justify-content: space-between; - align-items: center; - } - - .heroText { - flex: 1; - } - - .heroImageContainer { - position: absolute; - right: 0; - } - - .features { - padding: 2rem 0; - } - - .card { - background-color: #ffffff; - border: 1px solid #eaeaea; - border-radius: 8px; - padding: 2rem; - text-align: center; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); - transition: transform 0.2s ease-in-out; - } - - .card:hover { - transform: translateY(-5px); - } - - .card h3 { - margin-bottom: 1rem; - } - - .card p { - margin-bottom: 0; - } - \ No newline at end of file diff --git a/src/pages/index.module.scss b/src/pages/index.module.scss new file mode 100644 index 0000000..f896c2b --- /dev/null +++ b/src/pages/index.module.scss @@ -0,0 +1,152 @@ +@import "http://github.com/utils"; + +.homeWrapper { + margin: auto 0; + + .container { + max-width: var(--root-wrapper-width); + } +} + +.heroBanner { + padding-top: rem(100px); + position: relative; + display: flex; + align-items: center; + + .heroContent { + display: flex; + justify-content: space-between; + align-items: center; + .heroText { + max-width: rem(900px); + } + } + + .heroTitle { + font-size: rem(48px); + line-height: 1; + } + + .heroSubTitle { + font-size: rem(20px); + } + + @media screen and (max-width: 996px) { + padding-top: rem(50px); + + .heroTitle { + font-size: rem(26px); + } + + .heroSubTitle { + font-size: rem(16px); + br { + display: none; + } + } + } +} + +.features { + padding: rem(32px) 0; + + @media screen and (max-width: 996px) { + padding: 0 0 rem(32px); + } +} + +.arrow { + margin-left: rem(5px); + transition: all 0.3s ease; +} + +.card { + display: block; + background-color: var(--card-color); + border: rem(1px) solid var(--card-border-color); + border-radius: rem(8px); + padding: rem(32px); + text-align: center; + color: var(--ifm-font-color-base); + box-shadow: var(--card-box-shadow); + margin-bottom: rem(10px); + transition: all 0.3s ease; + + h3, + p { + margin-bottom: 0; + } + + p { + font-size: rem(14px); + } + + img { + width: rem(40px); + margin-bottom: rem(10px); + } + + &:hover { + transform: translateY(-2px) scale(1.02); + text-decoration: none; + color: var(--ifm-font-color-base); + border-color: var(--ifm-color-primary); + box-shadow: var(--card-box-shadow-highlight); + + .arrow { + transform: translate(3px, 0); + } + } + + @media screen and (max-width: 996px) { + display: flex; + text-align: left; + + img { + width: rem(30px); + margin: auto 15px auto 0; + } + h3 { + font-size: rem(16px); + } + } +} + +.linkList { + a { + display: block; + font-size: rem(14px); + } +} + +.community { + border-bottom: 1px solid var(--docs-title-border); + + h3 { + margin-bottom: 0; + color: var(--ifm-font-color-base); + } + + .communityLinks { + margin-top: rem(40px); + + .communityLink { + &:hover { + text-decoration: none; + + p { + text-decoration: underline; + } + + .arrow { + transform: rotate(-45deg) translate(3px, 0px); + } + } + } + } + + .arrow { + transform: rotate(-45deg); + } +} diff --git a/src/pages/index.tsx b/src/pages/index.tsx new file mode 100644 index 0000000..1b54e53 --- /dev/null +++ b/src/pages/index.tsx @@ -0,0 +1,160 @@ +import Head from '@docusaurus/Head'; +import Link from '@docusaurus/Link'; +import Layout from '@theme/Layout'; +import clsx from 'clsx'; +import React, { FC } from 'react'; +import IconThemeArrow from '../theme/IconArrow'; +import styles from './index.module.scss'; + +const HomepageHeader: FC<{}> = () => { + return ( +
    +
    +
    +
    +

    Source Network Developer Hub

    +

    Your guide to building with the Source Network stack.
    Get started, explore the docs, and discover the power of decentralized data.

    +
    +
    +
    +
    +
    +
    + ); +} + +const HomepageFeatures: FC<{}> = () => { + const features = [ + { + link: "/defradb", + image: "./img/icon-defradb.svg", + title: "DefraDB", + subTitle: "Deploy decentralized databases", + }, + { + link: "/sourcehub", + image: "./img/icon-sourcehub.svg", + title: "SourceHub", + subTitle: "Build trust & interopability", + }, + { + link: "/orbis", + image: "./img/icon-orbis.svg", + title: "Orbis", + subTitle: "Distributed secrets management", + } + ] + + return ( +
    +
    +
    + {features.map((feature, i) => { + return
    + + +
    +

    {feature.title}

    +

    {feature.subTitle}

    +
    + +
    + })} +
    +
    +
    + ); +} + +const HomepageReferenceLinks: FC<{}> = () => { + return ( +
    +
    +

    Quick Reference

    +

    A collection of guides and references to help you navigate the Source Network.

    + +
    +
    + DefraDB Query Language Overview + DefraDB CLI Reference + DefraDB Peer-to-Peer Guide + DefraDB Schema Migration Guide +
    +
    + SourceHub Getting Started + SourceHub API + Orbis Installation + Orbis Setup Authorization Policy +
    +
    +
    +
    +
    +
    + ); +} + +const HomepageCommunity: FC<{}> = () => { + const links = [ + { + link: "https://discord.source.network/", + title: "Discord", + linkText: "Join our server" + }, + { + link: "https://github.com/sourcenetwork/docs.source.network", + title: "Github", + linkText: "Contritube to Source" + }, + { + link: "https://x.com/sourcenetwrk", + title: "Twitter", + linkText: "Follow us on Twitter" + }, + { + link: "https://t.me/source_network", + title: "Telegram", + linkText: "Join the chat" + } + ] + + return ( +
    +

    Join Our Community

    +

    Engage with our developer community and the Source team to get help, exchange ideas & collaborate.

    +
    + {links.map((lnk, i) => { + return
    + +
    +

    {lnk.title}

    +

    {lnk.linkText}

    +
    + +
    + })} +
    +
    + ); +} + +export default function Home() { + return ( + + + + + +
    + +
    + + + +
    +
    +
    + ); +} diff --git a/static/img/icon-defradb.svg b/static/img/icon-defradb.svg new file mode 100644 index 0000000..bd713ae --- /dev/null +++ b/static/img/icon-defradb.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/icon-orbis.svg b/static/img/icon-orbis.svg new file mode 100644 index 0000000..0c04d05 --- /dev/null +++ b/static/img/icon-orbis.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/icon-sourcehub.svg b/static/img/icon-sourcehub.svg new file mode 100644 index 0000000..bda2f40 --- /dev/null +++ b/static/img/icon-sourcehub.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + From 61960e4f908170b6eb4604c85c8be837656d7b06 Mon Sep 17 00:00:00 2001 From: Keenan Nemetz Date: Tue, 7 Jan 2025 08:50:05 -0800 Subject: [PATCH 26/48] Update docs and add missing references (#150) This is a quick fix to make sure our docs site is up to date until we figure out the unified docs build pipeline. --- docs/defradb/getting-started.md | 237 ++++-- docs/defradb/guides/explain-systems.md | 4 +- docs/defradb/guides/peer-to-peer.md | 12 +- docs/defradb/guides/time-traveling-queries.md | 6 +- docs/defradb/references/acp.md | 795 ++++++++++++++++++ docs/defradb/references/cli/defradb.md | 43 +- docs/defradb/references/cli/defradb_client.md | 60 +- .../references/cli/defradb_client_acp.md | 46 + .../cli/defradb_client_acp_policy.md | 41 + .../cli/defradb_client_acp_policy_add.md | 91 ++ .../cli/defradb_client_acp_relationship.md | 42 + .../defradb_client_acp_relationship_add.md | 89 ++ .../defradb_client_acp_relationship_delete.md | 73 ++ .../references/cli/defradb_client_backup.md | 43 + .../cli/defradb_client_backup_export.md | 55 ++ .../cli/defradb_client_backup_import.md | 47 ++ .../references/cli/defradb_client_blocks.md | 28 - .../cli/defradb_client_blocks_get.md | 31 - .../cli/defradb_client_collection.md | 51 ++ .../cli/defradb_client_collection_create.md | 83 ++ .../cli/defradb_client_collection_delete.md | 61 ++ .../cli/defradb_client_collection_describe.md | 61 ++ .../cli/defradb_client_collection_docIDs.md | 55 ++ .../cli/defradb_client_collection_get.md | 56 ++ .../cli/defradb_client_collection_patch.md | 62 ++ .../cli/defradb_client_collection_update.md | 67 ++ .../references/cli/defradb_client_dump.md | 37 +- .../references/cli/defradb_client_index.md | 43 + .../cli/defradb_client_index_create.md | 62 ++ .../cli/defradb_client_index_drop.md | 49 ++ .../cli/defradb_client_index_list.md | 51 ++ .../cli/defradb_client_node-identity.md | 55 ++ .../references/cli/defradb_client_p2p.md | 43 + .../cli/defradb_client_p2p_collection.md | 44 + .../cli/defradb_client_p2p_collection_add.md | 52 ++ .../defradb_client_p2p_collection_getall.md | 45 + .../defradb_client_p2p_collection_remove.md | 52 ++ .../references/cli/defradb_client_p2p_info.md | 44 + .../cli/defradb_client_p2p_replicator.md | 44 + .../defradb_client_p2p_replicator_delete.md | 50 ++ .../defradb_client_p2p_replicator_getall.md | 49 ++ .../cli/defradb_client_p2p_replicator_set.md | 50 ++ .../references/cli/defradb_client_peerid.md | 31 - .../references/cli/defradb_client_ping.md | 31 - .../references/cli/defradb_client_purge.md | 46 + .../references/cli/defradb_client_query.md | 54 +- .../references/cli/defradb_client_rpc.md | 34 - .../cli/defradb_client_rpc_addreplicator.md | 37 - .../cli/defradb_client_rpc_p2pcollection.md | 35 - .../defradb_client_rpc_p2pcollection_add.md | 36 - ...defradb_client_rpc_p2pcollection_getall.md | 36 - ...defradb_client_rpc_p2pcollection_remove.md | 36 - .../cli/defradb_client_rpc_replicator.md | 37 - .../defradb_client_rpc_replicator_delete.md | 37 - .../defradb_client_rpc_replicator_getall.md | 37 - .../cli/defradb_client_rpc_replicator_set.md | 39 - .../references/cli/defradb_client_schema.md | 46 +- .../cli/defradb_client_schema_add.md | 48 +- .../cli/defradb_client_schema_describe.md | 60 ++ .../cli/defradb_client_schema_migration.md | 45 + .../defradb_client_schema_migration_down.md | 57 ++ .../defradb_client_schema_migration_reload.md | 44 + ...db_client_schema_migration_set-registry.md | 50 ++ .../defradb_client_schema_migration_set.md | 57 ++ .../cli/defradb_client_schema_migration_up.md | 57 ++ .../cli/defradb_client_schema_patch.md | 51 +- .../cli/defradb_client_schema_set-active.md | 45 + .../references/cli/defradb_client_tx.md | 43 + .../cli/defradb_client_tx_commit.md | 44 + .../cli/defradb_client_tx_create.md | 46 + .../cli/defradb_client_tx_discard.md | 44 + .../references/cli/defradb_client_view.md | 42 + .../references/cli/defradb_client_view_add.md | 50 ++ .../cli/defradb_client_view_refresh.md | 66 ++ .../references/cli/defradb_identity.md | 39 + .../references/cli/defradb_identity_new.md | 53 ++ docs/defradb/references/cli/defradb_init.md | 36 - .../defradb/references/cli/defradb_keyring.md | 57 ++ .../references/cli/defradb_keyring_export.md | 50 ++ .../cli/defradb_keyring_generate.md | 64 ++ .../references/cli/defradb_keyring_import.md | 50 ++ .../references/cli/defradb_keyring_list.md | 48 ++ .../references/cli/defradb_server-dump.md | 34 +- docs/defradb/references/cli/defradb_start.md | 61 +- .../defradb/references/cli/defradb_version.md | 31 +- docs/defradb/references/config.md | 171 ++++ .../references/query-specification/aliases.md | 6 +- .../query-specification/database-api.md | 4 +- .../limiting-and-pagination.md | 4 +- .../query-specification/mutation-block.md | 8 +- .../sorting-and-ordering.md | 18 +- docs/defradb/release notes/v0.10.0.md | 45 + docs/defradb/release notes/v0.11.0.md | 41 + docs/defradb/release notes/v0.12.0.md | 60 ++ docs/defradb/release notes/v0.13.0.md | 40 + docs/defradb/release notes/v0.14.0.md | 64 ++ docs/defradb/release notes/v0.15.0.md | 44 + docs/defradb/release notes/v0.5.0.md | 286 +++---- 98 files changed, 4793 insertions(+), 951 deletions(-) create mode 100644 docs/defradb/references/acp.md create mode 100644 docs/defradb/references/cli/defradb_client_acp.md create mode 100644 docs/defradb/references/cli/defradb_client_acp_policy.md create mode 100644 docs/defradb/references/cli/defradb_client_acp_policy_add.md create mode 100644 docs/defradb/references/cli/defradb_client_acp_relationship.md create mode 100644 docs/defradb/references/cli/defradb_client_acp_relationship_add.md create mode 100644 docs/defradb/references/cli/defradb_client_acp_relationship_delete.md create mode 100644 docs/defradb/references/cli/defradb_client_backup.md create mode 100644 docs/defradb/references/cli/defradb_client_backup_export.md create mode 100644 docs/defradb/references/cli/defradb_client_backup_import.md delete mode 100644 docs/defradb/references/cli/defradb_client_blocks.md delete mode 100644 docs/defradb/references/cli/defradb_client_blocks_get.md create mode 100644 docs/defradb/references/cli/defradb_client_collection.md create mode 100644 docs/defradb/references/cli/defradb_client_collection_create.md create mode 100644 docs/defradb/references/cli/defradb_client_collection_delete.md create mode 100644 docs/defradb/references/cli/defradb_client_collection_describe.md create mode 100644 docs/defradb/references/cli/defradb_client_collection_docIDs.md create mode 100644 docs/defradb/references/cli/defradb_client_collection_get.md create mode 100644 docs/defradb/references/cli/defradb_client_collection_patch.md create mode 100644 docs/defradb/references/cli/defradb_client_collection_update.md create mode 100644 docs/defradb/references/cli/defradb_client_index.md create mode 100644 docs/defradb/references/cli/defradb_client_index_create.md create mode 100644 docs/defradb/references/cli/defradb_client_index_drop.md create mode 100644 docs/defradb/references/cli/defradb_client_index_list.md create mode 100644 docs/defradb/references/cli/defradb_client_node-identity.md create mode 100644 docs/defradb/references/cli/defradb_client_p2p.md create mode 100644 docs/defradb/references/cli/defradb_client_p2p_collection.md create mode 100644 docs/defradb/references/cli/defradb_client_p2p_collection_add.md create mode 100644 docs/defradb/references/cli/defradb_client_p2p_collection_getall.md create mode 100644 docs/defradb/references/cli/defradb_client_p2p_collection_remove.md create mode 100644 docs/defradb/references/cli/defradb_client_p2p_info.md create mode 100644 docs/defradb/references/cli/defradb_client_p2p_replicator.md create mode 100644 docs/defradb/references/cli/defradb_client_p2p_replicator_delete.md create mode 100644 docs/defradb/references/cli/defradb_client_p2p_replicator_getall.md create mode 100644 docs/defradb/references/cli/defradb_client_p2p_replicator_set.md delete mode 100644 docs/defradb/references/cli/defradb_client_peerid.md delete mode 100644 docs/defradb/references/cli/defradb_client_ping.md create mode 100644 docs/defradb/references/cli/defradb_client_purge.md delete mode 100644 docs/defradb/references/cli/defradb_client_rpc.md delete mode 100644 docs/defradb/references/cli/defradb_client_rpc_addreplicator.md delete mode 100644 docs/defradb/references/cli/defradb_client_rpc_p2pcollection.md delete mode 100644 docs/defradb/references/cli/defradb_client_rpc_p2pcollection_add.md delete mode 100644 docs/defradb/references/cli/defradb_client_rpc_p2pcollection_getall.md delete mode 100644 docs/defradb/references/cli/defradb_client_rpc_p2pcollection_remove.md delete mode 100644 docs/defradb/references/cli/defradb_client_rpc_replicator.md delete mode 100644 docs/defradb/references/cli/defradb_client_rpc_replicator_delete.md delete mode 100644 docs/defradb/references/cli/defradb_client_rpc_replicator_getall.md delete mode 100644 docs/defradb/references/cli/defradb_client_rpc_replicator_set.md create mode 100644 docs/defradb/references/cli/defradb_client_schema_describe.md create mode 100644 docs/defradb/references/cli/defradb_client_schema_migration.md create mode 100644 docs/defradb/references/cli/defradb_client_schema_migration_down.md create mode 100644 docs/defradb/references/cli/defradb_client_schema_migration_reload.md create mode 100644 docs/defradb/references/cli/defradb_client_schema_migration_set-registry.md create mode 100644 docs/defradb/references/cli/defradb_client_schema_migration_set.md create mode 100644 docs/defradb/references/cli/defradb_client_schema_migration_up.md create mode 100644 docs/defradb/references/cli/defradb_client_schema_set-active.md create mode 100644 docs/defradb/references/cli/defradb_client_tx.md create mode 100644 docs/defradb/references/cli/defradb_client_tx_commit.md create mode 100644 docs/defradb/references/cli/defradb_client_tx_create.md create mode 100644 docs/defradb/references/cli/defradb_client_tx_discard.md create mode 100644 docs/defradb/references/cli/defradb_client_view.md create mode 100644 docs/defradb/references/cli/defradb_client_view_add.md create mode 100644 docs/defradb/references/cli/defradb_client_view_refresh.md create mode 100644 docs/defradb/references/cli/defradb_identity.md create mode 100644 docs/defradb/references/cli/defradb_identity_new.md delete mode 100644 docs/defradb/references/cli/defradb_init.md create mode 100644 docs/defradb/references/cli/defradb_keyring.md create mode 100644 docs/defradb/references/cli/defradb_keyring_export.md create mode 100644 docs/defradb/references/cli/defradb_keyring_generate.md create mode 100644 docs/defradb/references/cli/defradb_keyring_import.md create mode 100644 docs/defradb/references/cli/defradb_keyring_list.md create mode 100644 docs/defradb/references/config.md create mode 100644 docs/defradb/release notes/v0.10.0.md create mode 100644 docs/defradb/release notes/v0.11.0.md create mode 100644 docs/defradb/release notes/v0.12.0.md create mode 100644 docs/defradb/release notes/v0.13.0.md create mode 100644 docs/defradb/release notes/v0.14.0.md create mode 100644 docs/defradb/release notes/v0.15.0.md diff --git a/docs/defradb/getting-started.md b/docs/defradb/getting-started.md index 15a8d2b..316f8ad 100644 --- a/docs/defradb/getting-started.md +++ b/docs/defradb/getting-started.md @@ -8,13 +8,14 @@ slug: /defradb DefraDB is a user-centric database that prioritizes data ownership, personal privacy, and information security. Its data model, powered by the convergence of [MerkleCRDTs](https://arxiv.org/pdf/2004.00107.pdf) and the content-addressability of [IPLD](https://docs.ipld.io/), enables a multi-write-master architecture. It features [DQL](./references/query-specification/query-language-overview.md), a query language compatible with GraphQL but providing extra convenience. By leveraging peer-to-peer networking it can be deployed nimbly in novel topologies. Access control is determined by a relationship-based DSL, supporting document or field-level policies, secured by the SourceHub network. DefraDB is a core part of the [Source technologies](https://source.network/) that enable new paradigms of decentralized data and access-control management, user-centric apps, data trustworthiness, and much more. -DISCLAIMER: At this early stage, DefraDB does not offer access control or data encryption, and the default configuration exposes the database to the network. The software is provided "as is" and is not guaranteed to be stable, secure, or error-free. We encourage you to experiment with DefraDB and provide feedback, but please do not use it for production purposes until it has been thoroughly tested and developed. + +DISCLAIMER: At this early stage, DefraDB does not offer data encryption, and the default configuration exposes the database to the network. The software is provided "as is" and is not guaranteed to be stable, secure, or error-free. We encourage you to experiment with DefraDB and provide feedback, but please do not use it for production purposes until it has been thoroughly tested and developed. ## Install Install `defradb` by [downloading an executable](https://github.com/sourcenetwork/defradb/releases) or building it locally using the [Go toolchain](https://golang.org/): -```shell +```sh git clone git@github.com:sourcenetwork/defradb.git cd defradb make install @@ -22,17 +23,51 @@ make install In the following sections, we assume that `defradb` is included in your `PATH`. If you installed it with the Go toolchain, use: -```shell +```sh export PATH=$PATH:$(go env GOPATH)/bin ``` -We recommend experimenting with queries using a native GraphQL client. Altair is a popular option - [download and install it](https://altairgraphql.dev/#download). +We recommend experimenting with queries using a native GraphQL client. GraphiQL is a popular option - [download and install it](https://altairgraphql.dev/#download). + +## Key Management + +DefraDB has a built in keyring that can be used to store private keys securely. + +The following keys are loaded from the keyring on start: + +- `peer-key` Ed25519 private key (required) +- `encryption-key` AES-128, AES-192, or AES-256 key (optional) +- `node-identity-key` Secp256k1 private key (optional). This key is used for node's identity. + +A secret to unlock the keyring is required on start and must be provided via the `DEFRA_KEYRING_SECRET` environment variable. If a `.env` file is available in the working directory, the secret can be stored there or via a file at a path defined by the `--secret-file` flag. + +The keys will be randomly generated on the initial start of the node if they are not found. + +Alternatively, to randomly generate the required keys, run the following command: + +Node identity is an identity assigned to the node. It is used to exchange encryption keys with other nodes. + +``` +defradb keyring generate +``` + +To import externally generated keys, run the following command: + +``` +defradb keyring import +``` + +To learn more about the available options: + +``` +defradb keyring --help +``` ## Start Start a node by executing `defradb start`. Keep the node running while going through the following examples. -Verify the local connection to the node works by executing `defradb client ping` in another terminal. +Verify the local connection to the node works by executing `defradb client collection describe` in another terminal. ## Configuration @@ -40,10 +75,20 @@ In this document, we use the default configuration, which has the following beha - `~/.defradb/` is DefraDB's configuration and data directory - `client` command interacts with the locally running node -- The GraphQL endpoint is provided at +- The GraphQL endpoint is provided at http://localhost:9181/api/v0/graphql The GraphQL endpoint can be used with a GraphQL client (e.g., Altair) to conveniently perform requests (`query`, `mutation`) and obtain schema introspection. +Read more about the configuration [here](./references/config.md). + +## External port binding + +By default the HTTP API and P2P network will use localhost. If you want to expose the ports externally you need to specify the addresses in the config or command line parameters. + +``` +defradb start --p2paddr /ip4/0.0.0.0/tcp/9171 --url 0.0.0.0:9181 +``` + ## Add a schema type Schemas are used to structure documents using a type system. @@ -63,7 +108,7 @@ defradb client schema add ' ' ``` -Find more examples of schema type definitions in the [examples/schema/](https://github.com/sourcenetwork/defradb/examples/schema/) folder. +Find more examples of schema type definitions in the [examples/schema/](examples/schema/) folder. ## Create a document @@ -73,7 +118,7 @@ Submit a `mutation` request to create a document of the `User` type: defradb client query ' mutation { create_User(input: {age: 31, verified: true, points: 90, name: "Bob"}) { - _key + _docID } } ' @@ -83,15 +128,17 @@ Expected response: ```json { - "data": [ - { - "_key": "bae-91171025-ed21-50e3-b0dc-e31bccdfa1ab", - } - ] + "data": { + "create_User": [ + { + "_docID": "bae-91171025-ed21-50e3-b0dc-e31bccdfa1ab", + } + ] + } } ``` -`_key` is the document's key, a unique identifier of the document, determined by its schema and initial data. +`_docID` is the document's unique identifier determined by its schema and initial data. ## Query documents @@ -101,7 +148,7 @@ Once you have populated your node with data, you can query it: defradb client query ' query { User { - _key + _docID age name points @@ -110,7 +157,7 @@ defradb client query ' ' ``` -This query obtains *all* users and returns their fields `_key, age, name, points`. GraphQL queries only return the exact fields requested. +This query obtains *all* users and returns their fields `_docID, age, name, points`. GraphQL queries only return the exact fields requested. You can further filter results with the `filter` argument. @@ -118,7 +165,7 @@ You can further filter results with the `filter` argument. defradb client query ' query { User(filter: {points: {_ge: 50}}) { - _key + _docID age name points @@ -131,14 +178,14 @@ This returns only user documents which have a value for the `points` field *Grea ## Obtain document commits -DefraDB's data model is based on [MerkleCRDTs](./guides/merkle-crdt.md). Each document has a graph of all of its updates, similar to Git. The updates are called `commits` and are identified by `cid`, a content identifier. Each references its parents by their `cid`s. +DefraDB's data model is based on [MerkleCRDTs](https://arxiv.org/pdf/2004.00107.pdf). Each document has a graph of all of its updates, similar to Git. The updates are called `commit`s and are identified by `cid`, a content identifier. Each references its parents by their `cid`s. -To get the most recent commits in the MerkleDAG for the document identified as `bae-91171025-ed21-50e3-b0dc-e31bccdfa1ab`: +To get the most recent commit in the MerkleDAG for the document identified as `bae-91171025-ed21-50e3-b0dc-e31bccdfa1ab`: ```shell defradb client query ' query { - latestCommits(dockey: "bae-91171025-ed21-50e3-b0dc-e31bccdfa1ab") { + latestCommits(docID: "bae-91171025-ed21-50e3-b0dc-e31bccdfa1ab") { cid delta height @@ -155,31 +202,33 @@ It returns a structure similar to the following, which contains the update paylo ```json { - "data": [ - { - "cid": "bafybeifhtfs6vgu7cwbhkojneh7gghwwinh5xzmf7nqkqqdebw5rqino7u", - "delta": "pGNhZ2UYH2RuYW1lY0JvYmZwb2ludHMYWmh2ZXJpZmllZPU=", - "height": 1, - "links": [ - { - "cid": "bafybeiet6foxcipesjurdqi4zpsgsiok5znqgw4oa5poef6qtiby5hlpzy", - "name": "age" - }, - { - "cid": "bafybeielahxy3r3ulykwoi5qalvkluojta4jlg6eyxvt7lbon3yd6ignby", - "name": "name" - }, - { - "cid": "bafybeia3tkpz52s3nx4uqadbm7t5tir6gagkvjkgipmxs2xcyzlkf4y4dm", - "name": "points" - }, - { - "cid": "bafybeia4off4javopmxcdyvr6fgb5clo7m5bblxic5sqr2vd52s6khyksm", - "name": "verified" - } - ] - } - ] + "data": { + "latestCommits": [ + { + "cid": "bafybeifhtfs6vgu7cwbhkojneh7gghwwinh5xzmf7nqkqqdebw5rqino7u", + "delta": "pGNhZ2UYH2RuYW1lY0JvYmZwb2ludHMYWmh2ZXJpZmllZPU=", + "height": 1, + "links": [ + { + "cid": "bafybeiet6foxcipesjurdqi4zpsgsiok5znqgw4oa5poef6qtiby5hlpzy", + "name": "age" + }, + { + "cid": "bafybeielahxy3r3ulykwoi5qalvkluojta4jlg6eyxvt7lbon3yd6ignby", + "name": "name" + }, + { + "cid": "bafybeia3tkpz52s3nx4uqadbm7t5tir6gagkvjkgipmxs2xcyzlkf4y4dm", + "name": "points" + }, + { + "cid": "bafybeia4off4javopmxcdyvr6fgb5clo7m5bblxic5sqr2vd52s6khyksm", + "name": "verified" + } + ] + } + ] + } } ``` @@ -205,8 +254,7 @@ defradb client query ' DQL is compatible with GraphQL but features various extensions. -Read the [Query specification](./references/query-specification/query-language-overview.md) to discover filtering, ordering, limiting, relationships, variables, aggregate functions, and other useful features. - +Read its documentation [here](./references/query-specification/query-language-overview.md) to discover its filtering, ordering, limiting, relationships, variables, aggregate functions, and other useful features. ## Peer-to-peer data synchronization @@ -214,17 +262,24 @@ DefraDB leverages peer-to-peer networking for data exchange, synchronization, an When starting a node for the first time, a key pair is generated and stored in its "root directory" (`~/.defradb/` by default). -Each node has a unique `Peer ID` generated from its public key. This ID allows other nodes to connect to it. +Each node has a unique `PeerID` generated from its public key. This ID allows other nodes to connect to it. + +To view your node's peer info: + +```shell +defradb client p2p info +``` There are two types of peer-to-peer relationships supported: **pubsub** peering and **replicator** peering. -Pubsub peering *passively* synchronizes data between nodes by broadcasting *Document Commit* updates to the topic of the commit's document key. Nodes need to be listening on the pubsub channel to receive updates. This is for when two nodes *already* have share a document and want to keep them in sync. +Pubsub peering *passively* synchronizes data between nodes by broadcasting *Document Commit* updates to the topic of the commit's document key. Nodes need to be listening on the pubsub channel to receive updates. This is for when two nodes *already* have shared a document and want to keep them in sync. Replicator peering *actively* pushes changes from a specific collection *to* a target peer. -### Pubsub example +
    +Pubsub example -Pubsub peers can be specified on the command line using the `--peers` flag, which accepts a comma-separated list of peer [multiaddresses](https://docs.libp2p.io/concepts/addressing/). For example, a node at IP `192.168.1.12` listening on 9000 with Peer ID `12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B` would be referred to using the multiaddress `/ip4/192.168.1.12/tcp/9000/p2p/12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B`. +Pubsub peers can be specified on the command line using the `--peers` flag, which accepts a comma-separated list of peer [multiaddresses](https://docs.libp2p.io/concepts/addressing/). For example, a node at IP `192.168.1.12` listening on 9000 with PeerID `12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B` would be referred to using the multiaddress `/ip4/192.168.1.12/tcp/9000/p2p/12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B`. Let's go through an example of two nodes (*nodeA* and *nodeB*) connecting with each other over pubsub, on the same machine. @@ -234,39 +289,48 @@ Start *nodeA* with a default configuration: defradb start ``` -Obtain the Peer ID from its console output. In this example, we use `12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B`, but locally it will be different. +Obtain the node's peer info: + +```shell +defradb client p2p info +``` + +In this example, we use `12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B`, but locally it will be different. For *nodeB*, we provide the following configuration: ```shell -defradb start --rootdir ~/.defradb-nodeB --url localhost:9182 --p2paddr /ip4/0.0.0.0/tcp/9172 --tcpaddr /ip4/0.0.0.0/tcp/9162 --peers /ip4/0.0.0.0/tcp/9171/p2p/12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B +defradb start --rootdir ~/.defradb-nodeB --url localhost:9182 --p2paddr /ip4/127.0.0.1/tcp/9172 --peers /ip4/127.0.0.1/tcp/9171/p2p/12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B ``` About the flags: - `--rootdir` specifies the root dir (config and data) to use - `--url` is the address to listen on for the client HTTP and GraphQL API -- `--p2paddr` is the multiaddress for the p2p networking to listen on -- `--tcpaddr` is the multiaddress for the gRPC server to listen on +- `--p2paddr` is a comma-separated list of multiaddresses to listen on for p2p networking - `--peers` is a comma-separated list of peer multiaddresses This starts two nodes and connects them via pubsub networking. +
    -### Collection subscription example +
    +Subscription example -It is possible to subscribe to updates on a given collection by using its ID as the pubsub topic. The ID of a collection is found as the field `schemaVersionID` in one of its documents. Here we use the collection ID of the `User` type we created above. After setting up 2 nodes as shown in the [Pubsub example](#pubsub-example) section, we can subscribe to collections updates on *nodeA* from *nodeB* by using the `rpc p2pcollection` command: +It is possible to subscribe to updates on a given collection by using its ID as the pubsub topic. The ID of a collection is found as the field `collectionID` in one of its documents. Here we use the collection ID of the `User` type we created above. After setting up 2 nodes as shown in the [Pubsub example](#pubsub-example) section, we can subscribe to collections updates on *nodeA* from *nodeB* by using the following command: ```shell -defradb client rpc p2pcollection add --url localhost:9182 bafkreibpnvkvjqvg4skzlijka5xe63zeu74ivcjwd76q7yi65jdhwqhske +defradb client p2p collection add --url localhost:9182 bafkreibpnvkvjqvg4skzlijka5xe63zeu74ivcjwd76q7yi65jdhwqhske ``` Multiple collection IDs can be added at once. ```shell -defradb client rpc p2pcollection add --url localhost:9182 +defradb client p2p collection add --url localhost:9182 ,, ``` +
    -### Replicator example +
    +Replicator example Replicator peering is targeted: it allows a node to actively send updates to another node. Let's go through an example of *nodeA* actively replicating to *nodeB*: @@ -290,7 +354,7 @@ defradb client schema add ' Start (or continue running from above) *nodeB*, that will be receiving updates: ```shell -defradb start --rootdir ~/.defradb-nodeB --url localhost:9182 --p2paddr /ip4/0.0.0.0/tcp/9172 --tcpaddr /ip4/0.0.0.0/tcp/9162 +defradb start --rootdir ~/.defradb-nodeB --url localhost:9182 --p2paddr /ip4/0.0.0.0/tcp/9172 ``` Here we *do not* specify `--peers` as we will manually define a replicator after startup via the `rpc` client command. @@ -306,16 +370,20 @@ defradb client schema add --url localhost:9182 ' ' ``` -Set *nodeA* to actively replicate the "Article" collection to *nodeB*: +Then copy the peer info from *nodeB*: ```shell -defradb client rpc addreplicator "Article" /ip4/0.0.0.0/tcp/9172/p2p/ -defradb client rpc replicator set -c "Article" /ip4/0.0.0.0/tcp/9172/p2p/ - +defradb client p2p info --url localhost:9182 ``` -As we add or update documents in the "Article" collection on *nodeA*, they will be actively pushed to *nodeB*. Note that changes to *nodeB* will still be passively published back to *nodeA*, via pubsub. +Set *nodeA* to actively replicate the Article collection to *nodeB*: + +```shell +defradb client p2p replicator set -c Article +``` +As we add or update documents in the Article collection on *nodeA*, they will be actively pushed to *nodeB*. Note that changes to *nodeB* will still be passively published back to *nodeA*, via pubsub. +
    ## Securing the HTTP API with TLS @@ -339,16 +407,41 @@ defradb start --tls --pubkeypath ~/path-to-pubkey.key --privkeypath ~/path-to-pr ``` -DefraDB also comes with automatic HTTPS for deployments on the public web. To enable HTTPS, - deploy DefraDB to a server with both port 80 and port 443 open. With your domain's DNS A record - pointed to the IP of your server, you can run the database using the following command: +## Access Control System +Read more about the access control [here](./references/acp.md). + +## Supporting CORS + +When accessing DefraDB through a frontend interface, you may be confronted with a CORS error. That is because, by default, DefraDB will not have any allowed origins set. To specify which origins should be allowed to access your DefraDB endpoint, you can specify them when starting the database: +```shell +defradb start --allowed-origins=https://yourdomain.com +``` + +If running a frontend app locally on localhost, allowed origins must be set with the port of the app: ```shell -sudo defradb start --tls --url=your-domain.net --email=email@example.com +defradb start --allowed-origins=http://localhost:3000 ``` -Note: `sudo` is needed above for the redirection server (to bind port 80). -A valid email address is necessary for the creation of the certificate, and is important to get notifications from the Certificate Authority - in case the certificate is about to expire, etc. +The catch-all `*` is also a valid origin. + +## Backing up and restoring +It is currently not possible to do a full backup of DefraDB that includes the history of changes through the Merkle DAG. However, DefraDB currently supports a simple backup of the current data state in JSON format that can be used to seed a database or help with transitioning from one DefraDB version to another. + +To backup the data, run the following command: +```shell +defradb client backup export path/to/backup.json +``` + +To pretty print the JSON content when exporting, run the following command: +```shell +defradb client backup export --pretty path/to/backup.json +``` + +To restore the data, run the following command: +```shell +defradb client backup import path/to/backup.json +``` ## Conclusion diff --git a/docs/defradb/guides/explain-systems.md b/docs/defradb/guides/explain-systems.md index a1d770f..3620e18 100644 --- a/docs/defradb/guides/explain-systems.md +++ b/docs/defradb/guides/explain-systems.md @@ -13,7 +13,7 @@ The DefraDB Explain System is a powerful tool designed to introspect requests, e ```graphql query { Author { - _key + _docID name age } @@ -25,7 +25,7 @@ query { ```graphql query @explain { Author { - _key + _docID name age } diff --git a/docs/defradb/guides/peer-to-peer.md b/docs/defradb/guides/peer-to-peer.md index 5b6a52b..09de3c7 100644 --- a/docs/defradb/guides/peer-to-peer.md +++ b/docs/defradb/guides/peer-to-peer.md @@ -56,9 +56,6 @@ In passive replication, updates are broadcasted on a per-document level over the One major difference between active and passive networks is that an active network can focus on both collections and individual documents, while a passive network is only focused on individual documents. Active networks operate over a direct, point-to-point connection and allow you to select an entire collection to replicate to another node. For example, if you have a collection of books and specify a target node for active replication, the entire collection will be replicated to that node, including any updates to individual books. However, it is also possible to replicate granularly by selecting specific books within the collection for replication. Passive networks, on the other hand, are only concerned with replicating individual documents. -```bash -$ defradb client rpc addreplicator "Books" /ip4/0.0.0.0/tcp/9172/p2p/ -``` ## Concrete Features of P2P in DefraDB @@ -69,8 +66,11 @@ The Defra Command Line Interface (CLI) allows you to modify the behavior of the ```bash $ defradb start ... -2023-03-20T07:18:17.276-0400, INFO, defra.cli, Starting P2P node, {"P2P address": "/ip4/0.0.0.0/tcp/9171"} -2023-03-20T07:18:17.281-0400, INFO, defra.node, Created LibP2P host, {"PeerId": "12D3KooWEFCQ1iGMobsmNTPXb758kJkFc7XieQyGKpsuMxeDktz4", "Address": ["/ip4/0.0.0.0/tcp/9171"]} +Jan 2 10:15:49.124 INF cli Starting DefraDB +Jan 2 10:15:49.161 INF net Created LibP2P host PeerId=12D3KooWEFCQ1iGMobsmNTPXb758kJkFc7XieQyGKpsuMxeDktz4 Address=[/ip4/127.0.0.1/tcp/9171] +Jan 2 10:15:49.162 INF net Starting internal broadcaster for pubsub network +Jan 2 10:15:49.163 INF node Providing HTTP API at http://127.0.0.1:9181 PlaygroundEnabled=false +Jan 2 10:15:49.163 INF node Providing GraphQL endpoint at http://127.0.0.1:9181/api/v0/graphql ``` This host has a Peer ID, which is a function of a secret private key generated when the node is started for the first time. The Peer ID is important to know as it may be relevant for different parts of the peer-to-peer networking system. The libp2p networking stack can be enabled or disabled. @@ -110,7 +110,7 @@ When a node is started, it specifies a list of peers that it wants to stay conne To use the active replication feature in DefraDB, you can submit an add replicator Remote Procedure Call (RPC) command through the client API. You will need to specify the multi-address and Peer ID of the peer that you want to include in the replicator set, as well as the name of the collection that you want to replicate to that peer. These steps handle the process of defining which peers you want to connect to, enabling or disabling the underlying subsystems, and sending additional RPC commands to add any necessary replicators. ```bash -$ defradb client rpc addreplicator "Books" /ip4/0.0.0.0/tcp/9172/p2p/ +$ defradb client p2p replicator set -c Books ``` ## Benefits of the P2P System diff --git a/docs/defradb/guides/time-traveling-queries.md b/docs/defradb/guides/time-traveling-queries.md index 0c95286..0d3b6d1 100644 --- a/docs/defradb/guides/time-traveling-queries.md +++ b/docs/defradb/guides/time-traveling-queries.md @@ -16,12 +16,12 @@ The Web2 stack has traditional databases, like Postgres or MySQL, that usually h A powerful feature of a time-traveling query is that very little work is required from the developer to turn a traditional non-time-traveling query into a time-traveling query. Each update a document goes through gets a version identifier known as a Content Identifier (CID). CIDs are a function of the data model and are used to build out the time travel queries. These CIDs can be used to refer to a version that contains some piece of data. Instead of using some sort of human-invented notion of semantic version labels like Version 1, or Version 3.1 alpha, it uses the hash of the data as the actual identifier. The user can take the entire state of a document and create a single constant-sized CID. Each update in the document produces a new version number for the document, including a new version number for its individual fields. The developer then only needs to submit a new time-traveling query using the doc key of the document that it wants to query backward through its state, just like in a regular query, only here the developer needs to add the 32-bit hexadecimal version identifier that is expressed as it’s CID in an additional argument and the query will fetch the specific update that was made in the document. ```graphql -# Here we fetch a User of the given dockey, in the state that it was at +# Here we fetch a User of the given docID, in the state that it was at # at the commit matching the given CID. query { User ( cid: "bafybeieqnthjlvr64aodivtvtwgqelpjjvkmceyz4aqerkk5h23kjoivmu", - dockey: "bae-52b9170d-b77a-5887-b877-cbdbb99b009f" + docID: "bae-d4303725-7db9-53d2-b324-f3ee44020e52" ) { name age @@ -33,7 +33,7 @@ query { The mechanism behind time-traveling queries is based on the Merkel CRDT system and the data model of the documents discussed in the above sections. Each time a document is updated, a log of updates known as the Update graph is recorded. This graph consists of every update that the user makes in the document from the beginning till the Nth update. In addition to the document update graph, we also have an independent and individual update graph for each field of the document. The document update graph would capture the overall updates made in the document whereas the independent and individual update graphs would capture the changes made to a specific field of the document. The data model as discussed in the Usage section works in a similar fashion, where it keeps appending the updates of the document to its present state. So even if a user deletes any information in the document, this will be recorded as an update within the update graph. Hence, no information gets deleted from the document, as all updates are stored in the update graph. -[Include link to CRDT doc here] +[Merkle CRDT Guide](./merkle-crdt.md) Since we now have this update graph of changes, the query also takes its mechanism from the inherent properties of the Delta State Merkel CRDTs. Under this, the actual content of the update added by the user in the document is known as the Delta Payload. This delta payload is the amount of information that a user wants to go from a previous state to the very next state, where the value of the next state is set by some other user. For example, suppose a team of developers is working on a document and one of them wants to change the name of the document, then in this case, the delta payload of the new update would be the name of the document set by that user. Hence, the time-traveling queries work on two core concepts, the appending update graph and the delta payload which contains information that is required to go from the previous state to the next state. With both of these, whenever a user submits a regular query, the query caches the present state of the document within the database. And we internally issue a time-traveling query for the current state, with the only upside being that the user can submit a non-time-traveling query faster since a cached version of the same is already stored in the database. Thus, using this cached version of the present state of the document, the user can apply a time-traveling query using the CID of the specific version they want to query in the document. The database will then set the CID provided by the user as the Target State, a state at which the query will stop and go back to the beginning of the document, known as the Genesis State. The query will then apply all its operations until it reaches back to the Target State. diff --git a/docs/defradb/references/acp.md b/docs/defradb/references/acp.md new file mode 100644 index 0000000..9e362e3 --- /dev/null +++ b/docs/defradb/references/acp.md @@ -0,0 +1,795 @@ +--- +sidebar_label: ACP +sidebar_position: 0 +--- + +# Introduction + +In the realm of information technology (IT) and cybersecurity, **access control** plays a pivotal role in ensuring the confidentiality, integrity, and availability of sensitive resources. Let's delve into why access control policies are crucial for protecting your valuable data. + +## What Is Access Control? + +**Access control** is a mechanism that regulates who or what can view, use, or access a specific resource within a computing environment. Its primary goal is to minimize security risks by ensuring that only **authorized users**, systems, or services have access to the resources they need. But it's more than just granting or denying access, it involves several key components: + +1. **Authentication**: Verifying the identity of an individual or system. +2. **Authorization**: Determining what actions or operations an actor is allowed to perform. +3. **Access**: Granting or denying access based on authorization. +4. **Management**: Administering access rights and permissions. +5. **Audit**: Tracking and monitoring access patterns for accountability. + +## Why Is Access Control Important? + +1. **Mitigating Security Risks**: Cybercriminals are becoming increasingly sophisticated, employing advanced techniques to breach security systems. By controlling who has access to your database, you significantly reduce the risk of unauthorized access, both from external attackers and insider threats. + +2. **Compliance with Regulations**: Various regulatory requirements, such as the **General Data Protection Regulation (GDPR)** and the **Health Insurance Portability and Accountability Act (HIPAA)**, mandate stringent access control measures to protect personal data. Implementing access control ensures compliance with these regulations. + +3. **Preventing Data Breaches**: Access control acts as a proactive measure to deter, detect, and prevent unauthorized access. It ensures that only those with the necessary permissions can access sensitive data or services. + +4. **Managing Complexity**: Modern IT infrastructure, including cloud computing and mobile devices, has exponentially increased the number of access points. Technologies like **identity and access management (IAM)** and approaches like **zero trust** help manage this complexity effectively. + +## Types of Security Access Controls + +Several access control models exist, including: + +- **Role-Based Access Control (RBAC)**: Assigns permissions to roles, roles then are granted to users. A user's active role then defines their access. (e.g., admin, user, manager). +- **Attribute-Based Access Control (ABAC)**: Considers various attributes (e.g., user attributes, resource attributes) for access decisions. +- **Discretionary Access Control (DAC)**: Users with sufficient permissions (resource owners) are to grant / share an object with other users. +- **Mandatory Access Control (MAC)**: Users are not allowed to grant access to other users. Permissions are granted based on a minimum role / hierarchy (security labels and clearances) that must be met. +- **Policy-Based Access Control (PBAC)**: Enforces access based on defined policies. +- **Relation-Based Access Control (ReBac)**: Relations between objects and users in the system are used to derive their permissions. + +- Note: **DefraDB** access control rules strongly resembles **Discretionary Access Control (DAC)**, which is implemented through a **Relation-Based Access Control System (ReBac) Engine** + +## Challenges of Access Control in Cybersecurity + +- **Distributed IT Environments**: Cloud computing and remote work create new challenges. +- **Rise of Mobility**: Mobile devices in the workplace add complexity. +- **Password Fatigue**: Balancing security with usability. +- **Data Governance**: Ensuring visibility and control. +- **Multi-Tenancy**: Managing complex permissions in SaaS applications. + +## Key takeaway +A robust access control policy system is your first line of defense against unauthorized access and data breaches. + + +# DefraDB's Access Control System + +## ReBac Authorization Model + +### Zanzibar +In 2019, Google published their [Zanzibar](https://research.google/pubs/zanzibar-googles-consistent-global-authorization-system/) paper, a paper explaining how they handle authorization across their many services. It uses access control lists but with relationship-based access control rather than role-based access control. Relationship-Based Access Control (ReBAC) establishes an authorization model where a subject's permission to access an object is defined by the presence of relationships between those subjects and objects. +The way Zanzibar works is it exposes an API with (mainly) operations to manage `Relationships` (`tuples`) and Verify Access Requests (can Bob do X) through the `Check` call. A `tuple` includes subject, relation, and object. The Check call performs Graph Search over the `tuples` to find a path between the user and the object, if such a path exist then according to `RelBAC` the user has the queried permission. It operates as a Consistent and Partition-Tolerant System. + +### Zanzi +However the Zanzibar API is centralized, so we (Source Network) created a decentralized implementation of Zanzibar called **Zanzi**. Which is powered by our SourceHub trust protocol. Zanzi is a general purpose Zanzibar implementation which operates over a KV persistence layer. + +### SourceHub ACP Module +DefraDB wraps the `local` and `remote` SourceHub ACP Modules to bring all that magic to DefraDB. + +In order to setup the relation based access control, SourceHub requires an agreed upon contract which models the `relations`, `permissions`, and `actors`. That contract is refered to as a `SourceHub Policy`. The policy model's all the `relations` and `permissions` under a `resource`. +A `resource` corresponds to that "thing" that we want to gate the access control around. This can be a `Type`, `Container`, `Schema`, `Shape` or anything that has Objects that need access control. Once the policy is finalized, it has to be uploaded to the `SourceHub Module` so it can be used. +Once the `Policy` is uploaded to the `SourceHub Module` then an `Actor` can begin registering the `Object` for access control by linking to a `Resource` that exists on the uploaded `Policy`. +After the `Object` is registered successfully, the `Actor` will then get a special built-in relation with that `Object` called the `"owner"` relation. This relation is given to the `Registerer` of an `Object`. +Then an `Actor` can issue `Check` calls to see if they have access to an `Object`. + +## Document Access Control (DAC) +In DefraDB's case we wanted to gate access control around the `Documents` that belonged to a specific `Collection`. Here, the `Collection` (i.e. the type/shape of the `Object`) can be thought of as the `Resource`, and the `Documents` are the `Objects`. + + +## Field Access Control (FAC) (coming soon) +We also want the ability to do a more granular access control than just DAC. Therefore we have `Field` level access control for situations where some fields of a `Document` need to be private, while others do not. In this case the `Document` becomes the `Resource` and the `Fields` are the `Objects` being gated. + + +## Admin Access Control (AAC) (coming soon) +We also want to model access control around the `Admin Level Operations` that exist in `DefraDB`. In this case the entire `Database` would be the `Resource` and the `Admin Level Operations` are the `Objects` being gated. + +A non-exhastive list of some operations only admins should have access for: +- Ability to turnoff ACP +- Ability to interact with the P2P system + +## SourceHub Policies Are Too Flexible +SourceHub Policies are too flexible (atleast until the ability to define `Meta Policies` is implemented). This is because SourceHub leaves it up to the user to specify any type of `Permissions` and `Relations`. However for DefraDB, there are certain guarantees that **MUST** be maintained in order for the `Policy` to be effective. For example the user can input any name for a `Permission`, or `Relation` that DefraDB has no knowledge of. Another example is when a user might make a `Policy` that does not give any `Permission` to the `owner`. Which means in the case of DAC no one will have any access to the `Document` they created. +Therefore There was a very clear need to define some rules while writing a `Resource` in a `Policy` which will be used with DefraDB's DAC, FAC, or AAC. These rules will guarantee that certain `Required Permissions` will always be there on a `Resource` and that `Owner` has the correct `Permissions`. + +We call these rules DPI A.K.A DefraDB Policy Interface. + +## Terminologies +- 'SourceHub Address' is a `Bech32` Address with a specific SourceHub prefix. +- 'Identity' is a combination of SourceHub Address and a Key-Pair Signature. +- 'DPI' means 'DefraDB Policy Interface'. +- 'Partially-DPI' policy means a policy with at least one DPI compliant resource. +- 'Permissioned Collection' means to have a policy on the collection, like: `@policy(id:".." resource: "..")` +- 'Permissioned Request' means to have a request with a SourceHub Identity. + + +## DAC DPI Rules + +To qualify as a DPI-compliant `resource`, the following rules **MUST** be satisfied: +- The resource **must include** the mandatory `registerer` (`owner`) relation within the `relations` attribute. +- The resource **must encompass** all the required permissions under the `permissions` attribute. +- Every required permission must have the required registerer relation (`owner`) in `expr`. +- The required registerer relation **must be positioned** as the leading (first) relation in `expr` (see example below). +- Any relation after the required registerer relation must only be a union set operation (`+`). + +For a `Policy` to be `DPI` compliant for DAC, all of its `resources` must be DPI compliant. +To be `Partially-DPI` at least one of its `resource` must be DPI compliant. + +### More Into The Weeds: + +All mandatory permissions are: +- Specified in the `dpi.go` file within the variable `dpiRequiredPermissions`. + +The name of the required 'registerer' relation is: +- Specified in the `dpi.go` file within the variable `requiredRegistererRelationName`. + +### DPI Resource Examples: +- Check out tests here: [tests/integration/acp/schema/add_dpi](/tests/integration/acp/schema/add_dpi) +- The tests linked are broken into `accept_*_test.go` and `reject_*_test.go` files. +- Accepted tests document the valid DPIs (as the schema is accepted). +- Rejected tests document invalid DPIs (as the schema is rejected). +- There are also some Partially-DPI tests that are both accepted and rejected depending on the resource. + +### Required Permission's Expression: +Even though the following expressions are valid generic policy expressions, they will make a +DPI compliant resource lose its DPI status as these expressions are not in accordance to +our DPI [rules](#dac-dpi-rules). Assuming these `expr` are under a required permission label: +- `expr: owner-owner` +- `expr: owner-reader` +- `expr: owner&reader` +- `expr: owner - reader` +- `expr: ownerMalicious + owner` +- `expr: ownerMalicious` +- `expr: owner_new` +- `expr: reader+owner` +- `expr: reader-owner` +- `expr: reader - owner` + +Here are some valid expression examples. Assuming these `expr` are under a required permission label: +- `expr: owner` +- `expr: owner + reader` +- `expr: owner +reader` +- `expr: owner+reader` + +## DAC Usage CLI: + +### Authentication + +To perform authenticated operations you will need to generate a `secp256k1` key pair. + +The command below will generate a new secp256k1 private key and print the 256 bit X coordinate as a hexadecimal value. + +```sh +openssl ecparam -name secp256k1 -genkey | openssl ec -text -noout | head -n5 | tail -n3 | tr -d '\n:\ ' +``` + +Copy the private key hex from the output. + +```sh +read EC key +e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Use the private key to generate authentication tokens for each request. + +```sh +defradb client ... --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +### Adding a Policy: + +We have in `examples/dpi_policy/user_dpi_policy.yml`: +```yaml +description: A Valid DefraDB Policy Interface (DPI) + +actor: + name: actor + +resources: + users: + permissions: + read: + expr: owner + reader + write: + expr: owner + + relations: + owner: + types: + - actor + reader: + types: + - actor +``` + +CLI Command: +```sh +defradb client acp policy add -f examples/dpi_policy/user_dpi_policy.yml --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "PolicyID": "50d354a91ab1b8fce8a0ae4693de7616fb1d82cfc540f25cfbe11eb0195a5765" +} +``` + +### Add schema, linking to a resource within the policy we added: + +We have in `examples/schema/permissioned/users.graphql`: +```graphql +type Users @policy( + id: "50d354a91ab1b8fce8a0ae4693de7616fb1d82cfc540f25cfbe11eb0195a5765", + resource: "users" +) { + name: String + age: Int +} +``` + +CLI Command: +```sh +defradb client schema add -f examples/schema/permissioned/users.graphql +``` + +Result: +```json +[ + { + "Name": "Users", + "ID": 1, + "RootID": 1, + "SchemaVersionID": "bafkreihhd6bqrjhl5zidwztgxzeseveplv3cj3fwtn3unjkdx7j2vr2vrq", + "Sources": [], + "Fields": [ + { + "Name": "_docID", + "ID": 0 + }, + { + "Name": "age", + "ID": 1 + }, + { + "Name": "name", + "ID": 2 + } + ], + "Indexes": [], + "Policy": { + "ID": "50d354a91ab1b8fce8a0ae4693de7616fb1d82cfc540f25cfbe11eb0195a5765", + "ResourceName": "users" + } + } +] + +``` + +### Create private documents (with identity) + +CLI Command: +```sh +defradb client collection create --name Users '[{ "name": "SecretShahzad" }, { "name": "SecretLone" }]' --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +### Create public documents (without identity) + +CLI Command: +```sh +defradb client collection create --name Users '[{ "name": "PublicShahzad" }, { "name": "PublicLone" }]' +``` + +### Get all docIDs without an identity (shows only public): +CLI Command: +```sh +defradb client collection docIDs --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "docID": "bae-63ba68c9-78cb-5060-ab03-53ead1ec5b83", + "error": "" +} +{ + "docID": "bae-ba315e98-fb37-5225-8a3b-34a1c75cba9e", + "error": "" +} +``` + + +### Get all docIDs with an identity (shows public and owned documents): +```sh +defradb client collection docIDs --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "docID": "bae-63ba68c9-78cb-5060-ab03-53ead1ec5b83", + "error": "" +} +{ + "docID": "bae-a5830219-b8e7-5791-9836-2e494816fc0a", + "error": "" +} +{ + "docID": "bae-ba315e98-fb37-5225-8a3b-34a1c75cba9e", + "error": "" +} +{ + "docID": "bae-eafad571-e40c-55a7-bc41-3cf7d61ee891", + "error": "" +} +``` + + +### Access the private document (including field names): +CLI Command: +```sh +defradb client collection get --name Users "bae-a5830219-b8e7-5791-9836-2e494816fc0a" --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "_docID": "bae-a5830219-b8e7-5791-9836-2e494816fc0a", + "name": "SecretShahzad" +} +``` + +### Accessing the private document without an identity: +CLI Command: +```sh +defradb client collection get --name Users "bae-a5830219-b8e7-5791-9836-2e494816fc0a" +``` + +Error: +``` + Error: document not found or not authorized to access +``` + +### Accessing the private document with wrong identity: +CLI Command: +```sh +defradb client collection get --name Users "bae-a5830219-b8e7-5791-9836-2e494816fc0a" --identity 4d092126012ebaf56161716018a71630d99443d9d5217e9d8502bb5c5456f2c5 +``` + +Error: +``` + Error: document not found or not authorized to access +``` + +### Update private document: +CLI Command: +```sh +defradb client collection update --name Users --docID "bae-a5830219-b8e7-5791-9836-2e494816fc0a" --updater '{ "name": "SecretUpdatedShahzad" }' --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "Count": 1, + "DocIDs": [ + "bae-a5830219-b8e7-5791-9836-2e494816fc0a" + ] +} +``` + +#### Check if it actually got updated: +CLI Command: +```sh +defradb client collection get --name Users "bae-a5830219-b8e7-5791-9836-2e494816fc0a" --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "_docID": "bae-a5830219-b8e7-5791-9836-2e494816fc0a", + "name": "SecretUpdatedShahzad" +} +``` + +### Update With Filter example (coming soon) + +### Delete private document: +CLI Command: +```sh +defradb client collection delete --name Users --docID "bae-a5830219-b8e7-5791-9836-2e494816fc0a" --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "Count": 1, + "DocIDs": [ + "bae-a5830219-b8e7-5791-9836-2e494816fc0a" + ] +} +``` + +#### Check if it actually got deleted: +CLI Command: +```sh +defradb client collection get --name Users "bae-a5830219-b8e7-5791-9836-2e494816fc0a" --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Error: +``` + Error: document not found or not authorized to access +``` + +### Delete With Filter example (coming soon) + +### Typejoin example (coming soon) + +### View example (coming soon) + +### P2P example (coming soon) + +### Backup / Import example (coming soon) + +### Secondary Indexes example (coming soon) + +### Execute Explain example (coming soon) + +### Sharing Private Documents With Others + +To share a document (or grant a more restricted access) with another actor, we must add a relationship between the +actor and the document. Inorder to make the relationship we require all of the following: + +1) **Target DocID**: The `docID` of the document we want to make a relationship for. +2) **Collection Name**: The name of the collection that has the `Target DocID`. +3) **Relation Name**: The type of relation (name must be defined within the linked policy on collection). +4) **Target Identity**: The identity of the actor the relationship is being made with. +5) **Requesting Identity**: The identity of the actor that is making the request. + +Note: + - ACP must be available (i.e. ACP can not be disabled). + - The collection with the target document must have a valid policy and resource linked. + - The target document must be registered with ACP already (private document). + - The requesting identity MUST either be the owner OR the manager (manages the relation) of the resource. + - If the specified relation was not granted the miminum DPI permissions (read or write) within the policy, + and a relationship is formed, the subject/actor will still not be able to access (read or write) the resource. + - If the relationship already exists, then it will just be a no-op. + +Consider the following policy that we have under `examples/dpi_policy/user_dpi_policy_with_manages.yml`: + +```yaml +name: An Example Policy + +description: A Policy + +actor: + name: actor + +resources: + users: + permissions: + read: + expr: owner + reader + writer + + write: + expr: owner + writer + + nothing: + expr: dummy + + relations: + owner: + types: + - actor + + reader: + types: + - actor + + writer: + types: + - actor + + admin: + manages: + - reader + types: + - actor + + dummy: + types: + - actor +``` + +Add the policy: +```sh +defradb client acp policy add -f examples/dpi_policy/user_dpi_policy_with_manages.yml \ +--identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "PolicyID": "ec11b7e29a4e195f95787e2ec9b65af134718d16a2c9cd655b5e04562d1cabf9" +} +``` + +Add schema, linking to the users resource and our policyID: +```sh +defradb client schema add ' +type Users @policy( + id: "ec11b7e29a4e195f95787e2ec9b65af134718d16a2c9cd655b5e04562d1cabf9", + resource: "users" +) { + name: String + age: Int +} +' +``` + +Result: +```json +[ + { + "Name": "Users", + "ID": 1, + "RootID": 1, + "SchemaVersionID": "bafkreihhd6bqrjhl5zidwztgxzeseveplv3cj3fwtn3unjkdx7j2vr2vrq", + "Sources": [], + "Fields": [ + { + "Name": "_docID", + "ID": 0, + "Kind": null, + "RelationName": null, + "DefaultValue": null + }, + { + "Name": "age", + "ID": 1, + "Kind": null, + "RelationName": null, + "DefaultValue": null + }, + { + "Name": "name", + "ID": 2, + "Kind": null, + "RelationName": null, + "DefaultValue": null + } + ], + "Indexes": [], + "Policy": { + "ID": "ec11b7e29a4e195f95787e2ec9b65af134718d16a2c9cd655b5e04562d1cabf9", + "ResourceName": "users" + }, + "IsMaterialized": true + } +] +``` + +Create a private document: +```sh +defradb client collection create --name Users '[{ "name": "SecretShahzadLone" }]' \ +--identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Only the owner can see it: +```sh +defradb client collection docIDs --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "docID": "bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c", + "error": "" +} +``` + +Another actor can not: +```sh +defradb client collection docIDs --identity 4d092126012ebaf56161716018a71630d99443d9d5217e9d8502bb5c5456f2c5 +``` + +**Result is empty from the above command** + + +Now let's make the other actor a reader of the document by adding a relationship: +```sh +defradb client acp relationship add \ +--collection Users \ +--docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ +--relation reader \ +--actor did:key:z7r8os2G88XXBNBTLj3kFR5rzUJ4VAesbX7PgsA68ak9B5RYcXF5EZEmjRzzinZndPSSwujXb4XKHG6vmKEFG6ZfsfcQn \ +--identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "ExistedAlready": false +} +``` + +**Note: If the same relationship is created again the `ExistedAlready` would then be true, indicating no-op** + +Now the other actor can read: +```sh +defradb client collection docIDs --identity 4d092126012ebaf56161716018a71630d99443d9d5217e9d8502bb5c5456f2c5 +``` + +Result: +```json +{ + "docID": "bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c", + "error": "" +} +``` + +But, they still can not perform an update as they were only granted a read permission (through `reader` relation): +```sh +defradb client collection update --name Users --docID "bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c" \ +--identity 4d092126012ebaf56161716018a71630d99443d9d5217e9d8502bb5c5456f2c5 '{ "name": "SecretUpdatedShahzad" }' +``` + +Result: +```sh +Error: document not found or not authorized to access +``` + +Sometimes we might want to give a specific access (i.e. form a relationship) not just with one identity, but with +any identity (includes even requests with no-identity). +In that case we can specify "*" instead of specifying an explicit `actor`: +```sh +defradb client acp relationship add \ +--collection Users \ +--docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ +--relation reader \ +--actor "*" \ +--identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "ExistedAlready": false +} +``` + +**Note: specifying `*` does not overwrite any previous formed relationships, they will remain as is ** + +### Revoking Access To Private Documents + +To revoke access to a document for an actor, we must delete the relationship between the +actor and the document. Inorder to delete the relationship we require all of the following: + +1) Target DocID: The docID of the document we want to delete a relationship for. +2) Collection Name: The name of the collection that has the Target DocID. +3) Relation Name: The type of relation (name must be defined within the linked policy on collection). +4) Target Identity: The identity of the actor the relationship is being deleted for. +5) Requesting Identity: The identity of the actor that is making the request. + +Notes: + - ACP must be available (i.e. ACP can not be disabled). + - The target document must be registered with ACP already (policy & resource specified). + - The requesting identity MUST either be the owner OR the manager (manages the relation) of the resource. + - If the relationship record was not found, then it will be a no-op. + +Consider the same policy and added relationship from the previous example in the section above where we learnt +how to share the document with other actors. + +We made the document accessible to an actor by adding a relationship: +```sh +defradb client acp relationship add \ +--collection Users \ +--docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ +--relation reader \ +--actor did:key:z7r8os2G88XXBNBTLj3kFR5rzUJ4VAesbX7PgsA68ak9B5RYcXF5EZEmjRzzinZndPSSwujXb4XKHG6vmKEFG6ZfsfcQn \ +--identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "ExistedAlready": false +} +``` + +Similarly, inorder to revoke access to a document we have the following command to delete the relationship: +```sh +defradb client acp relationship delete \ +--collection Users \ +--docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ +--relation reader \ +--actor did:key:z7r8os2G88XXBNBTLj3kFR5rzUJ4VAesbX7PgsA68ak9B5RYcXF5EZEmjRzzinZndPSSwujXb4XKHG6vmKEFG6ZfsfcQn \ +--identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "RecordFound": true +} +``` + +**Note: If the same relationship is deleted again (or a record for a relationship does not exist) then the `RecordFound` +would be false, indicating no-op** + +Now the other actor can no longer read: +```sh +defradb client collection docIDs --identity 4d092126012ebaf56161716018a71630d99443d9d5217e9d8502bb5c5456f2c5 +``` + +**Result is empty from the above command** + +We can also revoke the previously granted implicit relationship which gave all actors access using the "*" actor. +Similarly we can just specify "*" to revoke all access given to actors implicitly through this relationship: +```sh +defradb client acp relationship delete \ +--collection Users \ +--docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ +--relation reader \ +--actor "*" \ +--identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "RecordFound": true +} +``` + +**Note: Deleting with`*` does not remove any explicitly formed relationships, they will remain as they were ** + +## DAC Usage HTTP: + +### Authentication + +To perform authenticated operations you will need to build and sign a JWT token with the following required fields: + +- `sub` public key of the identity +- `aud` host name of the defradb api +- The `exp` and `nbf` fields should also be set to short-lived durations. + +Additionally, if using SourceHub ACP, the following must be set: +- `iss` should be set to the user's DID, e.g. `"did:key:z6MkkHsQbp3tXECqmUJoCJwyuxSKn1BDF1RHzwDGg9tHbXKw"` +- `iat` should be set to the current unix timestamp +- `authorized_account` should be set to the SourceHub address of the account signing SourceHub transactions on your + behalf - WARNING - this will currently enable this account to make any SourceHub as your user for the lifetime of the + token, so please only set this if you fully trust the node/account. + +The JWT must be signed with the `secp256k1` private key of the identity you wish to perform actions as. + +The signed token must be set on the `Authorization` header of the HTTP request with the `bearer ` prefix prepended to it. + +If authentication fails for any reason a `403` forbidden response will be returned. + +## _AAC DPI Rules (coming soon)_ +## _AAC Usage: (coming soon)_ + +## _FAC DPI Rules (coming soon)_ +## _FAC Usage: (coming soon)_ + +## Warning / Caveats +- If using Local ACP, P2P will only work with collections that do not have a policy assigned. If you wish to use ACP +on collections connected to a multi-node network, please use SourceHub ACP. + +The following features currently don't work with ACP, they are being actively worked on. +- [Adding Secondary Indexes](https://github.com/sourcenetwork/defradb/issues/2365) +- [Backing/Restoring Private Documents](https://github.com/sourcenetwork/defradb/issues/2430) + +The following features may have undefined/unstable behavior until they are properly tested: +- [Views](https://github.com/sourcenetwork/defradb/issues/2018) +- [Average Operations](https://github.com/sourcenetwork/defradb/issues/2475) +- [Count Operations](https://github.com/sourcenetwork/defradb/issues/2474) +- [Group Operations](https://github.com/sourcenetwork/defradb/issues/2473) +- [Limit Operations](https://github.com/sourcenetwork/defradb/issues/2472) +- [Order Operations](https://github.com/sourcenetwork/defradb/issues/2471) +- [Sum Operations](https://github.com/sourcenetwork/defradb/issues/2470) +- [Dag/Commit Operations](https://github.com/sourcenetwork/defradb/issues/2469) +- [Delete With Filter Operations](https://github.com/sourcenetwork/defradb/issues/2468) +- [Update With Filter Operations](https://github.com/sourcenetwork/defradb/issues/2467) +- [Type Join Many Operations](https://github.com/sourcenetwork/defradb/issues/2466) +- [Type Join One Operations](https://github.com/sourcenetwork/defradb/issues/2466) +- [Parallel Operations](https://github.com/sourcenetwork/defradb/issues/2465) +- [Execute Explain](https://github.com/sourcenetwork/defradb/issues/2464) diff --git a/docs/defradb/references/cli/defradb.md b/docs/defradb/references/cli/defradb.md index 3a38cb5..9def574 100644 --- a/docs/defradb/references/cli/defradb.md +++ b/docs/defradb/references/cli/defradb.md @@ -1,35 +1,40 @@ -# defradb +## defradb DefraDB Edge Database -## Synopsis +### Synopsis DefraDB is the edge database to power the user-centric future. -Start a database node, issue a request to a local or remote node, and much more. +Start a DefraDB node, interact with a local or remote node, and much more. -DefraDB is released under the BSL license, (c) 2022 Democratized Data Foundation. -See https://docs.source.network/BSL.txt for more information. - -## Options +### Options ``` - -h, --help help for defradb - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") + -h, --help help for defradb + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") ``` -## SEE ALSO +### SEE ALSO -* [defradb client](defradb_client.md) - Interact with a running DefraDB node as a client -* [defradb init](defradb_init.md) - Initialize DefraDB's root directory and configuration file +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb identity](defradb_identity.md) - Interact with identity features of DefraDB instance +* [defradb keyring](defradb_keyring.md) - Manage DefraDB private keys * [defradb server-dump](defradb_server-dump.md) - Dumps the state of the entire database * [defradb start](defradb_start.md) - Start a DefraDB node * [defradb version](defradb_version.md) - Display the version information of DefraDB and its components diff --git a/docs/defradb/references/cli/defradb_client.md b/docs/defradb/references/cli/defradb_client.md index 81656ac..c23547e 100644 --- a/docs/defradb/references/cli/defradb_client.md +++ b/docs/defradb/references/cli/defradb_client.md @@ -1,39 +1,53 @@ -# client +## defradb client -Interact with a running DefraDB node as a client +Interact with a DefraDB node -## Synopsis +### Synopsis -Interact with a running DefraDB node as a client. -Execute queries, add schema types, and run debug routines. +Interact with a DefraDB node. +Execute queries, add schema types, obtain node info, etc. -## Options +### Options ``` - -h, --help help for client + -h, --help help for client + -i, --identity string Hex formatted private key used to authenticate with ACP + --tx uint Transaction ID ``` -## Options inherited from parent commands +### Options inherited from parent commands ``` - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") ``` -## SEE ALSO +### SEE ALSO * [defradb](defradb.md) - DefraDB Edge Database -* [defradb client blocks](defradb_client_blocks.md) - Interact with the database's blockstore -* [defradb client dump](defradb_client_dump.md) - Dump the contents of a database node-side -* [defradb client peerid](defradb_client_peerid.md) - Get the peer ID of the DefraDB node -* [defradb client ping](defradb_client_ping.md) - Ping to test connection to a node +* [defradb client acp](defradb_client_acp.md) - Interact with the access control system of a DefraDB node +* [defradb client backup](defradb_client_backup.md) - Interact with the backup utility +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. +* [defradb client dump](defradb_client_dump.md) - Dump the contents of DefraDB node-side +* [defradb client index](defradb_client_index.md) - Manage collections' indexes of a running DefraDB instance +* [defradb client node-identity](defradb_client_node-identity.md) - Get the public information about the node's identity +* [defradb client p2p](defradb_client_p2p.md) - Interact with the DefraDB P2P system +* [defradb client purge](defradb_client_purge.md) - Delete all persisted data and restart * [defradb client query](defradb_client_query.md) - Send a DefraDB GraphQL query request -* [defradb client rpc](defradb_client_rpc.md) - Interact with a DefraDB gRPC server -* [defradb client schema](defradb_client_schema.md) - Interact with the schema system of a running DefraDB instance +* [defradb client schema](defradb_client_schema.md) - Interact with the schema system of a DefraDB node +* [defradb client tx](defradb_client_tx.md) - Create, commit, and discard DefraDB transactions +* [defradb client view](defradb_client_view.md) - Manage views within a running DefraDB instance diff --git a/docs/defradb/references/cli/defradb_client_acp.md b/docs/defradb/references/cli/defradb_client_acp.md new file mode 100644 index 0000000..d2ffce5 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_acp.md @@ -0,0 +1,46 @@ +## defradb client acp + +Interact with the access control system of a DefraDB node + +### Synopsis + +Interact with the access control system of a DefraDB node + +Learn more about [ACP](/acp/README.md) + + + +### Options + +``` + -h, --help help for acp +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client acp policy](defradb_client_acp_policy.md) - Interact with the acp policy features of DefraDB instance +* [defradb client acp relationship](defradb_client_acp_relationship.md) - Interact with the acp relationship features of DefraDB instance + diff --git a/docs/defradb/references/cli/defradb_client_acp_policy.md b/docs/defradb/references/cli/defradb_client_acp_policy.md new file mode 100644 index 0000000..c0c8d6e --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_acp_policy.md @@ -0,0 +1,41 @@ +## defradb client acp policy + +Interact with the acp policy features of DefraDB instance + +### Synopsis + +Interact with the acp policy features of DefraDB instance + +### Options + +``` + -h, --help help for policy +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client acp](defradb_client_acp.md) - Interact with the access control system of a DefraDB node +* [defradb client acp policy add](defradb_client_acp_policy_add.md) - Add new policy + diff --git a/docs/defradb/references/cli/defradb_client_acp_policy_add.md b/docs/defradb/references/cli/defradb_client_acp_policy_add.md new file mode 100644 index 0000000..bef3750 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_acp_policy_add.md @@ -0,0 +1,91 @@ +## defradb client acp policy add + +Add new policy + +### Synopsis + +Add new policy + +Notes: + - Can not add a policy without specifying an identity. + - ACP must be available (i.e. ACP can not be disabled). + - A non-DPI policy will be accepted (will be registered with acp system). + - But only a valid DPI policyID & resource can be specified on a schema. + - DPI validation happens when attempting to add a schema with '@policy'. + - Learn more about [ACP & DPI Rules](/acp/README.md) + +Example: add from an argument string: + defradb client acp policy add -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f \ +' +description: A Valid DefraDB Policy Interface + +actor: + name: actor + +resources: + users: + permissions: + read: + expr: owner + reader + write: + expr: owner + + relations: + owner: + types: + - actor + reader: + types: + - actor +' + +Example: add from file: + defradb client acp policy add -f policy.yml \ + -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f + +Example: add from file, verbose flags: + defradb client acp policy add --file policy.yml \ + --identity 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f + +Example: add from stdin: + cat policy.yml | defradb client acp policy add - + + + +``` +defradb client acp policy add [-i --identity] [policy] [flags] +``` + +### Options + +``` + -f, --file string File to load a policy from + -h, --help help for add +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client acp policy](defradb_client_acp_policy.md) - Interact with the acp policy features of DefraDB instance + diff --git a/docs/defradb/references/cli/defradb_client_acp_relationship.md b/docs/defradb/references/cli/defradb_client_acp_relationship.md new file mode 100644 index 0000000..2518f6c --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_acp_relationship.md @@ -0,0 +1,42 @@ +## defradb client acp relationship + +Interact with the acp relationship features of DefraDB instance + +### Synopsis + +Interact with the acp relationship features of DefraDB instance + +### Options + +``` + -h, --help help for relationship +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client acp](defradb_client_acp.md) - Interact with the access control system of a DefraDB node +* [defradb client acp relationship add](defradb_client_acp_relationship_add.md) - Add new relationship +* [defradb client acp relationship delete](defradb_client_acp_relationship_delete.md) - Delete relationship + diff --git a/docs/defradb/references/cli/defradb_client_acp_relationship_add.md b/docs/defradb/references/cli/defradb_client_acp_relationship_add.md new file mode 100644 index 0000000..f3313b4 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_acp_relationship_add.md @@ -0,0 +1,89 @@ +## defradb client acp relationship add + +Add new relationship + +### Synopsis + +Add new relationship + +To share a document (or grant a more restricted access) with another actor, we must add a relationship between the +actor and the document. In order to make the relationship we require all of the following: +1) Target DocID: The docID of the document we want to make a relationship for. +2) Collection Name: The name of the collection that has the Target DocID. +3) Relation Name: The type of relation (name must be defined within the linked policy on collection). +4) Target Identity: The identity of the actor the relationship is being made with. +5) Requesting Identity: The identity of the actor that is making the request. + +Notes: + - ACP must be available (i.e. ACP can not be disabled). + - The target document must be registered with ACP already (policy & resource specified). + - The requesting identity MUST either be the owner OR the manager (manages the relation) of the resource. + - If the specified relation was not granted the minimum DPI permissions (read or write) within the policy, + and a relationship is formed, the subject/actor will still not be able to access (read or write) the resource. + - Learn more about [ACP & DPI Rules](/acp/README.md) + +Example: Let another actor (4d092126012ebaf56161716018a71630d99443d9d5217e9d8502bb5c5456f2c5) read a private document: + defradb client acp relationship add \ + --collection Users \ + --docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ + --relation reader \ + --actor did:key:z7r8os2G88XXBNBTLj3kFR5rzUJ4VAesbX7PgsA68ak9B5RYcXF5EZEmjRzzinZndPSSwujXb4XKHG6vmKEFG6ZfsfcQn \ + --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac + +Example: Let all actors read a private document: + defradb client acp relationship add \ + --collection Users \ + --docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ + --relation reader \ + --actor "*" \ + --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac + +Example: Creating a dummy relationship does nothing (from database perspective): + defradb client acp relationship add \ + -c Users \ + --docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ + -r dummy \ + -a did:key:z7r8os2G88XXBNBTLj3kFR5rzUJ4VAesbX7PgsA68ak9B5RYcXF5EZEmjRzzinZndPSSwujXb4XKHG6vmKEFG6ZfsfcQn \ + -i e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac + + +``` +defradb client acp relationship add [--docID] [-c --collection] [-r --relation] [-a --actor] [-i --identity] [flags] +``` + +### Options + +``` + -a, --actor string Actor to add relationship with + -c, --collection string Collection that has the resource and policy for object + --docID string Document Identifier (ObjectID) to make relationship for + -h, --help help for add + -r, --relation string Relation that needs to be set for the relationship +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client acp relationship](defradb_client_acp_relationship.md) - Interact with the acp relationship features of DefraDB instance + diff --git a/docs/defradb/references/cli/defradb_client_acp_relationship_delete.md b/docs/defradb/references/cli/defradb_client_acp_relationship_delete.md new file mode 100644 index 0000000..8da5e6a --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_acp_relationship_delete.md @@ -0,0 +1,73 @@ +## defradb client acp relationship delete + +Delete relationship + +### Synopsis + +Delete relationship + +To revoke access to a document for an actor, we must delete the relationship between the +actor and the document. In order to delete the relationship we require all of the following: + +1) Target DocID: The docID of the document we want to delete a relationship for. +2) Collection Name: The name of the collection that has the Target DocID. +3) Relation Name: The type of relation (name must be defined within the linked policy on collection). +4) Target Identity: The identity of the actor the relationship is being deleted for. +5) Requesting Identity: The identity of the actor that is making the request. + +Notes: + - ACP must be available (i.e. ACP can not be disabled). + - The target document must be registered with ACP already (policy & resource specified). + - The requesting identity MUST either be the owner OR the manager (manages the relation) of the resource. + - If the relationship record was not found, then it will be a no-op. + - Learn more about [ACP & DPI Rules](/acp/README.md) + +Example: Let another actor (4d092126012ebaf56161716018a71630d99443d9d5217e9d8502bb5c5456f2c5) read a private document: + defradb client acp relationship delete \ + --collection Users \ + --docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ + --relation reader \ + --actor did:key:z7r8os2G88XXBNBTLj3kFR5rzUJ4VAesbX7PgsA68ak9B5RYcXF5EZEmjRzzinZndPSSwujXb4XKHG6vmKEFG6ZfsfcQn \ + --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac + + +``` +defradb client acp relationship delete [--docID] [-c --collection] [-r --relation] [-a --actor] [-i --identity] [flags] +``` + +### Options + +``` + -a, --actor string Actor to delete relationship for + -c, --collection string Collection that has the resource and policy for object + --docID string Document Identifier (ObjectID) to delete relationship for + -h, --help help for delete + -r, --relation string Relation that needs to be deleted within the relationship +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client acp relationship](defradb_client_acp_relationship.md) - Interact with the acp relationship features of DefraDB instance + diff --git a/docs/defradb/references/cli/defradb_client_backup.md b/docs/defradb/references/cli/defradb_client_backup.md new file mode 100644 index 0000000..cf7b2d0 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_backup.md @@ -0,0 +1,43 @@ +## defradb client backup + +Interact with the backup utility + +### Synopsis + +Export to or Import from a backup file. +Currently only supports JSON format. + +### Options + +``` + -h, --help help for backup +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client backup export](defradb_client_backup_export.md) - Export the database to a file +* [defradb client backup import](defradb_client_backup_import.md) - Import a JSON data file to the database + diff --git a/docs/defradb/references/cli/defradb_client_backup_export.md b/docs/defradb/references/cli/defradb_client_backup_export.md new file mode 100644 index 0000000..fe0887f --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_backup_export.md @@ -0,0 +1,55 @@ +## defradb client backup export + +Export the database to a file + +### Synopsis + +Export the database to a file. If a file exists at the location, it will be overwritten. + +If the --collection flag is provided, only the data for that collection will be exported. +Otherwise, all collections in the database will be exported. + +If the --pretty flag is provided, the JSON will be pretty printed. + +Example: export data for the 'Users' collection: + defradb client export --collection Users user_data.json + +``` +defradb client backup export [-c --collections | -p --pretty | -f --format] [flags] +``` + +### Options + +``` + -c, --collections strings List of collections + -f, --format string Define the output format. Supported formats: [json] (default "json") + -h, --help help for export + -p, --pretty Set the output JSON to be pretty printed +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client backup](defradb_client_backup.md) - Interact with the backup utility + diff --git a/docs/defradb/references/cli/defradb_client_backup_import.md b/docs/defradb/references/cli/defradb_client_backup_import.md new file mode 100644 index 0000000..7511f76 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_backup_import.md @@ -0,0 +1,47 @@ +## defradb client backup import + +Import a JSON data file to the database + +### Synopsis + +Import a JSON data file to the database. + +Example: import data to the database: + defradb client import user_data.json + +``` +defradb client backup import [flags] +``` + +### Options + +``` + -h, --help help for import +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client backup](defradb_client_backup.md) - Interact with the backup utility + diff --git a/docs/defradb/references/cli/defradb_client_blocks.md b/docs/defradb/references/cli/defradb_client_blocks.md deleted file mode 100644 index 9f1a50f..0000000 --- a/docs/defradb/references/cli/defradb_client_blocks.md +++ /dev/null @@ -1,28 +0,0 @@ -# client blocks - -Interact with the database's blockstore - -## Options - -``` - -h, --help help for blocks -``` - -## Options inherited from parent commands - -``` - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") -``` - -## SEE ALSO - -* [defradb client](defradb_client.md) - Interact with a running DefraDB node as a client -* [defradb client blocks get](defradb_client_blocks_get.md) - Get a block by its CID from the blockstore. - diff --git a/docs/defradb/references/cli/defradb_client_blocks_get.md b/docs/defradb/references/cli/defradb_client_blocks_get.md deleted file mode 100644 index 2ddfcb8..0000000 --- a/docs/defradb/references/cli/defradb_client_blocks_get.md +++ /dev/null @@ -1,31 +0,0 @@ -# client blocks get - -Get a block by its CID from the blockstore. - -``` -defradb client blocks get [CID] [flags] -``` - -## Options - -``` - -h, --help help for get -``` - -## Options inherited from parent commands - -``` - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") -``` - -## SEE ALSO - -* [defradb client blocks](defradb_client_blocks.md) - Interact with the database's blockstore - diff --git a/docs/defradb/references/cli/defradb_client_collection.md b/docs/defradb/references/cli/defradb_client_collection.md new file mode 100644 index 0000000..d4ea8c3 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_collection.md @@ -0,0 +1,51 @@ +## defradb client collection + +Interact with a collection. + +### Synopsis + +Create, read, update, and delete documents within a collection. + +### Options + +``` + --get-inactive Get inactive collections as well as active + -h, --help help for collection + -i, --identity string Hex formatted private key used to authenticate with ACP + --name string Collection name + --schema string Collection schema Root + --tx uint Transaction ID + --version string Collection version ID +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client collection create](defradb_client_collection_create.md) - Create a new document. +* [defradb client collection delete](defradb_client_collection_delete.md) - Delete documents by docID or filter. +* [defradb client collection describe](defradb_client_collection_describe.md) - View collection description. +* [defradb client collection docIDs](defradb_client_collection_docIDs.md) - List all document IDs (docIDs). +* [defradb client collection get](defradb_client_collection_get.md) - View document fields. +* [defradb client collection patch](defradb_client_collection_patch.md) - Patch existing collection descriptions +* [defradb client collection update](defradb_client_collection_update.md) - Update documents by docID or filter. + diff --git a/docs/defradb/references/cli/defradb_client_collection_create.md b/docs/defradb/references/cli/defradb_client_collection_create.md new file mode 100644 index 0000000..8c88041 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_collection_create.md @@ -0,0 +1,83 @@ +## defradb client collection create + +Create a new document. + +### Synopsis + +Create a new document. + +Options: + -i, --identity + Marks the document as private and set the identity as the owner. The access to the document + and permissions are controlled by ACP (Access Control Policy). + + -e, --encrypt + Encrypt flag specified if the document needs to be encrypted. If set, DefraDB will generate a + symmetric key for encryption using AES-GCM. + + --encrypt-fields + Comma-separated list of fields to encrypt. If set, DefraDB will encrypt only the specified fields + and for every field in the list it will generate a symmetric key for encryption using AES-GCM. + If combined with '--encrypt' flag, all the fields in the document not listed in '--encrypt-fields' + will be encrypted with the same key. + +Example: create from string: + defradb client collection create --name User '{ "name": "Bob" }' + +Example: create from string, with identity: + defradb client collection create --name User '{ "name": "Bob" }' \ + -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f + +Example: create multiple from string: + defradb client collection create --name User '[{ "name": "Alice" }, { "name": "Bob" }]' + +Example: create from file: + defradb client collection create --name User -f document.json + +Example: create from stdin: + cat document.json | defradb client collection create --name User - + + +``` +defradb client collection create [-i --identity] [-e --encrypt] [--encrypt-fields] [flags] +``` + +### Options + +``` + -e, --encrypt Flag to enable encryption of the document + --encrypt-fields strings Comma-separated list of fields to encrypt + -f, --file string File containing document(s) + -h, --help help for create +``` + +### Options inherited from parent commands + +``` + --get-inactive Get inactive collections as well as active + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --name string Collection name + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --schema string Collection schema Root + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") + --version string Collection version ID +``` + +### SEE ALSO + +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. + diff --git a/docs/defradb/references/cli/defradb_client_collection_delete.md b/docs/defradb/references/cli/defradb_client_collection_delete.md new file mode 100644 index 0000000..d23c480 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_collection_delete.md @@ -0,0 +1,61 @@ +## defradb client collection delete + +Delete documents by docID or filter. + +### Synopsis + +Delete documents by docID or filter and lists the number of documents deleted. + +Example: delete by docID: + defradb client collection delete --name User --docID bae-123 + +Example: delete by docID with identity: + defradb client collection delete --name User --docID bae-123 \ + -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f + +Example: delete by filter: + defradb client collection delete --name User --filter '{ "_gte": { "points": 100 } }' + + +``` +defradb client collection delete [-i --identity] [--filter --docID ] [flags] +``` + +### Options + +``` + --docID string Document ID + --filter string Document filter + -h, --help help for delete +``` + +### Options inherited from parent commands + +``` + --get-inactive Get inactive collections as well as active + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --name string Collection name + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --schema string Collection schema Root + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") + --version string Collection version ID +``` + +### SEE ALSO + +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. + diff --git a/docs/defradb/references/cli/defradb_client_collection_describe.md b/docs/defradb/references/cli/defradb_client_collection_describe.md new file mode 100644 index 0000000..3de635d --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_collection_describe.md @@ -0,0 +1,61 @@ +## defradb client collection describe + +View collection description. + +### Synopsis + +Introspect collection types. + +Example: view all collections + defradb client collection describe + +Example: view collection by name + defradb client collection describe --name User + +Example: view collection by schema root id + defradb client collection describe --schema bae123 + +Example: view collection by version id. This will also return inactive collections + defradb client collection describe --version bae123 + + +``` +defradb client collection describe [flags] +``` + +### Options + +``` + --get-inactive Get inactive collections as well as active + -h, --help help for describe + --name string Collection name + --schema string Collection schema Root + --version string Collection version ID +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. + diff --git a/docs/defradb/references/cli/defradb_client_collection_docIDs.md b/docs/defradb/references/cli/defradb_client_collection_docIDs.md new file mode 100644 index 0000000..4e57523 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_collection_docIDs.md @@ -0,0 +1,55 @@ +## defradb client collection docIDs + +List all document IDs (docIDs). + +### Synopsis + +List all document IDs (docIDs). + +Example: list all docID(s): + defradb client collection docIDs --name User + +Example: list all docID(s), with an identity: + defradb client collection docIDs -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f --name User + + +``` +defradb client collection docIDs [-i --identity] [flags] +``` + +### Options + +``` + -h, --help help for docIDs +``` + +### Options inherited from parent commands + +``` + --get-inactive Get inactive collections as well as active + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --name string Collection name + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --schema string Collection schema Root + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") + --version string Collection version ID +``` + +### SEE ALSO + +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. + diff --git a/docs/defradb/references/cli/defradb_client_collection_get.md b/docs/defradb/references/cli/defradb_client_collection_get.md new file mode 100644 index 0000000..8b5b530 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_collection_get.md @@ -0,0 +1,56 @@ +## defradb client collection get + +View document fields. + +### Synopsis + +View document fields. + +Example: + defradb client collection get --name User bae-123 + +Example to get a private document we must use an identity: + defradb client collection get -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f --name User bae-123 + + +``` +defradb client collection get [-i --identity] [--show-deleted] [flags] +``` + +### Options + +``` + -h, --help help for get + --show-deleted Show deleted documents +``` + +### Options inherited from parent commands + +``` + --get-inactive Get inactive collections as well as active + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --name string Collection name + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --schema string Collection schema Root + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") + --version string Collection version ID +``` + +### SEE ALSO + +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. + diff --git a/docs/defradb/references/cli/defradb_client_collection_patch.md b/docs/defradb/references/cli/defradb_client_collection_patch.md new file mode 100644 index 0000000..ea2e581 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_collection_patch.md @@ -0,0 +1,62 @@ +## defradb client collection patch + +Patch existing collection descriptions + +### Synopsis + +Patch existing collection descriptions. + +Uses JSON Patch to modify collection descriptions. + +Example: patch from an argument string: + defradb client collection patch '[{ "op": "add", "path": "...", "value": {...} }]' + +Example: patch from file: + defradb client collection patch -p patch.json + +Example: patch from stdin: + cat patch.json | defradb client collection patch - + +To learn more about the DefraDB GraphQL Schema Language, refer to https://docs.source.network. + +``` +defradb client collection patch [patch] [flags] +``` + +### Options + +``` + -h, --help help for patch + -p, --patch-file string File to load a patch from +``` + +### Options inherited from parent commands + +``` + --get-inactive Get inactive collections as well as active + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --name string Collection name + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --schema string Collection schema Root + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") + --version string Collection version ID +``` + +### SEE ALSO + +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. + diff --git a/docs/defradb/references/cli/defradb_client_collection_update.md b/docs/defradb/references/cli/defradb_client_collection_update.md new file mode 100644 index 0000000..f21bba3 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_collection_update.md @@ -0,0 +1,67 @@ +## defradb client collection update + +Update documents by docID or filter. + +### Synopsis + +Update documents by docID or filter. + +Example: update from string: + defradb client collection update --name User --docID bae-123 '{ "name": "Bob" }' + +Example: update by filter: + defradb client collection update --name User \ + --filter '{ "_gte": { "points": 100 } }' --updater '{ "verified": true }' + +Example: update by docID: + defradb client collection update --name User \ + --docID bae-123 --updater '{ "verified": true }' + +Example: update private docID, with identity: + defradb client collection update -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f --name User \ + --docID bae-123 --updater '{ "verified": true }' + + +``` +defradb client collection update [-i --identity] [--filter --docID --updater ] [flags] +``` + +### Options + +``` + --docID string Document ID + --filter string Document filter + -h, --help help for update + --updater string Document updater +``` + +### Options inherited from parent commands + +``` + --get-inactive Get inactive collections as well as active + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --name string Collection name + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --schema string Collection schema Root + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") + --version string Collection version ID +``` + +### SEE ALSO + +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. + diff --git a/docs/defradb/references/cli/defradb_client_dump.md b/docs/defradb/references/cli/defradb_client_dump.md index fdc2a38..ebc3eec 100644 --- a/docs/defradb/references/cli/defradb_client_dump.md +++ b/docs/defradb/references/cli/defradb_client_dump.md @@ -1,31 +1,40 @@ -# client dump +## defradb client dump -Dump the contents of a database node-side +Dump the contents of DefraDB node-side ``` defradb client dump [flags] ``` -## Options +### Options ``` -h, --help help for dump ``` -## Options inherited from parent commands +### Options inherited from parent commands ``` - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") ``` -## SEE ALSO +### SEE ALSO -* [defradb client](defradb_client.md) - Interact with a running DefraDB node as a client +* [defradb client](defradb_client.md) - Interact with a DefraDB node diff --git a/docs/defradb/references/cli/defradb_client_index.md b/docs/defradb/references/cli/defradb_client_index.md new file mode 100644 index 0000000..7143286 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_index.md @@ -0,0 +1,43 @@ +## defradb client index + +Manage collections' indexes of a running DefraDB instance + +### Synopsis + +Manage (create, drop, or list) collection indexes on a DefraDB node. + +### Options + +``` + -h, --help help for index +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client index create](defradb_client_index_create.md) - Creates a secondary index on a collection's field(s) +* [defradb client index drop](defradb_client_index_drop.md) - Drop a collection's secondary index +* [defradb client index list](defradb_client_index_list.md) - Shows the list indexes in the database or for a specific collection + diff --git a/docs/defradb/references/cli/defradb_client_index_create.md b/docs/defradb/references/cli/defradb_client_index_create.md new file mode 100644 index 0000000..268cd9e --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_index_create.md @@ -0,0 +1,62 @@ +## defradb client index create + +Creates a secondary index on a collection's field(s) + +### Synopsis + +Creates a secondary index on a collection's field(s). + +The --name flag is optional. If not provided, a name will be generated automatically. +The --unique flag is optional. If provided, the index will be unique. +If no order is specified for the field, the default value will be "ASC" + +Example: create an index for 'Users' collection on 'name' field: + defradb client index create --collection Users --fields name + +Example: create a named index for 'Users' collection on 'name' field: + defradb client index create --collection Users --fields name --name UsersByName + +Example: create a unique index for 'Users' collection on 'name' in ascending order, and 'age' in descending order: + defradb client index create --collection Users --fields name:ASC,age:DESC --unique + + +``` +defradb client index create -c --collection --fields [-n --name ] [--unique] [flags] +``` + +### Options + +``` + -c, --collection string Collection name + --fields strings Fields to index + -h, --help help for create + -n, --name string Index name + -u, --unique Make the index unique +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client index](defradb_client_index.md) - Manage collections' indexes of a running DefraDB instance + diff --git a/docs/defradb/references/cli/defradb_client_index_drop.md b/docs/defradb/references/cli/defradb_client_index_drop.md new file mode 100644 index 0000000..081f5e2 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_index_drop.md @@ -0,0 +1,49 @@ +## defradb client index drop + +Drop a collection's secondary index + +### Synopsis + +Drop a collection's secondary index. + +Example: drop the index 'UsersByName' for 'Users' collection: + defradb client index create --collection Users --name UsersByName + +``` +defradb client index drop -c --collection -n --name [flags] +``` + +### Options + +``` + -c, --collection string Collection name + -h, --help help for drop + -n, --name string Index name +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client index](defradb_client_index.md) - Manage collections' indexes of a running DefraDB instance + diff --git a/docs/defradb/references/cli/defradb_client_index_list.md b/docs/defradb/references/cli/defradb_client_index_list.md new file mode 100644 index 0000000..c5cf211 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_index_list.md @@ -0,0 +1,51 @@ +## defradb client index list + +Shows the list indexes in the database or for a specific collection + +### Synopsis + +Shows the list indexes in the database or for a specific collection. + +If the --collection flag is provided, only the indexes for that collection will be shown. +Otherwise, all indexes in the database will be shown. + +Example: show all index for 'Users' collection: + defradb client index list --collection Users + +``` +defradb client index list [-c --collection ] [flags] +``` + +### Options + +``` + -c, --collection string Collection name + -h, --help help for list +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client index](defradb_client_index.md) - Manage collections' indexes of a running DefraDB instance + diff --git a/docs/defradb/references/cli/defradb_client_node-identity.md b/docs/defradb/references/cli/defradb_client_node-identity.md new file mode 100644 index 0000000..907a959 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_node-identity.md @@ -0,0 +1,55 @@ +## defradb client node-identity + +Get the public information about the node's identity + +### Synopsis + +Get the public information about the node's identity. + +Node uses the identity to be able to exchange encryption keys with other nodes. + +A public identity contains: +- A compressed 33-byte secp256k1 public key in HEX format. +- A "did:key" generated from the public key. + +Example to get the identity of the node: + defradb client node-identity + + + +``` +defradb client node-identity [flags] +``` + +### Options + +``` + -h, --help help for node-identity +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node + diff --git a/docs/defradb/references/cli/defradb_client_p2p.md b/docs/defradb/references/cli/defradb_client_p2p.md new file mode 100644 index 0000000..d998508 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_p2p.md @@ -0,0 +1,43 @@ +## defradb client p2p + +Interact with the DefraDB P2P system + +### Synopsis + +Interact with the DefraDB P2P system + +### Options + +``` + -h, --help help for p2p +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client p2p collection](defradb_client_p2p_collection.md) - Configure the P2P collection system +* [defradb client p2p info](defradb_client_p2p_info.md) - Get peer info from a DefraDB node +* [defradb client p2p replicator](defradb_client_p2p_replicator.md) - Configure the replicator system + diff --git a/docs/defradb/references/cli/defradb_client_p2p_collection.md b/docs/defradb/references/cli/defradb_client_p2p_collection.md new file mode 100644 index 0000000..bc1f8c6 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_p2p_collection.md @@ -0,0 +1,44 @@ +## defradb client p2p collection + +Configure the P2P collection system + +### Synopsis + +Add, delete, or get the list of P2P collections. +The selected collections synchronize their events on the pubsub network. + +### Options + +``` + -h, --help help for collection +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p](defradb_client_p2p.md) - Interact with the DefraDB P2P system +* [defradb client p2p collection add](defradb_client_p2p_collection_add.md) - Add P2P collections +* [defradb client p2p collection getall](defradb_client_p2p_collection_getall.md) - Get all P2P collections +* [defradb client p2p collection remove](defradb_client_p2p_collection_remove.md) - Remove P2P collections + diff --git a/docs/defradb/references/cli/defradb_client_p2p_collection_add.md b/docs/defradb/references/cli/defradb_client_p2p_collection_add.md new file mode 100644 index 0000000..836c066 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_p2p_collection_add.md @@ -0,0 +1,52 @@ +## defradb client p2p collection add + +Add P2P collections + +### Synopsis + +Add P2P collections to the synchronized pubsub topics. +The collections are synchronized between nodes of a pubsub network. + +Example: add single collection + defradb client p2p collection add bae123 + +Example: add multiple collections + defradb client p2p collection add bae123,bae456 + + +``` +defradb client p2p collection add [collectionIDs] [flags] +``` + +### Options + +``` + -h, --help help for add +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p collection](defradb_client_p2p_collection.md) - Configure the P2P collection system + diff --git a/docs/defradb/references/cli/defradb_client_p2p_collection_getall.md b/docs/defradb/references/cli/defradb_client_p2p_collection_getall.md new file mode 100644 index 0000000..3df290b --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_p2p_collection_getall.md @@ -0,0 +1,45 @@ +## defradb client p2p collection getall + +Get all P2P collections + +### Synopsis + +Get all P2P collections in the pubsub topics. +This is the list of collections of the node that are synchronized on the pubsub network. + +``` +defradb client p2p collection getall [flags] +``` + +### Options + +``` + -h, --help help for getall +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p collection](defradb_client_p2p_collection.md) - Configure the P2P collection system + diff --git a/docs/defradb/references/cli/defradb_client_p2p_collection_remove.md b/docs/defradb/references/cli/defradb_client_p2p_collection_remove.md new file mode 100644 index 0000000..c3739df --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_p2p_collection_remove.md @@ -0,0 +1,52 @@ +## defradb client p2p collection remove + +Remove P2P collections + +### Synopsis + +Remove P2P collections from the followed pubsub topics. +The removed collections will no longer be synchronized between nodes. + +Example: remove single collection + defradb client p2p collection remove bae123 + +Example: remove multiple collections + defradb client p2p collection remove bae123,bae456 + + +``` +defradb client p2p collection remove [collectionIDs] [flags] +``` + +### Options + +``` + -h, --help help for remove +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p collection](defradb_client_p2p_collection.md) - Configure the P2P collection system + diff --git a/docs/defradb/references/cli/defradb_client_p2p_info.md b/docs/defradb/references/cli/defradb_client_p2p_info.md new file mode 100644 index 0000000..cf78285 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_p2p_info.md @@ -0,0 +1,44 @@ +## defradb client p2p info + +Get peer info from a DefraDB node + +### Synopsis + +Get peer info from a DefraDB node + +``` +defradb client p2p info [flags] +``` + +### Options + +``` + -h, --help help for info +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p](defradb_client_p2p.md) - Interact with the DefraDB P2P system + diff --git a/docs/defradb/references/cli/defradb_client_p2p_replicator.md b/docs/defradb/references/cli/defradb_client_p2p_replicator.md new file mode 100644 index 0000000..3c1efbc --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_p2p_replicator.md @@ -0,0 +1,44 @@ +## defradb client p2p replicator + +Configure the replicator system + +### Synopsis + +Configure the replicator system. Add, delete, or get the list of persisted replicators. +A replicator replicates one or all collection(s) from one node to another. + +### Options + +``` + -h, --help help for replicator +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p](defradb_client_p2p.md) - Interact with the DefraDB P2P system +* [defradb client p2p replicator delete](defradb_client_p2p_replicator_delete.md) - Delete replicator(s) and stop synchronization +* [defradb client p2p replicator getall](defradb_client_p2p_replicator_getall.md) - Get all replicators +* [defradb client p2p replicator set](defradb_client_p2p_replicator_set.md) - Add replicator(s) and start synchronization + diff --git a/docs/defradb/references/cli/defradb_client_p2p_replicator_delete.md b/docs/defradb/references/cli/defradb_client_p2p_replicator_delete.md new file mode 100644 index 0000000..626aafe --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_p2p_replicator_delete.md @@ -0,0 +1,50 @@ +## defradb client p2p replicator delete + +Delete replicator(s) and stop synchronization + +### Synopsis + +Delete replicator(s) and stop synchronization. +A replicator synchronizes one or all collection(s) from this node to another. + +Example: + defradb client p2p replicator delete -c Users '{"ID": "12D3", "Addrs": ["/ip4/0.0.0.0/tcp/9171"]}' + + +``` +defradb client p2p replicator delete [-c, --collection] [flags] +``` + +### Options + +``` + -c, --collection strings Collection(s) to stop replicating + -h, --help help for delete +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p replicator](defradb_client_p2p_replicator.md) - Configure the replicator system + diff --git a/docs/defradb/references/cli/defradb_client_p2p_replicator_getall.md b/docs/defradb/references/cli/defradb_client_p2p_replicator_getall.md new file mode 100644 index 0000000..c9f9142 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_p2p_replicator_getall.md @@ -0,0 +1,49 @@ +## defradb client p2p replicator getall + +Get all replicators + +### Synopsis + +Get all the replicators active in the P2P data sync system. +A replicator synchronizes one or all collection(s) from this node to another. + +Example: + defradb client p2p replicator getall + + +``` +defradb client p2p replicator getall [flags] +``` + +### Options + +``` + -h, --help help for getall +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p replicator](defradb_client_p2p_replicator.md) - Configure the replicator system + diff --git a/docs/defradb/references/cli/defradb_client_p2p_replicator_set.md b/docs/defradb/references/cli/defradb_client_p2p_replicator_set.md new file mode 100644 index 0000000..75d6efe --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_p2p_replicator_set.md @@ -0,0 +1,50 @@ +## defradb client p2p replicator set + +Add replicator(s) and start synchronization + +### Synopsis + +Add replicator(s) and start synchronization. +A replicator synchronizes one or all collection(s) from this node to another. + +Example: + defradb client p2p replicator set -c Users '{"ID": "12D3", "Addrs": ["/ip4/0.0.0.0/tcp/9171"]}' + + +``` +defradb client p2p replicator set [-c, --collection] [flags] +``` + +### Options + +``` + -c, --collection strings Collection(s) to replicate + -h, --help help for set +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p replicator](defradb_client_p2p_replicator.md) - Configure the replicator system + diff --git a/docs/defradb/references/cli/defradb_client_peerid.md b/docs/defradb/references/cli/defradb_client_peerid.md deleted file mode 100644 index cf3f175..0000000 --- a/docs/defradb/references/cli/defradb_client_peerid.md +++ /dev/null @@ -1,31 +0,0 @@ -# client peerid - -Get the peer ID of the DefraDB node - -``` -defradb client peerid [flags] -``` - -## Options - -``` - -h, --help help for peerid -``` - -## Options inherited from parent commands - -``` - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") -``` - -## SEE ALSO - -* [defradb client](defradb_client.md) - Interact with a running DefraDB node as a client - diff --git a/docs/defradb/references/cli/defradb_client_ping.md b/docs/defradb/references/cli/defradb_client_ping.md deleted file mode 100644 index 6115c5f..0000000 --- a/docs/defradb/references/cli/defradb_client_ping.md +++ /dev/null @@ -1,31 +0,0 @@ -# client ping - -Ping to test connection to a node - -``` -defradb client ping [flags] -``` - -## Options - -``` - -h, --help help for ping -``` - -## Options inherited from parent commands - -``` - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") -``` - -## SEE ALSO - -* [defradb client](defradb_client.md) - Interact with a running DefraDB node as a client - diff --git a/docs/defradb/references/cli/defradb_client_purge.md b/docs/defradb/references/cli/defradb_client_purge.md new file mode 100644 index 0000000..82adc92 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_purge.md @@ -0,0 +1,46 @@ +## defradb client purge + +Delete all persisted data and restart + +### Synopsis + +Delete all persisted data and restart. +WARNING this operation cannot be reversed. + +``` +defradb client purge [flags] +``` + +### Options + +``` + -f, --force Must be set for the operation to run + -h, --help help for purge +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node + diff --git a/docs/defradb/references/cli/defradb_client_query.md b/docs/defradb/references/cli/defradb_client_query.md index b602633..abaea09 100644 --- a/docs/defradb/references/cli/defradb_client_query.md +++ b/docs/defradb/references/cli/defradb_client_query.md @@ -1,16 +1,22 @@ -# client query +## defradb client query Send a DefraDB GraphQL query request -## Synopsis +### Synopsis Send a DefraDB GraphQL query request to the database. A query request can be sent as a single argument. Example command: -defradb client query 'query { ... }' + defradb client query 'query { ... }' + +Do a query request from a file by using the '-f' flag. Example command: + defradb client query -f request.graphql + +Do a query request from a file and with an identity. Example command: + defradb client query -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f -f request.graphql Or it can be sent via stdin by using the '-' special syntax. Example command: -cat request.graphql | defradb client query - + cat request.graphql | defradb client query - A GraphQL client such as GraphiQL (https://github.com/graphql/graphiql) can be used to interact with the database more conveniently. @@ -18,29 +24,41 @@ with the database more conveniently. To learn more about the DefraDB GraphQL Query Language, refer to https://docs.source.network. ``` -defradb client query [query request] [flags] +defradb client query [-i --identity] [request] [flags] ``` -## Options +### Options ``` - -h, --help help for query + -f, --file string File containing the query request + -h, --help help for query + -o, --operation string Name of the operation to execute in the query + -v, --variables string JSON encoded variables to use in the query ``` -## Options inherited from parent commands +### Options inherited from parent commands ``` - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") ``` -## SEE ALSO +### SEE ALSO -* [defradb client](defradb_client.md) - Interact with a running DefraDB node as a client +* [defradb client](defradb_client.md) - Interact with a DefraDB node diff --git a/docs/defradb/references/cli/defradb_client_rpc.md b/docs/defradb/references/cli/defradb_client_rpc.md deleted file mode 100644 index 1044e78..0000000 --- a/docs/defradb/references/cli/defradb_client_rpc.md +++ /dev/null @@ -1,34 +0,0 @@ -# client rpc - -Interact with a DefraDB gRPC server - -## Synopsis - -Interact with a DefraDB gRPC server. - -## Options - -``` - --addr string gRPC endpoint address (default "0.0.0.0:9161") - -h, --help help for rpc -``` - -## Options inherited from parent commands - -``` - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") -``` - -## SEE ALSO - -* [defradb client](defradb_client.md) - Interact with a running DefraDB node as a client -* [defradb client rpc p2pcollection](defradb_client_rpc_p2pcollection.md) - Interact with the P2P collection system -* [defradb client rpc replicator](defradb_client_rpc_replicator.md) - Interact with the replicator system - diff --git a/docs/defradb/references/cli/defradb_client_rpc_addreplicator.md b/docs/defradb/references/cli/defradb_client_rpc_addreplicator.md deleted file mode 100644 index a7c5c9f..0000000 --- a/docs/defradb/references/cli/defradb_client_rpc_addreplicator.md +++ /dev/null @@ -1,37 +0,0 @@ -# client rpc addreplicator - -Add a new replicator - -## Synopsis - -Use this command if you wish to add a new target replicator -for the p2p data sync system. - -``` -defradb client rpc addreplicator [flags] -``` - -## Options - -``` - -h, --help help for addreplicator -``` - -## Options inherited from parent commands - -``` - --addr string gRPC endpoint address (default "0.0.0.0:9161") - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") -``` - -## SEE ALSO - -* [defradb client rpc](defradb_client_rpc.md) - Interact with a DefraDB gRPC server - diff --git a/docs/defradb/references/cli/defradb_client_rpc_p2pcollection.md b/docs/defradb/references/cli/defradb_client_rpc_p2pcollection.md deleted file mode 100644 index 37edd5e..0000000 --- a/docs/defradb/references/cli/defradb_client_rpc_p2pcollection.md +++ /dev/null @@ -1,35 +0,0 @@ -# client rpc p2pcollection - -Interact with the P2P collection system - -## Synopsis - -Add, delete, or get the list of P2P collections - -## Options - -``` - -h, --help help for p2pcollection -``` - -## Options inherited from parent commands - -``` - --addr string gRPC endpoint address (default "0.0.0.0:9161") - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") -``` - -## SEE ALSO - -* [defradb client rpc](defradb_client_rpc.md) - Interact with a DefraDB gRPC server -* [defradb client rpc p2pcollection add](defradb_client_rpc_p2pcollection_add.md) - Add P2P collections -* [defradb client rpc p2pcollection getall](defradb_client_rpc_p2pcollection_getall.md) - Get all P2P collections -* [defradb client rpc p2pcollection remove](defradb_client_rpc_p2pcollection_remove.md) - Add P2P collections - diff --git a/docs/defradb/references/cli/defradb_client_rpc_p2pcollection_add.md b/docs/defradb/references/cli/defradb_client_rpc_p2pcollection_add.md deleted file mode 100644 index 902ff41..0000000 --- a/docs/defradb/references/cli/defradb_client_rpc_p2pcollection_add.md +++ /dev/null @@ -1,36 +0,0 @@ -# client rpc p2pcollection add - -Add P2P collections - -## Synopsis - -Use this command if you wish to add new P2P collections to the pubsub topics - -``` -defradb client rpc p2pcollection add [collectionID] [flags] -``` - -## Options - -``` - -h, --help help for add -``` - -## Options inherited from parent commands - -``` - --addr string gRPC endpoint address (default "0.0.0.0:9161") - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") -``` - -## SEE ALSO - -* [defradb client rpc p2pcollection](defradb_client_rpc_p2pcollection.md) - Interact with the P2P collection system - diff --git a/docs/defradb/references/cli/defradb_client_rpc_p2pcollection_getall.md b/docs/defradb/references/cli/defradb_client_rpc_p2pcollection_getall.md deleted file mode 100644 index 92d5337..0000000 --- a/docs/defradb/references/cli/defradb_client_rpc_p2pcollection_getall.md +++ /dev/null @@ -1,36 +0,0 @@ -# client rpc p2pcollection getall - -Get all P2P collections - -## Synopsis - -Use this command if you wish to get all P2P collections in the pubsub topics - -``` -defradb client rpc p2pcollection getall [flags] -``` - -## Options - -``` - -h, --help help for getall -``` - -## Options inherited from parent commands - -``` - --addr string gRPC endpoint address (default "0.0.0.0:9161") - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") -``` - -## SEE ALSO - -* [defradb client rpc p2pcollection](defradb_client_rpc_p2pcollection.md) - Interact with the P2P collection system - diff --git a/docs/defradb/references/cli/defradb_client_rpc_p2pcollection_remove.md b/docs/defradb/references/cli/defradb_client_rpc_p2pcollection_remove.md deleted file mode 100644 index 9f8214d..0000000 --- a/docs/defradb/references/cli/defradb_client_rpc_p2pcollection_remove.md +++ /dev/null @@ -1,36 +0,0 @@ -# client rpc p2pcollection remove - -Add P2P collections - -## Synopsis - -Use this command if you wish to remove P2P collections from the pubsub topics - -``` -defradb client rpc p2pcollection remove [collectionID] [flags] -``` - -## Options - -``` - -h, --help help for remove -``` - -## Options inherited from parent commands - -``` - --addr string gRPC endpoint address (default "0.0.0.0:9161") - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") -``` - -## SEE ALSO - -* [defradb client rpc p2pcollection](defradb_client_rpc_p2pcollection.md) - Interact with the P2P collection system - diff --git a/docs/defradb/references/cli/defradb_client_rpc_replicator.md b/docs/defradb/references/cli/defradb_client_rpc_replicator.md deleted file mode 100644 index cdb87fa..0000000 --- a/docs/defradb/references/cli/defradb_client_rpc_replicator.md +++ /dev/null @@ -1,37 +0,0 @@ -# client rpc replicator - -Interact with the replicator system - -## Synopsis - -Add, delete, or get the list of persisted replicators - -## Options - -``` - -c, --collection stringArray Define the collection for the replicator - -f, --full Set the replicator to act on all collections - -h, --help help for replicator -``` - -## Options inherited from parent commands - -``` - --addr string gRPC endpoint address (default "0.0.0.0:9161") - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") -``` - -## SEE ALSO - -* [defradb client rpc](defradb_client_rpc.md) - Interact with a DefraDB gRPC server -* [defradb client rpc replicator delete](defradb_client_rpc_replicator_delete.md) - Delete a replicator -* [defradb client rpc replicator getall](defradb_client_rpc_replicator_getall.md) - Get all replicators -* [defradb client rpc replicator set](defradb_client_rpc_replicator_set.md) - Set a P2P replicator - diff --git a/docs/defradb/references/cli/defradb_client_rpc_replicator_delete.md b/docs/defradb/references/cli/defradb_client_rpc_replicator_delete.md deleted file mode 100644 index 392481b..0000000 --- a/docs/defradb/references/cli/defradb_client_rpc_replicator_delete.md +++ /dev/null @@ -1,37 +0,0 @@ -# client rpc replicator delete - -Delete a replicator - -## Synopsis - -Use this command if you wish to remove the target replicator -for the p2p data sync system. - -``` -defradb client rpc replicator delete [-f, --full | -c, --collection] [flags] -``` - -## Options - -``` - -h, --help help for delete -``` - -## Options inherited from parent commands - -``` - --addr string gRPC endpoint address (default "0.0.0.0:9161") - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") -``` - -## SEE ALSO - -* [defradb client rpc replicator](defradb_client_rpc_replicator.md) - Interact with the replicator system - diff --git a/docs/defradb/references/cli/defradb_client_rpc_replicator_getall.md b/docs/defradb/references/cli/defradb_client_rpc_replicator_getall.md deleted file mode 100644 index 79d891a..0000000 --- a/docs/defradb/references/cli/defradb_client_rpc_replicator_getall.md +++ /dev/null @@ -1,37 +0,0 @@ -# client rpc replicator getall - -Get all replicators - -## Synopsis - -Use this command if you wish to get all the replicators -for the p2p data sync system. - -``` -defradb client rpc replicator getall [flags] -``` - -## Options - -``` - -h, --help help for getall -``` - -## Options inherited from parent commands - -``` - --addr string gRPC endpoint address (default "0.0.0.0:9161") - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") -``` - -## SEE ALSO - -* [defradb client rpc replicator](defradb_client_rpc_replicator.md) - Interact with the replicator system - diff --git a/docs/defradb/references/cli/defradb_client_rpc_replicator_set.md b/docs/defradb/references/cli/defradb_client_rpc_replicator_set.md deleted file mode 100644 index 5b94f1a..0000000 --- a/docs/defradb/references/cli/defradb_client_rpc_replicator_set.md +++ /dev/null @@ -1,39 +0,0 @@ -# client rpc replicator set - -Set a P2P replicator - -## Synopsis - -Use this command if you wish to add a new target replicator -for the p2p data sync system or add schemas to an existing one - -``` -defradb client rpc replicator set [-f, --full | -c, --collection] [flags] -``` - -## Options - -``` - -c, --collection stringArray Define the collection for the replicator - -f, --full Set the replicator to act on all collections - -h, --help help for set -``` - -## Options inherited from parent commands - -``` - --addr string gRPC endpoint address (default "0.0.0.0:9161") - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") -``` - -## SEE ALSO - -* [defradb client rpc replicator](defradb_client_rpc_replicator.md) - Interact with the replicator system - diff --git a/docs/defradb/references/cli/defradb_client_schema.md b/docs/defradb/references/cli/defradb_client_schema.md index 140c7fe..51e3ae0 100644 --- a/docs/defradb/references/cli/defradb_client_schema.md +++ b/docs/defradb/references/cli/defradb_client_schema.md @@ -1,33 +1,45 @@ -# client schema +## defradb client schema -Interact with the schema system of a running DefraDB instance +Interact with the schema system of a DefraDB node -## Synopsis +### Synopsis -Make changes, updates, or look for existing schema types to a DefraDB node. +Make changes, updates, or look for existing schema types. -## Options +### Options ``` -h, --help help for schema ``` -## Options inherited from parent commands +### Options inherited from parent commands ``` - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") ``` -## SEE ALSO +### SEE ALSO -* [defradb client](defradb_client.md) - Interact with a running DefraDB node as a client -* [defradb client schema add](defradb_client_schema_add.md) - Add a new schema type to DefraDB +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client schema add](defradb_client_schema_add.md) - Add new schema +* [defradb client schema describe](defradb_client_schema_describe.md) - View schema descriptions. +* [defradb client schema migration](defradb_client_schema_migration.md) - Interact with the schema migration system of a running DefraDB instance * [defradb client schema patch](defradb_client_schema_patch.md) - Patch an existing schema type +* [defradb client schema set-active](defradb_client_schema_set-active.md) - Set the active collection version diff --git a/docs/defradb/references/cli/defradb_client_schema_add.md b/docs/defradb/references/cli/defradb_client_schema_add.md index 0909eb5..ecff042 100644 --- a/docs/defradb/references/cli/defradb_client_schema_add.md +++ b/docs/defradb/references/cli/defradb_client_schema_add.md @@ -1,10 +1,15 @@ -# client schema add +## defradb client schema add -Add a new schema type to DefraDB +Add new schema -## Synopsis +### Synopsis -Add a new schema type to DefraDB. +Add new schema. + +Schema Object with a '@policy(id:".." resource: "..")' linked will only be accepted if: + - ACP is available (i.e. ACP is not disabled). + - The specified resource adheres to the Document Access Control DPI Rules. + - Learn more about [ACP & DPI Rules](/acp/README.md) Example: add from an argument string: defradb client schema add 'type Foo { ... }' @@ -15,33 +20,42 @@ Example: add from file: Example: add from stdin: cat schema.graphql | defradb client schema add - -To learn more about the DefraDB GraphQL Schema Language, refer to https://docs.source.network. +Learn more about the DefraDB GraphQL Schema Language on https://docs.source.network. ``` defradb client schema add [schema] [flags] ``` -## Options +### Options ``` -f, --file string File to load a schema from -h, --help help for add ``` -## Options inherited from parent commands +### Options inherited from parent commands ``` - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") ``` -## SEE ALSO +### SEE ALSO -* [defradb client schema](defradb_client_schema.md) - Interact with the schema system of a running DefraDB instance +* [defradb client schema](defradb_client_schema.md) - Interact with the schema system of a DefraDB node diff --git a/docs/defradb/references/cli/defradb_client_schema_describe.md b/docs/defradb/references/cli/defradb_client_schema_describe.md new file mode 100644 index 0000000..a3dd96f --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_schema_describe.md @@ -0,0 +1,60 @@ +## defradb client schema describe + +View schema descriptions. + +### Synopsis + +Introspect schema types. + +Example: view all schemas + defradb client schema describe + +Example: view schemas by name + defradb client schema describe --name User + +Example: view schemas by root + defradb client schema describe --root bae123 + +Example: view a single schema by version id + defradb client schema describe --version bae123 + + +``` +defradb client schema describe [flags] +``` + +### Options + +``` + -h, --help help for describe + --name string Schema name + --root string Schema root + --version string Schema Version ID +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema](defradb_client_schema.md) - Interact with the schema system of a DefraDB node + diff --git a/docs/defradb/references/cli/defradb_client_schema_migration.md b/docs/defradb/references/cli/defradb_client_schema_migration.md new file mode 100644 index 0000000..76be24e --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_schema_migration.md @@ -0,0 +1,45 @@ +## defradb client schema migration + +Interact with the schema migration system of a running DefraDB instance + +### Synopsis + +Make set or look for existing schema migrations on a DefraDB node. + +### Options + +``` + -h, --help help for migration +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema](defradb_client_schema.md) - Interact with the schema system of a DefraDB node +* [defradb client schema migration down](defradb_client_schema_migration_down.md) - Reverses the migration to the specified collection version. +* [defradb client schema migration reload](defradb_client_schema_migration_reload.md) - Reload the schema migrations within DefraDB +* [defradb client schema migration set](defradb_client_schema_migration_set.md) - Set a schema migration within DefraDB +* [defradb client schema migration set-registry](defradb_client_schema_migration_set-registry.md) - Set a schema migration within the DefraDB LensRegistry +* [defradb client schema migration up](defradb_client_schema_migration_up.md) - Applies the migration to the specified collection version. + diff --git a/docs/defradb/references/cli/defradb_client_schema_migration_down.md b/docs/defradb/references/cli/defradb_client_schema_migration_down.md new file mode 100644 index 0000000..2ec8a26 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_schema_migration_down.md @@ -0,0 +1,57 @@ +## defradb client schema migration down + +Reverses the migration to the specified collection version. + +### Synopsis + +Reverses the migration to the specified collection version. +Documents is a list of documents to reverse the migration from. + +Example: migrate from string + defradb client schema migration down --collection 2 '[{"name": "Bob"}]' + +Example: migrate from file + defradb client schema migration down --collection 2 -f documents.json + +Example: migrate from stdin + cat documents.json | defradb client schema migration down --collection 2 - + + +``` +defradb client schema migration down --collection [flags] +``` + +### Options + +``` + --collection uint32 Collection id + -f, --file string File containing document(s) + -h, --help help for down +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema migration](defradb_client_schema_migration.md) - Interact with the schema migration system of a running DefraDB instance + diff --git a/docs/defradb/references/cli/defradb_client_schema_migration_reload.md b/docs/defradb/references/cli/defradb_client_schema_migration_reload.md new file mode 100644 index 0000000..07011eb --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_schema_migration_reload.md @@ -0,0 +1,44 @@ +## defradb client schema migration reload + +Reload the schema migrations within DefraDB + +### Synopsis + +Reload the schema migrations within DefraDB + +``` +defradb client schema migration reload [flags] +``` + +### Options + +``` + -h, --help help for reload +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema migration](defradb_client_schema_migration.md) - Interact with the schema migration system of a running DefraDB instance + diff --git a/docs/defradb/references/cli/defradb_client_schema_migration_set-registry.md b/docs/defradb/references/cli/defradb_client_schema_migration_set-registry.md new file mode 100644 index 0000000..a62a1a5 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_schema_migration_set-registry.md @@ -0,0 +1,50 @@ +## defradb client schema migration set-registry + +Set a schema migration within the DefraDB LensRegistry + +### Synopsis + +Set a migration to a collection within the LensRegistry of the local DefraDB node. +Does not persist the migration after restart. + +Example: set from an argument string: + defradb client schema migration set-registry 2 '{"lenses": [...' + +Learn more about the DefraDB GraphQL Schema Language on https://docs.source.network. + +``` +defradb client schema migration set-registry [collectionID] [cfg] [flags] +``` + +### Options + +``` + -h, --help help for set-registry +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema migration](defradb_client_schema_migration.md) - Interact with the schema migration system of a running DefraDB instance + diff --git a/docs/defradb/references/cli/defradb_client_schema_migration_set.md b/docs/defradb/references/cli/defradb_client_schema_migration_set.md new file mode 100644 index 0000000..9543136 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_schema_migration_set.md @@ -0,0 +1,57 @@ +## defradb client schema migration set + +Set a schema migration within DefraDB + +### Synopsis + +Set a migration from a source schema version to a destination schema version for +all collections that are on the given source schema version within the local DefraDB node. + +Example: set from an argument string: + defradb client schema migration set bae123 bae456 '{"lenses": [...' + +Example: set from file: + defradb client schema migration set bae123 bae456 -f schema_migration.lens + +Example: add from stdin: + cat schema_migration.lens | defradb client schema migration set bae123 bae456 - + +Learn more about the DefraDB GraphQL Schema Language on https://docs.source.network. + +``` +defradb client schema migration set [src] [dst] [cfg] [flags] +``` + +### Options + +``` + -f, --file string Lens configuration file + -h, --help help for set +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema migration](defradb_client_schema_migration.md) - Interact with the schema migration system of a running DefraDB instance + diff --git a/docs/defradb/references/cli/defradb_client_schema_migration_up.md b/docs/defradb/references/cli/defradb_client_schema_migration_up.md new file mode 100644 index 0000000..1b59edb --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_schema_migration_up.md @@ -0,0 +1,57 @@ +## defradb client schema migration up + +Applies the migration to the specified collection version. + +### Synopsis + +Applies the migration to the specified collection version. +Documents is a list of documents to apply the migration to. + +Example: migrate from string + defradb client schema migration up --collection 2 '[{"name": "Bob"}]' + +Example: migrate from file + defradb client schema migration up --collection 2 -f documents.json + +Example: migrate from stdin + cat documents.json | defradb client schema migration up --collection 2 - + + +``` +defradb client schema migration up --collection [flags] +``` + +### Options + +``` + --collection uint32 Collection id + -f, --file string File containing document(s) + -h, --help help for up +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema migration](defradb_client_schema_migration.md) - Interact with the schema migration system of a running DefraDB instance + diff --git a/docs/defradb/references/cli/defradb_client_schema_patch.md b/docs/defradb/references/cli/defradb_client_schema_patch.md index 307e7b8..e2b58fe 100644 --- a/docs/defradb/references/cli/defradb_client_schema_patch.md +++ b/docs/defradb/references/cli/defradb_client_schema_patch.md @@ -1,18 +1,18 @@ -# client schema patch +## defradb client schema patch Patch an existing schema type -## Synopsis +### Synopsis Patch an existing schema. -Uses JSON PATCH formatting as a DDL. +Uses JSON Patch to modify schema types. Example: patch from an argument string: - defradb client schema patch '[{ "op": "add", "path": "...", "value": {...} }]' + defradb client schema patch '[{ "op": "add", "path": "...", "value": {...} }]' '{"lenses": [...' Example: patch from file: - defradb client schema patch -f patch.json + defradb client schema patch -p patch.json Example: patch from stdin: cat patch.json | defradb client schema patch - @@ -20,30 +20,41 @@ Example: patch from stdin: To learn more about the DefraDB GraphQL Schema Language, refer to https://docs.source.network. ``` -defradb client schema patch [schema] [flags] +defradb client schema patch [schema] [migration] [flags] ``` -## Options +### Options ``` - -f, --file string File to load a patch from - -h, --help help for patch + -h, --help help for patch + -t, --lens-file string File to load a lens config from + -p, --patch-file string File to load a patch from + --set-active Set the active schema version for all collections using the root schem ``` -## Options inherited from parent commands +### Options inherited from parent commands ``` - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") ``` -## SEE ALSO +### SEE ALSO -* [defradb client schema](defradb_client_schema.md) - Interact with the schema system of a running DefraDB instance +* [defradb client schema](defradb_client_schema.md) - Interact with the schema system of a DefraDB node diff --git a/docs/defradb/references/cli/defradb_client_schema_set-active.md b/docs/defradb/references/cli/defradb_client_schema_set-active.md new file mode 100644 index 0000000..7b637da --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_schema_set-active.md @@ -0,0 +1,45 @@ +## defradb client schema set-active + +Set the active collection version + +### Synopsis + +Activates all collection versions with the given schema version, and deactivates all +those without it (if they share the same schema root). + +``` +defradb client schema set-active [versionID] [flags] +``` + +### Options + +``` + -h, --help help for set-active +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema](defradb_client_schema.md) - Interact with the schema system of a DefraDB node + diff --git a/docs/defradb/references/cli/defradb_client_tx.md b/docs/defradb/references/cli/defradb_client_tx.md new file mode 100644 index 0000000..01353b8 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_tx.md @@ -0,0 +1,43 @@ +## defradb client tx + +Create, commit, and discard DefraDB transactions + +### Synopsis + +Create, commit, and discard DefraDB transactions + +### Options + +``` + -h, --help help for tx +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client tx commit](defradb_client_tx_commit.md) - Commit a DefraDB transaction. +* [defradb client tx create](defradb_client_tx_create.md) - Create a new DefraDB transaction. +* [defradb client tx discard](defradb_client_tx_discard.md) - Discard a DefraDB transaction. + diff --git a/docs/defradb/references/cli/defradb_client_tx_commit.md b/docs/defradb/references/cli/defradb_client_tx_commit.md new file mode 100644 index 0000000..557b9f0 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_tx_commit.md @@ -0,0 +1,44 @@ +## defradb client tx commit + +Commit a DefraDB transaction. + +### Synopsis + +Commit a DefraDB transaction. + +``` +defradb client tx commit [id] [flags] +``` + +### Options + +``` + -h, --help help for commit +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client tx](defradb_client_tx.md) - Create, commit, and discard DefraDB transactions + diff --git a/docs/defradb/references/cli/defradb_client_tx_create.md b/docs/defradb/references/cli/defradb_client_tx_create.md new file mode 100644 index 0000000..f174a09 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_tx_create.md @@ -0,0 +1,46 @@ +## defradb client tx create + +Create a new DefraDB transaction. + +### Synopsis + +Create a new DefraDB transaction. + +``` +defradb client tx create [flags] +``` + +### Options + +``` + --concurrent Transaction is concurrent + -h, --help help for create + --read-only Transaction is read only +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client tx](defradb_client_tx.md) - Create, commit, and discard DefraDB transactions + diff --git a/docs/defradb/references/cli/defradb_client_tx_discard.md b/docs/defradb/references/cli/defradb_client_tx_discard.md new file mode 100644 index 0000000..671d4f2 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_tx_discard.md @@ -0,0 +1,44 @@ +## defradb client tx discard + +Discard a DefraDB transaction. + +### Synopsis + +Discard a DefraDB transaction. + +``` +defradb client tx discard [id] [flags] +``` + +### Options + +``` + -h, --help help for discard +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client tx](defradb_client_tx.md) - Create, commit, and discard DefraDB transactions + diff --git a/docs/defradb/references/cli/defradb_client_view.md b/docs/defradb/references/cli/defradb_client_view.md new file mode 100644 index 0000000..bf21e03 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_view.md @@ -0,0 +1,42 @@ +## defradb client view + +Manage views within a running DefraDB instance + +### Synopsis + +Manage (add) views withing a running DefraDB instance + +### Options + +``` + -h, --help help for view +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client view add](defradb_client_view_add.md) - Add new view +* [defradb client view refresh](defradb_client_view_refresh.md) - Refresh views. + diff --git a/docs/defradb/references/cli/defradb_client_view_add.md b/docs/defradb/references/cli/defradb_client_view_add.md new file mode 100644 index 0000000..c5073d7 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_view_add.md @@ -0,0 +1,50 @@ +## defradb client view add + +Add new view + +### Synopsis + +Add new database view. + +Example: add from an argument string: + defradb client view add 'Foo { name, ...}' 'type Foo { ... }' '{"lenses": [...' + +Learn more about the DefraDB GraphQL Schema Language on https://docs.source.network. + +``` +defradb client view add [query] [sdl] [transform] [flags] +``` + +### Options + +``` + -f, --file string Lens configuration file + -h, --help help for add +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client view](defradb_client_view.md) - Manage views within a running DefraDB instance + diff --git a/docs/defradb/references/cli/defradb_client_view_refresh.md b/docs/defradb/references/cli/defradb_client_view_refresh.md new file mode 100644 index 0000000..28e9151 --- /dev/null +++ b/docs/defradb/references/cli/defradb_client_view_refresh.md @@ -0,0 +1,66 @@ +## defradb client view refresh + +Refresh views. + +### Synopsis + +Refresh views, executing the underlying query and LensVm transforms and +persisting the results. + +View is refreshed as the current user, meaning the cached items will reflect that user's +permissions. Subsequent query requests to the view, regardless of user, will receive +items from that cache. + +Example: refresh all views + defradb client view refresh + +Example: refresh views by name + defradb client view refresh --name UserView + +Example: refresh views by schema root id + defradb client view refresh --schema bae123 + +Example: refresh views by version id. This will also return inactive views + defradb client view refresh --version bae123 + + +``` +defradb client view refresh [flags] +``` + +### Options + +``` + --get-inactive Get inactive views as well as active + -h, --help help for refresh + --name string View name + --schema string View schema Root + --version string View version ID +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client view](defradb_client_view.md) - Manage views within a running DefraDB instance + diff --git a/docs/defradb/references/cli/defradb_identity.md b/docs/defradb/references/cli/defradb_identity.md new file mode 100644 index 0000000..cb0d0a6 --- /dev/null +++ b/docs/defradb/references/cli/defradb_identity.md @@ -0,0 +1,39 @@ +## defradb identity + +Interact with identity features of DefraDB instance + +### Synopsis + +Interact with identity features of DefraDB instance + +### Options + +``` + -h, --help help for identity +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb](defradb.md) - DefraDB Edge Database +* [defradb identity new](defradb_identity_new.md) - Generate a new identity + diff --git a/docs/defradb/references/cli/defradb_identity_new.md b/docs/defradb/references/cli/defradb_identity_new.md new file mode 100644 index 0000000..0fc3a73 --- /dev/null +++ b/docs/defradb/references/cli/defradb_identity_new.md @@ -0,0 +1,53 @@ +## defradb identity new + +Generate a new identity + +### Synopsis + +Generate a new identity + +The generated identity contains: +- A secp256k1 private key that is a 256-bit big-endian binary-encoded number, +padded to a length of 32 bytes in HEX format. +- A compressed 33-byte secp256k1 public key in HEX format. +- A "did:key" generated from the public key. + +Example: generate a new identity: + defradb identity new + + + +``` +defradb identity new [flags] +``` + +### Options + +``` + -h, --help help for new +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb identity](defradb_identity.md) - Interact with identity features of DefraDB instance + diff --git a/docs/defradb/references/cli/defradb_init.md b/docs/defradb/references/cli/defradb_init.md deleted file mode 100644 index 5b7f207..0000000 --- a/docs/defradb/references/cli/defradb_init.md +++ /dev/null @@ -1,36 +0,0 @@ -# init - -Initialize DefraDB's root directory and configuration file - -## Synopsis - -Initialize a directory for configuration and data at the given path. - -``` -defradb init [flags] -``` - -## Options - -``` - -h, --help help for init - --reinitialize Reinitialize the configuration file - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") -``` - -## Options inherited from parent commands - -``` - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") -``` - -## SEE ALSO - -* [defradb](defradb.md) - DefraDB Edge Database - diff --git a/docs/defradb/references/cli/defradb_keyring.md b/docs/defradb/references/cli/defradb_keyring.md new file mode 100644 index 0000000..362273c --- /dev/null +++ b/docs/defradb/references/cli/defradb_keyring.md @@ -0,0 +1,57 @@ +## defradb keyring + +Manage DefraDB private keys + +### Synopsis + +Manage DefraDB private keys. +Generate, import, and export private keys. + +The following keys are loaded from the keyring on start: + peer-key: Ed25519 private key (required) + encryption-key: AES-128, AES-192, or AES-256 key (optional) + +To randomly generate the required keys, run the following command: + defradb keyring generate + +To import externally generated keys, run the following command: + defradb keyring import \ \ + +To learn more about the available options: + defradb keyring --help + + +### Options + +``` + -h, --help help for keyring +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb](defradb.md) - DefraDB Edge Database +* [defradb keyring export](defradb_keyring_export.md) - Export a private key +* [defradb keyring generate](defradb_keyring_generate.md) - Generate private keys +* [defradb keyring import](defradb_keyring_import.md) - Import a private key +* [defradb keyring list](defradb_keyring_list.md) - List all keys in the keyring + diff --git a/docs/defradb/references/cli/defradb_keyring_export.md b/docs/defradb/references/cli/defradb_keyring_export.md new file mode 100644 index 0000000..083654b --- /dev/null +++ b/docs/defradb/references/cli/defradb_keyring_export.md @@ -0,0 +1,50 @@ +## defradb keyring export + +Export a private key + +### Synopsis + +Export a private key. +Prints the hexadecimal representation of a private key. + +The DEFRA_KEYRING_SECRET environment variable must be set to unlock the keyring. +This can also be done with a .env file in the working directory or at a path +defined with the --secret-file flag. + +Example: + defradb keyring export encryption-key + +``` +defradb keyring export [flags] +``` + +### Options + +``` + -h, --help help for export +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb keyring](defradb_keyring.md) - Manage DefraDB private keys + diff --git a/docs/defradb/references/cli/defradb_keyring_generate.md b/docs/defradb/references/cli/defradb_keyring_generate.md new file mode 100644 index 0000000..9c7b99b --- /dev/null +++ b/docs/defradb/references/cli/defradb_keyring_generate.md @@ -0,0 +1,64 @@ +## defradb keyring generate + +Generate private keys + +### Synopsis + +Generate private keys. +Randomly generate and store private keys in the keyring. +By default peer and encryption keys will be generated. + +The DEFRA_KEYRING_SECRET environment variable must be set to unlock the keyring. +This can also be done with a .env file in the working directory or at a path +defined with the --secret-file flag. + +WARNING: This will overwrite existing keys in the keyring. + +Example: + defradb keyring generate + +Example: with no encryption key + defradb keyring generate --no-encryption + +Example: with no peer key + defradb keyring generate --no-peer-key + +Example: with system keyring + defradb keyring generate --keyring-backend system + +``` +defradb keyring generate [flags] +``` + +### Options + +``` + -h, --help help for generate + --no-encryption Skip generating an encryption key. Encryption at rest will be disabled + --no-peer-key Skip generating a peer key. +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb keyring](defradb_keyring.md) - Manage DefraDB private keys + diff --git a/docs/defradb/references/cli/defradb_keyring_import.md b/docs/defradb/references/cli/defradb_keyring_import.md new file mode 100644 index 0000000..d6a275d --- /dev/null +++ b/docs/defradb/references/cli/defradb_keyring_import.md @@ -0,0 +1,50 @@ +## defradb keyring import + +Import a private key + +### Synopsis + +Import a private key. +Store an externally generated key in the keyring. + +The DEFRA_KEYRING_SECRET environment variable must be set to unlock the keyring. +This can also be done with a .env file in the working directory or at a path +defined with the --secret-file flag. + +Example: + defradb keyring import encryption-key 0000000000000000 + +``` +defradb keyring import [flags] +``` + +### Options + +``` + -h, --help help for import +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb keyring](defradb_keyring.md) - Manage DefraDB private keys + diff --git a/docs/defradb/references/cli/defradb_keyring_list.md b/docs/defradb/references/cli/defradb_keyring_list.md new file mode 100644 index 0000000..fb43aef --- /dev/null +++ b/docs/defradb/references/cli/defradb_keyring_list.md @@ -0,0 +1,48 @@ +## defradb keyring list + +List all keys in the keyring + +### Synopsis + +List all keys in the keyring. +The DEFRA_KEYRING_SECRET environment variable must be set to unlock the keyring. +This can also be done with a .env file in the working directory or at a path +defined with the --secret-file flag. + +Example: + defradb keyring list + +``` +defradb keyring list [flags] +``` + +### Options + +``` + -h, --help help for list +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb keyring](defradb_keyring.md) - Manage DefraDB private keys + diff --git a/docs/defradb/references/cli/defradb_server-dump.md b/docs/defradb/references/cli/defradb_server-dump.md index 91641d1..3aafdcf 100644 --- a/docs/defradb/references/cli/defradb_server-dump.md +++ b/docs/defradb/references/cli/defradb_server-dump.md @@ -1,4 +1,4 @@ -# server-dump +## defradb server-dump Dumps the state of the entire database @@ -6,27 +6,33 @@ Dumps the state of the entire database defradb server-dump [flags] ``` -## Options +### Options ``` - -h, --help help for server-dump - --store string Datastore to use. Options are badger, memory (default "badger") + -h, --help help for server-dump ``` -## Options inherited from parent commands +### Options inherited from parent commands ``` - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") ``` -## SEE ALSO +### SEE ALSO * [defradb](defradb.md) - DefraDB Edge Database diff --git a/docs/defradb/references/cli/defradb_start.md b/docs/defradb/references/cli/defradb_start.md index d393f7f..5aea7e8 100644 --- a/docs/defradb/references/cli/defradb_start.md +++ b/docs/defradb/references/cli/defradb_start.md @@ -1,46 +1,55 @@ -# start +## defradb start Start a DefraDB node -## Synopsis +### Synopsis -Start a new instance of DefraDB node. +Start a DefraDB node. ``` defradb start [flags] ``` -## Options +### Options ``` - --email string Email address used by the CA for notifications (default "example@example.com") - -h, --help help for start - --max-txn-retries int Specify the maximum number of retries per transaction (default 5) - --no-p2p Disable the peer-to-peer network synchronization system - --p2paddr string Listener address for the p2p network (formatted as a libp2p MultiAddr) (default "/ip4/0.0.0.0/tcp/9171") - --peers string List of peers to connect to - --privkeypath string Path to the private key for tls (default "certs/server.crt") - --pubkeypath string Path to the public key for tls (default "certs/server.key") - --store string Specify the datastore to use (supported: badger, memory) (default "badger") - --tcpaddr string Listener address for the tcp gRPC server (formatted as a libp2p MultiAddr) (default "/ip4/0.0.0.0/tcp/9161") - --tls Enable serving the API over https - --valuelogfilesize ByteSize Specify the datastore value log file size (in bytes). In memory size will be 2*valuelogfilesize (default 1GiB) + --allowed-origins stringArray List of origins to allow for CORS requests + --development Enables a set of features that make development easier but should not be enabled in production: + - allows purging of all persisted data + - generates temporary node identity if keyring is disabled + -h, --help help for start + --max-txn-retries int Specify the maximum number of retries per transaction (default 5) + --no-encryption Skip generating an encryption key. Encryption at rest will be disabled. WARNING: This cannot be undone. + --no-p2p Disable the peer-to-peer network synchronization system + --p2paddr strings Listen addresses for the p2p network (formatted as a libp2p MultiAddr) (default [/ip4/127.0.0.1/tcp/9171]) + --peers stringArray List of peers to connect to + --privkeypath string Path to the private key for tls + --pubkeypath string Path to the public key for tls + --store string Specify the datastore to use (supported: badger, memory) (default "badger") + --valuelogfilesize int Specify the datastore value log file size (in bytes). In memory size will be 2*valuelogfilesize (default 1073741824) ``` -## Options inherited from parent commands +### Options inherited from parent commands ``` - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") ``` -## SEE ALSO +### SEE ALSO * [defradb](defradb.md) - DefraDB Edge Database diff --git a/docs/defradb/references/cli/defradb_version.md b/docs/defradb/references/cli/defradb_version.md index de817ad..fdd5010 100644 --- a/docs/defradb/references/cli/defradb_version.md +++ b/docs/defradb/references/cli/defradb_version.md @@ -1,4 +1,4 @@ -# version +## defradb version Display the version information of DefraDB and its components @@ -6,7 +6,7 @@ Display the version information of DefraDB and its components defradb version [flags] ``` -## Options +### Options ``` -f, --format string Version output format. Options are text, json @@ -14,20 +14,27 @@ defradb version [flags] -h, --help help for version ``` -## Options inherited from parent commands +### Options inherited from parent commands ``` - --logformat string Log format to use. Options are csv, json (default "csv") - --logger stringArray Override logger parameters. Usage: --logger ,level=,output=,... - --loglevel string Log level to use. Options are debug, info, error, fatal (default "info") - --lognocolor Disable colored log output - --logoutput string Log output path (default "stderr") - --logtrace Include stacktrace in error and fatal logs - --rootdir string Directory for data and configuration to use (default "$HOME/.defradb") - --url string URL of HTTP endpoint to listen on or connect to (default "localhost:9181") + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") ``` -## SEE ALSO +### SEE ALSO * [defradb](defradb.md) - DefraDB Edge Database diff --git a/docs/defradb/references/config.md b/docs/defradb/references/config.md new file mode 100644 index 0000000..e3733e7 --- /dev/null +++ b/docs/defradb/references/config.md @@ -0,0 +1,171 @@ +--- +sidebar_label: Config +sidebar_position: 1 +--- + +# DefraDB configuration (YAML) + +The default DefraDB directory is `$HOME/.defradb`. It can be changed via the --rootdir CLI flag. + +Relative paths are interpreted as being rooted in the DefraDB directory. + +## `development` + +Enables a set of features that make development easier but should not be enabled in production. + +## `datastore.store` + +Store can be badger or memory. Defaults to `badger`. + +- badger: fast pure Go key-value store optimized for SSDs (https://github.com/dgraph-io/badger) +- memory: in-memory version of badger + +## `datastore.maxtxnretries` + +The number of retries to make in the event of a transaction conflict. Defaults to `5`. + +Currently this is only used within the P2P system and will not affect operations initiated by users. + +## `datastore.noencryption` + +Skip generating an encryption key. Encryption at rest will be disabled. **WARNING**: This cannot be undone. + +## `datastore.badger.path` + +The path to the database data file(s). Defaults to `data`. + +## `datastore.badger.valuelogfilesize` + +Maximum file size of the value log files. + +## `api.address` + +Address of the HTTP API to listen on or connect to. Defaults to `127.0.0.1:9181`. + +## `api.allowed-origins` + +The list of origins a cross-domain request can be executed from. + +## `api.pubkeypath` + +The path to the public key file for TLS / HTTPS. + +## `api.privkeypath` + +The path to the private key file for TLS / HTTPS. + +## `net.p2pdisabled` + +Whether P2P networking is disabled. Defaults to `false`. + +## `net.p2paddresses` + +List of addresses for the P2P network to listen on. Defaults to `/ip4/127.0.0.1/tcp/9171`. + +## `net.pubsubenabled` + +Whether PubSub is enabled. Defaults to `true`. + +## `net.peers` + +List of peers to boostrap with, specified as multiaddresses. + +https://docs.libp2p.io/concepts/addressing/ + +## `net.relay` + +Enable libp2p's Circuit relay transport protocol. Defaults to `false`. + +https://docs.libp2p.io/concepts/circuit-relay/ + +## `log.level` + +Log level to use. Options are `info` or `error`. Defaults to `info`. + +## `log.output` + +Log output path. Options are `stderr` or `stdout`. Defaults to `stderr`. + +## `log.format` + +Log format to use. Options are `text` or `json`. Defaults to `text`. + +## `log.stacktrace` + +Include stacktrace in error and fatal logs. Defaults to `false`. + +## `log.source` + +Include source location in logs. Defaults to `false`. + +## `log.overrides` + +Logger config overrides. Format `,=,...;,...`. + +## `log.colordisabled` + +Disable colored log output. Defaults to `false`. + +## `keyring.path` + +Path to store encrypted key files in. Defaults to `keys`. + +## `keyring.disabled` + +Disable the keyring and generate ephemeral keys instead. Defaults to `false`. + +## `keyring.namespace` + +The service name to use when using the system keyring. Defaults to `defradb`. + +## `keyring.backend` + +Keyring backend to use. Defaults to `file`. + +- `file` Stores keys in encrypted files +- `system` Stores keys in the OS managed keyring + +## `lens.runtime` + +The LensVM wasm runtime to run lens modules in. + +Possible values: +- `wasm-time` (default): https://github.com/bytecodealliance/wasmtime-go +- `wasmer` (windows not supported): https://github.com/wasmerio/wasmer-go +- `wazero`: https://github.com/tetratelabs/wazero + +## `acp.type` + +The type of ACP module to use. + +Possible values: +- `none` (default): No ACP +- `local` local-only ACP +- `source-hub` source hub ACP: https://github.com/sourcenetwork/sourcehub + +## `acp.sourceHub.ChainID` + +The ID of the SourceHub chain to store ACP data in. Required when using `acp.type`:`source-hub`. + +## `acp.sourceHub.GRPCAddress` + +The address of the SourceHub GRPC server. Required when using `acp.type`:`source-hub`. + +## `acp.sourceHub.CometRPCAddress` + +The address of the SourceHub Comet RPC server. Required when using `acp.type`:`source-hub`. + +## `acp.sourceHub.KeyName` + +The name of the key in the keyring where the SourceHub credentials used to sign (and pay for) SourceHub +transactions created by the node is stored. Required when using `acp.type`:`source-hub`. + +## `acp.sourceHub.address` + +The SourceHub address of the actor that client-side actions should permit to make SourceHub actions on +their behalf. This is a client-side only config param. It is required if the client wishes to make +SourceHub ACP requests in order to create protected data. + +## `secretfile` + +Path to the file containing secrets. Defaults to `.env`. diff --git a/docs/defradb/references/query-specification/aliases.md b/docs/defradb/references/query-specification/aliases.md index acd5db1..32be263 100644 --- a/docs/defradb/references/query-specification/aliases.md +++ b/docs/defradb/references/query-specification/aliases.md @@ -8,7 +8,7 @@ If the structure of a returned query is not ideal for a given application, you c ```graphql { - topTenBooks: Books(sort: {rating: DESC}, limit: 10) { + topTenBooks: Books(order: {rating: DESC}, limit: 10) { title genre description @@ -20,13 +20,13 @@ In the above example, the books result is renamed to `topTenBooks`, which can be ```graphql { - topTenBooks: Books(sort: {rating: DESC}, limit: 10) { + topTenBooks: Books(order: {rating: DESC}, limit: 10) { title genre description } - bottomTenBooks: Books(sort: {rating: ASC}, limit: 10) { + bottomTenBooks: Books(order: {rating: ASC}, limit: 10) { title genre description diff --git a/docs/defradb/references/query-specification/database-api.md b/docs/defradb/references/query-specification/database-api.md index e2cec7d..4bf9533 100644 --- a/docs/defradb/references/query-specification/database-api.md +++ b/docs/defradb/references/query-specification/database-api.md @@ -45,7 +45,7 @@ type Delta { To query the latest commit of an object (with id: '123'): ```graphql query { - latestCommits(docid: "123") { + latestCommits(docID: "123") { cid height delta { @@ -58,7 +58,7 @@ query { To query all the commits of an object (with id: '123'): ```graphql query { - allCommits(docid: "123") { + allCommits(docID: "123") { cid height delta { diff --git a/docs/defradb/references/query-specification/limiting-and-pagination.md b/docs/defradb/references/query-specification/limiting-and-pagination.md index fd5577e..983c56d 100644 --- a/docs/defradb/references/query-specification/limiting-and-pagination.md +++ b/docs/defradb/references/query-specification/limiting-and-pagination.md @@ -9,7 +9,7 @@ After filtering and sorting a query, we can then limit and skip elements from th Let us get the top 10 rated books: ```graphql { - Books(sort: {rating: DESC}, limit: 10) { + Books(order: {rating: DESC}, limit: 10) { title genre description @@ -22,7 +22,7 @@ The `limit` function accepts the maximum number of items to return from the resu Let's get the *next* top 10 rated books after the previous query: ```graphql { - Books(sort: {rating: DESC}, limit:10, offset: 10) { + Books(order: {rating: DESC}, limit: 10, offset: 10) { title genre description diff --git a/docs/defradb/references/query-specification/mutation-block.md b/docs/defradb/references/query-specification/mutation-block.md index 255c3b4..c22c46d 100644 --- a/docs/defradb/references/query-specification/mutation-block.md +++ b/docs/defradb/references/query-specification/mutation-block.md @@ -65,7 +65,7 @@ Update filters use the same format and types from the Query system. Hence, it ea The structure of the generated update mutation for a `Book` type is given below: ```graphql mutation { - update_Book(dockey: ID, filter: BookFilterArg, input: updateBookInput) [Book] + update_Book(docID: ID, filter: BookFilterArg, input: updateBookInput) [Book] } ``` @@ -88,7 +88,7 @@ Once we create our update, and select which document(s) to update, we can query A basic example is provided below: ```graphql mutation { - update_Book(dockey: '123', input: {name: "John"}) { + update_Book(docID: '123', input: {name: "John"}) { _key name } @@ -124,14 +124,14 @@ The document selection interface is identical to the `Update` system. Much like The structure of the generated delete mutation for a `Book` type is given below: ```graphql mutation { - delete_Book(dockey: ID, ids: [ID], filter: BookFilterArg) [Book] + delete_Book(docID: ID, ids: [ID], filter: BookFilterArg) [Book] } ``` Here, we can delete a document with ID '123': ```graphql mutation { - delete_User(dockey: '123') { + delete_User(docID: '123') { _key name } diff --git a/docs/defradb/references/query-specification/sorting-and-ordering.md b/docs/defradb/references/query-specification/sorting-and-ordering.md index 444a244..7da53e3 100644 --- a/docs/defradb/references/query-specification/sorting-and-ordering.md +++ b/docs/defradb/references/query-specification/sorting-and-ordering.md @@ -25,7 +25,7 @@ Sorting can be applied to multiple fields in the same query. The sort order is s The query below finds all books ordered by earliest published date and then by descending order of titles. ```graphql { - Books(order: { published_at: ASC, title: DESC }) { + Books(order: [{ published_at: ASC }, { title: DESC }] }) { title genre description @@ -38,7 +38,7 @@ Additionally, you can sort sub-object fields along with root object fields. The query below finds all books ordered by earliest published date and then by the latest authors' birthday. ```graphql { - Books(order: { published_at: ASC, Author: { birthday: DESC }}) { + Books(order: [{ published_at: ASC }, { Author: { birthday: DESC } }]) { title description published_at @@ -63,7 +63,7 @@ If the DocKey is included in the sort fields, any field included afterwards will *So, instead of:* ```graphql { - Authors(order: { name: DESC, Books: { title: ASC }}) { + Authors(order: [{ name: DESC }, { Books: { title: ASC } }]) { name Books { title @@ -114,7 +114,7 @@ If you have the following objects in the database: > and the following query ```graphql { - Authors(order: { name: DESC, books: { title: ASC }}) { + Authors(order: [{ name: DESC }, { books: { title: ASC } }]) { name books { title @@ -123,14 +123,6 @@ If you have the following objects in the database: } ``` -```graphql -Books(filter: {_id: [1]}) { - title - genre - description -} -``` - -> Given there are two authors with the same name (John Grisham), the sort object `(sort: { name: "desc", Books: { title: "asc" }}` would suggest we sort duplicate authors using `Books: { title: "asc" }` as the secondary sort field. However, because the books field is an array of objects, there is no single value for the title to compare easily. +> Given there are two authors with the same name (John Grisham), the sort object `(sort: { name: DESC, books: { title: ASC }}` would suggest we sort duplicate authors using `books: { title: ASC }` as the secondary sort field. However, because the books field is an array of objects, there is no single value for the title to compare easily. > > Therefore, sorting on array sub objects from the root field is ***strictly not allowed***. diff --git a/docs/defradb/release notes/v0.10.0.md b/docs/defradb/release notes/v0.10.0.md new file mode 100644 index 0000000..c5471bc --- /dev/null +++ b/docs/defradb/release notes/v0.10.0.md @@ -0,0 +1,45 @@ +--- +sidebar_position: 100 +--- +# v0.10.0 + +> 2024-03-08 + +## Changelog +DefraDB v0.10 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.9.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. + +### Features +* feat: Add JSON scalar ([#2254](https://github.com/sourcenetwork/defradb/issues/2254)) +* feat: Add case insensitive `like` operator ([#2368](https://github.com/sourcenetwork/defradb/issues/2368)) +* feat: Add composite indexes ([#2226](https://github.com/sourcenetwork/defradb/issues/2226)) +* feat: Add support for views with Lens transforms ([#2311](https://github.com/sourcenetwork/defradb/issues/2311)) +* feat: Allow setting null values on doc fields ([#2273](https://github.com/sourcenetwork/defradb/issues/2273)) +* feat: Generate OpenAPI command ([#2235](https://github.com/sourcenetwork/defradb/issues/2235)) +* feat: Model Col. SchemaVersions and migrations on Cols ([#2286](https://github.com/sourcenetwork/defradb/issues/2286)) +* feat: Multiple docs with nil value on unique-indexed field ([#2276](https://github.com/sourcenetwork/defradb/issues/2276)) +* feat: Replace FieldDescription.RelationType with IsPrimary ([#2288](https://github.com/sourcenetwork/defradb/issues/2288)) +* feat: Reverted order for indexed fields ([#2335](https://github.com/sourcenetwork/defradb/issues/2335)) +* feat: Rework GetCollection/SchemaByFoo funcs into single ([#2319](https://github.com/sourcenetwork/defradb/issues/2319)) +### Fix +* fix: Add `latest` image tag for ghcr ([#2340](https://github.com/sourcenetwork/defradb/issues/2340)) +* fix: Add missing delta payload ([#2306](https://github.com/sourcenetwork/defradb/issues/2306)) +* fix: Add missing directive definitions ([#2369](https://github.com/sourcenetwork/defradb/issues/2369)) +* fix: Add validation to JSON fields ([#2375](https://github.com/sourcenetwork/defradb/issues/2375)) +* fix: Fix compound relational filters in aggregates ([#2297](https://github.com/sourcenetwork/defradb/issues/2297)) +* fix: Load root dir before loading config ([#2266](https://github.com/sourcenetwork/defradb/issues/2266)) +* fix: Make peers sync secondary index ([#2390](https://github.com/sourcenetwork/defradb/issues/2390)) +* fix: Make returned collections respect explicit transactions ([#2385](https://github.com/sourcenetwork/defradb/issues/2385)) +* fix: Mark docs as deleted when querying in delete mut ([#2298](https://github.com/sourcenetwork/defradb/issues/2298)) +* fix: Move field id off of schema ([#2336](https://github.com/sourcenetwork/defradb/issues/2336)) +* fix: Update GetCollections behaviour ([#2378](https://github.com/sourcenetwork/defradb/issues/2378)) +### Refactoring +* refactor: Decouple net config ([#2258](https://github.com/sourcenetwork/defradb/issues/2258)) +* refactor: Generate field ids using a sequence ([#2339](https://github.com/sourcenetwork/defradb/issues/2339)) +* refactor: HTTP config ([#2278](https://github.com/sourcenetwork/defradb/issues/2278)) +* refactor: Make CollectionDescription.Name Option ([#2223](https://github.com/sourcenetwork/defradb/issues/2223)) +* refactor: Make config internal to CLI ([#2310](https://github.com/sourcenetwork/defradb/issues/2310)) +* refactor: Node config ([#2296](https://github.com/sourcenetwork/defradb/issues/2296) +* refactor: Remove unused Delete field from client.Document ([#2275](https://github.com/sourcenetwork/defradb/issues/2275)) + diff --git a/docs/defradb/release notes/v0.11.0.md b/docs/defradb/release notes/v0.11.0.md new file mode 100644 index 0000000..816e487 --- /dev/null +++ b/docs/defradb/release notes/v0.11.0.md @@ -0,0 +1,41 @@ +--- +sidebar_position: 110 +--- +# v0.11.0 + +> 2024-05-06 + +## Changelog +DefraDB v0.11 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.10.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. + +### Features +* feat: Add Access Control Policy ([#2338](https://github.com/sourcenetwork/defradb/issues/2338)) +* feat: Add Defra-Lens support for branching schema ([#2421](https://github.com/sourcenetwork/defradb/issues/2421)) +* feat: Add P Counter CRDT ([#2482](https://github.com/sourcenetwork/defradb/issues/2482)) +* feat: Add PatchCollection ([#2402](https://github.com/sourcenetwork/defradb/issues/2402)) +* feat: Allow mutation of col sources via PatchCollection ([#2424](https://github.com/sourcenetwork/defradb/issues/2424)) +* feat: Force explicit primary decl. in SDL for one-ones ([#2462](https://github.com/sourcenetwork/defradb/issues/2462)) +* feat: Lens runtime config ([#2497](https://github.com/sourcenetwork/defradb/issues/2497)) +* feat: Move relation field properties onto collection ([#2529](https://github.com/sourcenetwork/defradb/issues/2529)) +* feat: Update corelog to 0.0.7 ([#2547](https://github.com/sourcenetwork/defradb/issues/2547)) +### Fix +* fix: Add check to filter result for logical ops ([#2573](https://github.com/sourcenetwork/defradb/issues/2573)) +* fix: Allow update when updating non-indexed field ([#2511](https://github.com/sourcenetwork/defradb/issues/2511)) +* fix: Handle compound filters on related indexed fields ([#2575](https://github.com/sourcenetwork/defradb/issues/2575)) +* fix: Make all array kinds nillable ([#2534](https://github.com/sourcenetwork/defradb/issues/2534)) +* fix: Return correct results from one-many indexed filter ([#2579](https://github.com/sourcenetwork/defradb/issues/2579)) +### Documentation +* docs: Add data definition document ([#2544](https://github.com/sourcenetwork/defradb/issues/2544)) +### Refactoring +* refactor: Add NormalValue ([#2404](https://github.com/sourcenetwork/defradb/issues/2404)) +* refactor: Clean up client/request package ([#2443](https://github.com/sourcenetwork/defradb/issues/2443)) +* refactor: DB transactions context ([#2513](https://github.com/sourcenetwork/defradb/issues/2513)) +* refactor: Merge collection UpdateWith and DeleteWith ([#2531](https://github.com/sourcenetwork/defradb/issues/2531)) +* refactor: Replace logging package with corelog ([#2406](https://github.com/sourcenetwork/defradb/issues/2406)) +* refactor: Rewrite convertImmutable ([#2445](https://github.com/sourcenetwork/defradb/issues/2445)) +* refactor: Unify Field Kind and Schema properties ([#2414](https://github.com/sourcenetwork/defradb/issues/2414)) +### Testing +* test: Add flag to skip network tests ([#2495](https://github.com/sourcenetwork/defradb/issues/2495)) + diff --git a/docs/defradb/release notes/v0.12.0.md b/docs/defradb/release notes/v0.12.0.md new file mode 100644 index 0000000..bd39a45 --- /dev/null +++ b/docs/defradb/release notes/v0.12.0.md @@ -0,0 +1,60 @@ +--- +sidebar_position: 120 +--- +# v0.12.0 + +> 2024-06-28 + +## Changelog +DefraDB v0.12 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.11.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. + +### Features +* feat: Ability to generate a new identity (#2760) +* feat: Add async transaction callbacks (#2708) +* feat: Add authentication for ACP (#2649) +* feat: Allow lens runtime selection via config (#2684) +* feat: Enable sec. indexes with ACP (#2602) +* feat: Inject ACP instance into the DB instance (#2633) +* feat: Keyring (#2557) +* feat: Sec. indexes on relations (#2670) +### Fix +* fix: Add version check in basicTxn.Query (#2742) +* fix: Allow primary field declarations on one-many (#2796) +* fix: Change new identity keys to hex format (#2773) +* fix: Incorporate schema root into docID (#2701) +* fix: Keyring output (#2784) +* fix: Make node options composable (#2648) +* fix: Merge retry logic (#2719) +* fix: Race condition when testing CLI (#2713) +* fix: Remove limit for fetching secondary docs (#2594) +* fix: Remove shared mutable state between database instances (#2777) +* fix: Resolve incorrect merge conflict (#2723) +* fix: Return slice of correct length from db.AddSchema (#2765) +* fix: Use node representation for Block (#2746) +### Documentation +* docs: Add http/openapi documentation & ci workflow (#2678) +* docs: Document Event Update struct (#2598) +* docs: Remove reference to client ping from readme (#2793) +* docs: Streamline cli documentation (#2646) +### Refactoring +* refactor: Change counters to support encryption (#2698) +* refactor: Change from protobuf to cbor for IPLD (#2604) +* refactor: Change local_acp implementation to use acp_core (#2691) +* refactor: DAG sync and move merge outside of net package (#2658) +* refactor: Extract Defra specific logic from ACPLocal type (#2656) +* refactor: Extract definition stuff from collection.go (#2706) +* refactor: Move internal packages to internal dir (#2599) +* refactor: Reorganize global CLI flags (#2615) +* refactor: Replace subscription events publisher (#2686) +* refactor: Rework definition validation (#2720) +* refactor: Use events to test network logic (#2700) +### Testing +* test: Add relation substitute mechanic to tests (#2682) +* test: Allow assertion of AddSchema results (#2788) +* test: Allow test harness to execute benchmarks (#2740) +* test: Remove duplicate test (#2787) +* test: Support asserting on doc index in test results (#2786) +* test: Test node pkg constructor via integration test suite (#2641) + diff --git a/docs/defradb/release notes/v0.13.0.md b/docs/defradb/release notes/v0.13.0.md new file mode 100644 index 0000000..f73f73a --- /dev/null +++ b/docs/defradb/release notes/v0.13.0.md @@ -0,0 +1,40 @@ +--- +sidebar_position: 130 +--- +# v0.13.0 + +> 2024-08-23 + +## Changelog + +DefraDB v0.13 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.12.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. + +### Features +* feat: Doc encryption with symmetric key (#2731) +* feat: Doc field encryption (#2817) +* feat: Enable indexing for DateTime fields (#2933) +* feat: Handle P2P with SourceHub ACP (#2848) +* feat: Implement SourceHub ACP (#2657) +* feat: Remove IsObjectArray (#2859) +### Fix +* fix: Add ns precision support to time values (#2940) +* fix: Allow querying of 9th, 19th, 29th, etc collections (#2819) +* fix: Create mutation introspection (#2881) +* fix: Enable filtering doc by fields of JSON and Blob types (#2841) +* fix: Filter with date and document with nil date value (#2946) +* fix: Handle index queries where child found without parent (#2942) +* fix: Handle multiple child index joins (#2867) +* fix: No panic if filter condition on indexed field is empty (#2929) +* fix: Panic with different composite-indexed child objects (#2947) +* fix: Support one-many self joins without primary directive (#2799) +### Refactoring +* refactor: Decouple client.DB from net (#2768) +* refactor: GQL responses (#2872) +* refactor: Network test sync logic (#2748) +### Testing +* test: Add assert on DocIndex for child documents (#2871) +* test: Fix refreshing of docs in change detector (#2832) +* test: Remove hardcoded test identities (#2822) + diff --git a/docs/defradb/release notes/v0.14.0.md b/docs/defradb/release notes/v0.14.0.md new file mode 100644 index 0000000..1395cba --- /dev/null +++ b/docs/defradb/release notes/v0.14.0.md @@ -0,0 +1,64 @@ +--- +sidebar_position: 140 +--- +# v0.14.0 + +> 2024-10-19 + +## Changelog + +DefraDB v0.14 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.13.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.gg/w7jYQVJ/. + +### Features +* feat: JSON type filter ([#3122](https://github.com/sourcenetwork/defradb/issues/3122)) +* feat: Add replicator retry ([#3107](https://github.com/sourcenetwork/defradb/issues/3107)) +* feat: Inherit `read` permission if only `write` access ([#3108](https://github.com/sourcenetwork/defradb/issues/3108)) +* feat: JSON type coercion ([#3098](https://github.com/sourcenetwork/defradb/issues/3098)) +* feat: Ability to unrelate private documents from actors ([#3099](https://github.com/sourcenetwork/defradb/issues/3099)) +* feat: Enable Indexing of array fields ([#3092](https://github.com/sourcenetwork/defradb/issues/3092)) +* feat: Min and max numerical aggregates ([#3078](https://github.com/sourcenetwork/defradb/issues/3078)) +* feat: Ability to relate private documents to actors ([#2907](https://github.com/sourcenetwork/defradb/issues/2907)) +* feat: GraphQL upsert mutation ([#3075](https://github.com/sourcenetwork/defradb/issues/3075)) +* feat: GraphQL fragments ([#3066](https://github.com/sourcenetwork/defradb/issues/3066)) +* feat: Secure document encryption key exchange ([#2891](https://github.com/sourcenetwork/defradb/issues/2891)) +* feat: Inline array filters ([#3028](https://github.com/sourcenetwork/defradb/issues/3028)) +* feat: CLI purge command ([#2998](https://github.com/sourcenetwork/defradb/issues/2998)) +* feat: Add support for one sided relations ([#3021](https://github.com/sourcenetwork/defradb/issues/3021)) +* feat: Add materialized views ([#3000](https://github.com/sourcenetwork/defradb/issues/3000)) +* feat: Default scalar field values ([#2997](https://github.com/sourcenetwork/defradb/issues/2997)) +* feat: GQL variables and operation name ([#2993](https://github.com/sourcenetwork/defradb/issues/2993)) + +### Fixes +* fix: Make GraphQL errors spec compliant ([#3040](https://github.com/sourcenetwork/defradb/issues/3040)) +* fix: Ignore badger path if in-memory ([#2967](https://github.com/sourcenetwork/defradb/issues/2967)) +* fix: Rework relation field kinds ([#2961](https://github.com/sourcenetwork/defradb/issues/2961)) +* fix: Panic with filter on unique composite index on relation ([#3020](https://github.com/sourcenetwork/defradb/issues/3020)) +* fix: Handle missing type in an SDL ([#3023](https://github.com/sourcenetwork/defradb/issues/3023)) +* fix: GraphQL null argument parsing ([#3013](https://github.com/sourcenetwork/defradb/issues/3013)) +* fix: Prevent mutations from secondary side of relation ([#3124](https://github.com/sourcenetwork/defradb/issues/3124)) +* fix: Treat explicitly set nil values like omitted values ([#3101](https://github.com/sourcenetwork/defradb/issues/3101)) +* fix: Remove duplication of block heads on delete ([#3096](https://github.com/sourcenetwork/defradb/issues/3096)) +* fix: Log GQL endpoint correctly on node start ([#3037](https://github.com/sourcenetwork/defradb/issues/3037)) +* fix: Panic with different composite-indexed child objects ([#2947](https://github.com/sourcenetwork/defradb/issues/2947)) +* fix: Validate GraphQL schemas ([#3152](https://github.com/sourcenetwork/defradb/issues/3152)) +* fix: Queries with filter on 2 rel fields of composite index ([#3035](https://github.com/sourcenetwork/defradb/issues/3035)) + +### Documentation +* doc: Rename _key to _docID in docs ([#2989](https://github.com/sourcenetwork/defradb/issues/2989)) + +### Refactoring +* refactor: Change from protobuf to cbor for gRPC ([#3061](https://github.com/sourcenetwork/defradb/issues/3061)) +* refactor: GraphQL order input ([#3044](https://github.com/sourcenetwork/defradb/issues/3044)) +* refactor: Merge duplicate input args ([#3046](https://github.com/sourcenetwork/defradb/issues/3046)) +* refactor: Index field directive ([#2994](https://github.com/sourcenetwork/defradb/issues/2994)) +* refactor: Make SourceHub dep internal-only ([#2963](https://github.com/sourcenetwork/defradb/issues/2963)) + +### Testing +* test: Add bug bash tests for gql fragments ([#3136](https://github.com/sourcenetwork/defradb/issues/3136)) + +### Chore +* chore: Make keyring non-interactive ([#3026](https://github.com/sourcenetwork/defradb/issues/3026)) +* chore: Change from ipld traversal to direct link access ([#2931](https://github.com/sourcenetwork/defradb/issues/2931)) +* chore: Bump to GoLang v1.22 ([#2913](https://github.com/sourcenetwork/defradb/issues/2913)) \ No newline at end of file diff --git a/docs/defradb/release notes/v0.15.0.md b/docs/defradb/release notes/v0.15.0.md new file mode 100644 index 0000000..c848e94 --- /dev/null +++ b/docs/defradb/release notes/v0.15.0.md @@ -0,0 +1,44 @@ +--- +sidebar_position: 150 +--- +# v0.15.0 + +> 2024-12-13 + +## Changelog +DefraDB v0.15 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.14.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.gg/w7jYQVJ/. + +### Features +* feat: Add ACP to pubsub KMS (#3206) +* feat: Add ability to add/delete relationship for all actors (#3254) +* feat: Add node identity (#3125) +* feat: Add support for branchable collection time-traveling (#3260) +* feat: Add support for branchable collections (#3216) +* feat: Add support for cid-only time travel queries (#3256) +* feat: Aggregate filter alias targeting (#3252) +* feat: Aggregate order alias targeting (#3293) +* feat: Error if purge request made with dev mode disabled (#3295) +* feat: Filter alias target (#3201) +* feat: Order alias target (#3217) +* feat: Support for descending fields CLI index creation (#3237) +### Fix +* fix: Add Authorization header to CORS allowed headers (#3178) +* fix: Add support for operationName and variables in HTTP GET (#3292) +* fix: Adjust OpenAPI index POST example request body (#3268) +* fix: Make requests with no identity work with "*" target (#3278) +* fix: Prevent over span (#3258) +* fix: Resolve CORS errors in OpenAPI tab of Playground (#3263) +### Documentation +* docs: Update discord link (#3231) +### Refactoring +* refactor: Add unified JSON interface (#3265) +* refactor: Breakup core/keys.go file (#3198) +* refactor: Consolidate node-related fields into a struct (#3232) +* refactor: Remove indirection from crdt packages (#3192) +* refactor: Rework core.Spans (#3210) +* refactor: Simplify merkle/crdt code (#3200) +### Testing +* test: Allow soft-referencing of Cids in tests (#3176) + diff --git a/docs/defradb/release notes/v0.5.0.md b/docs/defradb/release notes/v0.5.0.md index 7a3154f..96e8499 100644 --- a/docs/defradb/release notes/v0.5.0.md +++ b/docs/defradb/release notes/v0.5.0.md @@ -1,144 +1,144 @@ ---- -sidebar_position: 50 ---- - -# v0.5.0 - -> 2023-04-12 - -DefraDB v0.5 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. - -There many new features in this release, but most importantly, this is the first open source release for DefraDB. As such, this release focused on various quality of life changes and refactors, bug fixes, and overall cleanliness of the repo so it can effectively be used and tested in the public domain. - -To get a full outline of the changes, we invite you to review the official changelog below. Some highlights are the first iteration of our schema update system, allowing developers to add new fields to schemas using our JSON Patch based DDL, a new DAG based delete system which will persist "soft-delete" ops into the CRDT Merkle DAG, and a early prototype for our collection level peer-to-peer synchronization. - -This release does include a Breaking Change to existing v0.4.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. - -### Features - -* Add document delete mechanics ([#1263](https://github.com/sourcenetwork/defradb/issues/1263)) -* Ability to explain an executed request ([#1188](https://github.com/sourcenetwork/defradb/issues/1188)) -* Add SchemaPatch CLI command ([#1250](https://github.com/sourcenetwork/defradb/issues/1250)) -* Add support for one-one mutation from sec. side ([#1247](https://github.com/sourcenetwork/defradb/issues/1247)) -* Store only key in DAG instead of dockey path ([#1245](https://github.com/sourcenetwork/defradb/issues/1245)) -* Add collectionId field to commit field ([#1235](https://github.com/sourcenetwork/defradb/issues/1235)) -* Add field kind substitution for PatchSchema ([#1223](https://github.com/sourcenetwork/defradb/issues/1223)) -* Add dockey field for commit field ([#1216](https://github.com/sourcenetwork/defradb/issues/1216)) -* Allow new fields to be added locally to schema ([#1139](https://github.com/sourcenetwork/defradb/issues/1139)) -* Add `like` sub-string filter ([#1091](https://github.com/sourcenetwork/defradb/issues/1091)) -* Add ability for P2P to wait for pushlog by peer ([#1098](https://github.com/sourcenetwork/defradb/issues/1098)) -* Add P2P collection topic subscription ([#1086](https://github.com/sourcenetwork/defradb/issues/1086)) -* Add support for schema version id in queries ([#1067](https://github.com/sourcenetwork/defradb/issues/1067)) -* Add schema version id to commit queries ([#1061](https://github.com/sourcenetwork/defradb/issues/1061)) -* Persist schema version at time of commit ([#1055](https://github.com/sourcenetwork/defradb/issues/1055)) -* Add ability to input simple explain type arg ([#1039](https://github.com/sourcenetwork/defradb/issues/1039)) - -### Fixes - -* API address parameter validation ([#1311](https://github.com/sourcenetwork/defradb/issues/1311)) -* Improve error message for NonNull GQL types ([#1333](https://github.com/sourcenetwork/defradb/issues/1333)) -* Handle panics in the rpc server ([#1330](https://github.com/sourcenetwork/defradb/issues/1330)) -* Handle returned error in select.go ([#1329](https://github.com/sourcenetwork/defradb/issues/1329)) -* Resolve handful of CLI issues ([#1318](https://github.com/sourcenetwork/defradb/issues/1318)) -* Only check for events queue on subscription request ([#1326](https://github.com/sourcenetwork/defradb/issues/1326)) -* Remove client Create/UpdateCollection ([#1309](https://github.com/sourcenetwork/defradb/issues/1309)) -* CLI to display specific command usage help ([#1314](https://github.com/sourcenetwork/defradb/issues/1314)) -* Fix P2P collection CLI commands ([#1295](https://github.com/sourcenetwork/defradb/issues/1295)) -* Dont double up badger file path ([#1299](https://github.com/sourcenetwork/defradb/issues/1299)) -* Update immutable package ([#1290](https://github.com/sourcenetwork/defradb/issues/1290)) -* Fix panic on success of Add/RemoveP2PCollections ([#1297](https://github.com/sourcenetwork/defradb/issues/1297)) -* Fix deadlock on memory-datastore Close ([#1273](https://github.com/sourcenetwork/defradb/issues/1273)) -* Determine if query is introspection query ([#1255](https://github.com/sourcenetwork/defradb/issues/1255)) -* Allow newly added fields to sync via p2p ([#1226](https://github.com/sourcenetwork/defradb/issues/1226)) -* Expose `ExplainEnum` in the GQL schema ([#1204](https://github.com/sourcenetwork/defradb/issues/1204)) -* Resolve aggregates' mapping with deep nested subtypes ([#1175](https://github.com/sourcenetwork/defradb/issues/1175)) -* Make sort stable and handle nil comparison ([#1094](https://github.com/sourcenetwork/defradb/issues/1094)) -* Change successful schema add status to 200 ([#1106](https://github.com/sourcenetwork/defradb/issues/1106)) -* Add delay in P2P test util execution ([#1093](https://github.com/sourcenetwork/defradb/issues/1093)) -* Ensure errors test don't hard expect folder name ([#1072](https://github.com/sourcenetwork/defradb/issues/1072)) -* Remove potential P2P deadlock ([#1056](https://github.com/sourcenetwork/defradb/issues/1056)) -* Rework the P2P integration tests ([#989](https://github.com/sourcenetwork/defradb/issues/989)) -* Improve DAG sync with highly concurrent updates ([#1031](https://github.com/sourcenetwork/defradb/issues/1031)) - -### Documentation - -* Update docs for the v0.5 release ([#1320](https://github.com/sourcenetwork/defradb/issues/1320)) -* Document client interfaces in client/db.go ([#1305](https://github.com/sourcenetwork/defradb/issues/1305)) -* Document client Description types ([#1307](https://github.com/sourcenetwork/defradb/issues/1307)) -* Improve security policy ([#1240](https://github.com/sourcenetwork/defradb/issues/1240)) -* Add security disclosure policy ([#1194](https://github.com/sourcenetwork/defradb/issues/1194)) -* Correct commits query example in readme ([#1172](https://github.com/sourcenetwork/defradb/issues/1172)) - -### Refactoring - -* Improve p2p collection operations on peer ([#1286](https://github.com/sourcenetwork/defradb/issues/1286)) -* Migrate gql introspection tests to new framework ([#1211](https://github.com/sourcenetwork/defradb/issues/1211)) -* Reorganise client transaction related interfaces ([#1180](https://github.com/sourcenetwork/defradb/issues/1180)) -* Config-local viper, rootdir, and logger parsing ([#1132](https://github.com/sourcenetwork/defradb/issues/1132)) -* Migrate mutation-relation tests to new framework ([#1109](https://github.com/sourcenetwork/defradb/issues/1109)) -* Rework integration test framework ([#1089](https://github.com/sourcenetwork/defradb/issues/1089)) -* Generate gql types using col. desc ([#1080](https://github.com/sourcenetwork/defradb/issues/1080)) -* Extract config errors to dedicated file ([#1107](https://github.com/sourcenetwork/defradb/issues/1107)) -* Change terminology from query to request ([#1054](https://github.com/sourcenetwork/defradb/issues/1054)) -* Allow db keys to handle multiple schema versions ([#1026](https://github.com/sourcenetwork/defradb/issues/1026)) -* Extract query schema errors to dedicated file ([#1037](https://github.com/sourcenetwork/defradb/issues/1037)) -* Extract planner errors to dedicated file ([#1034](https://github.com/sourcenetwork/defradb/issues/1034)) -* Extract query parser errors to dedicated file ([#1035](https://github.com/sourcenetwork/defradb/issues/1035)) - -### Testing - -* Remove test reference to DEFRA_ROOTDIR env var ([#1328](https://github.com/sourcenetwork/defradb/issues/1328)) -* Expand tests for Peer subscribe actions ([#1287](https://github.com/sourcenetwork/defradb/issues/1287)) -* Fix flaky TestCloseThroughContext test ([#1265](https://github.com/sourcenetwork/defradb/issues/1265)) -* Add gql introspection tests for patch schema ([#1219](https://github.com/sourcenetwork/defradb/issues/1219)) -* Explicitly state change detector split for test ([#1228](https://github.com/sourcenetwork/defradb/issues/1228)) -* Add test for successful one-one create mutation ([#1215](https://github.com/sourcenetwork/defradb/issues/1215)) -* Ensure that all databases are always closed on exit ([#1187](https://github.com/sourcenetwork/defradb/issues/1187)) -* Add P2P tests for Schema Update adding field ([#1182](https://github.com/sourcenetwork/defradb/issues/1182)) -* Migrate P2P/state tests to new framework ([#1160](https://github.com/sourcenetwork/defradb/issues/1160)) -* Remove sleep from subscription tests ([#1156](https://github.com/sourcenetwork/defradb/issues/1156)) -* Fetch documents on test execution start ([#1163](https://github.com/sourcenetwork/defradb/issues/1163)) -* Introduce basic testing for the `version` module ([#1111](https://github.com/sourcenetwork/defradb/issues/1111)) -* Boost test coverage for collection_update ([#1050](https://github.com/sourcenetwork/defradb/issues/1050)) -* Wait between P2P update retry attempts ([#1052](https://github.com/sourcenetwork/defradb/issues/1052)) -* Exclude auto-generated protobuf files from codecov ([#1048](https://github.com/sourcenetwork/defradb/issues/1048)) -* Add P2P tests for relational docs ([#1042](https://github.com/sourcenetwork/defradb/issues/1042)) - -### Continuous integration - -* Add workflow that builds DefraDB AMI upon tag push ([#1304](https://github.com/sourcenetwork/defradb/issues/1304)) -* Allow PR title to end with a capital letter ([#1291](https://github.com/sourcenetwork/defradb/issues/1291)) -* Changes for `dependabot` to be well-behaved ([#1165](https://github.com/sourcenetwork/defradb/issues/1165)) -* Skip benchmarks for dependabot ([#1144](https://github.com/sourcenetwork/defradb/issues/1144)) -* Add workflow to ensure deps build properly ([#1078](https://github.com/sourcenetwork/defradb/issues/1078)) -* Runner and Builder Containerfiles ([#951](https://github.com/sourcenetwork/defradb/issues/951)) -* Fix go-header linter rule to be any year ([#1021](https://github.com/sourcenetwork/defradb/issues/1021)) - -### Chore - -* Add Islam as contributor ([#1302](https://github.com/sourcenetwork/defradb/issues/1302)) -* Update go-libp2p to 0.26.4 ([#1257](https://github.com/sourcenetwork/defradb/issues/1257)) -* Improve the test coverage of datastore ([#1203](https://github.com/sourcenetwork/defradb/issues/1203)) -* Add issue and discussion templates ([#1193](https://github.com/sourcenetwork/defradb/issues/1193)) -* Bump libp2p/go-libp2p-kad-dht from 0.21.0 to 0.21.1 ([#1146](https://github.com/sourcenetwork/defradb/issues/1146)) -* Enable dependabot ([#1120](https://github.com/sourcenetwork/defradb/issues/1120)) -* Update `opentelemetry` dependencies ([#1114](https://github.com/sourcenetwork/defradb/issues/1114)) -* Update dependencies including go-ipfs ([#1112](https://github.com/sourcenetwork/defradb/issues/1112)) -* Bump to GoLang v1.19 ([#818](https://github.com/sourcenetwork/defradb/issues/818)) -* Remove versionedScan node ([#1049](https://github.com/sourcenetwork/defradb/issues/1049)) - -### Bot - -* Bump github.com/multiformats/go-multiaddr from 0.8.0 to 0.9.0 ([#1277](https://github.com/sourcenetwork/defradb/issues/1277)) -* Bump google.golang.org/grpc from 1.53.0 to 1.54.0 ([#1233](https://github.com/sourcenetwork/defradb/issues/1233)) -* Bump github.com/multiformats/go-multibase from 0.1.1 to 0.2.0 ([#1230](https://github.com/sourcenetwork/defradb/issues/1230)) -* Bump github.com/ipfs/go-libipfs from 0.6.2 to 0.7.0 ([#1231](https://github.com/sourcenetwork/defradb/issues/1231)) -* Bump github.com/ipfs/go-cid from 0.3.2 to 0.4.0 ([#1200](https://github.com/sourcenetwork/defradb/issues/1200)) -* Bump github.com/ipfs/go-ipfs-blockstore from 1.2.0 to 1.3.0 ([#1199](https://github.com/sourcenetwork/defradb/issues/1199)) -* Bump github.com/stretchr/testify from 1.8.1 to 1.8.2 ([#1198](https://github.com/sourcenetwork/defradb/issues/1198)) -* Bump github.com/ipfs/go-libipfs from 0.6.1 to 0.6.2 ([#1201](https://github.com/sourcenetwork/defradb/issues/1201)) -* Bump golang.org/x/crypto from 0.6.0 to 0.7.0 ([#1197](https://github.com/sourcenetwork/defradb/issues/1197)) -* Bump libp2p/go-libp2p-gostream from 0.5.0 to 0.6.0 ([#1152](https://github.com/sourcenetwork/defradb/issues/1152)) -* Bump github.com/ipfs/go-libipfs from 0.5.0 to 0.6.1 ([#1166](https://github.com/sourcenetwork/defradb/issues/1166)) -* Bump github.com/ugorji/go/codec from 1.2.9 to 1.2.11 ([#1173](https://github.com/sourcenetwork/defradb/issues/1173)) +--- +sidebar_position: 50 +--- + +# v0.5.0 + +> 2023-04-12 + +DefraDB v0.5 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +There many new features in this release, but most importantly, this is the first open source release for DefraDB. As such, this release focused on various quality of life changes and refactors, bug fixes, and overall cleanliness of the repo so it can effectively be used and tested in the public domain. + +To get a full outline of the changes, we invite you to review the official changelog below. Some highlights are the first iteration of our schema update system, allowing developers to add new fields to schemas using our JSON Patch based DDL, a new DAG based delete system which will persist "soft-delete" ops into the CRDT Merkle DAG, and a early prototype for our collection level peer-to-peer synchronization. + +This release does include a Breaking Change to existing v0.4.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. + +### Features + +* Add document delete mechanics ([#1263](https://github.com/sourcenetwork/defradb/issues/1263)) +* Ability to explain an executed request ([#1188](https://github.com/sourcenetwork/defradb/issues/1188)) +* Add SchemaPatch CLI command ([#1250](https://github.com/sourcenetwork/defradb/issues/1250)) +* Add support for one-one mutation from sec. side ([#1247](https://github.com/sourcenetwork/defradb/issues/1247)) +* Store only key in DAG instead of dockey path ([#1245](https://github.com/sourcenetwork/defradb/issues/1245)) +* Add collectionId field to commit field ([#1235](https://github.com/sourcenetwork/defradb/issues/1235)) +* Add field kind substitution for PatchSchema ([#1223](https://github.com/sourcenetwork/defradb/issues/1223)) +* Add dockey field for commit field ([#1216](https://github.com/sourcenetwork/defradb/issues/1216)) +* Allow new fields to be added locally to schema ([#1139](https://github.com/sourcenetwork/defradb/issues/1139)) +* Add `like` sub-string filter ([#1091](https://github.com/sourcenetwork/defradb/issues/1091)) +* Add ability for P2P to wait for pushlog by peer ([#1098](https://github.com/sourcenetwork/defradb/issues/1098)) +* Add P2P collection topic subscription ([#1086](https://github.com/sourcenetwork/defradb/issues/1086)) +* Add support for schema version id in queries ([#1067](https://github.com/sourcenetwork/defradb/issues/1067)) +* Add schema version id to commit queries ([#1061](https://github.com/sourcenetwork/defradb/issues/1061)) +* Persist schema version at time of commit ([#1055](https://github.com/sourcenetwork/defradb/issues/1055)) +* Add ability to input simple explain type arg ([#1039](https://github.com/sourcenetwork/defradb/issues/1039)) + +### Fixes + +* API address parameter validation ([#1311](https://github.com/sourcenetwork/defradb/issues/1311)) +* Improve error message for NonNull GQL types ([#1333](https://github.com/sourcenetwork/defradb/issues/1333)) +* Handle panics in the rpc server ([#1330](https://github.com/sourcenetwork/defradb/issues/1330)) +* Handle returned error in select.go ([#1329](https://github.com/sourcenetwork/defradb/issues/1329)) +* Resolve handful of CLI issues ([#1318](https://github.com/sourcenetwork/defradb/issues/1318)) +* Only check for events queue on subscription request ([#1326](https://github.com/sourcenetwork/defradb/issues/1326)) +* Remove client Create/UpdateCollection ([#1309](https://github.com/sourcenetwork/defradb/issues/1309)) +* CLI to display specific command usage help ([#1314](https://github.com/sourcenetwork/defradb/issues/1314)) +* Fix P2P collection CLI commands ([#1295](https://github.com/sourcenetwork/defradb/issues/1295)) +* Dont double up badger file path ([#1299](https://github.com/sourcenetwork/defradb/issues/1299)) +* Update immutable package ([#1290](https://github.com/sourcenetwork/defradb/issues/1290)) +* Fix panic on success of Add/RemoveP2PCollections ([#1297](https://github.com/sourcenetwork/defradb/issues/1297)) +* Fix deadlock on memory-datastore Close ([#1273](https://github.com/sourcenetwork/defradb/issues/1273)) +* Determine if query is introspection query ([#1255](https://github.com/sourcenetwork/defradb/issues/1255)) +* Allow newly added fields to sync via p2p ([#1226](https://github.com/sourcenetwork/defradb/issues/1226)) +* Expose `ExplainEnum` in the GQL schema ([#1204](https://github.com/sourcenetwork/defradb/issues/1204)) +* Resolve aggregates' mapping with deep nested subtypes ([#1175](https://github.com/sourcenetwork/defradb/issues/1175)) +* Make sort stable and handle nil comparison ([#1094](https://github.com/sourcenetwork/defradb/issues/1094)) +* Change successful schema add status to 200 ([#1106](https://github.com/sourcenetwork/defradb/issues/1106)) +* Add delay in P2P test util execution ([#1093](https://github.com/sourcenetwork/defradb/issues/1093)) +* Ensure errors test don't hard expect folder name ([#1072](https://github.com/sourcenetwork/defradb/issues/1072)) +* Remove potential P2P deadlock ([#1056](https://github.com/sourcenetwork/defradb/issues/1056)) +* Rework the P2P integration tests ([#989](https://github.com/sourcenetwork/defradb/issues/989)) +* Improve DAG sync with highly concurrent updates ([#1031](https://github.com/sourcenetwork/defradb/issues/1031)) + +### Documentation + +* Update docs for the v0.5 release ([#1320](https://github.com/sourcenetwork/defradb/issues/1320)) +* Document client interfaces in client/db.go ([#1305](https://github.com/sourcenetwork/defradb/issues/1305)) +* Document client Description types ([#1307](https://github.com/sourcenetwork/defradb/issues/1307)) +* Improve security policy ([#1240](https://github.com/sourcenetwork/defradb/issues/1240)) +* Add security disclosure policy ([#1194](https://github.com/sourcenetwork/defradb/issues/1194)) +* Correct commits query example in readme ([#1172](https://github.com/sourcenetwork/defradb/issues/1172)) + +### Refactoring + +* Improve p2p collection operations on peer ([#1286](https://github.com/sourcenetwork/defradb/issues/1286)) +* Migrate gql introspection tests to new framework ([#1211](https://github.com/sourcenetwork/defradb/issues/1211)) +* Reorganise client transaction related interfaces ([#1180](https://github.com/sourcenetwork/defradb/issues/1180)) +* Config-local viper, rootdir, and logger parsing ([#1132](https://github.com/sourcenetwork/defradb/issues/1132)) +* Migrate mutation-relation tests to new framework ([#1109](https://github.com/sourcenetwork/defradb/issues/1109)) +* Rework integration test framework ([#1089](https://github.com/sourcenetwork/defradb/issues/1089)) +* Generate gql types using col. desc ([#1080](https://github.com/sourcenetwork/defradb/issues/1080)) +* Extract config errors to dedicated file ([#1107](https://github.com/sourcenetwork/defradb/issues/1107)) +* Change terminology from query to request ([#1054](https://github.com/sourcenetwork/defradb/issues/1054)) +* Allow db keys to handle multiple schema versions ([#1026](https://github.com/sourcenetwork/defradb/issues/1026)) +* Extract query schema errors to dedicated file ([#1037](https://github.com/sourcenetwork/defradb/issues/1037)) +* Extract planner errors to dedicated file ([#1034](https://github.com/sourcenetwork/defradb/issues/1034)) +* Extract query parser errors to dedicated file ([#1035](https://github.com/sourcenetwork/defradb/issues/1035)) + +### Testing + +* Remove test reference to DEFRA_ROOTDIR env var ([#1328](https://github.com/sourcenetwork/defradb/issues/1328)) +* Expand tests for Peer subscribe actions ([#1287](https://github.com/sourcenetwork/defradb/issues/1287)) +* Fix flaky TestCloseThroughContext test ([#1265](https://github.com/sourcenetwork/defradb/issues/1265)) +* Add gql introspection tests for patch schema ([#1219](https://github.com/sourcenetwork/defradb/issues/1219)) +* Explicitly state change detector split for test ([#1228](https://github.com/sourcenetwork/defradb/issues/1228)) +* Add test for successful one-one create mutation ([#1215](https://github.com/sourcenetwork/defradb/issues/1215)) +* Ensure that all databases are always closed on exit ([#1187](https://github.com/sourcenetwork/defradb/issues/1187)) +* Add P2P tests for Schema Update adding field ([#1182](https://github.com/sourcenetwork/defradb/issues/1182)) +* Migrate P2P/state tests to new framework ([#1160](https://github.com/sourcenetwork/defradb/issues/1160)) +* Remove sleep from subscription tests ([#1156](https://github.com/sourcenetwork/defradb/issues/1156)) +* Fetch documents on test execution start ([#1163](https://github.com/sourcenetwork/defradb/issues/1163)) +* Introduce basic testing for the `version` module ([#1111](https://github.com/sourcenetwork/defradb/issues/1111)) +* Boost test coverage for collection_update ([#1050](https://github.com/sourcenetwork/defradb/issues/1050)) +* Wait between P2P update retry attempts ([#1052](https://github.com/sourcenetwork/defradb/issues/1052)) +* Exclude auto-generated protobuf files from codecov ([#1048](https://github.com/sourcenetwork/defradb/issues/1048)) +* Add P2P tests for relational docs ([#1042](https://github.com/sourcenetwork/defradb/issues/1042)) + +### Continuous integration + +* Add workflow that builds DefraDB AMI upon tag push ([#1304](https://github.com/sourcenetwork/defradb/issues/1304)) +* Allow PR title to end with a capital letter ([#1291](https://github.com/sourcenetwork/defradb/issues/1291)) +* Changes for `dependabot` to be well-behaved ([#1165](https://github.com/sourcenetwork/defradb/issues/1165)) +* Skip benchmarks for dependabot ([#1144](https://github.com/sourcenetwork/defradb/issues/1144)) +* Add workflow to ensure deps build properly ([#1078](https://github.com/sourcenetwork/defradb/issues/1078)) +* Runner and Builder Containerfiles ([#951](https://github.com/sourcenetwork/defradb/issues/951)) +* Fix go-header linter rule to be any year ([#1021](https://github.com/sourcenetwork/defradb/issues/1021)) + +### Chore + +* Add Islam as contributor ([#1302](https://github.com/sourcenetwork/defradb/issues/1302)) +* Update go-libp2p to 0.26.4 ([#1257](https://github.com/sourcenetwork/defradb/issues/1257)) +* Improve the test coverage of datastore ([#1203](https://github.com/sourcenetwork/defradb/issues/1203)) +* Add issue and discussion templates ([#1193](https://github.com/sourcenetwork/defradb/issues/1193)) +* Bump libp2p/go-libp2p-kad-dht from 0.21.0 to 0.21.1 ([#1146](https://github.com/sourcenetwork/defradb/issues/1146)) +* Enable dependabot ([#1120](https://github.com/sourcenetwork/defradb/issues/1120)) +* Update `opentelemetry` dependencies ([#1114](https://github.com/sourcenetwork/defradb/issues/1114)) +* Update dependencies including go-ipfs ([#1112](https://github.com/sourcenetwork/defradb/issues/1112)) +* Bump to GoLang v1.19 ([#818](https://github.com/sourcenetwork/defradb/issues/818)) +* Remove versionedScan node ([#1049](https://github.com/sourcenetwork/defradb/issues/1049)) + +### Bot + +* Bump github.com/multiformats/go-multiaddr from 0.8.0 to 0.9.0 ([#1277](https://github.com/sourcenetwork/defradb/issues/1277)) +* Bump google.golang.org/grpc from 1.53.0 to 1.54.0 ([#1233](https://github.com/sourcenetwork/defradb/issues/1233)) +* Bump github.com/multiformats/go-multibase from 0.1.1 to 0.2.0 ([#1230](https://github.com/sourcenetwork/defradb/issues/1230)) +* Bump github.com/ipfs/go-libipfs from 0.6.2 to 0.7.0 ([#1231](https://github.com/sourcenetwork/defradb/issues/1231)) +* Bump github.com/ipfs/go-cid from 0.3.2 to 0.4.0 ([#1200](https://github.com/sourcenetwork/defradb/issues/1200)) +* Bump github.com/ipfs/go-ipfs-blockstore from 1.2.0 to 1.3.0 ([#1199](https://github.com/sourcenetwork/defradb/issues/1199)) +* Bump github.com/stretchr/testify from 1.8.1 to 1.8.2 ([#1198](https://github.com/sourcenetwork/defradb/issues/1198)) +* Bump github.com/ipfs/go-libipfs from 0.6.1 to 0.6.2 ([#1201](https://github.com/sourcenetwork/defradb/issues/1201)) +* Bump golang.org/x/crypto from 0.6.0 to 0.7.0 ([#1197](https://github.com/sourcenetwork/defradb/issues/1197)) +* Bump libp2p/go-libp2p-gostream from 0.5.0 to 0.6.0 ([#1152](https://github.com/sourcenetwork/defradb/issues/1152)) +* Bump github.com/ipfs/go-libipfs from 0.5.0 to 0.6.1 ([#1166](https://github.com/sourcenetwork/defradb/issues/1166)) +* Bump github.com/ugorji/go/codec from 1.2.9 to 1.2.11 ([#1173](https://github.com/sourcenetwork/defradb/issues/1173)) * Bump github.com/libp2p/go-libp2p-pubsub from 0.9.0 to 0.9.3 ([#1183](https://github.com/sourcenetwork/defradb/issues/1183)) \ No newline at end of file From 1478545056c390dc67426dbbe79957d6f903fb9a Mon Sep 17 00:00:00 2001 From: Keenan Nemetz Date: Wed, 12 Feb 2025 15:38:18 -0800 Subject: [PATCH 27/48] Secondary Index Guide (#151) This PR adds a guide for secondary indexes. --------- Co-authored-by: pradhanashutosh --- docs/defradb/guides/secondary-index.md | 263 +++++++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 docs/defradb/guides/secondary-index.md diff --git a/docs/defradb/guides/secondary-index.md b/docs/defradb/guides/secondary-index.md new file mode 100644 index 0000000..72c28ed --- /dev/null +++ b/docs/defradb/guides/secondary-index.md @@ -0,0 +1,263 @@ +--- +sidebar_label: Secondary index guide +sidebar_position: 80 +--- + +## Introduction + +DefraDB provides a powerful and flexible secondary indexing system that enables efficient document lookups and queries. + +## About + +The following sections provide an overview of performance considerations, indexing related objects, and JSON field indexing. + +### Performance considerations + +Indexes can greatly improve query performance, but they also impact system performance during writes. Each index adds write overhead since every document update must also update the relevant indexes. Despite this, the boost in read performance for indexed queries usually makes this trade-off worthwhile. + +#### To optimize performance: + +- Choose indexes based on your query patterns. Focus on fields frequently used in query filters to maximize efficiency. +- Avoid indexing rarely queried fields. Doing so adds unnecessary overhead. +- Be cautious with unique indexes. These require extra validation, making their performance impact more significant. + +Plan your indexes carefully to balance read and write performance. + +### Indexing related objects + +DefraDB supports indexing relationships between documents, allowing for efficient queries across related data. + +#### Example schema: Users and addresses + +```graphql +type User { + name: String + age: Int + address: Address @primary @index +} + +type Address { + user: User + city: String @index + street: String +} +``` + +Key indexes in this schema: + +- **City field in address:** Indexed to enable efficient queries by city. +- **Relationship between user and address**: Indexed to support fast lookups based on relationships. + +#### Query example + +The following query retrieves all users living in Montreal: + +```graphql +query { + User(filter: { + address: {city: {_eq: "Montreal"}} + }) { + name + } +} +``` + +#### How indexing improves efficiency + +**Without indexes:** +- Fetch all user documents. +- For each user, retrieve the corresponding Address. This approach becomes slow with large datasets. + +**With indexes:** +- Fetch address documents matching the city value directly. +- Retrieve the corresponding User documents. This method is much faster because indexes enable direct lookups. + +#### Enforcing relationship cardinality +Indexes can also enforce one-to-one relationships. For instance, to ensure each User has exactly one unique Address: + +```graphql +type User { + name: String + age: Int + address: Address @primary @index(unique: true) +} + +type Address { + user: User + city: String @index + street: String +} +``` + +Here, the @index(unique: true) constraint ensures no two Users can share the same Address. Without it, the relationship defaults to one-to-many, allowing multiple Users to reference a single Address. + +By combining relationship indexing with cardinality constraints, you can create highly efficient and logically consistent data structures. + +### JSON field indexing + +DefraDB offers a specialized indexing system for JSON fields, designed to handle their hierarchical structure efficiently. + +#### JSON indexing overview + +JSON fields differ from other field types (e.g., Int, String, Bool) because they are structured hierarchically. DefraDB uses a path-aware system to manage these complexities, enabling traversal and indexing of all leaf nodes in a JSON document. + +#### JSON Interface + +DefraDB's JSON interface, defined in client/json.go, is essential for managing JSON fields. It allows the system to: + +Traverse all leaf nodes in a JSON document. +Represent a JSON value as either a complete document or a single node within the structure. +Each JSON value also stores its path information, which is crucial for creating accurate and efficient indexes. + +##### Example JSON Document + +```json +{ + "user": { + "device": { + "model": "iPhone" + } + } +} +``` + +Here, the `iPhone` value is represented with its complete path: [`user`, `device`, `model`]. This path-aware representation ensures that the system knows not just the value, but where it resides within the document. + +#### Inverted Indexes for JSON +DefraDB uses inverted indexes for JSON fields. These indexes reverse the traditional "document-to-value" relationship by starting with a value and quickly locating all documents containing that value. + +#### Key Format for JSON Indexes + +``` +/(//)+/ +``` + +##### How It Differs + +- Regular fields map to a single index entry. +- JSON fields generate multiple entries—one for each leaf node, incorporating both the path and the value. + +During indexing, the system traverses the entire JSON structure, creating these detailed index entries. + +#### Value normalization in JSON +DefraDB normalizes JSON leaf values to ensure consistency in ordering and comparisons. For example: + +- JSON values include their normalized value and path information. +- Scalar types (e.g., integers) are normalized to a standard type, such as `int64`. + +This ensures that operations like filtering and sorting are reliable and efficient. + +#### How indexing works +When indexing a document with JSON fields, the system: + +1. Traverses the JSON structure using the JSON interface. +1. Generates index entries for every leaf node, combining path and normalized value. +1. Stores entries efficiently, enabling direct querying. + +##### Query example +Retrieve documents where the model is "iPhone": + +``` +query { + Collection(filter: { + jsonField: { + user: { + device: { + model: {_eq: "iPhone"} + } + } + } + }) +} +``` + +With indexes, the system directly retrieves matching documents, avoiding the need to scan and parse the JSON during queries. + +#### Benefits of JSON field indexing +- **Efficient queries**: Leverages inverted indexes for fast lookups, even in deeply nested structures. +- **Precise path tracking**: Maintains path information for accurate indexing and retrieval. +- **Scalable structure**: Handles complex JSON documents with minimal performance overhead. + +## Usage + +The `@index` directive can be used on GraphQL schema objects and field definitions to configure indexes. + +`@index(name: String, unique: Bool, direction: ORDERING, includes: [{ field: String, direction: ORDERING }])` + +### `name` +Sets the index name. Defaults to concatenated field names with direction. + +### `unique` +Makes the index unique. Defaults to false. + +### `direction` +Sets the default index direction for all fields. Can be one of ASC (ascending) or DESC (descending). Defaults to ASC. + +If a field in the includes list does not specify a direction the default direction from this value will be used instead. + +### `includes` +Sets the fields the index is created on. + +When used on a field definition and the field is not in the includes list it will be implicitly added as the first entry. + +## Examples + +### Field level usage + +Creates an index on the User name field with DESC direction. + +```gql +type User { + name: String @index(direction: DESC) +} +``` + +### Schema level usage + +Creates an index on the User name field with default direction (ASC). + +```gql +type User @index(includes: {field: "name"}) { + name: String + age: Int +} +``` + +### Unique index + +Creates a unique index on the User name field with default direction (ASC). + +```gql +type User { + name: String @index(unique: true) +} +``` + +### Composite index + +Creates a composite index on the User name and age fields with default direction (ASC). + +```gql +type User @index(includes: [{field: "name"}, {field: "age"}]) { + name: String + age: Int +} +``` + +### Relationship index + +Creates a unique index on the User relationship to Address. The unique index constraint ensures that no two Users can reference the same Address document. + +```gql +type User { + name: String + age: Int + address: Address @primary @index(unique: true) +} + +type Address { + user: User + city: String + street: String +} +``` From 7ccdae92dd4521317b248afccdc9676e10b99e62 Mon Sep 17 00:00:00 2001 From: Ivan Date: Thu, 3 Apr 2025 02:38:04 +0800 Subject: [PATCH 28/48] fix: SourceHub docs (#152) Fixes inconsistencies and typos across multiple sections of the SourceHub documentation. --------- Co-authored-by: pradhanashutosh --- docs/sourcehub/concepts/zanzibar.md | 284 +++++++++--------- docs/sourcehub/getting-started/1-readme.md | 6 +- docs/sourcehub/getting-started/2-account.md | 6 +- .../getting-started/3-create-a-policy.md | 10 +- docs/sourcehub/getting-started/4-acp-check.md | 8 +- docs/sourcehub/overview.md | 4 +- 6 files changed, 157 insertions(+), 161 deletions(-) diff --git a/docs/sourcehub/concepts/zanzibar.md b/docs/sourcehub/concepts/zanzibar.md index 06b2e32..7b3ab0d 100644 --- a/docs/sourcehub/concepts/zanzibar.md +++ b/docs/sourcehub/concepts/zanzibar.md @@ -3,39 +3,28 @@ date: 2023-09-08 title: Zanzibar Access Control --- -# Introduction +## Introduction -Zanzibar was first introduced by Google in their [whitepaper](https://research.google/pubs/pub48190/). -In essence, Zanzibar is an Authorization Service which powers Google's services. -Its main purpose boils down to answering Access Requests, which in plain English can be translated to the question: +[Zanzibar](https://research.google/pubs/pub48190/) is an authorization service introduced by Google to manage access control across its services. +Its primary function is to evaluate access requests by answering: -> can user U do operation O over object A? +> Can user **U** perform operation **O** on object **A**? -The remaining of this article introduces Zanzibar's Access Control model, how it was designed to fulfill Access Requests and propose a model to aid understanding. +This article explores Zanzibar's access control model, how it handles access requests, and a conceptual framework for understanding it. ## Relation Based Access Control Model -The field of Access Control is a branch which studies how to manage who or what can operate a certain resource within a system, which is to say, whether something has a permission to do something. -Zanzibar is an implementation which closely resembles the model known as ["Relation Based Access Control"](https://ieeexplore.ieee.org/abstract/document/4725889/)(RelBAC). +Access control determines who or what can operate on a given resource within a system. Zanzibar implements a model closely aligned with [Relation-Based Access Control (RelBAC)](https://ieeexplore.ieee.org/abstract/document/4725889). RelBAC defines permissions based on relationships between entities. Similar to relational databases and object-oriented modeling, it establishes access rules using entity relationships. -The primary idea behind RelBAC is that objects within a system have relations amongst themselves, and through these relations the system can resolve Access Requests. -This notion of relations should feel familiar to Relational Databases and Class Diagrams in Object Oriented Modeling. - -To illustrate RelBAC take the familiar example of: "a book is written by an author". -From that sentence we can identify two entities, "book" and "author. -Furthermore there exists a relation between these two entities, a book was *authored* by an author. -The key to RelBAC is noticing that this relation can be used to derive permissions. -The book's author should be able to read and edit their own book - meaning the operations "read" and "edit" should be allowed for an author. - -These relations exist in virtualy every problem domain, so much so there are specialized languages dedicated to representing those relations, such as Descrption Logic. -RelBAC exploits these relations in order to figure out permissions. +E.g. A book is written by an author. The book and author are connected by the authored relation. This relation implies permissions—an author should have read and edit access to their book. +Such relationships exist across various domains, often represented using specialized languages like description logic. RelBAC leverages these relationships to determine permissions dynamically. ## Zanzibar's RelBAC -A very important concept drawn from Zanzibar is that of Relation Tuples, which are used to represent a Relation between system objects. +A key concept in Zanzibar is the **Relation Tuple**, which represents relationships between system objects. -The Relation Tuple is defined as: +### Relation Tuple ``` tuple := (object, relation, user) @@ -46,207 +35,214 @@ namespace := string id := string ``` -A Relation Tuple is a 3-tuple which contains a reference to an object, some named relation and an user. -The 3-tuple `(article:zanzibar, publisher, coorporation:google)` represents a relationship between the zanzibar article and the google coorporation. +A Relation Tuple is a **3-tuple** containing: + +1. **Object** – The entity being referenced. +2. **Relation** – A named association between entities. +3. **User** – The entity granted access, which can be: + - A direct reference to an object. + - A **userset** (an indirect group reference). + +E.g. The tuple `(article:zanzibar, publisher, corporation:google)` defines a relationship where **Google (corporation:google) is the publisher of the Zanzibar article (article:zanzibar)**. -More interestingly however is the variant of `user` given by the pair `(object, relation)`, in Zanzibar's white paper this pair is called `userset`. -The userset is a convenient way to express a group of users. -The users given by the userset is the set of all users which are referenced in a relationship with the same object and relation as the userset. +### Usersets -Example: -Take the userset `(group:engineering, member)` and the tuples: +A **userset** is a special form of `user` defined as `(object, relation)`, grouping users who share the same relation to an object. -- `(group:engineering, member, user:bob)` +#### Example + +Consider the userset `(group:engineering, member)` and the tuples: + +- `(group:engineering, member, user:bob)` - `(group:engineering, member, user:alice)`. -The userset `(group:engineering, member)` expands to the users `bob` and `alice`. +The userset `(group:engineering, member)` expands to include **Bob and Alice** as members. -Effectively usersets add a layer of indirection to the Relation Tuple. -A Tuple can specify an Userset, and the Userset's Tuples can in turn specify an Userset. -The Relation Tuple was designed to support recursive definitions. +### Recursive Definitions -## The Relation Graph +Usersets introduce a layer of indirection in Relation Tuples, allowing tuples to reference other usersets. This enables **recursive definitions**, where a tuple can specify a userset that, in turn, references another userset, supporting complex access hierarchies. -A key insight to grok Zanzibar is to notice that a set of Tuples defines a Graph, let's call it the Relation Graph. +## The Relation Graph -In order to vizualise this fact, notice that a Relation Tuple can be rewritten as a pair of pairs: ((object, relation), (object, relation)), let's call the object-relation pairs Relation Nodes. -The first pair is given by the tuple's Object and Relation as per usual, the second pair is taken to be an userset. -If we assume relations can be empty, this representation covers all cases mentioend in the original definition. +A key insight into Zanzibar is recognizing that a set of Tuples forms a **Relation Graph**. -With this interpretation, we can start to see the relation graph taking shape. -Each Relation Tuple actually defines an Edge in the Relation Graph. -Each Node in the Relation Graph is given by an object-relation pair. +### Structure of the Relation Graph + +A Relation Tuple can be rewritten as a **pair of pairs**: +- ((object, relation), (object, relation)) + +These **object-relation pairs** are called **Relation Nodes**. The first pair represents the Tuple’s **Object and Relation**, while the second represents a **userset**. If relations are allowed to be empty, this structure accommodates all cases from the original definition. + +Each **Relation Tuple** defines an **Edge** in the Relation Graph, and each **Node** corresponds to an object-relation pair. + +### Example + +Given the following tuples: -As an example, take the tuples: -- ("file:readme", "owner", "bob") - ("file:readme", "owner", "bob") - ("file:readme", "reader", "group:engineering", "member") - ("group:engineering", "member", "alice") -Would look like this as a graph: +The corresponding Relation Graph looks like this: -![Relation Graph Example](/img/sourcehub/relgraph-simple.png) +![Relation Graph Example](/img/sourcehub/relgraph-simple.png) -The Relation Graph is a view over the set of all objects in a system and the relations between these objects. -Through the relation graph it's possible to answer questions such as "does user U have relation R with object O"? -We can answer that question by starting at the node given by (O, R) and walking through the graph looking for U. -If we take relation R to represent a permission or an operation such as "read", "write", "delete" or whatever, we can use the Relation Graph to answer the originally posed as the object of study within the field of Access Control. +### Using the Relation Graph -## Userset Rewrite Rules +The Relation Graph provides a **system-wide view** of all objects and their relationships. It enables answering questions such as: -The Relation Tuples model a generic and powerful system to represent Relations and consequently Permissions in a system. -With that said, Tuples are very bare bones, which leads to a redundant tuples. -Historically, grouping relations and grouping objects proved to be extremely useful in access control. -From a theoretical perspective, these features are required for Zanzibar to be considered a "Relation Based Access Control" implementation. +> Does user **U** have relation **R** with object **O**? -Zanzibars "Userset Rewrite Rules" addresses these issues. +This question is resolved by starting at node `(O, R)`, traversing the graph, and checking for user **U**. -### Rewrite Rule Briefing +If **R** represents a permission (e.g., `"read"`, `"write"`, `"delete"`), the Relation Graph serves as a structured way to enforce and evaluate access control. -Userset Rewrite Rules aren't extremely intuitive. +## Userset Rewrite Rules -A Rule can be thought of as a function which takes an object-relation pair (ie Relation Node) and returns a set of Relation Nodes which are interpreted as descendents of the input node. -Example: let A be a Relation Node and R be a Rewrite Rule: R(A) returns a set of Relation Nodes which are descedents of A. -Rules are associated to Relations. +Relation Tuples provide a **generic and powerful** model for representing **relations and permissions** in a system. However, they are minimalistic, often leading to redundant tuples. -A final remark: rules are evaluated during runtime, for every Relation Node Zanzibar encounters while searching through the Relation Graph. +Historically, **grouping relations** and **grouping objects** have been crucial in access control. Theoretically, these features are essential for Zanzibar to qualify as a **Relation-Based Access Control (RelBAC)** implementation. +To address this, Zanzibar introduces **Userset Rewrite Rules**. -### Permissions Hiearchy & Computed Usersets +### Overview of Userset Rewrite Rules -Permission Hiearchy is a big word for a simple idea. -It basically means that permission to do some operation implies permission to do some other "weaker" operation. +Userset Rewrite Rules are not immediately intuitive. -ie. the permission to write (in most cases) implies the permission to read beforehand. +A **rule** functions as a **transformation** on a **Relation Node** `(object, relation)`, returning a set of **descendant Relation Nodes**. -From a pratical perspective, this feature greatly reduces the administrative burden and complexity associated to managing rules in an Access Control System. +#### Example -Take for instance the previous Relation Graph, repeated here for convenience. +Let **A** be a **Relation Node** and **R** be a **Rewrite Rule**. Then: -![Relation Graph Example](/img/sourcehub/relgraph-simple.png) +R(A) → {B, C, D} + +This means that applying **R** to **A** produces a **set of descendant Relation Nodes** `{B, C, D}`. + +Rules are associated with specific **relations** and **execute at runtime**, dynamically resolving permissions as Zanzibar traverses the Relation Graph. -Note that Bob is both a "reader" and an "owner". -Suppose that in our system "owner" should always imply "reader", there's an additional cost associate with maintaining these redundant Tuples. +### Permissions hierarchy and computed usersets -In Zanzibar there is a Rule for associating Relations, the "Computed Userset" rule. +A permission hierarchy simplifies access control by linking stronger and weaker permissions. If a user has permission to perform a higher-level action, they automatically gain permission for related lower-level actions. For example, the ability to write typically includes the ability to read. This hierarchy reduces administrative effort and simplifies rule management in an Access Control System. -A Computed Userset is a rule defined for some Relation name which dynamically adds another Node to the Relation Graph. +Refer to the following Relation Graph for a visual representation. -As a way of an example, let's add a Rule such that "owner" implies "reader". -In Zanzibar that would be done by adding a `Computed Userset("owner")` Rule to the `reader` Relation. +![Relation Graph Example](/img/sourcehub/relgraph-simple.png) + +In our system, Bob is both a *reader* and an *owner*. If ownership always implies read access, maintaining redundant permission tuples adds unnecessary overhead. Zanzibar addresses this with the **Computed Userset** rule, which dynamically links relations in the permission hierarchy. To enforce that *owner* always implies *reader*, we define a **Computed Userset("owner")** rule for the *reader* relation. This rule automatically extends permissions without requiring additional tuples. -Now, let's walk through an example to see how Zanzibar handles that. -Suppose we ask Zanzibar to check whether "bob" is a "reader" of "file:readme", zanzibar would: +When checking if Bob has *reader* access to `file:readme`, Zanzibar follows these steps: -1. start at the node `("file:readme", "reader")` and look for any rules associated to the `reader` relation. -2. With the `Computed Userset("owner")` rule, it would create a new Relation Node `("file:readme", "owner")` and set it as a sucessor of `("file:readme", "reader")` -3. Continue the search through `("file:readme", "owner")` +1. Start at the node `("file:readme", "reader")` and check for associated rules. +1. Detect the **Computed Userset("owner")** rule, which creates a new relation node `("file:readme", "owner")` as a successor of `("file:readme", "reader")`. +1. Continue searching through `("file:readme", "owner")`. + +This approach ensures efficient permission management by dynamically resolving inherited access rights. ![Computed Userset Evaluation](/img/sourcehub/cu-annotated.png) -Using a Computed Userset we sucessfuly added a rule to Zanzibar which automatically derives one relation from another. +Using a Computed Userset we successfully added a rule to Zanzibar which automatically derives one relation from another. This enable users to define a set of global rules for a relation as opposed to adding additional Relation Tuples for each object in the system. -This powerful mechanism greatly decreases the maintanability cost associated to Relation Tuples. +This powerful mechanism greatly decreases the maintainability cost associated to Relation Tuples. + +### Object Hierarchy and Tuple to Userset -### Object Hiearchy & Tuple to Userset +Before exploring the **Tuple to Userset** rule, let's revisit the core idea of **RelBAC**: relationships between system objects define permissions and determine access control. We have already seen how **Relation Tuples** link objects to users and how **Usersets** establish hierarchies and group users. However, we have yet to define how Zanzibar can create **relationships between objects** and group them accordingly. This is where the **Tuple to Userset** rule comes into play. -Before diving into the Tuple to Userset rule it's important to recall the main idea behind RelBAC: the relations among system objects can be used to derive permissiosn and fulfill Access Requests. +To illustrate this concept, let's consider a familiar **filesystem permission model**. -We have seen how to relate objects to users using Relation Tuples. -Usersets allows us to define hiearchy between users and group them. -The missing link so far is how can we use Zanzibar to create Relations between Objects and consequently group them. -That's where the Tuple to Userset comes in. +A filesystem consists of: -To motivate this topic, we shall use the familiar example of a file system permission system. -Filesystems are composed of directories, files and users. -Users owns files and directories, directories contains files and for this example read permission over a directory implies read permission over all files in a directory. +- **Directories**, **files**, and **users** +- Users who **own** files and directories +- Directories that **contain** files -Let the Tuples in the system be illustrated by the following Relation Graph: +In this example, having **read** permission on a directory should automatically grant **read** permission for all files within that directory. The **Tuple to Userset** rule enables this by defining relationships between objects dynamically. + +The following **Relation Graph** illustrates the existing **Tuples** in the system: ![File system example](/img/sourcehub/ttu-relgraph.png) -The problem at hand is: how to declare that Bob's readme file is under Alice's home directory. -Furthermore, how can we declare that Alice should be able to read file readme, since it is contained in her directory. +We need to express two key relationships: + +1. Bob’s `readme` file is inside Alice’s `/home` directory. +1. Since the file is in her directory, Alice should have **read** access to it. -One way to solve the problem regadring the permission is to create a Relation Tuple from the file to the directory. -The tuple `(file:/home/readme, reader, (directory:/home, owner))` will do the trick, by adding the set of directory owners as readers. +One way to grant Alice read access is to create a **Relation Tuple** that links the file to the directory’s owners. +The tuple `(file:/home/readme, reader, (directory:/home, owner))` ensures that **directory owners automatically become file readers**. + +The updated **Relation Graph** now looks like this: ![File System Relation Graph with Relation from File to Directory owners](/img/sourcehub/ttu-relgraph-2.png) -This solves the permission problem but a problem remains, this approach creates no relation between the file and the directory themselves. -The Relation Tuple only states that directory owners are also file readers. +While this grants the correct **permissions**, it does not establish an explicit **relationship** between the file and the directory itself. The **Relation Tuple** only states that **directory owners are also file readers**, but it does not indicate that `file:/home/readme` is actually **contained** within `directory:/home`. + +To fully represent the **structure** of the filesystem, we need a way to explicitly define object relationships. This is where the **Tuple to Userset** rule becomes essential. -What we really want is to declare a relation between a file and directory and from that relation get to the set of directory owners, as shown in the following image: +What we truly need is a way to **declare a relationship between a file and a directory** and, from that relationship, derive the **set of directory owners**. The following image illustrates this concept: ![File System Relation Graph parent relation](/img/sourcehub/ttu-relgraph-3.png) -From the image we see that the file is realated to its directory through the `parent` relation. -This representation explicitely outlines how files and directories are associated in the system. -All that is missing is tracing a path from the `/home/readme, reader` node to the `/home, owner` node, completing the chain. +From this representation, we see that the file is linked to its directory through the **`parent`** relation. This explicitly defines the **structural** relationship between objects in the system. However, to complete the access control logic, we need a way to trace a path from the `("/home/readme", "reader")` node to the `("/home", "owner")` node. -This *could* be done by using a Computed Userset rule pointing from reader to parent and an additional Relation Tuple between the `/home` node and `/home, owner` but that still blurries the line between what is an actual Relation between objects and Access Control rules. -The Tuple to Userset rule solves this exact problem. +One possible approach would be to use: -The Tuple to Userset rule is essentially a Tuple query chained with a Computed Userset rule. -It takes two arguments: a "Tupleset Filter" and a "Computed Userset Relation". -The rule first rewrites the current Relation Node using the Tupleset Filter, with the new node it then fetches all sucessors of that node. -With the resulting sucessor set, it performs a Computed Userset Rewrite using the supplied "Computed Userset Relation". +- A **Computed Userset** rule, linking `reader` to `parent` +- An additional **Relation Tuple** between `/home` and `/home, owner` -The Tuple to Userset rule is very powerful in that it allows the application to declare a Relation between two objects, thus allowing object hiearchies as we've just explored. +However, this method **mixes object relationships with access control rules**, making it difficult to separate concerns. This is exactly the problem that the **Tuple to Userset** rule solves. -Note however that the main benefit of the `Tuple to Userset` is the fact that it allows an application to create only Tuples which expresses Relations, without requiring additional Tuples which would otherwise exist only for deriving Permission rules. -This may seem trivial but it has profound implications, the fact that Zazibar supports Relations like these, means that the Application - which ultimately is responsible for creating the Tuples - need not be aware that a Relation Tuple from `/home/readme` to the parent directory needs to be created. -The rules of access control are inconsequential at the application layer, being contained entirely within Zanzibar. -The Tuple to Userset is findamental to decouple Permission and Access Control logic from the application because it supports complex hiearchies between objects to be translated into Access Control rules. +The **Tuple to Userset** rule is essentially a **Tuple query** combined with a **Computed Userset** rule. It takes two arguments: -Finally, let's see the TupleToUserset in action. +- **Tupleset Filter** – Specifies the relation between objects +- **Computed Userset Relation** – Defines how permissions should propagate -Let the Rule `TupleToUserset(tupleset_filter: "parent", computed_userset: "reader")` be associated with the "reader" relation and assume the same Relation Tuples shown above. +1. The rule first **rewrites the current Relation Node** using the **Tupleset Filter**. +2. Using this new node, it **fetches all successor nodes**. +3. The successor set is then processed through a **Computed Userset Rewrite**, applying the supplied **Computed Userset Relation**. -Evaluating the TupleToUserset rule requires the following steps: +The **Tuple to Userset** rule is powerful because it allows an application to **declare relationships between objects** without embedding access control logic in the application itself. This enables **object hierarchies** to be seamlessly translated into **access control rules**. -1. start at the Relation Node `(file:/home/readme, reader)`. -2. Evaluate Rule `TupleToUserset(tupleset_filter: "parent", computed_userset: "reader")` -3. Build a filter using "tupleset_relation" -> `(file:readme, parent)` -4. Fetch all sucessors of the filter built in step 3 -> `[(directory:/home)]` -5. Apply a Computed Userset rewrite rule using the provided "computed_userset" relation for each Relation Node fetched -> `[(directory:/home, reader)]` +The key benefit of **Tuple to Userset** is that applications only need to create **Tuples expressing object relationships**—without extra tuples just for permission derivation. -Another explanation is given the following image: +This has **profound implications**: -![Tuple to Userset Evaluation](/img/sourcehub/ttu-eval.png) +- Applications no longer need to **explicitly track access control logic**. +- The rules of access control remain **entirely within Zanzibar**. +- The **application layer is unaware of access rules**, focusing solely on object relationships. -Effectively, the Tuple to Userset added a path from the `/home/readme, reader` node to the `/home, owner` nodes. -The follwing image shows the edges the rule added: +By enabling complex object hierarchies to be **natively converted into access control rules**, the **Tuple to Userset** rule fundamentally decouples **permission management** from application logic. -![](/img/sourcehub/ttu-relgraph-annotated.png) +Finally, let's see the TupleToUserset rule in action. + +Let the rule `TupleToUserset(tupleset_filter: "parent", computed_userset: "reader")` be associated with the `"reader"` relation, and assume the same Relation Tuples as shown earlier. -### Rewrite Rule Expression +Evaluating the TupleToUserset rule follows these steps: -One final passing note about Rewrite Rules: in Zanzibar a relation can have multiple rewrite rules. -These rewrite rules are combine to form Rewrite Rule expressions. +1. Start at the Relation Node `(file:/home/readme, reader)`. +2. Evaluate the rule `TupleToUserset(tupleset_filter: "parent", computed_userset: "reader")`. +3. Build a filter using `"tupleset_filter"` -> `(file:/home/readme, parent)`. +4. Fetch all successors of the filter from step 3 -> `[(directory:/home)]`. +5. Apply a Computed Userset rewrite rule using the `"computed_userset"` relation for each fetched Relation Node -> `[(directory:/home, reader)]`. -Each Rewrite Rule effectively returns a set of Relation Nodes (or userset) which are combined using the operation defined in the Rewrite Rule Expression. -Rules are joined using the familiar set operators: union, difference and intersection. +This process ensures that the `"reader"` permission propagates correctly through the object hierarchy. The following image further illustrates the concept: -The set operations are applied to the resulting set of Nodes resulting from evaluating each Rewrite Rule. -This evaluated final set of Nodes is effectively all the sucessors from a parent Relation Node. +![Tuple to Userset Evaluation](/img/sourcehub/ttu-eval.png) + +Effectively, the Tuple to Userset added a path from the `/home/readme, reader` node to the `/home, owner` nodes. +The following image shows the edges the rule added: -## Conclusion +![](/img/sourcehub/ttu-relgraph-annotated.png) -We've seen how the Relation Tuples actually define a Graph of object-relations, which in turn can be used to resolve Access Requests -We've also seen how Usersets enables grouping users and applying a Relation to a set of users. -Finally, we explored how the Use -rset Rewrite Rules can be used to define a Relation Hiearchy and how it supports Object hiearchies; both of these features are critical to ensure that Access Control Logic stays within Zanzibar. +### Rewrite Rule Expression -Althought the initial mention of the Relation Graph was extremely helpful to illustrate how it works, the reality is that the actual Relation Graph is dynamically built by Zanzibar from the Relation Tuples and by evaluating the Relation Rewrite Rules. -The synergy between these two concepts is what powers Zanzibar's Access Control Model. +In Zanzibar, a relation can have multiple rewrite rules. These rules are combined to form Rewrite Rule expressions. Each rewrite rule returns a set of Relation Nodes (or usersets), which are then combined using set operations defined in the Rewrite Rule Expression. The available set operations are union, difference, and intersection. When evaluating each Rewrite Rule, the resulting sets of Nodes are processed through these set operations. The final evaluated set of Nodes represents all the successors of a parent Relation Node. -Under that point of view, we can think of Zanzibar's API as operating over the dynamic Relation Graph. -The `Check` API call is equivalent to the graph reachability problem. -`Expand` is used as a debug tool to dump the Goal Tree used while evaluating the recursive expansion of Rewrite Rules and sucessor fetching. +### Conclusion +The Relation Tuples define a graph of object relationships, which is used to resolve Access Requests. Usersets enable grouping users and applying relations to an entire set of users. The Userset Rewrite Rules allow the creation of Relation Hierarchies and support Object Hierarchies. These features are critical for keeping Access Control Logic within Zanzibar. While the Relation Graph was useful for illustration, in practice, Zanzibar dynamically constructs the graph from Relation Tuples and evaluates the Rewrite Rules. This synergy between Relation Tuples and Rewrite Rules powers Zanzibar’s Access Control Model. From this perspective, Zanzibar’s API operates on the dynamic Relation Graph. The `Check` API call corresponds to a graph reachability problem. The `Expand` API serves as a debugging tool, exposing the Goal Tree used during the recursive expansion of Rewrite Rules and successor retrieval. # References -- Zanzibar: https://research.google/pubs/pub48190/ -- RelBAC: https://ieeexplore.ieee.org/abstract/document/4725889/ \ No newline at end of file +- Zanzibar: +- RelBAC: diff --git a/docs/sourcehub/getting-started/1-readme.md b/docs/sourcehub/getting-started/1-readme.md index 6eb68a0..9774bc5 100644 --- a/docs/sourcehub/getting-started/1-readme.md +++ b/docs/sourcehub/getting-started/1-readme.md @@ -1,6 +1,6 @@ # Getting Started -To get started with SourceHub, we need to download and initialize our local client. This section will utilize the `CLI` but equivalent functionaly is available using the programatic embedded API. +To get started with SourceHub, we need to download and initialize our local client. This section will utilize the `CLI` but equivalent functionality is available using the programmatic embedded API. ## 1. Install SourceHub First, we will download the SourceHub binary which includes a client. @@ -10,11 +10,11 @@ You can get precompiled binaries from our Github Release page [here](https://git cd $HOME wget https://github.com/sourcenetwork/sourcehub/releases/download/v0.2.0/sourcehubd chmod +x sourcehubd -sudo mv /usr/bin +sudo mv sourcehubd /usr/bin ``` ### From Source Code -You can download the code and compile your own binaries if you prefer. However you will need a local installation of the go toolchain at a minimum version of 1.22 +You can download the code and compile your own binaries if you prefer. However you will need a local installation of the Go toolchain with a minimum version of 1.22. ```bash cd $HOME git clone https://github.com/sourcenetwork/sourcehub diff --git a/docs/sourcehub/getting-started/2-account.md b/docs/sourcehub/getting-started/2-account.md index eebadeb..de6335d 100644 --- a/docs/sourcehub/getting-started/2-account.md +++ b/docs/sourcehub/getting-started/2-account.md @@ -7,7 +7,7 @@ The following command will generate a new random private key with the name ` ``` -This will output the newly generated key public key, address, and mnemonic (make sure to backup the mnemonic) +This will output the newly generated public key, address, and mnemonic (make sure to back up the mnemonic). ![Wallet output](/img/sourcehub/key-add-output.png) @@ -20,7 +20,7 @@ sourcehubd keys add --recover Then input your existing mnemonic when prompted. :::warning -You MUST ensure that you sufficiently backup your mnemonic. Failure to do so may result in lost access to your wallet. +You MUST ensure that you sufficiently back up your mnemonic. Failure to do so may result in lost access to your wallet. ::: ## Configuring client @@ -43,4 +43,4 @@ Finally, we can verify that our account exists and that it has been loaded with sourcehubd query bank balances ``` -That it, we now have a newly generated local wallet via the `CLI` client. Now we can interact with the network! First up, we will be creating an ACP policy, seeding it with some state, and executing authorization checks. \ No newline at end of file +That's it, we now have a newly generated local wallet via the `CLI` client. Now we can interact with the network! First up, we will be creating an ACP policy, seeding it with some state, and executing authorization checks. \ No newline at end of file diff --git a/docs/sourcehub/getting-started/3-create-a-policy.md b/docs/sourcehub/getting-started/3-create-a-policy.md index ad58b55..80793cb 100644 --- a/docs/sourcehub/getting-started/3-create-a-policy.md +++ b/docs/sourcehub/getting-started/3-create-a-policy.md @@ -13,7 +13,7 @@ The SourceHub ACP Module is a [Zanzibar](/sourcehub/concepts/zanzibar) based glo - **Permissions**: Computed queries over resources, relations, and even other permissions (they're recursive!). ## Example -Lets create a very basic example policy which defines a single resource named `note` with both an `owner` and `collaborator` relation which are both of type `actor`. +Let's create a very basic example policy which defines a single resource named `note` with both an `owner` and `collaborator` relation which are both of type `actor`. Create a file named `basic-policy.yaml` and paste the following: ```yaml @@ -40,9 +40,9 @@ resources: Here we are also defining 3 permissions. -The `read` permission is expressed as `owner + reader` which means *if* you have either an `owner` or `reader` relation *then* you have the `read`. +The `read` permission is expressed as `owner + collaborator` which means *if* you have either an `owner` or `collaborator` relation *then* you have the `read` permission. -Both the `edit` and `delete` permissions are reserved soley for those with the `owner` relation. +Both the `edit` and `delete` permissions are reserved solely for those with the `owner` relation. :::info Traditionally we define relations as nouns and permissions as verbs. This is because we often understand authorization as some *thing* (noun) performing some *action* (verb) on some resource. @@ -51,13 +51,13 @@ Traditionally we define relations as nouns and permissions as verbs. This is bec ### Upload Policy Now that we have defined our policy, we can upload it to SourceHub. ```bash -sourcehub tx acp create-policy basic-policy.yaml --from +sourcehubd tx acp create-policy basic-policy.yaml --from ``` Then, to get the policy we can list the existing policies. ```bash -sourcehub q acp policy-ids +sourcehubd q acp policy-ids ``` ![Policy IDs](/img/sourcehub/policy-ids-1.png) \ No newline at end of file diff --git a/docs/sourcehub/getting-started/4-acp-check.md b/docs/sourcehub/getting-started/4-acp-check.md index efcad18..14c2567 100644 --- a/docs/sourcehub/getting-started/4-acp-check.md +++ b/docs/sourcehub/getting-started/4-acp-check.md @@ -5,7 +5,7 @@ title: Access Requests Now that we have an existing account and created policy, we're going to seed it with some resources and evaluate some `Check` requests. -> A [`Check`](zanzibar-concept) request is how we determine if a given action on a reasource by an actor is allowed. +> A [`Check`](zanzibar-concept) request is how we determine if a given action on a resource by an actor is allowed. We are using the policy we created for our basic note app from the last step, which has a policy id of `a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf`. @@ -16,7 +16,7 @@ The full command is: sourcehubd tx acp direct-policy-cmd register-object a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf note alice-grocery-list --from ``` -We now have created the the `alice-grocery-list` and registered the `owner` as whatever wallet you used for ``. +We now have created the `alice-grocery-list` and registered the `owner` as whatever wallet you used for ``. To verify this, we can run a request to inspect the resource owner. ```bash @@ -33,7 +33,7 @@ After registering an object and verifying its owner, we can add a collaborator, We are going to introduce a new actor `BOB` who has an identity `did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS`. -To add `BOB` as a `collaborator` (which is a specific relation defined on the [policy](example-basic-policy)) we can issue a a `set-relationship ` where `` is `collaborator` and `` is the BOB identity above (`did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS`). +To add `BOB` as a `collaborator` (which is a specific relation defined on the [policy](example-basic-policy)) we can issue a `set-relationship ` where `` is `collaborator` and `` is the BOB identity above (`did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS`). ``` sourcehubd tx acp direct-policy-cmd set-relationship a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf note alice-grocery-list collaborator did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS --from ``` @@ -45,7 +45,7 @@ sourcehubd q acp verify-access-request a3cc042579639c4b36357217a197e0bb17bdbb54f Which will return `valid: true`. -Lets check for a permission that Bob *shouldn't* have, like `edit` which is reserved for `OWNERs`. +Let's check for a permission that Bob *shouldn't* have, like `edit` which is reserved for `OWNERs`. ```bash sourcehubd q acp verify-access-request a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS note:alice-grocery-list#edit ``` diff --git a/docs/sourcehub/overview.md b/docs/sourcehub/overview.md index dd027a9..9fe7e05 100644 --- a/docs/sourcehub/overview.md +++ b/docs/sourcehub/overview.md @@ -7,7 +7,7 @@ slug: /sourcehub ![SourceHub Overview](/img/sourcehub-cover-copy.png) -SourceHub is the Source Network's trust protocol, which fascilitates trusted and authenticated sharing and collaboration of data across the network and beyond. It utilizes [CometBFT](https://cometbft.com/) consensus and is built on the [Cosmos SDK](link) to provide us with a solid technical foundation to enable our decentralized infrastructure and application-specific chain. +SourceHub is the Source Network's trust protocol, which facilitates trusted and authenticated sharing and collaboration of data across the network and beyond. It utilizes [CometBFT](https://cometbft.com/) consensus and is built on the [Cosmos SDK](link) to provide us with a solid technical foundation to enable our decentralized infrastructure and application-specific chain. The primary functions of SourceHub are: - **ACP Module**: A decentralized authorization engine, inspired in part by [Google Zanzibar's](/sourcehub/concepts/zanzibar) Relational Based Access Control (RelBAC) @@ -18,6 +18,6 @@ The primary functions of SourceHub are: --- -Although SourceHub is an indepdant system with self-contained functionality - like the rest of the Source Stack - it is designed to work in conjunction with [DefraDB](/defradb) nodes to help fascilitate trust in its peer-to-peer architecture. +Although SourceHub is an independent system with self-contained functionality - like the rest of the Source Stack - it is designed to work in conjunction with [DefraDB](/defradb) nodes to help facilitate trust in its peer-to-peer architecture. ![SourceHub+DefraDB](/img/sourcehub/trust-protocol-defradb.png) \ No newline at end of file From 4db56a518b376def69ef8a8fdcc6b562891bd441 Mon Sep 17 00:00:00 2001 From: Ashutosh Pradhan Date: Thu, 3 Apr 2025 08:21:30 -0700 Subject: [PATCH 29/48] Update DefraDB Getting started page (#156) 1. Reorder sections 2. Update section headings if needed Co-authored-by: pradhanashutosh --- docs/defradb/getting-started.md | 165 +++++++++++++++++--------------- 1 file changed, 86 insertions(+), 79 deletions(-) diff --git a/docs/defradb/getting-started.md b/docs/defradb/getting-started.md index 316f8ad..05fdbfe 100644 --- a/docs/defradb/getting-started.md +++ b/docs/defradb/getting-started.md @@ -3,13 +3,14 @@ sidebar_position: 1 title: Getting Started slug: /defradb --- + # DefraDB Overview -![DefraDB Overview](/img/defradb-cover.png) -DefraDB is a user-centric database that prioritizes data ownership, personal privacy, and information security. Its data model, powered by the convergence of [MerkleCRDTs](https://arxiv.org/pdf/2004.00107.pdf) and the content-addressability of [IPLD](https://docs.ipld.io/), enables a multi-write-master architecture. It features [DQL](./references/query-specification/query-language-overview.md), a query language compatible with GraphQL but providing extra convenience. By leveraging peer-to-peer networking it can be deployed nimbly in novel topologies. Access control is determined by a relationship-based DSL, supporting document or field-level policies, secured by the SourceHub network. DefraDB is a core part of the [Source technologies](https://source.network/) that enable new paradigms of decentralized data and access-control management, user-centric apps, data trustworthiness, and much more. +![DefraDB Overview](/img/defradb-cover.png) +DefraDB is an application-centric database that prioritizes data ownership, personal privacy, and information security. Its data model, powered by the convergence of [MerkleCRDTs](https://arxiv.org/pdf/2004.00107.pdf) and the content-addressability of [IPLD](https://docs.ipld.io/), enables a multi-write-master architecture. It features [DQL](./references/query-specification/query-language-overview.md), a query language compatible with GraphQL but providing extra convenience. By leveraging peer-to-peer infrastructure, it can be deployed nimbly in novel topologies. Access control is determined by a relationship-based DSL, supporting document or field-level policies, secured by the SourceHub infrastructure. DefraDB is a core part of the [Source technologies](https://source.network/) that enable new paradigms of local-first software, edge compute, access-control management, application-centric features, data trustworthiness, and much more. -DISCLAIMER: At this early stage, DefraDB does not offer data encryption, and the default configuration exposes the database to the network. The software is provided "as is" and is not guaranteed to be stable, secure, or error-free. We encourage you to experiment with DefraDB and provide feedback, but please do not use it for production purposes until it has been thoroughly tested and developed. +Disclaimer: At this early stage, DefraDB does not offer data encryption, and the default configuration exposes the database to the infrastructure. The software is provided "as is" and is not guaranteed to be stable, secure, or error-free. We encourage you to experiment with DefraDB and provide feedback, but please do not use it for production purposes until it has been thoroughly tested and developed. ## Install @@ -21,83 +22,74 @@ cd defradb make install ``` -In the following sections, we assume that `defradb` is included in your `PATH`. If you installed it with the Go toolchain, use: +Ensure `defradb` is included in your `PATH`: ```sh export PATH=$PATH:$(go env GOPATH)/bin ``` -We recommend experimenting with queries using a native GraphQL client. GraphiQL is a popular option - [download and install it](https://altairgraphql.dev/#download). - -## Key Management - -DefraDB has a built in keyring that can be used to store private keys securely. - -The following keys are loaded from the keyring on start: - -- `peer-key` Ed25519 private key (required) -- `encryption-key` AES-128, AES-192, or AES-256 key (optional) -- `node-identity-key` Secp256k1 private key (optional). This key is used for node's identity. - -A secret to unlock the keyring is required on start and must be provided via the `DEFRA_KEYRING_SECRET` environment variable. If a `.env` file is available in the working directory, the secret can be stored there or via a file at a path defined by the `--secret-file` flag. +We recommend experimenting with queries using a native GraphQL client. [GraphiQL](https://altairgraphql.dev/#download) is a popular option. -The keys will be randomly generated on the initial start of the node if they are not found. - -Alternatively, to randomly generate the required keys, run the following command: +## Start -Node identity is an identity assigned to the node. It is used to exchange encryption keys with other nodes. +Start a node by executing: -``` -defradb keyring generate +```sh +defradb start ``` -To import externally generated keys, run the following command: +Verify the local connection: -``` -defradb keyring import +```sh +defradb client collection describe ``` -To learn more about the available options: +## Configuration -``` -defradb keyring --help -``` +DefraDB uses a default configuration: -## Start +- Data directory: `~/.defradb/` +- GraphQL endpoint: `http://localhost:9181/api/v0/graphql` -Start a node by executing `defradb start`. Keep the node running while going through the following examples. +The `client` command interacts with the locally running node. -Verify the local connection to the node works by executing `defradb client collection describe` in another terminal. +The GraphQL endpoint can be used with a GraphQL client (e.g., Altair) to conveniently perform requests (`query`, `mutation`) and obtain schema introspection. Read more about [configuration options](./references/config.md). -## Configuration +## Key Management -In this document, we use the default configuration, which has the following behavior: +DefraDB has a built-in keyring for storing private keys securely. Keys are loaded at startup, and a secret must be provided via the `DEFRA_KEYRING_SECRET` environment variable. The following keys are loaded from the keyring on start: -- `~/.defradb/` is DefraDB's configuration and data directory -- `client` command interacts with the locally running node -- The GraphQL endpoint is provided at http://localhost:9181/api/v0/graphql +- `peer-key` Ed25519 private key (required) +- `encryption-key` AES-128, AES-192, or AES-256 key (optional) +- `node-identity-key` Secp256k1 private key (optional). This key is used for node's identity. -The GraphQL endpoint can be used with a GraphQL client (e.g., Altair) to conveniently perform requests (`query`, `mutation`) and obtain schema introspection. +If a `.env` file is available in the working directory, the secret can be stored there or via a file at a path defined by the `--secret-file` flag. -Read more about the configuration [here](./references/config.md). +Keys will be randomly generated on the initial start of the node if they are not found. If not, to generate keys: -## External port binding +```sh +defradb keyring generate +``` -By default the HTTP API and P2P network will use localhost. If you want to expose the ports externally you need to specify the addresses in the config or command line parameters. +Import external keys: -``` -defradb start --p2paddr /ip4/0.0.0.0/tcp/9171 --url 0.0.0.0:9181 +```sh +defradb keyring import ``` -## Add a schema type +To learn more about the available options: -Schemas are used to structure documents using a type system. +```sh +defradb keyring --help +``` -In the following examples, we'll be using a simple `User` schema type. +NOTE: Node identity is an identity assigned to the node. It is used to exchange encryption keys with other nodes. -Add it to the database with the following command. By doing so, DefraDB generates the typed GraphQL endpoints for querying, mutation, and introspection. +## Add a schema type + +Define and add a schema type. -```shell +```sh defradb client schema add ' type User { name: String @@ -108,13 +100,13 @@ defradb client schema add ' ' ``` -Find more examples of schema type definitions in the [examples/schema/](examples/schema/) folder. +For more examples of schema type definitions, see the [examples/schema/](examples/schema/) folder. ## Create a document Submit a `mutation` request to create a document of the `User` type: -```shell +```sh defradb client query ' mutation { create_User(input: {age: 31, verified: true, points: 90, name: "Bob"}) { @@ -144,7 +136,7 @@ Expected response: Once you have populated your node with data, you can query it: -```shell +```sh defradb client query ' query { User { @@ -161,7 +153,7 @@ This query obtains *all* users and returns their fields `_docID, age, name, poin You can further filter results with the `filter` argument. -```shell +```sh defradb client query ' query { User(filter: {points: {_ge: 50}}) { @@ -178,11 +170,9 @@ This returns only user documents which have a value for the `points` field *Grea ## Obtain document commits -DefraDB's data model is based on [MerkleCRDTs](https://arxiv.org/pdf/2004.00107.pdf). Each document has a graph of all of its updates, similar to Git. The updates are called `commit`s and are identified by `cid`, a content identifier. Each references its parents by their `cid`s. +DefraDB's data model is based on [MerkleCRDTs](https://arxiv.org/pdf/2004.00107.pdf). Each document has a graph of all of its updates, similar to Git. The updates are called `commit`s and are identified by `cid`, a content identifier. Each references its parents by their `cid`s. To get the most recent commit in the MerkleDAG for the document identified as `bae-91171025-ed21-50e3-b0dc-e31bccdfa1ab`: -To get the most recent commit in the MerkleDAG for the document identified as `bae-91171025-ed21-50e3-b0dc-e31bccdfa1ab`: - -```shell +```sh defradb client query ' query { latestCommits(docID: "bae-91171025-ed21-50e3-b0dc-e31bccdfa1ab") { @@ -234,7 +224,7 @@ It returns a structure similar to the following, which contains the update paylo Obtain a specific commit by its content identifier (`cid`): -```shell +```sh defradb client query ' query { commits(cid: "bafybeifhtfs6vgu7cwbhkojneh7gghwwinh5xzmf7nqkqqdebw5rqino7u") { @@ -266,7 +256,7 @@ Each node has a unique `PeerID` generated from its public key. This ID allows ot To view your node's peer info: -```shell +```sh defradb client p2p info ``` @@ -285,13 +275,13 @@ Let's go through an example of two nodes (*nodeA* and *nodeB*) connecting with e Start *nodeA* with a default configuration: -```shell +```sh defradb start ``` Obtain the node's peer info: -```shell +```sh defradb client p2p info ``` @@ -299,7 +289,7 @@ In this example, we use `12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B`, For *nodeB*, we provide the following configuration: -```shell +```sh defradb start --rootdir ~/.defradb-nodeB --url localhost:9182 --p2paddr /ip4/127.0.0.1/tcp/9172 --peers /ip4/127.0.0.1/tcp/9171/p2p/12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B ``` @@ -318,15 +308,16 @@ This starts two nodes and connects them via pubsub networking. It is possible to subscribe to updates on a given collection by using its ID as the pubsub topic. The ID of a collection is found as the field `collectionID` in one of its documents. Here we use the collection ID of the `User` type we created above. After setting up 2 nodes as shown in the [Pubsub example](#pubsub-example) section, we can subscribe to collections updates on *nodeA* from *nodeB* by using the following command: -```shell +```sh defradb client p2p collection add --url localhost:9182 bafkreibpnvkvjqvg4skzlijka5xe63zeu74ivcjwd76q7yi65jdhwqhske ``` Multiple collection IDs can be added at once. -```shell +```sh defradb client p2p collection add --url localhost:9182 ,, ``` +
    @@ -336,13 +327,13 @@ Replicator peering is targeted: it allows a node to actively send updates to ano Start *nodeA*: -```shell +```sh defradb start ``` In another terminal, add this example schema to it: -```shell +```sh defradb client schema add ' type Article { content: String @@ -353,7 +344,7 @@ defradb client schema add ' Start (or continue running from above) *nodeB*, that will be receiving updates: -```shell +```sh defradb start --rootdir ~/.defradb-nodeB --url localhost:9182 --p2paddr /ip4/0.0.0.0/tcp/9172 ``` @@ -361,7 +352,7 @@ Here we *do not* specify `--peers` as we will manually define a replicator after In another terminal, add the same schema to *nodeB*: -```shell +```sh defradb client schema add --url localhost:9182 ' type Article { content: String @@ -372,13 +363,13 @@ defradb client schema add --url localhost:9182 ' Then copy the peer info from *nodeB*: -```shell +```sh defradb client p2p info --url localhost:9182 ``` Set *nodeA* to actively replicate the Article collection to *nodeB*: -```shell +```sh defradb client p2p replicator set -c Article ``` @@ -391,7 +382,8 @@ By default, DefraDB will expose its HTTP API at `http://localhost:9181/api/v0`. To start defradb with self-signed certificates placed under `~/.defradb/certs/` with `server.key` being the public key and `server.crt` being the private key, just do: -```shell + +```sh defradb start --tls ``` @@ -402,47 +394,62 @@ Since the keys should be stored within the DefraDB data and configuration direct If not saved under `~/.defradb/certs` then the public (`pubkeypath`) and private (`privkeypaths`) key paths need to be explicitly defined in addition to the `--tls` flag or `tls` set to `true` in the config. Then to start the server with TLS, using your generated keys in custom path: -```shell + +```sh defradb start --tls --pubkeypath ~/path-to-pubkey.key --privkeypath ~/path-to-privkey.crt ``` ## Access Control System + Read more about the access control [here](./references/acp.md). ## Supporting CORS When accessing DefraDB through a frontend interface, you may be confronted with a CORS error. That is because, by default, DefraDB will not have any allowed origins set. To specify which origins should be allowed to access your DefraDB endpoint, you can specify them when starting the database: -```shell + +```sh defradb start --allowed-origins=https://yourdomain.com ``` If running a frontend app locally on localhost, allowed origins must be set with the port of the app: -```shell + +```sh defradb start --allowed-origins=http://localhost:3000 ``` -The catch-all `*` is also a valid origin. +The catch-all `*` is also a valid origin. + +## External port binding + +By default the HTTP API and P2P network will use localhost. If you want to expose the ports externally you need to specify the addresses in the config or command line parameters. + +```sh +defradb start --p2paddr /ip4/0.0.0.0/tcp/9171 --url 0.0.0.0:9181 +``` ## Backing up and restoring It is currently not possible to do a full backup of DefraDB that includes the history of changes through the Merkle DAG. However, DefraDB currently supports a simple backup of the current data state in JSON format that can be used to seed a database or help with transitioning from one DefraDB version to another. To backup the data, run the following command: -```shell + +```sh defradb client backup export path/to/backup.json ``` To pretty print the JSON content when exporting, run the following command: -```shell + +```sh defradb client backup export --pretty path/to/backup.json ``` To restore the data, run the following command: -```shell + +```sh defradb client backup import path/to/backup.json ``` ## Conclusion -This gets you started to use DefraDB! Read on the documentation website for guides and further information. +This gets you started to use DefraDB. Read on the documentation website for guides and further information. From acc031ea70dd5e92fa0f7837a6aa7dbcdd85b188 Mon Sep 17 00:00:00 2001 From: Ashutosh Pradhan Date: Thu, 3 Apr 2025 08:23:50 -0700 Subject: [PATCH 30/48] Updated defradb concepts (#157) Update defradb concepts -ipfs -libp2p Co-authored-by: pradhanashutosh --- docs/defradb/concepts/ipfs.md | 101 +++++++++++++++++++++++++++----- docs/defradb/concepts/libp2p.md | 73 ++++++++++++++++++----- 2 files changed, 143 insertions(+), 31 deletions(-) diff --git a/docs/defradb/concepts/ipfs.md b/docs/defradb/concepts/ipfs.md index 5d643d3..5573386 100644 --- a/docs/defradb/concepts/ipfs.md +++ b/docs/defradb/concepts/ipfs.md @@ -1,31 +1,102 @@ --- -title: IPFS +title: InterPlanetary File System (IPFS) --- ## Overview -IPFS is a decentralized system to access websites, applications, files, and data using content addressing. IPFS stands for **InterPlanetary File System**. The fundamental idea underlying in this technology is to change the way a network of people and computers can exchange information amongst themselves. +The **InterPlanetary File System (IPFS)** is a **distributed** system designed to enable peer-to-peer access to websites, applications, files, and data using **content addressing** instead of traditional location-based addressing. The fundamental goal of IPFS is to revolutionize how information is shared across networks by making it more **efficient, resilient, and censorship-resistant**. ## Key Features -- Distributed/decentralized system -- Uses content addressing -- Participation +IPFS is built on several core principles that distinguish it from conventional web technologies: -A decentralized system lets you access information or a file from multiple locations, which aren't managed by a single organization. The pro's of decentralization are - access to multiple locations to access data, easy to dodge content censorship, and faster file transfer. +- **Distributed Infrastructure:** Information is retrieved from multiple nodes instead of relying on a single centralized server. +- **Content Addressing:** Data is identified by its **cryptographic hash**, ensuring content integrity and eliminating reliance on specific locations (URLs). +- **Decentralized Participation:** The network thrives on active participation, where multiple users store and share files, making data more accessible and resilient to failures. -IPFS addresses a file by its content instead of its location. A content identifier is the cryptographic hash of the content at that address. It is unique to the content it came in from and permits you to verify if you got what you had requested for. +## Why IPFS? Advantages of a Distributed Web -For IPFS to work well, active participation of people is necessary. If you are sharing files using IPFS, you need to have copies of the shared files available on multiple computers, which are powered on and running IPFS. In a nutshell, many people provide access to each others files and participate in making them available when requested. Note that if you have downloaded a file using IPFS, by default your computer will share it further with others participants to share further. +Unlike traditional web systems that rely on centralized servers, IPFS offers several benefits: -## How Does it Work? +- **Resilience to Failures:** Since content is retrieved from multiple sources, it remains available even if some nodes go offline. +- **Faster Content Delivery:** By retrieving content from the nearest available node, IPFS can significantly reduce latency and bandwidth costs. +- **Censorship Resistance:** IPFS makes it difficult for a single entity to control or restrict access to content. +- **Efficient Storage:** Duplicate files are automatically deduplicated across the network, optimizing storage usage. -As discussed earlier, IPFS is a p2p (peer-to-peer) storage network. The IPFS ecosystem works with the following fundamental principles. +## How IPFS Works -1. Unique identification via content addressing -2. Content linking via directed acrylic graphs (DAGs) -3. Content discovery via distributed hash tables (DHTs) +IPFS operates using three key mechanisms: -## Suggested Reading +### 1. Content Addressing -For more in-depth knowledge of the IPFS system refer to the [IPFS Conceptual documentation](https://docs.ipfs.io/concepts/). +- Each file is assigned a **unique cryptographic hash** (Content Identifier or CID). +- Any change to the file results in a new hash, ensuring integrity and version control. + +### 2. Directed Acyclic Graphs (DAGs) for Content Linking + +- Data is structured as a **Merkle Directed Acyclic Graph (DAG)**, where each node contains links to its components. +- This allows for efficient data distribution and version tracking. + +### 3. Distributed Hash Tables (DHTs) for Content Discovery + +- When a user requests a file, IPFS looks up its CID in a **Distributed Hash Table** (DHT) to locate peers storing the requested content. +- The system retrieves the file from the nearest or most efficient source. + +## How to Use IPFS + +### 1. Adding a File to IPFS + +- A user adds a file to IPFS using an IPFS node. +- The file is broken into chunks and given a unique CID. +- The CID can be used to retrieve the file later. + +### 2. Retrieving a File from IPFS + +- Users request content by CID. +- IPFS locates the closest nodes storing that file and delivers the data in a peer-to-peer fashion. + +### 3. Pinning and Persistence + +- IPFS does not permanently store all files; users must "pin" files to keep them accessible on their own nodes. +- Content persistence is ensured by either pinning files manually or using **IPFS pinning services**. + +## Considerations and Limitations + +While IPFS offers significant advantages, users should be aware of: + +- **Storage Responsibility:** Files may disappear unless pinned or actively shared by multiple peers. +- **No Built-in Encryption:** While data integrity is ensured, encryption must be handled separately if needed. +- **Bandwidth Usage:** Nodes that participate in the network contribute bandwidth, which may impact performance on limited connections. + +## Getting Started with IPFS + +To start using IPFS: + +1. Install IPFS from the [official IPFS website](https://ipfs.io). +1. Initialize an IPFS node using: + +```sh +ipfs init +``` + +1. Add a file to IPFS: + +```sh +ipfs add myfile.txt +``` + +1. Retrieve a file using its CID + +```s +ipfs cat +``` + +## Further Reading + +For more in-depth knowledge, explore: + +- [IPFS Official Documentation](https://docs.ipfs.tech/) +- [IPFS Whitepaper](https://ipfs.io/ipfs/QmR7GSQM93Cx5eAg6a6vTyWKNXq8Rz5KZX3u37aS1WbDyB) +- [IPFS GitHub Repository](https://github.com/ipfs) + +IPFS represents a fundamental shift towards a more open, resilient, and decentralized internet, paving the way for the future of data distribution and web applications. diff --git a/docs/defradb/concepts/libp2p.md b/docs/defradb/concepts/libp2p.md index ace7366..108e3d7 100644 --- a/docs/defradb/concepts/libp2p.md +++ b/docs/defradb/concepts/libp2p.md @@ -1,24 +1,65 @@ -# libp2p -## Overview +# libp2p: A Modular Peer-to-Peer Networking Framework -libp2p is a modular system which helps in the development of peer-to-peer network applications. The system comprises of protocols, specifications, and libraries. +## Overview -## What is Peer-to-peer? +libp2p is a flexible and modular framework designed to simplify the development of peer-to-peer (P2P) network applications. It provides a suite of **protocols, specifications, and libraries** that allow applications to communicate efficiently without relying on centralized servers. -Most commonly used peer-to-peer applications include file sharing networks like bittorrent (used to download movies, files) and the recent uptrend of blockchain networks. Both these network types communicate in a peer-to-peer method. +Originally developed for IPFS, libp2p has evolved into a **standalone networking stack** used in decentralized applications, blockchain networks, and distributed systems. -In a p2p network, participants (also known as nodes or peers) communicate with each other directly rather than using a **server** like the client/server model of data transfer. +## Understanding Peer-to-Peer Networks -# Problems Solved by libp2p +Peer-to-peer (P2P) networking is a communication model where **nodes (peers) interact directly** with each other instead of depending on a central server. This approach contrasts with the traditional **client-server model**, where a server acts as the central point for data exchange. -Of the many problems, the major ones which libp2p addresses include: -- Transport -- Identity -- Security -- Peer Routing -- Content Routing -- Messaging/PubSub +### Examples of P2P Networks: -## Suggested Reading +- **File-sharing networks** (e.g., BitTorrent) – Allow users to share and download files without a central server. +- **Blockchain networks** (e.g., Ethereum, Bitcoin) – Enable decentralized transaction validation and consensus mechanisms. -For more in-depth knowledge of the libp2p system refer to the [libp2p Conceptual documentation](https://docs.libp2p.io/concepts/). \ No newline at end of file +By eliminating central authorities, P2P networks enhance **resilience, scalability, and censorship resistance** in distributed applications. + +## Key Challenges Solved by libp2p + +libp2p provides solutions to fundamental networking challenges that arise in P2P environments: + +### 1. **Transport Abstraction** + +- Supports multiple transport protocols (TCP, WebSockets, QUIC, etc.). +- Enables seamless communication across different network environments. + +### 2. **Identity & Security** + +- Uses **cryptographic identities** to verify peers. +- Ensures encrypted and authenticated communication between nodes. + +### 3. **Peer Routing** + +- Implements **Distributed Hash Tables (DHTs)** for efficient peer discovery. +- Helps nodes locate and connect with others dynamically. + +### 4. **Content Routing** + +- Allows efficient lookup and retrieval of data across the network. +- Optimizes distributed content addressing for performance and reliability. + +### 5. **Messaging & PubSub** + +- Supports **publish-subscribe (PubSub) messaging** for real-time data exchange. +- Facilitates decentralized event-driven communication in distributed applications. + +## Why Use libp2p? + +libp2p is widely adopted in decentralized technologies because of its: + +- **Modularity** – Developers can mix and match components based on project needs. +- **Interoperability** – Works across different networks, transport protocols, and applications. +- **Scalability** – Designed to handle thousands of peers efficiently. +- **Security** – Implements robust encryption and authentication mechanisms. + +## Getting Started with libp2p + +To start using libp2p, explore the following resources: + +- [libp2p Conceptual Documentation](https://docs.libp2p.io/concepts/) +- [libp2p GitHub Repository](https://github.com/libp2p/) + +libp2p is shaping the future of **decentralized communication** by enabling efficient, secure, and scalable peer-to-peer networking. From 28df88566d6b3a87347f491d0ad14f403c6f0e83 Mon Sep 17 00:00:00 2001 From: Ashutosh Pradhan Date: Wed, 9 Apr 2025 01:55:14 -0700 Subject: [PATCH 31/48] Guides toc refactor (#155) refactor the guides toc in order, no classification Co-authored-by: pradhanashutosh --- docs/defradb/guides/akash-deployment.md | 2 +- docs/defradb/guides/deployment-guide.md | 2 +- docs/defradb/guides/schema-migration.md | 2 +- docs/defradb/guides/secondary-index.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/defradb/guides/akash-deployment.md b/docs/defradb/guides/akash-deployment.md index 1156347..e18d0d4 100644 --- a/docs/defradb/guides/akash-deployment.md +++ b/docs/defradb/guides/akash-deployment.md @@ -1,6 +1,6 @@ --- sidebar_label: Akash Deployment Guide -sidebar_position: 60 +sidebar_position: 70 --- # Deploy DefraDB on Akash diff --git a/docs/defradb/guides/deployment-guide.md b/docs/defradb/guides/deployment-guide.md index 82541ed..dfb6bba 100644 --- a/docs/defradb/guides/deployment-guide.md +++ b/docs/defradb/guides/deployment-guide.md @@ -1,6 +1,6 @@ --- sidebar_label: Deployment Guide -sidebar_position: 70 +sidebar_position: 80 --- # A Guide to DefraDB Deployment DefraDB aspires to be a versatile database, supporting both single-node and clustered deployments. In a clustered setup, multiple nodes collaborate seamlessly. This guide walks you through deploying DefraDB, from single-node configurations to cloud and server environments. Let’s begin. diff --git a/docs/defradb/guides/schema-migration.md b/docs/defradb/guides/schema-migration.md index 9bdd854..6df51f6 100644 --- a/docs/defradb/guides/schema-migration.md +++ b/docs/defradb/guides/schema-migration.md @@ -1,6 +1,6 @@ --- sidebar_label: Schema Migration Guide -sidebar_position: 60 +sidebar_position: 90 --- # A Guide to Schema Migration in DefraDB diff --git a/docs/defradb/guides/secondary-index.md b/docs/defradb/guides/secondary-index.md index 72c28ed..1c10478 100644 --- a/docs/defradb/guides/secondary-index.md +++ b/docs/defradb/guides/secondary-index.md @@ -1,6 +1,6 @@ --- sidebar_label: Secondary index guide -sidebar_position: 80 +sidebar_position: 60 --- ## Introduction From fd54eba884802edecd5610c24efe4bfe72c6f181 Mon Sep 17 00:00:00 2001 From: Ashutosh Pradhan Date: Fri, 2 May 2025 11:51:25 -0700 Subject: [PATCH 32/48] Hide akash-deployment.md (#164) PR to hide Akash deployment guide --------- Co-authored-by: pradhanashutosh --- docs/defradb/guides/akash-deployment.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/defradb/guides/akash-deployment.md b/docs/defradb/guides/akash-deployment.md index e18d0d4..4caceec 100644 --- a/docs/defradb/guides/akash-deployment.md +++ b/docs/defradb/guides/akash-deployment.md @@ -1,6 +1,7 @@ --- sidebar_label: Akash Deployment Guide sidebar_position: 70 +draft: true --- # Deploy DefraDB on Akash @@ -142,4 +143,4 @@ defradb client p2p replicator set --collection User '{ > The p2p host and port can be found in the [deployment info](#deployment-info). For example: if your p2p address is http://provider.bdl.computer:32582/ the host would be provider.bdl.computer and the port would be 32582. -The local node should now be replicating all User documents to the Akash node. \ No newline at end of file +The local node should now be replicating all User documents to the Akash node. From 1275d4d4df4f9f8945340a7a3c35fbf52a8baa26 Mon Sep 17 00:00:00 2001 From: David Turner Date: Wed, 21 May 2025 19:06:03 -0400 Subject: [PATCH 33/48] feat: theme update (#165) Updates the theme with current branding and icons --- docs/defradb/getting-started.md | 66 ++++++++-------- docusaurus.config.js | 17 ++--- src/code-theme/code-theme-light.js | 90 ---------------------- src/code-theme/code-theme.js | 108 +++++++++++++++++++++++++++ src/css/custom.scss | 106 ++++++++++++++++++-------- src/css/fonts.scss | 2 +- src/css/infima-variables.scss | 35 +++++---- src/pages/index.module.scss | 2 +- src/pages/index.tsx | 8 +- static/img/product/defradb.svg | 3 + static/img/product/orbis.svg | 3 + static/img/product/sourcehub.svg | 5 ++ static/img/source-docs-logo-w_v2.svg | 11 +++ static/img/source-docs-logo_v2.svg | 11 +++ static/img/source-logo-w_v2.svg | 9 +++ static/img/source-logo_v2.svg | 9 +++ 16 files changed, 303 insertions(+), 182 deletions(-) delete mode 100644 src/code-theme/code-theme-light.js create mode 100644 src/code-theme/code-theme.js create mode 100644 static/img/product/defradb.svg create mode 100644 static/img/product/orbis.svg create mode 100644 static/img/product/sourcehub.svg create mode 100644 static/img/source-docs-logo-w_v2.svg create mode 100644 static/img/source-docs-logo_v2.svg create mode 100644 static/img/source-logo-w_v2.svg create mode 100644 static/img/source-logo_v2.svg diff --git a/docs/defradb/getting-started.md b/docs/defradb/getting-started.md index 05fdbfe..e31d8af 100644 --- a/docs/defradb/getting-started.md +++ b/docs/defradb/getting-started.md @@ -16,7 +16,7 @@ Disclaimer: At this early stage, DefraDB does not offer data encryption, and the Install `defradb` by [downloading an executable](https://github.com/sourcenetwork/defradb/releases) or building it locally using the [Go toolchain](https://golang.org/): -```sh +```bash git clone git@github.com:sourcenetwork/defradb.git cd defradb make install @@ -24,7 +24,7 @@ make install Ensure `defradb` is included in your `PATH`: -```sh +```bash export PATH=$PATH:$(go env GOPATH)/bin ``` @@ -34,13 +34,13 @@ We recommend experimenting with queries using a native GraphQL client. [GraphiQL Start a node by executing: -```sh +```bash defradb start ``` Verify the local connection: -```sh +```bash defradb client collection describe ``` @@ -67,19 +67,19 @@ If a `.env` file is available in the working directory, the secret can be stored Keys will be randomly generated on the initial start of the node if they are not found. If not, to generate keys: -```sh +```bash defradb keyring generate ``` Import external keys: -```sh +```bash defradb keyring import ``` To learn more about the available options: -```sh +```bash defradb keyring --help ``` @@ -89,7 +89,7 @@ NOTE: Node identity is an identity assigned to the node. It is used to exchange Define and add a schema type. -```sh +```bash defradb client schema add ' type User { name: String @@ -106,7 +106,7 @@ For more examples of schema type definitions, see the [examples/schema/](example Submit a `mutation` request to create a document of the `User` type: -```sh +```bash defradb client query ' mutation { create_User(input: {age: 31, verified: true, points: 90, name: "Bob"}) { @@ -136,7 +136,7 @@ Expected response: Once you have populated your node with data, you can query it: -```sh +```bash defradb client query ' query { User { @@ -153,7 +153,7 @@ This query obtains *all* users and returns their fields `_docID, age, name, poin You can further filter results with the `filter` argument. -```sh +```bash defradb client query ' query { User(filter: {points: {_ge: 50}}) { @@ -172,7 +172,7 @@ This returns only user documents which have a value for the `points` field *Grea DefraDB's data model is based on [MerkleCRDTs](https://arxiv.org/pdf/2004.00107.pdf). Each document has a graph of all of its updates, similar to Git. The updates are called `commit`s and are identified by `cid`, a content identifier. Each references its parents by their `cid`s. To get the most recent commit in the MerkleDAG for the document identified as `bae-91171025-ed21-50e3-b0dc-e31bccdfa1ab`: -```sh +```bash defradb client query ' query { latestCommits(docID: "bae-91171025-ed21-50e3-b0dc-e31bccdfa1ab") { @@ -224,7 +224,7 @@ It returns a structure similar to the following, which contains the update paylo Obtain a specific commit by its content identifier (`cid`): -```sh +```graphql defradb client query ' query { commits(cid: "bafybeifhtfs6vgu7cwbhkojneh7gghwwinh5xzmf7nqkqqdebw5rqino7u") { @@ -256,7 +256,7 @@ Each node has a unique `PeerID` generated from its public key. This ID allows ot To view your node's peer info: -```sh +```bash defradb client p2p info ``` @@ -275,13 +275,13 @@ Let's go through an example of two nodes (*nodeA* and *nodeB*) connecting with e Start *nodeA* with a default configuration: -```sh +```bash defradb start ``` Obtain the node's peer info: -```sh +```bash defradb client p2p info ``` @@ -289,7 +289,7 @@ In this example, we use `12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B`, For *nodeB*, we provide the following configuration: -```sh +```bash defradb start --rootdir ~/.defradb-nodeB --url localhost:9182 --p2paddr /ip4/127.0.0.1/tcp/9172 --peers /ip4/127.0.0.1/tcp/9171/p2p/12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B ``` @@ -308,13 +308,13 @@ This starts two nodes and connects them via pubsub networking. It is possible to subscribe to updates on a given collection by using its ID as the pubsub topic. The ID of a collection is found as the field `collectionID` in one of its documents. Here we use the collection ID of the `User` type we created above. After setting up 2 nodes as shown in the [Pubsub example](#pubsub-example) section, we can subscribe to collections updates on *nodeA* from *nodeB* by using the following command: -```sh +```bash defradb client p2p collection add --url localhost:9182 bafkreibpnvkvjqvg4skzlijka5xe63zeu74ivcjwd76q7yi65jdhwqhske ``` Multiple collection IDs can be added at once. -```sh +```bash defradb client p2p collection add --url localhost:9182 ,, ``` @@ -327,13 +327,13 @@ Replicator peering is targeted: it allows a node to actively send updates to ano Start *nodeA*: -```sh +```bash defradb start ``` In another terminal, add this example schema to it: -```sh +```bash defradb client schema add ' type Article { content: String @@ -344,7 +344,7 @@ defradb client schema add ' Start (or continue running from above) *nodeB*, that will be receiving updates: -```sh +```bash defradb start --rootdir ~/.defradb-nodeB --url localhost:9182 --p2paddr /ip4/0.0.0.0/tcp/9172 ``` @@ -352,7 +352,7 @@ Here we *do not* specify `--peers` as we will manually define a replicator after In another terminal, add the same schema to *nodeB*: -```sh +```bash defradb client schema add --url localhost:9182 ' type Article { content: String @@ -363,13 +363,13 @@ defradb client schema add --url localhost:9182 ' Then copy the peer info from *nodeB*: -```sh +```bash defradb client p2p info --url localhost:9182 ``` Set *nodeA* to actively replicate the Article collection to *nodeB*: -```sh +```bash defradb client p2p replicator set -c Article ``` @@ -383,7 +383,7 @@ By default, DefraDB will expose its HTTP API at `http://localhost:9181/api/v0`. To start defradb with self-signed certificates placed under `~/.defradb/certs/` with `server.key` being the public key and `server.crt` being the private key, just do: -```sh +```bash defradb start --tls ``` @@ -395,7 +395,7 @@ If not saved under `~/.defradb/certs` then the public (`pubkeypath`) and private Then to start the server with TLS, using your generated keys in custom path: -```sh +```bash defradb start --tls --pubkeypath ~/path-to-pubkey.key --privkeypath ~/path-to-privkey.crt ``` @@ -408,13 +408,13 @@ Read more about the access control [here](./references/acp.md). When accessing DefraDB through a frontend interface, you may be confronted with a CORS error. That is because, by default, DefraDB will not have any allowed origins set. To specify which origins should be allowed to access your DefraDB endpoint, you can specify them when starting the database: -```sh +```bash defradb start --allowed-origins=https://yourdomain.com ``` If running a frontend app locally on localhost, allowed origins must be set with the port of the app: -```sh +```bash defradb start --allowed-origins=http://localhost:3000 ``` @@ -424,7 +424,7 @@ The catch-all `*` is also a valid origin. By default the HTTP API and P2P network will use localhost. If you want to expose the ports externally you need to specify the addresses in the config or command line parameters. -```sh +```bash defradb start --p2paddr /ip4/0.0.0.0/tcp/9171 --url 0.0.0.0:9181 ``` @@ -434,19 +434,19 @@ It is currently not possible to do a full backup of DefraDB that includes the hi To backup the data, run the following command: -```sh +```bash defradb client backup export path/to/backup.json ``` To pretty print the JSON content when exporting, run the following command: -```sh +```bash defradb client backup export --pretty path/to/backup.json ``` To restore the data, run the following command: -```sh +```bash defradb client backup import path/to/backup.json ``` diff --git a/docusaurus.config.js b/docusaurus.config.js index 2ce3b22..a334ba1 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -1,8 +1,7 @@ // @ts-check // Note: type annotations allow type checking and IDEs autocompletion -const lightCodeTheme = require("./src/code-theme/code-theme-light"); -const darkCodeTheme = require("prism-react-renderer/themes/oceanicNext"); +const variableCodeTheme = require("./src/code-theme/code-theme"); /** @type {import('@docusaurus/types').Config} */ const config = { @@ -54,15 +53,16 @@ const config = { }, }, colorMode: { - respectPrefersColorScheme: true, + respectPrefersColorScheme: false, + defaultMode: "dark", }, navbar: { title: null, hideOnScroll: false, logo: { alt: "Source Network Documentation", - src: "img/source-docs-full-light.svg", - srcDark: "img/source-docs-full-dark.svg", + src: "img/source-docs-logo_v2.svg", + srcDark: "img/source-docs-logo-w_v2.svg", }, items: [ { @@ -97,8 +97,8 @@ const config = { footer: { logo: { alt: "Facebook Open Source Logo", - src: "img/source-full-light.svg", - srcDark: "img/source-full-dark.svg", + src: "img/source-logo_v2.svg", + srcDark: "img/source-logo-w_v2.svg", href: "https://source.network/", }, links: [ @@ -149,8 +149,7 @@ const config = { copyright: `Copyright © ${new Date().getFullYear()} Source, Inc & Democratized Data Foundation. Built with Docusaurus.`, }, prism: { - theme: lightCodeTheme, - darkTheme: darkCodeTheme, + theme: variableCodeTheme, }, }), plugins: [ diff --git a/src/code-theme/code-theme-light.js b/src/code-theme/code-theme-light.js deleted file mode 100644 index 450c942..0000000 --- a/src/code-theme/code-theme-light.js +++ /dev/null @@ -1,90 +0,0 @@ -var theme = { - plain: { - color: "#a9b1d6", - backgroundColor: "#1a1b26", - }, - styles: [ - { - types: ["comment"], - style: { - fontStyle: "italic", - }, - }, - { - types: ["keyword", "operator"], - style: { - color: "rgb(137, 221, 255)", - }, - }, - { - types: ["punctuation"], - style: { - color: "rgb(68, 75, 106)", - }, - }, - { - types: ["builtin", "number"], - style: { - color: "rgb(255, 158, 100)", - }, - }, - { - types: ["string", "symbol", "constant", "attr-name"], - style: { - color: "rgb(158, 206, 106)", - }, - }, - { - types: ["function"], - style: { - color: "rgb(13, 185, 215)", - }, - }, - { - types: ["tag"], - style: { - color: "rgb(247, 118, 142)", - }, - }, - { - types: ["variable"], - style: { - color: "rgb(224, 175, 104)", - }, - }, - { - types: ["char"], - style: { - color: "rgb(187, 154, 247)", - }, - }, - { - types: ["property"], - style: { - color: "rgb(154, 189, 245)", - }, - }, - { - types: ["inserted"], - style: { - color: "rgb(68, 157, 171)", - }, - }, - { - types: ["deleted"], - style: { - color: "rgb(145, 76, 84)", - }, - }, - { - types: ["changed"], - style: { - color: "rgb(97, 131, 187)", - }, - }, - ], -}; - -module.exports = theme; - -module.exports = theme; diff --git a/src/code-theme/code-theme.js b/src/code-theme/code-theme.js new file mode 100644 index 0000000..48a93ee --- /dev/null +++ b/src/code-theme/code-theme.js @@ -0,0 +1,108 @@ +const theme = { + plain: { + color: "var(--code-foreground)", + backgroundColor: "var(--code-background)", // assuming background is handled by container + }, + styles: [ + { + types: ["comment"], + style: { + color: "var(--code-token-comment)", + fontStyle: "italic", + }, + }, + { + types: ["keyword", "builtin", "changed"], + style: { + color: "var(--code-token-keyword)", + }, + }, + { + types: ["constant", "property", "class-name"], + style: { + color: "var(--code-token-constant)", + }, + }, + { + types: ["string", "inserted", "attr-value"], + style: { + color: "var(--code-token-string)", + }, + }, + { + types: ["string-expression"], + style: { + color: "var(--code-token-string-expression)", + }, + }, + { + types: ["number"], + style: { + color: "var(--code-token-number)", + }, + }, + { + types: ["punctuation", "operator"], + style: { + color: "var(--code-token-punctuation)", + }, + }, + { + types: ["function"], + style: { + color: "var(--code-token-function)", + }, + }, + { + types: ["variable", "parameter"], + style: { + color: "var(--code-token-parameter)", + }, + }, + { + types: ["attr-name", "maybe-class-name"], + style: { + color: "var(--code-token-property)", + }, + }, + { + types: ["url", "link"], + style: { + color: "var(--code-token-link)", + textDecoration: "underline", + }, + }, + { + types: ["tag"], + style: { + color: "var(--code-token-keyword)", // reuse keyword color for tags + }, + }, + { + types: ["deleted"], + style: { + color: "red", + }, + }, + { + types: ["important", "bold"], + style: { + fontWeight: "bold", + }, + }, + { + types: ["italic"], + style: { + fontStyle: "italic", + }, + }, + { + types: ["highlight"], + style: { + backgroundColor: "var(--code-highlight-color)", + }, + }, + ], +}; + +module.exports = theme; diff --git a/src/css/custom.scss b/src/css/custom.scss index 8c7cea5..f71d68b 100644 --- a/src/css/custom.scss +++ b/src/css/custom.scss @@ -22,23 +22,49 @@ body { :root { --root-wrapper-width: 90rem; --menu-indicator-color: #ccc; -} - -// Dark overrides -// html[data-theme="dark"] {} + // Light theme + --code-foreground: #000000; + --code-background: #f3f3f3; + --code-border: #d1d1d1; + --code-token-keyword: #5a2cbc; + --code-token-constant: #1a7032; + --code-token-string: #d18c0c; + --code-token-comment: #7e7e7e; + --code-token-parameter: hsl(var(--foreground-light) / 1); + --code-token-function: #1a7032; + --code-token-string-expression: #f1a10d; + --code-token-punctuation: hsl(var(--foreground-light) / 1); + --code-token-link: hsl(var(--foreground-light) / 1); + --code-token-number: hsl(var(--foreground-light) / 1); + --code-token-property: rgb(105, 76, 156); + --code-highlight-color: #1c1c1c; +} -// Pages +pre { + border: 2px solid var(--code-border); +} -.home-page { - background-image: url(http://github.com/img/hero_grid_black_1.png); - background-repeat: no-repeat; - background-position: 100% 10%; - background-size: rem(350px); +// Dark overrides - &[data-theme="dark"] { - background-image: url(http://github.com/img/hero_grid_white_1.png); - } +html[data-theme="dark"] { + // Dark theme + --code-foreground: #fffff; + --code-background: #191919; + --code-border: #252525; + --code-token-keyword: #aca4ff; + --code-foreground: #ffffff; + --code-token-constant: #3ecf6e; + --code-token-string: #e7bb94; + --code-token-comment: #7e7e7e; + --code-token-parameter: #ffffff; + --code-token-function: #3ecf6e; + --code-token-string-expression: #ffcda1; + --code-token-punctuation: #ffffff; + --code-token-link: #ffffff; + --code-token-number: #ffffff; + --code-token-property: rgb(180, 148, 234); + --code-highlight-color: #232323; } // Layout @@ -139,6 +165,38 @@ body { // Sidebar menu .main-wrapper { + .menu__list { + .menu__list { + position: relative; + + &:before { + content: ""; + display: block; + width: rem(1px); + background: var(--docs-title-border); + position: absolute; + left: rem(15px); + top: 0; + bottom: 0; + } + + .menu__link--active:not(.menu__link--sublist) { + position: relative; + + &:before { + content: ""; + display: block; + width: rem(1px); + background: var(--ifm-color-primary); + position: absolute; + left: 0; + top: 0; + bottom: 0; + } + } + } + } + .menu { $self: &; @@ -149,14 +207,14 @@ body { font-size: rem(14px); &--active { - font-weight: bold; + font-weight: 500; } &--sublist { position: relative; + &.menu__link--active { color: var(--ifm-menu-color); - font-weight: bold; } &:after { @@ -184,7 +242,6 @@ body { .menu__link--sublist { &:after { transform: rotate(45deg); - // background: var(--menu-indicator-color); } } } @@ -192,18 +249,6 @@ body { ul { font-weight: 400; - > li { - ul { - padding-left: rem(10px); - margin-top: rem(10px); - margin-bottom: rem(10px); - li { - padding: rem(2px) 0; - margin: 0; - position: relative; - } - } - } } } } @@ -227,7 +272,6 @@ body { &:last-child { color: var(--ifm-color-primary); - opacity: 0.8; } &:not(:last-child):after { @@ -249,7 +293,7 @@ body { .theme-edit-this-page { color: var(--ifm-menu-color); - font-weight: 700; + font-weight: 500; font-size: 14px; // border-top: 1px solid var(--docs-title-border); @@ -308,7 +352,7 @@ body { } html[data-theme="dark"] & { - background-color: #202020; + background-color: #000000; border-color: rgb(56, 56, 56); } } diff --git a/src/css/fonts.scss b/src/css/fonts.scss index 0f85965..1319373 100644 --- a/src/css/fonts.scss +++ b/src/css/fonts.scss @@ -1 +1 @@ -@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700;800&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Funnel+Display:wght@300..800&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap"); diff --git a/src/css/infima-variables.scss b/src/css/infima-variables.scss index 06b563f..5358e18 100644 --- a/src/css/infima-variables.scss +++ b/src/css/infima-variables.scss @@ -1,20 +1,20 @@ // Custom vars :root { - --card-color: rgb(255, 255, 255, 0.8); + --card-color: rgb(255, 255, 255, 0.9); --card-border-color: #e8e8e8; --card-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); --card-box-shadow-highlight: 0 2px 25px rgba(31, 96, 233, 0.05); } html[data-theme="dark"] { - --card-color: rgb(29, 29, 29, 0.8); + --card-color: rgb(29, 29, 29, 0.4); --card-border-color: #313131; --card-box-shadow: 0 2px 25px rgba(238, 238, 238, 0.05); } :root { // Colors - --ifm-color-primary: rgb(31, 96, 233); + --ifm-color-primary: #00cd50; --ifm-color-primary-dark: #1554d8; --ifm-color-primary-darker: #144fcc; --ifm-color-primary-darkest: #1141a8; @@ -23,6 +23,10 @@ html[data-theme="dark"] { --ifm-color-primary-lightest: #6793f0; --ifm-color-secondary-contrast-background: rgb(236, 236, 236); + --ifm-color-info-dark: rgb(0, 205, 80); + --ifm-color-info-darker: rgb(7, 160, 66); + --ifm-color-info-darkest: rgb(4, 146, 59); + // Fonts --ifm-font-family-base: "Inter", system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, BlinkMacSystemFont, "Segoe UI", @@ -30,14 +34,16 @@ html[data-theme="dark"] { "Segoe UI Symbol"; --ifm-font-size-base: 1rem; --ifm-font-weight-bold: 800; + --ifm-heading-font-family: "Funnel Display", sans-serif; + --ifm-heading-font-weight: 400; // Base --ifm-global-radius: 0rem; // Code - --ifm-code-background: rgb(226, 226, 226); --ifm-code-font-size: 80%; + --ifm-code-border-radius: 0.5rem; --ifm-pre-padding: 1rem; --ifm-leading-desktop: 1.75; @@ -59,27 +65,30 @@ html[data-theme="dark"] { --docs-title-border: #e0e0e0; --ifm-alert-border-left-width: 2px; + --ifm-alert-border-radius: 0.5rem; /* Horizontal Rules. */ - // --ifm-breadcrumb-border-radius: 1.5rem; --ifm-breadcrumb-spacing: 0rem; --ifm-breadcrumb-color-active: inherit; --ifm-breadcrumb-item-background-active: transparent; - // --ifm-breadcrumb-padding-horizontal: 0.8rem; - // --ifm-breadcrumb-padding-vertical: 0.4rem; - // --ifm-breadcrumb-size-multiplier: 1; --ifm-breadcrumb-separator: none; - // --ifm-breadcrumb-separator-filter: none; - // --ifm-breadcrumb-separator-size: 0.5rem; - // --ifm-breadcrumb-separator-size-multiplier: 1.25; + --ifm-menu-color: var(--ifm-color-emphasis-700); + --ifm-menu-color-active: var(--ifm-color-primary); + + --ifm-color-info-contrast-background: rgb(255, 255, 255); + --ifm-color-info-contrast-foreground: rgb(0, 0, 0); } html[data-theme="dark"] { - --ifm-color-primary: #5087fd; - --ifm-background-color: #1d1d1d; + --ifm-color-primary: #00cd50; + --ifm-background-color: #000000; --ifm-background-surface-color: var(--ifm-background-color); --docs-title-border: #343434; --ifm-toc-border-color: transparent; + --ifm-menu-color: var(--ifm-color-emphasis-400); + + --ifm-color-info-contrast-background: rgb(0, 0, 0); + --ifm-color-info-contrast-foreground: rgb(255, 255, 255); } .markdown { diff --git a/src/pages/index.module.scss b/src/pages/index.module.scss index f896c2b..9e7b161 100644 --- a/src/pages/index.module.scss +++ b/src/pages/index.module.scss @@ -83,7 +83,7 @@ } img { - width: rem(40px); + width: rem(60px); margin-bottom: rem(10px); } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 1b54e53..c478aa9 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -27,19 +27,19 @@ const HomepageFeatures: FC<{}> = () => { const features = [ { link: "/defradb", - image: "./img/icon-defradb.svg", + image: "./img/product/defradb.svg", title: "DefraDB", subTitle: "Deploy decentralized databases", }, { link: "/sourcehub", - image: "./img/icon-sourcehub.svg", + image: "./img/product/sourcehub.svg", title: "SourceHub", - subTitle: "Build trust & interopability", + subTitle: "Build trust & interoperability", }, { link: "/orbis", - image: "./img/icon-orbis.svg", + image: "./img/product/orbis.svg", title: "Orbis", subTitle: "Distributed secrets management", } diff --git a/static/img/product/defradb.svg b/static/img/product/defradb.svg new file mode 100644 index 0000000..9594dd7 --- /dev/null +++ b/static/img/product/defradb.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/product/orbis.svg b/static/img/product/orbis.svg new file mode 100644 index 0000000..882b9f0 --- /dev/null +++ b/static/img/product/orbis.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/product/sourcehub.svg b/static/img/product/sourcehub.svg new file mode 100644 index 0000000..cd386e5 --- /dev/null +++ b/static/img/product/sourcehub.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/img/source-docs-logo-w_v2.svg b/static/img/source-docs-logo-w_v2.svg new file mode 100644 index 0000000..248bf49 --- /dev/null +++ b/static/img/source-docs-logo-w_v2.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/static/img/source-docs-logo_v2.svg b/static/img/source-docs-logo_v2.svg new file mode 100644 index 0000000..9144417 --- /dev/null +++ b/static/img/source-docs-logo_v2.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/static/img/source-logo-w_v2.svg b/static/img/source-logo-w_v2.svg new file mode 100644 index 0000000..fba581a --- /dev/null +++ b/static/img/source-logo-w_v2.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/static/img/source-logo_v2.svg b/static/img/source-logo_v2.svg new file mode 100644 index 0000000..82e4ddd --- /dev/null +++ b/static/img/source-logo_v2.svg @@ -0,0 +1,9 @@ + + + + + + + + + From 4ef3dfbc568b22cf1f341f0e6bc93d6aee2dea35 Mon Sep 17 00:00:00 2001 From: Quinn Purdy <49766546+BellringerQuinn@users.noreply.github.com> Date: Wed, 25 Jun 2025 13:49:53 -0400 Subject: [PATCH 34/48] =?UTF-8?q?Move=20key=20management=20setup=20higher?= =?UTF-8?q?=20up=20as=20it=20is=20required=20as=20part=20of=20setu?= =?UTF-8?q?=E2=80=A6=20(#166)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …p before we can start the defradb instance --- .gitignore | 1 + docs/defradb/getting-started.md | 54 ++++++++++++++++----------------- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index 65364c0..e81c415 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ yarn-error.log* # VSCode Settings .vscode +.history/ diff --git a/docs/defradb/getting-started.md b/docs/defradb/getting-started.md index e31d8af..9273bfa 100644 --- a/docs/defradb/getting-started.md +++ b/docs/defradb/getting-started.md @@ -30,34 +30,9 @@ export PATH=$PATH:$(go env GOPATH)/bin We recommend experimenting with queries using a native GraphQL client. [GraphiQL](https://altairgraphql.dev/#download) is a popular option. -## Start - -Start a node by executing: - -```bash -defradb start -``` - -Verify the local connection: - -```bash -defradb client collection describe -``` - -## Configuration - -DefraDB uses a default configuration: - -- Data directory: `~/.defradb/` -- GraphQL endpoint: `http://localhost:9181/api/v0/graphql` - -The `client` command interacts with the locally running node. - -The GraphQL endpoint can be used with a GraphQL client (e.g., Altair) to conveniently perform requests (`query`, `mutation`) and obtain schema introspection. Read more about [configuration options](./references/config.md). - -## Key Management +## Key Management - Initial Setup -DefraDB has a built-in keyring for storing private keys securely. Keys are loaded at startup, and a secret must be provided via the `DEFRA_KEYRING_SECRET` environment variable. The following keys are loaded from the keyring on start: +DefraDB has a built-in keyring for storing private keys securely. Keys are loaded at startup, and a secret must be provided via the `DEFRA_KEYRING_SECRET` environment variable. The following keys are loaded from the keyring on start: - `peer-key` Ed25519 private key (required) - `encryption-key` AES-128, AES-192, or AES-256 key (optional) @@ -85,6 +60,31 @@ defradb keyring --help NOTE: Node identity is an identity assigned to the node. It is used to exchange encryption keys with other nodes. +## Start + +Start a node by executing: + +```bash +defradb start +``` + +Verify the local connection: + +```bash +defradb client collection describe +``` + +## Configuration + +DefraDB uses a default configuration: + +- Data directory: `~/.defradb/` +- GraphQL endpoint: `http://localhost:9181/api/v0/graphql` + +The `client` command interacts with the locally running node. + +The GraphQL endpoint can be used with a GraphQL client (e.g., Altair) to conveniently perform requests (`query`, `mutation`) and obtain schema introspection. Read more about [configuration options](./references/config.md). + ## Add a schema type Define and add a schema type. From 1474c2e3efcf858d348e41452620c77ea837501a Mon Sep 17 00:00:00 2001 From: Quinn Purdy <49766546+BellringerQuinn@users.noreply.github.com> Date: Wed, 25 Jun 2025 13:50:08 -0400 Subject: [PATCH 35/48] =?UTF-8?q?Added=20a=20note=20in=20the=20readme=20th?= =?UTF-8?q?at=20the=20docusauraus=20docs=20are=20built=20using=20=E2=80=A6?= =?UTF-8?q?=20(#167)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …MDX syntax and linked to the syntax. This will make it easier for devs to get started updating the documentation --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 76ba42f..197673a 100644 --- a/README.md +++ b/README.md @@ -19,11 +19,12 @@ Most changes are reflected live without having to restart the server. This website is built using [Docusaurus 2](https://docusaurus.io/). +Documentation is written using [common markdown syntax](https://commonmark.org/help/) or [MDX syntax](https://mdxjs.com/docs/what-is-mdx/#mdx-syntax) - the file extension will determine the syntax (.md for common markdown and .mdx for MDX). + ## Deployment The website is automatically deployed using Cloudfare Pages. - ## Contributing Feedback and pull requests appreciated! \ No newline at end of file From d2d08d1679bb06e60662fc52e091719bded4f5ab Mon Sep 17 00:00:00 2001 From: Ashutosh Pradhan Date: Fri, 4 Jul 2025 23:52:00 +0530 Subject: [PATCH 36/48] Lens VM section (#168) Introduce LensVM to docs.source.network --------- Co-authored-by: pradhanashutosh Co-authored-by: John-Alan Simmons --- docs/lensvm/lens-vm.md | 146 ++++++++++++++++++++++++++++++++++ docusaurus.config.js | 7 ++ sidebars.js | 4 + src/pages/index.tsx | 6 ++ static/img/product/lensvm.svg | 5 ++ 5 files changed, 168 insertions(+) create mode 100644 docs/lensvm/lens-vm.md create mode 100644 static/img/product/lensvm.svg diff --git a/docs/lensvm/lens-vm.md b/docs/lensvm/lens-vm.md new file mode 100644 index 0000000..5e56fcd --- /dev/null +++ b/docs/lensvm/lens-vm.md @@ -0,0 +1,146 @@ +--- +sidebar_position: 1 +title: LensVM +slug: /lensvm +--- + +## Introduction + +LensVM is a bi-directional data transformation engine originally developed for DefraDB, now available as a standalone tool. It enables transforming data both forwards and in reverse directions using user-defined modules called Lenses, which are compiled to WebAssembly (WASM). Each Lens runs inside a secure, sandboxed WASM environment, enabling safe and modular pipelines, even when composed from multiple sources. + +This guide provides the foundational steps for writing and composing Lenses using the LensVM framework. It includes examples for Rust-based Lenses using the official SDK, as well as lower-level implementations without the SDK in other languages. + +## Before you begin + +Before getting started, ensure the following are installed: + +- [Golang](https://golang.google.cn/doc/install) (required to run the Lens engine) +- WASM-compatible compiler: Choose a compiler that targets the `wasm32-unknown` architecture, based on your preferred programming language. + +**Note**: The LensVM Engine executes Lenses in isolated WASM environments. It manages data flow, memory allocation, and function calls between the host application and the Lens module. + +## Writing lenses + +Lenses can be authored in any language that compiles to valid WebAssembly. To interface with the LensVM engine, each Lens must implement a specific set of exported and imported functions. + +### Required and optional functions + +Each Lens must implement the following interface: + +| Function | Type | Required | Description | +|:-----------------------|:----------|:---------|:------------| +| `alloc(unsigned64)` | Exported | Yes | Allocates memory for LensVM to store input data. | +| `next() -> unsigned8` | Imported | Yes | Retrieves the next input item from the LensVM engine. | +| `set_param(unsigned8) -> unsigned8` | Exported | No | (Optional) Accepts configuration data before input processing begins. | +| `transform() -> unsigned8` | Exported | Yes | Core transformation function. Applies logic to one or more inputs and returns the output. | +| `inverse() -> unsigned8` | Exported | No | (Optional) Performs reverse transformation using the same interface as `transform()`. | + +### WASM data format + +LensVM communicates with Lenses using a binary format across the WASM boundary. The format is as follows: + +```json + +[TypeId][Length][Payload] +``` + +- **TypeId**: A signed 8-byte integer +- **Length**: An optional unsigned 32-byte integer, depending on the TypeId +- **Payload**: Raw binary or serialized data (e.g., JSON) + +#### TypeId Values + +| TypeId | Meaning | Notes | +|:-------|:--------------------|:------| +| `-1` | Error | May include an error message in the Payload. | +| `0` | Nil | No `Length` or `Payload`. | +| `1` | JSON | Payload contains a JSON-serialized object. | +| `127` | End of Stream | Signals that there are no more items to process. | + +### Developing with the Rust SDK + +To simplify development, LensVM provides a [Rust SDK](https://docs.rs/lens_sdk). It abstracts much of the boilerplate required to build Lenses, allowing you to focus on transformation logic. + +The SDK: + +- Implements the required interface automatically +- Handles safe memory and data exchange across the WASM boundary +- Provides helpful macros and utilities for Lens definition + +You can find it on [crates.io](https://crates.io/crates/lens_sdk) and in the official [GitHub repository](https://github.com/lens-vm/lens). + +### Example Lenses + +Example Lenses written in: + +- [Rust](https://www.rust-lang.org/) +- [AssemblyScript](https://www.assemblyscript.org/) + +can be found in this repository and in [DefraDB](https://github.com/sourcenetwork/defradb). + +## Basic Lens Example + +The easiest way to get started writing a Lens is by using Rust, thanks to the [`lens_sdk`](https://docs.rs/lens_sdk) crate, which provides helpful macros and utilities for Lens development. + +A minimal example is shown in the [`define!` macro documentation](https://docs.rs/lens_sdk/latest/lens_sdk/macro.define.html#examples). This example demonstrates a simple forward transformation that iterates through input documents and increments the `age` field by 1. + +## Writing a Lens using the SDK + +Writing a Lens with the Rust SDK is straightforward and well-documented. The examples provided in the [`lens_sdk` documentation](https://docs.rs/lens_sdk) build progressively: + +- **Example 1:** A minimal forward transformation using the `define!` macro. +- **Example 2:** Adds parameters and an inverse function to demonstrate bi-directional transformations. + +For more advanced examples, refer to the following repositories: + +- [Lens test modules](https://github.com/lens-vm/lens/blob/main/tests/modules) +- [DefraDB lens tests](https://github.com/sourcenetwork/defradb/tree/develop/tests/lenses) + +These cover schema-aware transformations, reversible pipelines, and other real-world use cases. + +## Writing a Lens without the SDK + +Creating a Lens without the Rust SDK is intended for advanced use cases—such as developing in non-Rust languages or needing fine-grained control over serialization and transformation behavior. + +Currently, the only working non-Rust example is written in [AssemblyScript](https://www.assemblyscript.org/introduction.html): + +- [AssemblyScript Lens Example](https://github.com/lens-vm/lens/blob/main/tests/modules/as_wasm32_simple/assembly/index.ts) + +This approach requires: + +- Manual implementation of memory allocation and serialization +- A deep understanding of the LensVM protocol +- Proficiency in AssemblyScript (or your chosen language) + +> **Recommendation:** For most users, we strongly recommend using the [Rust SDK](https://docs.rs/lens_sdk), even partially. It can significantly reduce development time and complexity. You can start with full SDK support and incrementally replace parts with custom logic as needed. + +## Composing Lenses + +Lenses can be composed into pipelines using the Go `config` sub-package: + +- [Go Config Package](https://github.com/lens-vm/lens/tree/main/host-go/config) + +Pipeline composition is handled via the `model.Lens` type: + +- [`model.Lens` Definition](https://github.com/lens-vm/lens/blob/main/host-go/config/model/lens.go) + +You can compose pipelines either by: + +- Supplying a `model.Lens` object directly +- Referencing a JSON configuration file (from local storage or a URL) that conforms to the `model.Lens` schema + +> **Note:** Composing Lenses does **not** execute them. Instead, it builds an enumerable pipeline object, which you can then iterate over to apply transformations. + +You can extend this enumerable pipeline by: + +- Adding additional Lenses through the `config` package +- Chaining in native Go-based enumerables for advanced customization + +### Composition Examples + +For practical examples of pipeline composition, explore the following: + +- [Go engine tests](https://github.com/lens-vm/lens/tree/main/host-go/engine/tests) +- [CLI integration tests](https://github.com/lens-vm/lens/tree/main/tests/integration/cli) + +These examples demonstrate how to build and extend Lens pipelines declaratively for various environments and workflows. diff --git a/docusaurus.config.js b/docusaurus.config.js index a334ba1..c6018dd 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -86,6 +86,13 @@ const config = { label: "Orbis", className: "header-docs-link-orbis", }, + { + type: "docSidebar", + position: "left", + sidebarId: "lensvmSidebar", + label: "LensVM", + className: "header-docs-link-lensvm", + }, { href: "https://github.com/sourcenetwork/docs.source.network", "aria-label": "GitHub repository", diff --git a/sidebars.js b/sidebars.js index 62dfc07..6384372 100644 --- a/sidebars.js +++ b/sidebars.js @@ -33,6 +33,10 @@ const sidebars = { type: "autogenerated", dirName: "orbis" }], + lensvmSidebar: [{ + type: "autogenerated", + dirName: "lensvm" + }] // But you can create a sidebar manually /* diff --git a/src/pages/index.tsx b/src/pages/index.tsx index c478aa9..a0f6217 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -42,6 +42,12 @@ const HomepageFeatures: FC<{}> = () => { image: "./img/product/orbis.svg", title: "Orbis", subTitle: "Distributed secrets management", + }, + { + link: "/lensvm", + image: "./img/product/lensvm.svg", + title: "LensVM", + subTitle: "Bidirectional data transformation", } ] diff --git a/static/img/product/lensvm.svg b/static/img/product/lensvm.svg new file mode 100644 index 0000000..4e9664e --- /dev/null +++ b/static/img/product/lensvm.svg @@ -0,0 +1,5 @@ + + + + + From 4371d677f0d015da7c95d480706a1aa03f6ffa14 Mon Sep 17 00:00:00 2001 From: Ashutosh Pradhan Date: Sat, 5 Jul 2025 00:06:44 +0530 Subject: [PATCH 37/48] added updates to lensvm (#169) Co-authored-by: pradhanashutosh --- docs/lensvm/lens-vm.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/lensvm/lens-vm.md b/docs/lensvm/lens-vm.md index 5e56fcd..23bc89b 100644 --- a/docs/lensvm/lens-vm.md +++ b/docs/lensvm/lens-vm.md @@ -29,11 +29,11 @@ Each Lens must implement the following interface: | Function | Type | Required | Description | |:-----------------------|:----------|:---------|:------------| -| `alloc(unsigned64)` | Exported | Yes | Allocates memory for LensVM to store input data. | -| `next() -> unsigned8` | Imported | Yes | Retrieves the next input item from the LensVM engine. | -| `set_param(unsigned8) -> unsigned8` | Exported | No | (Optional) Accepts configuration data before input processing begins. | -| `transform() -> unsigned8` | Exported | Yes | Core transformation function. Applies logic to one or more inputs and returns the output. | -| `inverse() -> unsigned8` | Exported | No | (Optional) Performs reverse transformation using the same interface as `transform()`. | +| `alloc(unsigned64)` | Exported | Yes | Allocates a memory block of the given size. Called by the LensVM engine. | +| `next() -> unsigned8` | Imported | Yes | Called by the Lens to retrieve a pointer to the next input data item from the engine. | +| `set_param(unsigned8) -> unsigned8` | Exported | No | Accepts static configuration data at initialization. Receives a pointer to the config and returns a pointer to an OK or error response. Called once before any input is processed. | +| `transform() -> unsigned8` | Exported | Yes | Core transformation logic. Pulls zero or more inputs using `next()`, applies transformation, and returns a pointer to a single output item. Supports stateful transformations. | +| `inverse() -> unsigned8` | Exported | No | Optional reverse transformation logic, same interface as `transform()`. | ### WASM data format From f4e5e91f6e5e445226edbff21d8078141720e46a Mon Sep 17 00:00:00 2001 From: Ashutosh Pradhan Date: Tue, 23 Sep 2025 14:56:00 -0700 Subject: [PATCH 38/48] Add CAS document (#170) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Create document on the following guidelines: - What is Content-Addressable Storage?
 Intro to CAS, why it matters, and how it’s different from location-based storage. - How DefraDB Uses CAS
 Explain IPLD, Merkle DAGs, and hash-based addressing in plain language. How records are stored/retrieved. - Why It Matters
 Benefits to be detailed - CAS in Action
 Walk through a practical example: storing data, retrieving it by hash, and how updates flow across peers. - How It Connects
 show how CAS underpins CRDTs, synchronization, and offline-first patterns. --------- Co-authored-by: Fred Carle --- .../guides/content-addressable-storage.md | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 docs/defradb/guides/content-addressable-storage.md diff --git a/docs/defradb/guides/content-addressable-storage.md b/docs/defradb/guides/content-addressable-storage.md new file mode 100644 index 0000000..0d0e44c --- /dev/null +++ b/docs/defradb/guides/content-addressable-storage.md @@ -0,0 +1,98 @@ +--- +sidebar_label: Content Addressable Storage +sidebar_position: 80 +--- + +# Content Addressable Storage + +## Overview + +Content-Addressable Storage (CAS) is a way to store data that works differently from what you might be used to. Normally, when you save something on your computer or online, you find it by where it is stored, like a file path or a website address. But with CAS, each piece of data gets its own special ID based on what it actually is. + +This special ID comes from running the data through a hash function, which turns it into a unique digest. If the data changes even a little, the digest changes too. Content-addressable storage can tell if someone tried to change or mess with the data. It also saves space because if two pieces of data are exactly the same, it stores that data only once. + +This method matters because it helps keep data safe and trustworthy. It makes it easy to track different versions over time and works well in systems where many computers share data with each other. + +## How DefraDB uses CAS + +DefraDB’s data model is built on IPLD (InterPlanetary Linked Data), which connects and represents data using Merkle Directed Acyclic Graphs (Merkle DAGs) and hash-based addressing. Here’s what these terms mean in simple language: + +* **IPLD**: This is a way to represent and connect data across distributed systems using hashes. It makes data universally linkable and verifiable. + +* **Merkle DAGs**: In DefraDB, every document and every update is a node in a Merkle DAG. Each change creates a “commit,” similar to Git. The commit has its own hash and also links back to earlier commits by their hashes. + +* **Hash-based addressing**: Each version of a document, or even a field update, is given a unique identifier called a CID (Content Identifier). The CID is generated from the content itself, so if the content changes, the CID changes too. + +* **Storage and retrieval**: When you create or update a document, DefraDB saves the difference (the part that changed) and assigns it a CID. To fetch the data, a user or peer asks for the CID. The system then finds the content and verifies it by recalculating the hash. + +## Why it matters + +Using CAS in DefraDB brings many benefits that make data safer, easier to manage, and more flexible. + +* **Immutability and auditability**: Every time you change a document, DefraDB records that update permanently. You can always see what happened and when, making the data trustworthy. + +* **Deduplication**: DefraDB stores only one copy of identical data because it identifies data by its content. This saves space and makes storage efficient. + +* **Tamper-evidence**: If someone changes data without permission, the content hash stops matching. DefraDB can detect this easily. + +* **Peer-to-peer friendly**: CAS works well when many computers share data directly. DefraDB syncs updates quickly, even when offline or on weak networks. + +* **Efficient versioning**: DefraDB saves every change with its own ID. You can go back to any earlier version of the data, making “time travel” through history possible. + +## CAS in Action + +Here’s how it works step by step: + +* **Storing data**: When you create a new document, like a user profile, DefraDB calculates a unique digest called a CID by hashing the document content. The CID becomes the document’s permanent ID. DefraDB stores the document under that CID. If two documents have the same content, then they share the same CID and DefraDB stores the data only once. + +* **Updating data**: When you change a document, DefraDB does not replace the old data. It saves the update as a separate new node, linking it to the previous version and forming a chain called a Merkle DAG. Each update gets its own CID representing a new version. DefraDB keeps the full change history this way. + +## Synchronization Process + +Content-addressable storage gives DefraDB a strong foundation to manage data across devices, users, and network conditions. Here is how it supports key features step by step: + +### Supporting CRDTs for Conflict-free Collaboration + +DefraDB implements **Merkle CRDTs**, a specialized type of Conflict-free Replicated Data Type that combines traditional CRDT merge semantics with Merkle DAGs for efficient distributed collaboration: + +**Merkle Clock Implementation:** + +1. Each document change creates a new node in the Merkle DAG with a unique CID and a height value (incremental counter) +2. The Merkle clock uses the inherent causality of the DAG structure—since node A's CID is embedded in node B, A must exist before B +3. This eliminates the need to maintain per-peer metadata, making DefraDB efficient in high-churn networks with unlimited peers + +**Delta State CRDT Semantics:** + +1. DefraDB uses delta state-based CRDTs that only transmit the minimum "delta" needed to transform one state to another +2. Instead of sending entire document states, only the changed portion (like adding "banana" to a fruit set) is transmitted +3. This hybrid approach provides the benefits of both operation-based (small message size) and state-based (reliable delivery) CRDTs + +**Branching and Merging:** + +1. When peers make concurrent edits, the Merkle DAG naturally branches into independent states +2. Each branch maintains its own valid history until synchronization occurs +3. Merging creates a new "merge node" with multiple parents, applying CRDT-specific merge semantics +4. The system finds common ancestral nodes using height parameters and CIDs to resolve conflicts deterministically + +**Conflict Resolution Process:** + +1. When conflicts occur, DefraDB traverses both branches back to their common ancestor +2. The embedded CRDT type (register, counter, set, etc.) defines the specific merge rules +3. All changes are preserved in the final merged state, ensuring no data loss +4. The resulting merge maintains the DAG structure and provides a new canonical head + +### Enabling Efficient Synchronization Across Peers + +1. Peers exchange CIDs representing the latest document versions. +1. Compare received CIDs with its own and requests only missing data. +1. Verify data by recalculating the hash and matching it to the CID. Peers reject any data that does not match. +1. Verified data is added to the local Merkle DAG to update the document history. + +### Making Offline-First Work Smoothly + +1. Users make changes locally even without internet. Each update gets a new CID and joins the local Merkle DAG. +1. When online again, devices share new CIDs and sync changes. +1. DefraDB merges updates from different peers using CRDT rules using full change histories. +1. This process ensures all peers arrive at the same up-to-date data without conflicts or loss. + +Overall, content-addressable storage lets DefraDB create reliable, easy-to-sync, and conflict-free data systems that work online and offline. From aeb58973d5eea00e614009cd5fef05bd9da588c6 Mon Sep 17 00:00:00 2001 From: Ashutosh Pradhan Date: Tue, 23 Sep 2025 15:18:09 -0700 Subject: [PATCH 39/48] Update content-addressable-storage.md (#172) --- docs/defradb/guides/content-addressable-storage.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/defradb/guides/content-addressable-storage.md b/docs/defradb/guides/content-addressable-storage.md index 0d0e44c..97dfa87 100644 --- a/docs/defradb/guides/content-addressable-storage.md +++ b/docs/defradb/guides/content-addressable-storage.md @@ -88,7 +88,7 @@ DefraDB implements **Merkle CRDTs**, a specialized type of Conflict-free Replica 1. Verify data by recalculating the hash and matching it to the CID. Peers reject any data that does not match. 1. Verified data is added to the local Merkle DAG to update the document history. -### Making Offline-First Work Smoothly +### Making Offline-first Work Smoothly 1. Users make changes locally even without internet. Each update gets a new CID and joins the local Merkle DAG. 1. When online again, devices share new CIDs and sync changes. From 716ff2760bafc0c67dba069cc2ab6a710da33803 Mon Sep 17 00:00:00 2001 From: Ashutosh Pradhan Date: Tue, 23 Sep 2025 16:52:09 -0700 Subject: [PATCH 40/48] Update Merkle CRDT document (#171) Source: https://docs.google.com/document/d/1_IEYmo5hMG97Uh0JZHiHmbjgjHLQOkUY3CoO0uVC0Ss/edit?tab=t.0 reviewed and approved by all SMEs --- docs/defradb/guides/merkle-crdt.md | 60 ++++++++++++++---------------- 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/docs/defradb/guides/merkle-crdt.md b/docs/defradb/guides/merkle-crdt.md index 150e35f..a4c20ea 100644 --- a/docs/defradb/guides/merkle-crdt.md +++ b/docs/defradb/guides/merkle-crdt.md @@ -5,63 +5,57 @@ sidebar_position: 30 # A Guide to Merkle CRDTs in DefraDB ## Overview -Merkle CRDTs are a type of Conflict-free Replicated Data Type (CRDT). They are designed to update or modify independent sets of data without any human intervention, ensuring that updates made by multiple actors are merged without conflicts. The goal of Merkle CRDT is to perform deterministic, automatic data merging and synchronization without any inconsistencies. CRDTs were first formalized in 2011 and have become a useful tool in distributed computing. Merkle CRDTs are a new kind of CRDT that allows data to be merged without conflicts, ensuring that data is deterministically synchronized across multiple actors. This can be useful in a variety of distributed computing applications where data needs to be updated and merged in a consistent and conflict-free manner. -## Background on Regular CRDTs -Conflict-free Replicated Data Types (CRDTs) are a useful tool in local and offline-first applications. They allow multiple actors or peers to collaborate and update the state of a data structure without worrying about synchronizing that state. CRDTs come in many different forms and can be applied to a variety of data types, such as simple registers, counters, sets, lists, and maps. The key feature of CRDTs is their ability to merge data deterministically, ensuring that all actors eventually reach the same state. +Merkle CRDTs are a type of Conflict-free Replicated Data Type (CRDT). They are designed to support independent updates across multiple peers and to merge those updates automatically without conflicts. The goal is to achieve deterministic, automatic data synchronization while maintaining consistency. [CRDTs](https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type) were first formalized in 2011 and have become an important tool in distributed computing. This approach is particularly useful in distributed applications where data must be updated and merged consistently across many actors, such as peer-to-peer networks or offline-first systems. -To achieve this, CRDTs rely on the concept of causality or ordering of events. This determines how the merge algorithm works and ensures that if all events or updates are applied to a data type, the resulting state will be the same for all actors. In distributed systems, however, the concept of time and causality can be more complex than it appears. This is because it is often difficult to determine the relative order of events occurring on different computers in a network. As a result, CRDTs often rely on some sort of clock or a different mechanism for tracking the relative order of events. +## Concepts -## Need for CRDTs +### Regular CRDTs -It can be difficult to determine the relative order of events occurring on different computers in a network, which is why CRDTs can enable the user to ensure data can be merged without conflicts. For example, consider a situation where two actors, A and B, are making updates to the same data at the same time. If actor A stamps their update with a system time of 2:39:56 PM EST on September 6, 2022, and actor B stamps their update with a system time of 2:40:00 PM, it would look like actor B's update occurred after actor A's. However, system times are not always reliable because they can be easily changed by actors, leading to inconsistencies in the relative order of events. To solve this problem, distributed systems use alternative clocks such as logical clocks or vector clocks to track the causality of events. +Conflict-free Replicated Data Types (CRDTs) allow peers to collaborate and update data structures without explicit synchronization. They can be applied to registers, counters, sets, lists, maps, and much more. +The key feature of CRDTs is deterministic merging. In other words, they always merge updates in a predictable way. No matter the order in which updates arrive, all peers eventually agree on the same final state. To make this possible, CRDTs keep track of when events happen, often using logical or vector clocks. These clocks store metadata for each peer, but this becomes inefficient when the number of peers is very large or constantly changing. -To track the relative causality of events, CRDTs often rely on clocks such as logical clocks or vector clocks. However, these clocks have limitations when used in high-churn networks with a large number of peers. For example, in a peer-to-peer network with a high rate of churn, logical and vector clocks require additional metadata for each peer that an actor interacts with. This metadata must be constantly maintained for each peer, which can be inefficient if the number of peers is unbounded. Additionally, in high churn environments, the amount of metadata grows linearly with the churn rate, making it infeasible to use these clocks in certain situations. Therefore, existing CRDT clock implementations may not be sufficient for use in high churn networks with an unbounded number of peers. +### Limitations with Ordering -## Formalization of Merkle CRDT +In distributed systems, it is difficult to know the exact order of events across different machines. System clocks may not match, or they can even be manipulated, which leads to inconsistencies. -Merkle CRDTs are a type of CRDT that combines traditional CRDTs with a new approach to CRDT clocks called a Merkle clock. This clock allows us to solve the issue of maintaining a constant amount of metadata per peer in a high churn network. Instead of tracking this metadata, we can use the inherent causality of Merkle DAGs (Directed Acyclic Graphs). In these graphs, each node is identified using its content identifiable data (CID) and is embedded in another node. The edges in these graphs are directed, meaning one node points to another, forming a DAG structure. If a node points to another node, the CID of the first node is embedded in the value of the second. The inherent nature of Merkle graphs is the embedded relation of hashing or CIDs from one node to another, providing us with useful properties. +Merkle CRDTs solve this by building causality directly into the structure of a Merkle Directed Acyclic Graph (Merkle DAG). This removes the need to maintain separate metadata for every peer, making the system more scalable. +## Formalization of Merkle CRDTs -To create a Merkle CRDT, we take an existing Merkle clock and embed any CRDT that satisfies the requirements. A CRDT is made up of three components: the data type, the CRDT type (operation-based or state-based), and the semantic type. For our specific implementation, we use delta state based CRDTs with different data types and semantic types for different applications. The formal structure of a CRDT is simple - it consists of a Merkle CRDT outer box containing two inner boxes, a Merkle clock and a regular CRDT. +A Merkle CRDT is built by combining a Merkle clock with a standard CRDT. The Merkle DAG ensures causality through its structure: every node includes the hash of its parent, so a new node cannot exist without its predecessor. This creates a verifiable, tamper-resistant chain of updates. +Merkle CRDT includes: +- **Merkle clock** – provides causality and ordering of events. +- **Embedded CRDT** – manages the type of data structure and the rules for merging updates. -## Merkle Clock +### Merkle Clock -Merkle clocks are a type of clock used in distributed systems to solve the issue of tracking metadata for each peer that an actor interacts with. They are based on Merkle DAGs that function like hash chains, similar to a blockchain. These graphs are made up of nodes and edges, where the edges are directed, meaning that one node points to another. The head of a Merkle DAG is the most recent node added to the graph, and the entire graph can be referred to by the CID of the head node. The size of the CID hash does not grow with the number of nodes in the graph, making it a useful tool for high churn networks with a large number of peers. +A Merkle clock uses the properties of Merkle DAGs, similar to blockchains. Each new node contains the identifier of its parent, creating a cryptographically verifiable chain of events that cannot be altered without detection. -The Merkle clock is created by adding an additional metadata field to each node of the Merkle DAG, called the height value, which acts as an incremental counter that increases with each new node added to the system. This allows the Merkle clock to provide a rough sense of causality, meaning that it can determine if one event happened before, at the same time, or after another event. The inherent causality of the Merkle DAG ensures that events are recorded in the correct order, making it a useful tool for tracking changes in a distributed system. +Each node also records a height value, which acts like a counter. This makes it easier to tell whether one event happened before, after, or at the same time as another. -The embedding of CID into the parent node that produces the hash chain provides a causality guarantee that, for example a B is pointed to by node A, node C is pointed to by node B and so on till the node Z, A had to exist before B, because the value of A is embedded inside B, and B could not exist before A, otherwise it would result in breaking the causality of time because the value of A is embedded inside the value of B which then gets embedded inside the value of C, which means that C has to come after B and so on, all the way till the user gets back to Z. And hence if the user has constructed a Merkle DAG correctly, then A has to happen before B, B has to happen before C, C has to happen before D, all the way until they get to Z. This inherent causality of time with respect to CIDs and Merkle DAG provides the user with a causality-adhering system. +With these properties, a Merkle clock ensures that causality is always preserved and that the history of updates cannot be forged or tampered with. ## Delta State Semantics -There are two types of Delta State Semantics: Operation-Based CRDTs and State-Based CRDTs. Operation-Based CRDTs use the intent of an operation as the body or content of the message, while State-Based CRDTs use the resulting state as the body or content of the message. Both have their own advantages and disadvantages, and the appropriate choice depends on the specific use case. Operation-Based CRDTs express actions such as setting a value to 10 or incrementing a counter by 4 through the intent of the operation. State-Based CRDTs, on the other hand, include the resulting state in the message. For example, a message to set a value to 10 would include the value 10 as the body or content of the message. +There are two main ways to represent changes in CRDTs: operation-based and state-based. -Operation-Based CRDTs tend to be smaller because their messages only contain the operation being performed, while State-Based CRDTs are larger because their messages contain both the current state and the state being changed. It is important to consider the trade-offs between these two types of Delta State Semantics when choosing which one to use in a given situation. +- **Operation-based CRDTs** send the intent of an action as the message. For example, “set the value to 10” or “increment the counter by 4.” These messages are usually small because they only contain the operation being performed. +- **State-based CRDTs** send the full resulting state as the message. For example, to set a value to 10, the message would contain the value 10 as the content. These messages are larger because they include both the current state and the change. -Delta State Semantics is an optimization of the State-based CRDTs. While both Operation-based CRDTs and State-based CRDTs have their own pros and cons, Delta State CRDTs offer a hybrid approach that uses the state as the message content, but with the same size as an operation. +Both approaches work, but each has trade-offs. Operation-based CRDTs are compact but depend on reliable delivery of every operation. State-based CRDTs are easier to reason about but become inefficient as the state grows. -In a Delta State CRDT, the message body includes only the minimum amount, or "delta," necessary to transform the previous state to the target state. For example, if we have a set of nine fruit names, and we want to add a banana to the set, the Delta State CRDT would only include the delta, or the value "banana," rather than expressing the entire set of 10 fruit names as in traditional State-based CRDTs. This is like an operation because it has the size of only one action, but it expresses the difference in state between the previous and target rather than the intent of the action. +**Delta State CRDTs** combine the strengths of both. Instead of sending either the full operation or the full state, they only send the minimum change needed to move from one state to another. This small change is called a delta. +For example, if there is a set of nine fruit names and you add “banana,” the delta message contains only the word “banana.” It does not resend the entire set of ten fruits. In this way, the message is as small as an operation-based CRDT but still captures the actual difference in state, like a state-based CRDT. -## Branching and Merging State +This hybrid model is efficient and expressive, making it a practical choice for distributed systems where both bandwidth and consistency are important. +## Branching and Merging -### Branching of Merkle CRDTs - - -Merkle CRDTs are based on the concept of a Merkle clock, which is in turn based on the idea of a Merkle DAG. The structure of a Merkle DAG allows it to branch and merge at any point, as long as it adheres to the requirement of being a DAG and does not create a recursive loop. - - -Branching in a Merkle CRDT system occurs when two peers make independent changes to a common ancestor node and then share those changes, resulting in two distinct states. Neither of these states is considered the correct or canonical version in a Merkle CRDT system. Instead, both are treated as their own local main copies. From these divergent states, further updates can be made, causing the divergence to increase. For example, if there are 10 nodes in common between the two states, one branch may have five new nodes while the other has six. These branches exist independently of each other, and changes can be made to each branch independently without the need for immediate synchronization. This makes CRDTs useful for local-first or offline-first applications that can operate without network connectivity. The structure of a Merkle DAG, on which a Merkle CRDT is based, naturally supports branching. - -### Merging of Merkle CRDTs - -Merging in a Merkle CRDT system involves bringing two divergent states back together into a single, canonical graph. This is done by adding a new head node, known as a merge node, to the history of the graph. The merge node has two or more previous parents, as opposed to the traditional single parent of most nodes. To merge these states, merge semantics must be applied to the new system. The Merkle clock provides two pieces of information that facilitate this process: the use of a CID for each parent and the ability to go back in time through both branches of the divergent state, parent by parent, before officially merging the state. Each type of CRDT defines its own merge semantics. - - -The process begins by finding a common ancestral node between the two divergent states. Each node in the system includes a height parameter, which is the number of nodes preceding it. This, along with the CID of the ancestral node, is provided to the embedded CRDT's merge system to facilitate the merging process. The Merkle CRDT coordinates the logistics of the Merkle DAG and passes information about the multiple parents of the merge node to the embedded CRDT's merge system, which is responsible for defining the merge semantics. As long as the CRDT and the Merkle DAG are functioning correctly, the resulting Merkle clock will also operate correctly. +Merkle CRDTs naturally support branching. When two peers update the same ancestor independently, their updates form separate branches. Each peer treats its branch as the main state, without requiring immediate resolution. This makes the system ideal for offline-first applications. +Merging occurs when branches are brought back together. A merge node is created with multiple parents, and the embedded CRDT defines how to resolve differences between the branches. The Merkle clock ensures that the process respects causality, while the CRDT ensures that the merged state is valid and consistent. From 98befbd0a93b7ca3f5902939640fec6f125f7667 Mon Sep 17 00:00:00 2001 From: David Turner Date: Tue, 30 Sep 2025 17:13:50 -0400 Subject: [PATCH 41/48] Add search (#174) --- docusaurus.config.js | 5 ++ src/css/custom.scss | 108 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) diff --git a/docusaurus.config.js b/docusaurus.config.js index c6018dd..80c1124 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -158,6 +158,11 @@ const config = { prism: { theme: variableCodeTheme, }, + algolia: { + appId: "N3M9YBYYQY", + apiKey: "909584ed5214e2d24ae2a85a5cd8664a", + indexName: "source-docs", + }, }), plugins: [ [ diff --git a/src/css/custom.scss b/src/css/custom.scss index f71d68b..9d90e95 100644 --- a/src/css/custom.scss +++ b/src/css/custom.scss @@ -409,3 +409,111 @@ html[data-theme="dark"] { display: none; } } + +// Search + +body .DocSearch { + --docsearch-modal-width: 800px; + + &-Button { + margin-left: 1rem; + } + + &-Search-Icon { + height: 1rem; + } + + &-Hit { + &-source { + font-family: "Funnel Display", sans-serif; + color: white; + } + &[aria-selected="true"] a { + background-color: var(--docsearch-hit-background-active); + } + } + + &-Logo { + filter: grayscale(100%); + } +} + +.search-page-wrapper { + --ifm-toc-border-color: var(--docs-title-border); + + a[aria-label="Search by Algolia"] { + opacity: 0.5; + filter: grayscale(100%); + } + + main { + --ifm-h2-font-size: 1rem; + + article { + border-top: 1px solid var(--docs-title-border); + + a { + color: inherit; + } + } + + .breadcrumbs { + margin: 0; + + &__item { + &:after { + padding: 0 0.5rem; + } + + &:first-child { + display: inline-block; + } + } + } + } +} + +[data-theme="light"] .DocSearch { + /* --docsearch-primary-color: var(--ifm-color-primary); */ + /* --docsearch-text-color: var(--ifm-font-color-base); */ + --docsearch-muted-color: var(--ifm-color-secondary-darkest); + --docsearch-container-background: rgba(94, 100, 112, 0.7); + /* Modal */ + --docsearch-modal-background: var(--ifm-color-secondary-lighter); + /* Search box */ + --docsearch-searchbox-background: var(--ifm-color-secondary); + --docsearch-searchbox-focus-background: var(--ifm-color-white); + /* Hit */ + --docsearch-hit-color: var(--ifm-font-color-base); + --docsearch-hit-active-color: var(--ifm-color-white); + --docsearch-hit-background: var(--ifm-color-white); + --docsearch-hit-background-active: rgba(94, 100, 112, 0.7); + /* Footer */ + --docsearch-footer-background: var(--ifm-color-white); +} + +[data-theme="dark"] .DocSearch { + --docsearch-text-color: var(--ifm-font-color-base); + --docsearch-muted-color: var(--ifm-color-secondary-darkest); + --docsearch-container-background: rgba(24, 24, 24, 0.7); + --docsearch-highlight-color: var(--ifm-color-primary); + + /* 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(--ifm-color-white); + --docsearch-hit-background: var(--ifm-color-emphasis-100); + --docsearch-hit-background-active: rgba(124, 124, 124, 0.7); + + /* 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% + ); +} From 32dff8bf0a7e5952f8a9f06b300eb8b7361c7a06 Mon Sep 17 00:00:00 2001 From: Ashutosh Pradhan Date: Fri, 10 Oct 2025 17:03:49 -0700 Subject: [PATCH 42/48] added many-to-many (#175) Co-authored-by: John-Alan Simmons --- .../query-specification/relationships.md | 114 ++++++++++++++++-- 1 file changed, 106 insertions(+), 8 deletions(-) diff --git a/docs/defradb/references/query-specification/relationships.md b/docs/defradb/references/query-specification/relationships.md index bfecbf3..b17f667 100644 --- a/docs/defradb/references/query-specification/relationships.md +++ b/docs/defradb/references/query-specification/relationships.md @@ -8,7 +8,8 @@ DefraDB supports a number of common relational models that an application may ne Relationships are defined through the Document Schemas, using a series of GraphQL directives, and inferencing. They are always defined on both sides of the relation, meaning both objects involved in the relationship. -#### One-to-One +## One-to-One + The simplest relationship is a "one-to-one" which directly maps one document to another. The code below defines a one-to-one relationship between the `Author` and their `Address`: ```graphql @@ -27,6 +28,7 @@ type Address { ``` The types of both objects are included and DefraDB infers the relationship. As a result: + - Both objects which can be queried separately. - Each object provides field level access to its related object. @@ -34,7 +36,8 @@ The notable distinction of "one-to-one" relationships is that only the DocKey of On the other hand, if you simply embed the Address within the Author type without the internal relational system, you can include the `@embed` directive, which will embed it within. Objects embedded inside another using the `@embed` directive do not expose a query endpoint, so they can *only* be accessed through their parent object. Additionally they are not assigned a DocKey. -#### One-to-Many +## One-to-Many + A "one-to-many" relationship allows us to relate several objects of one type, to a single instance of another. Let us define a one-to-many relationship between an author and their books below. This example differs from the above relationship example because we relate the author to an array of books, instead of a single address. @@ -55,22 +58,117 @@ type Book { In this case, the books object is defined within the Author object to be an array of books, indicating that *one* Author type has a relationship to *many* Book types. Internally, much like the one-to-one model, only the DocKeys are stored. However, the DocKey is only stored on one side of the relationship (the child type). In this example, only the Book type keeps a reference to its associated Author DocKey. -#### Many-to-Many +## Many-to-Many -*to be updated* +A "many-to-many" relationship allows multiple instances of one type to be related to multiple instances of another type. In DefraDB, many-to-many relationships are implemented using an explicit join type that connects the two related types. Unlike one-to-one or one-to-many relationships that are automatically managed, many-to-many relationships require an intermediary join type to be explicitly defined. -#### Multiple Relationships +Let us define a many-to-many relationship between students and courses below. A student can enroll in many courses, and a course can have many students enrolled. + +```graphql +type Student { + name: String + age: Int + enrollment: [Enrollment] +} + +type Course { + title: String + code: String + enrollment: [Enrollment] +} + +type Enrollment { + student: Student @relation(name: "student_enrollments") + course: Course @relation(name: "course_enrollments") +} +``` + +In this example, the `Enrollment` type acts as the join type that creates the many-to-many relationship between `Student` and `Course`. The join type has a one-to-many relationship with both Student and Course. Each enrollment links one student to one course. The `@relation` directive with unique names ensures that the relationships are properly distinguished. + +Similar to traditional SQL databases, you define the join type manually in your schema as a regular type. However, DefraDB automatically handles the relationship management between the join type and the related types, reducing the complexity of maintaining these connections. + +You can query the relationships directly from either the `Student` or `Course` type, or through the intermediary `Enrollment` type. + +```graphql +# Get students with their enrolled courses +query { + Student { + _docID + name + enrollment { + course { + title + code + } + } + } +} +``` + +```graphql +# Get courses with their enrolled students +query { + Course { + _docID + title + enrollment { + student { + name + age + } + } + } +} +``` + +You can also query the join type directly: + +```graphql +# Get all enrollments with student and course details +query { + Enrollment { + student { + name + age + } + course { + title + code + } + } +} +``` + +DefraDB handles the traversal through the join type automatically, allowing you to express complex many-to-many queries in a single request, but it still must go through the join type. + +The join type can also include additional fields specific to the relationship, such as enrollment date, grade, or status: + +```graphql +type Enrollment { + student: Student @relation(name: "student_enrollments") + course: Course @relation(name: "course_enrollments") + enrollmentDate: DateTime + status: String + grade: Float +} +``` + +This pattern allows you to maintain rich, contextual information about the relationship itself, not just the connection between the two types. + +## Multiple Relationships + +It is possible to define a collection of different relationship models. Additionally, we can define multiple relationships within a single type. Relationships containing unique types can simply be added to the types without issue. Like the following: -It is possible to define a collection of different relationship models. Additionally, we can define multiple relationships within a single type. Relationships containing unique types, can simply be added to the types without issue. Like the following: ```graphql type Author { name: String address: Address - books: [Book] @relation("authored_books") @index + books: [Book] @relation(name: "authored_books") @index } ``` However, in case of multiple relationships using the *same* types, you have to annotate the differences. You can use the `@relation` directive to be explicit. + ```graphql type Author { name: String @@ -86,4 +184,4 @@ type Book { } ``` -Here we have two relations of the same type. By default, their association would conflict because internally, type names are used to specify relations. We use the `@relation` to add a custom name to the relation. `@relation` can be added to any relationship, even if it's a duplicate type relationship. It exists to be explicit, and to change the default parameters of the relation. \ No newline at end of file +Here we have two relations of the same type. By default, their association would conflict because internally, type names are used to specify relations. We use the `@relation` to add a custom name to the relation. `@relation` can be added to any relationship, even if it's a duplicate type relationship. It exists to be explicit, and to change the default parameters of the relation. From 013e780ca9ce71d8ae38e0d1076cf7faa45a7ac0 Mon Sep 17 00:00:00 2001 From: Ashutosh Pradhan Date: Tue, 21 Oct 2025 13:16:21 -0700 Subject: [PATCH 43/48] CID-article (#176) Co-authored-by: pradhanashutosh --- docs/defradb/guides/content-identifier.md | 94 +++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 docs/defradb/guides/content-identifier.md diff --git a/docs/defradb/guides/content-identifier.md b/docs/defradb/guides/content-identifier.md new file mode 100644 index 0000000..556d176 --- /dev/null +++ b/docs/defradb/guides/content-identifier.md @@ -0,0 +1,94 @@ +--- +sidebar_label: Content Identifiers (CID) +sidebar_position: 90 +--- + +# Content Identifiers (CID) + +## Overview + +Content Identifiers (CIDs) are foundational in content-addressable storage (CAS) systems, providing a globally unique, self-describing reference to digital content based on its data rather than its location. CIDs enable systems to efficiently and securely retrieve, verify, link, and manage data, enabling immutable and decentralized data storage solutions such as IPFS, IPLD, and DefraDB. + +## Why Content Identifiers Matter + +Traditional web addresses (URLs) tell you **where** data lives—on a specific server, at a specific location. + +Content Identifiers tell you **what** the data is—a unique fingerprint of the content itself. + +This fundamental shift enables: + +- **Decentralized architecture:** Any node can serve data, not just the original source +- **Self-verifying data:** Content proves its own integrity through cryptographic hashing +- **Permanent links:** References that never break, even when data moves +- **Automatic deduplication:** The same content always has the same identifier, eliminating redundant storage +- **True data portability:** Content can move freely between platforms while maintaining its identity + +This transformation from location-based to content-based addressing is as significant as the shift from IP addresses to domain names—but instead of making locations human-readable, CIDs make content itself addressable. + +## Content Identifier Basics + +A **CID** uniquely identifies data by combining a cryptographic hash with encoding metadata. This makes a CID: + +- **Deterministic:** No randomness—the same input always yields the same CID +- **Consistent across locations:** The same content always produces the same CID +- **Unique:** Different content results in different CIDs +- **Self-describing:** The identifier encodes what the data is and how to verify it + +### Understanding Cryptographic Hashes + +To understand how CIDs achieve these properties, we first need to understand the cryptographic hashes that power them. + +A **cryptographic hash** is a mathematical function that takes input data of any size and transforms it into a fixed-length string of bits, called a hash value or digest. This process is: + +- **Deterministic:** The same input always produces the same output +- **Collision-resistant:** Different inputs produce different outputs +- **One-way:** Cannot reverse the hash to get the original data +- **Sensitive:** Even a tiny change in input results in a completely different hash value + +Content-Addressable Storage (CAS) uses these cryptographic fingerprints to store and access data, ensuring integrity and enabling efficient deduplication. + +### Key CID Properties + +| Property | Description | Technical Benefit | +|----------|-------------|-------------------| +| **Immutability** | Any change to content changes the CID | Enables trustless verification | +| **Deduplication** | Same content anywhere yields the same CID | Reduces storage significantly in typical datasets | +| **Integrity verification** | CIDs ensure the authenticity of retrieved data | Cryptographic proof of data integrity | +| **Versioning** | Unique CIDs support tracking content over time | Implicit version control | + +## CID Structure + +With these fundamentals in place, let's examine how CIDs are actually structured and what each component does. + +### Visual Overview + +A CID consists of multiple components that work together to create a self-describing content identifier: +```bash +bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi +│ └┬┘└───────────────────────────────────────────────────────┘ +│ │ │ +│ │ └── Base32-encoded multihash +│ └──────────────────────────────── Multicodec (dag-pb) +└──────────────────────────────────── Multibase prefix (b = base32) +``` + +### Component Breakdown + +- **Multibase prefix:** Indicates how the CID is encoded (like choosing between binary and text). This allows CIDs to be represented in different formats for different use cases +- **Multicodec:** Specifies what format the content uses (raw bytes, JSON, CBOR, etc.). This tells systems how to interpret the data +- **Multihash:** Contains the actual cryptographic fingerprint of your content, along with information about which hash function was used + +### Technical Components + +| Component | Description | Details | Example Values | +|-----------|-------------|---------|----------------| +| **Multibase prefix** | Specifies encoding format | First character(s) of the CID | `b` (base32), `z` (base58btc), `f` (base16) | +| **Multicodec** | Identifies content type/format | Varint-encoded codec identifier | `0x70` (dag-pb), `0x71` (dag-cbor), `0x55` (raw) | +| **Multihash** | Hash function and digest | Function ID + digest length + digest | SHA-256, Blake2b-256, SHA-3 | + +### CID Versions + +| Version | Details | Example CID | Binary Structure | +|---------|---------|-------------|------------------| +| **CIDv0** | Base58btc encoding, supports only dag-pb and SHA-256 | `QmYwAPJzv5CZsnA...` | `` only | +| **CIDv1** | Supports multiple codecs, hash functions, and encodings | `bafybeigdyrzt5sf...` | `` | From 9d39e4ce58e94ec2f11245729404f12efea25dd2 Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Thu, 6 Nov 2025 12:09:07 -0800 Subject: [PATCH 44/48] chore: Upgrade docusaurus to v3 (#181) Upgrade our docusaurus instance to v3. This required various updates to dependencies, most notably MDX. These MDX changes required changes to some of the markdown files. --- CLAUDE.md | 98 + .../cli/defradb_client_backup_export.md | 2 +- .../cli/defradb_client_collection_create.md | 6 +- .../cli/defradb_client_collection_delete.md | 2 +- .../cli/defradb_client_collection_patch.md | 2 +- .../cli/defradb_client_collection_update.md | 8 +- .../defradb_client_p2p_replicator_delete.md | 4 +- .../cli/defradb_client_p2p_replicator_set.md | 2 +- .../references/cli/defradb_client_query.md | 2 +- .../cli/defradb_client_schema_add.md | 2 +- .../defradb_client_schema_migration_down.md | 2 +- ...db_client_schema_migration_set-registry.md | 2 +- .../defradb_client_schema_migration_set.md | 2 +- .../cli/defradb_client_schema_migration_up.md | 2 +- .../cli/defradb_client_schema_patch.md | 2 +- .../references/cli/defradb_client_view_add.md | 2 +- docs/sourcehub/concepts/zanzibar.md | 8 +- package-lock.json | 24398 ++++++++++------ package.json | 20 +- src/pages/index.module.scss | 2 +- src/theme/DocItem/Content/index.js | 2 +- src/theme/DocItem/Footer/index.js | 2 +- src/theme/DocItem/Layout/index.tsx | 3 +- src/theme/DocItem/Metadata/index.js | 2 +- src/theme/DocItem/Paginator/index.js | 2 +- src/theme/DocItem/TOC/Desktop/index.js | 2 +- src/theme/DocItem/TOC/Mobile/index.js | 2 +- src/theme/DocItem/index.js | 2 +- src/theme/DocPage/Layout/Main/index.tsx | 2 +- src/theme/DocPage/Layout/index.tsx | 2 +- src/theme/DocPage/index.tsx | 10 +- src/theme/EditThisPage/index.tsx | 4 +- tsconfig.json | 2 +- 33 files changed, 15198 insertions(+), 9407 deletions(-) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..ce2ffe0 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,98 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +This is the Source Network documentation site, built with Docusaurus 3. It hosts documentation for four main products: +- **DefraDB**: A peer-to-peer database with Merkle CRDTs +- **SourceHub**: Access control and policy management +- **Orbis**: Multi-party computation and encryption +- **LensVM**: Virtual machine component + +The site uses the `docusaurus-preset-openapi` for API documentation and auto-generates sidebars from the docs folder structure. + +## Common Commands + +```bash +# Install dependencies +npm install + +# Start local development server (with hot reload) +npm run start + +# Build for production +npm run build + +# Serve production build locally +npm run serve + +# Type checking +npm run typecheck + +# Clear Docusaurus cache +npm run clear + +# Import DefraDB CLI docs from upstream repository +# Usage: npm run import-defradb-cli-docs [commit-hash-or-branch] +npm run import-defradb-cli-docs develop +``` + +## Architecture + +### Documentation Structure + +Documentation is organized by product in the `/docs` directory: +- `/docs/defradb/` - DefraDB database documentation +- `/docs/sourcehub/` - SourceHub access control documentation +- `/docs/orbis/` - Orbis cryptography documentation +- `/docs/lensvm/` - LensVM documentation + +Each product section typically contains: +- `getting-started.md` or `getting-started/` - Onboarding guides +- `concepts/` - Conceptual explanations +- `guides/` - How-to guides +- `references/` - Reference documentation (CLI, API) +- `release notes/` - Version release notes + +### Sidebar Configuration + +Sidebars are defined in `sidebars.js` with four main sections: +- `defraSidebar` - Auto-generated from `docs/defradb/` +- `sourcehubSidebar` - Auto-generated from `docs/sourcehub/` + API link +- `orbisSidebar` - Auto-generated from `docs/orbis/` +- `lensvmSidebar` - Auto-generated from `docs/lensvm/` + +The changelog/release notes sidebar items are automatically reversed (newest first) via the `reverseSidebarChangelog()` function in `docusaurus.config.js:185-194`. + +### API Documentation + +OpenAPI specification is stored in `openapi.yml` at the root. The SourceHub API docs are served at `/sourcehub/api` via the `docusaurus-preset-openapi` plugin configuration. + +### Theme Customization + +Custom theme components are in `/src/theme/` using Docusaurus swizzling: +- Custom footer components with Source Network branding +- Custom color mode toggle +- SCSS styling in `/src/css/custom.scss` +- Custom code theme in `/src/code-theme/code-theme.js` + +The site uses dark mode by default with `respectPrefersColorScheme: false`. + +### CLI Documentation Import + +The script `scripts/import-defradb-cli-docs.js` imports CLI reference docs from the DefraDB repository: +- Clones the DefraDB repo at a specific commit/branch +- Extracts markdown files from `docs/cli/` directory +- Transforms headers (removes one level, removes "defradb" prefix) +- Outputs to `docs/defradb/references/cli/` + +Usage: `npm run import-defradb-cli-docs ` + +## Development Notes + +- Documentation files support both `.md` (CommonMark) and `.mdx` (MDX) formats +- The edit URL for all docs points to the GitHub repo master branch +- Algolia search is configured with app ID `N3M9YBYYQY` +- Site is deployed automatically via Cloudflare Pages +- GitHub edit links are configured to point to the master branch diff --git a/docs/defradb/references/cli/defradb_client_backup_export.md b/docs/defradb/references/cli/defradb_client_backup_export.md index fe0887f..031a321 100644 --- a/docs/defradb/references/cli/defradb_client_backup_export.md +++ b/docs/defradb/references/cli/defradb_client_backup_export.md @@ -4,7 +4,7 @@ Export the database to a file ### Synopsis -Export the database to a file. If a file exists at the location, it will be overwritten. +Export the database to a file. If a file exists at the `` location, it will be overwritten. If the --collection flag is provided, only the data for that collection will be exported. Otherwise, all collections in the database will be exported. diff --git a/docs/defradb/references/cli/defradb_client_collection_create.md b/docs/defradb/references/cli/defradb_client_collection_create.md index 8c88041..ab10761 100644 --- a/docs/defradb/references/cli/defradb_client_collection_create.md +++ b/docs/defradb/references/cli/defradb_client_collection_create.md @@ -22,14 +22,14 @@ Options: will be encrypted with the same key. Example: create from string: - defradb client collection create --name User '{ "name": "Bob" }' + defradb client collection create --name User '\{ "name": "Bob" \}' Example: create from string, with identity: - defradb client collection create --name User '{ "name": "Bob" }' \ + defradb client collection create --name User '\{ "name": "Bob" \}' \ -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f Example: create multiple from string: - defradb client collection create --name User '[{ "name": "Alice" }, { "name": "Bob" }]' + defradb client collection create --name User '[\{ "name": "Alice" \}, \{ "name": "Bob" \}]' Example: create from file: defradb client collection create --name User -f document.json diff --git a/docs/defradb/references/cli/defradb_client_collection_delete.md b/docs/defradb/references/cli/defradb_client_collection_delete.md index d23c480..df1ef3b 100644 --- a/docs/defradb/references/cli/defradb_client_collection_delete.md +++ b/docs/defradb/references/cli/defradb_client_collection_delete.md @@ -14,7 +14,7 @@ Example: delete by docID with identity: -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f Example: delete by filter: - defradb client collection delete --name User --filter '{ "_gte": { "points": 100 } }' + defradb client collection delete --name User --filter '\{ "_gte": \{ "points": 100 \} \}' ``` diff --git a/docs/defradb/references/cli/defradb_client_collection_patch.md b/docs/defradb/references/cli/defradb_client_collection_patch.md index ea2e581..86ec944 100644 --- a/docs/defradb/references/cli/defradb_client_collection_patch.md +++ b/docs/defradb/references/cli/defradb_client_collection_patch.md @@ -9,7 +9,7 @@ Patch existing collection descriptions. Uses JSON Patch to modify collection descriptions. Example: patch from an argument string: - defradb client collection patch '[{ "op": "add", "path": "...", "value": {...} }]' + defradb client collection patch '[\{ "op": "add", "path": "...", "value": \{...\} \}]' Example: patch from file: defradb client collection patch -p patch.json diff --git a/docs/defradb/references/cli/defradb_client_collection_update.md b/docs/defradb/references/cli/defradb_client_collection_update.md index f21bba3..562335c 100644 --- a/docs/defradb/references/cli/defradb_client_collection_update.md +++ b/docs/defradb/references/cli/defradb_client_collection_update.md @@ -7,19 +7,19 @@ Update documents by docID or filter. Update documents by docID or filter. Example: update from string: - defradb client collection update --name User --docID bae-123 '{ "name": "Bob" }' + defradb client collection update --name User --docID bae-123 '\{ "name": "Bob" \}' Example: update by filter: defradb client collection update --name User \ - --filter '{ "_gte": { "points": 100 } }' --updater '{ "verified": true }' + --filter '\{ "_gte": \{ "points": 100 \} \}' --updater '\{ "verified": true \}' Example: update by docID: defradb client collection update --name User \ - --docID bae-123 --updater '{ "verified": true }' + --docID bae-123 --updater '\{ "verified": true \}' Example: update private docID, with identity: defradb client collection update -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f --name User \ - --docID bae-123 --updater '{ "verified": true }' + --docID bae-123 --updater '\{ "verified": true \}' ``` diff --git a/docs/defradb/references/cli/defradb_client_p2p_replicator_delete.md b/docs/defradb/references/cli/defradb_client_p2p_replicator_delete.md index 626aafe..e751ce6 100644 --- a/docs/defradb/references/cli/defradb_client_p2p_replicator_delete.md +++ b/docs/defradb/references/cli/defradb_client_p2p_replicator_delete.md @@ -7,8 +7,8 @@ Delete replicator(s) and stop synchronization Delete replicator(s) and stop synchronization. A replicator synchronizes one or all collection(s) from this node to another. -Example: - defradb client p2p replicator delete -c Users '{"ID": "12D3", "Addrs": ["/ip4/0.0.0.0/tcp/9171"]}' +Example: + defradb client p2p replicator delete -c Users '\{"ID": "12D3", "Addrs": ["/ip4/0.0.0.0/tcp/9171"]\}' ``` diff --git a/docs/defradb/references/cli/defradb_client_p2p_replicator_set.md b/docs/defradb/references/cli/defradb_client_p2p_replicator_set.md index 75d6efe..752b3ed 100644 --- a/docs/defradb/references/cli/defradb_client_p2p_replicator_set.md +++ b/docs/defradb/references/cli/defradb_client_p2p_replicator_set.md @@ -8,7 +8,7 @@ Add replicator(s) and start synchronization. A replicator synchronizes one or all collection(s) from this node to another. Example: - defradb client p2p replicator set -c Users '{"ID": "12D3", "Addrs": ["/ip4/0.0.0.0/tcp/9171"]}' + defradb client p2p replicator set -c Users '\{"ID": "12D3", "Addrs": ["/ip4/0.0.0.0/tcp/9171"]\}' ``` diff --git a/docs/defradb/references/cli/defradb_client_query.md b/docs/defradb/references/cli/defradb_client_query.md index abaea09..aff8234 100644 --- a/docs/defradb/references/cli/defradb_client_query.md +++ b/docs/defradb/references/cli/defradb_client_query.md @@ -7,7 +7,7 @@ Send a DefraDB GraphQL query request Send a DefraDB GraphQL query request to the database. A query request can be sent as a single argument. Example command: - defradb client query 'query { ... }' + defradb client query 'query \{ ... \}' Do a query request from a file by using the '-f' flag. Example command: defradb client query -f request.graphql diff --git a/docs/defradb/references/cli/defradb_client_schema_add.md b/docs/defradb/references/cli/defradb_client_schema_add.md index ecff042..a91c293 100644 --- a/docs/defradb/references/cli/defradb_client_schema_add.md +++ b/docs/defradb/references/cli/defradb_client_schema_add.md @@ -12,7 +12,7 @@ Schema Object with a '@policy(id:".." resource: "..")' linked will only be accep - Learn more about [ACP & DPI Rules](/acp/README.md) Example: add from an argument string: - defradb client schema add 'type Foo { ... }' + defradb client schema add 'type Foo \{ ... \}' Example: add from file: defradb client schema add -f schema.graphql diff --git a/docs/defradb/references/cli/defradb_client_schema_migration_down.md b/docs/defradb/references/cli/defradb_client_schema_migration_down.md index 2ec8a26..851ea9d 100644 --- a/docs/defradb/references/cli/defradb_client_schema_migration_down.md +++ b/docs/defradb/references/cli/defradb_client_schema_migration_down.md @@ -8,7 +8,7 @@ Reverses the migration to the specified collection version. Documents is a list of documents to reverse the migration from. Example: migrate from string - defradb client schema migration down --collection 2 '[{"name": "Bob"}]' + defradb client schema migration down --collection 2 '[\{"name": "Bob"\}]' Example: migrate from file defradb client schema migration down --collection 2 -f documents.json diff --git a/docs/defradb/references/cli/defradb_client_schema_migration_set-registry.md b/docs/defradb/references/cli/defradb_client_schema_migration_set-registry.md index a62a1a5..e7adb30 100644 --- a/docs/defradb/references/cli/defradb_client_schema_migration_set-registry.md +++ b/docs/defradb/references/cli/defradb_client_schema_migration_set-registry.md @@ -8,7 +8,7 @@ Set a migration to a collection within the LensRegistry of the local DefraDB nod Does not persist the migration after restart. Example: set from an argument string: - defradb client schema migration set-registry 2 '{"lenses": [...' + defradb client schema migration set-registry 2 '\{"lenses": [...' Learn more about the DefraDB GraphQL Schema Language on https://docs.source.network. diff --git a/docs/defradb/references/cli/defradb_client_schema_migration_set.md b/docs/defradb/references/cli/defradb_client_schema_migration_set.md index 9543136..fa6f094 100644 --- a/docs/defradb/references/cli/defradb_client_schema_migration_set.md +++ b/docs/defradb/references/cli/defradb_client_schema_migration_set.md @@ -8,7 +8,7 @@ Set a migration from a source schema version to a destination schema version for all collections that are on the given source schema version within the local DefraDB node. Example: set from an argument string: - defradb client schema migration set bae123 bae456 '{"lenses": [...' + defradb client schema migration set bae123 bae456 '\{"lenses": [...' Example: set from file: defradb client schema migration set bae123 bae456 -f schema_migration.lens diff --git a/docs/defradb/references/cli/defradb_client_schema_migration_up.md b/docs/defradb/references/cli/defradb_client_schema_migration_up.md index 1b59edb..7da6945 100644 --- a/docs/defradb/references/cli/defradb_client_schema_migration_up.md +++ b/docs/defradb/references/cli/defradb_client_schema_migration_up.md @@ -8,7 +8,7 @@ Applies the migration to the specified collection version. Documents is a list of documents to apply the migration to. Example: migrate from string - defradb client schema migration up --collection 2 '[{"name": "Bob"}]' + defradb client schema migration up --collection 2 '[\{"name": "Bob"\}]' Example: migrate from file defradb client schema migration up --collection 2 -f documents.json diff --git a/docs/defradb/references/cli/defradb_client_schema_patch.md b/docs/defradb/references/cli/defradb_client_schema_patch.md index e2b58fe..46460f3 100644 --- a/docs/defradb/references/cli/defradb_client_schema_patch.md +++ b/docs/defradb/references/cli/defradb_client_schema_patch.md @@ -9,7 +9,7 @@ Patch an existing schema. Uses JSON Patch to modify schema types. Example: patch from an argument string: - defradb client schema patch '[{ "op": "add", "path": "...", "value": {...} }]' '{"lenses": [...' + defradb client schema patch '[\{ "op": "add", "path": "...", "value": \{...\} \}]' '\{"lenses": [...' Example: patch from file: defradb client schema patch -p patch.json diff --git a/docs/defradb/references/cli/defradb_client_view_add.md b/docs/defradb/references/cli/defradb_client_view_add.md index c5073d7..a231362 100644 --- a/docs/defradb/references/cli/defradb_client_view_add.md +++ b/docs/defradb/references/cli/defradb_client_view_add.md @@ -7,7 +7,7 @@ Add new view Add new database view. Example: add from an argument string: - defradb client view add 'Foo { name, ...}' 'type Foo { ... }' '{"lenses": [...' + defradb client view add 'Foo \{ name, ...\}' 'type Foo \{ ... \}' '\{"lenses": [...' Learn more about the DefraDB GraphQL Schema Language on https://docs.source.network. diff --git a/docs/sourcehub/concepts/zanzibar.md b/docs/sourcehub/concepts/zanzibar.md index 7b3ab0d..6be9e1b 100644 --- a/docs/sourcehub/concepts/zanzibar.md +++ b/docs/sourcehub/concepts/zanzibar.md @@ -113,9 +113,9 @@ A **rule** functions as a **transformation** on a **Relation Node** `(object, re #### Example -Let **A** be a **Relation Node** and **R** be a **Rewrite Rule**. Then: +Let **A** be a **Relation Node** and **R** be a **Rewrite Rule**. Then: -R(A) → {B, C, D} +R(A) → \{B, C, D\} This means that applying **R** to **A** produces a **set of descendant Relation Nodes** `{B, C, D}`. @@ -244,5 +244,5 @@ The Relation Tuples define a graph of object relationships, which is used to res # References -- Zanzibar: -- RelBAC: +- Zanzibar: https://research.google/pubs/pub48190/ +- RelBAC: https://ieeexplore.ieee.org/abstract/document/4725889/ diff --git a/package-lock.json b/package-lock.json index 246052a..7e73950 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,225 +8,376 @@ "name": "docs.source.network", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "2.4.0", - "@docusaurus/preset-classic": "2.4.0", - "@mdx-js/react": "^1.6.22", + "@docusaurus/core": "3.9.0", + "@docusaurus/preset-classic": "3.9.0", + "@mdx-js/react": "^3.0.0", "@svgr/webpack": "^7.0.0", "clsx": "^1.2.1", - "docusaurus-plugin-sass": "^0.2.3", - "docusaurus-preset-openapi": "^0.6.4", - "prism-react-renderer": "^1.3.5", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "docusaurus-plugin-sass": "^0.2.5", + "docusaurus-preset-openapi": "^0.7.1", + "prism-react-renderer": "^2.1.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-icons": "^4.8.0", "sass": "^1.60.0", "url": "^0.11.3" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.4.0", - "@tsconfig/docusaurus": "^1.0.7", + "@docusaurus/module-type-aliases": "^3.9.0", + "@docusaurus/tsconfig": "^3.9.0", "glob": "^10.2.2", "simple-git": "^3.17.0", "tmp": "^0.2.1", "typescript": "^5.0.2" } }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", - "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", + "node_modules/@ai-sdk/gateway": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.0.tgz", + "integrity": "sha512-Gj0PuawK7NkZuyYgO/h5kDK/l6hFOjhLdTq3/Lli1FTl47iGmwhH1IZQpAL3Z09BeFYWakcwUmn02ovIm2wy9g==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.12", + "@vercel/oidc": "3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", + "license": "Apache-2.0", "dependencies": { - "@algolia/autocomplete-shared": "1.7.4" + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", - "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", + "node_modules/@ai-sdk/provider-utils": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.12.tgz", + "integrity": "sha512-ZtbdvYxdMoria+2SlNarEk6Hlgyf+zzcznlD55EAl+7VZvJaSg2sqPvwArY7L6TfDEDJsnCq0fdhBSkYo0Xqdg==", + "license": "Apache-2.0", "dependencies": { - "@algolia/autocomplete-shared": "1.7.4" + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.5" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" + "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", - "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==" + "node_modules/@ai-sdk/react": { + "version": "2.0.76", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.76.tgz", + "integrity": "sha512-ggAPzyaKJTqUWigpxMzI5DuC0Y3iEpDUPCgz6/6CpnKZY/iok+x5xiZhDemeaP0ILw5IQekV0kdgBR8JPgI8zQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "3.0.12", + "ai": "5.0.76", + "swr": "^2.2.5", + "throttleit": "2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "zod": "^3.25.76 || ^4.1.8" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } }, - "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.16.0.tgz", - "integrity": "sha512-jVrk0YB3tjOhD5/lhBtYCVCeLjZmVpf2kdi4puApofytf/R0scjWz0GdozlW4HhU+Prxmt/c9ge4QFjtv5OAzQ==", + "node_modules/@algolia/abtesting": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.6.1.tgz", + "integrity": "sha512-wV/gNRkzb7sI9vs1OneG129hwe3Q5zPj7zigz3Ps7M5Lpo2hSorrOnXNodHEOV+yXE/ks4Pd+G3CDFIjFTWhMQ==", + "license": "MIT", "dependencies": { - "@algolia/cache-common": "4.16.0" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/cache-common": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.16.0.tgz", - "integrity": "sha512-4iHjkSYQYw46pITrNQgXXhvUmcekI8INz1m+SzmqLX8jexSSy4Ky4zfGhZzhhhLHXUP3+x/PK/c0qPjxEvRwKQ==" + "node_modules/@algolia/autocomplete-core": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", + "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", + "@algolia/autocomplete-shared": "1.19.2" + } }, - "node_modules/@algolia/cache-in-memory": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.16.0.tgz", - "integrity": "sha512-p7RYykvA6Ip6QENxrh99nOD77otVh1sJRivcgcVpnjoZb5sIN3t33eUY1DpB9QSBizcrW+qk19rNkdnZ43a+PQ==", + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", + "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", + "license": "MIT", "dependencies": { - "@algolia/cache-common": "4.16.0" + "@algolia/autocomplete-shared": "1.19.2" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", + "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" } }, - "node_modules/@algolia/client-account": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.16.0.tgz", - "integrity": "sha512-eydcfpdIyuWoKgUSz5iZ/L0wE/Wl7958kACkvTHLDNXvK/b8Z1zypoJavh6/km1ZNQmFpeYS2jrmq0kUSFn02w==", + "node_modules/@algolia/client-abtesting": { + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.40.1.tgz", + "integrity": "sha512-cxKNATPY5t+Mv8XAVTI57altkaPH+DZi4uMrnexPxPHODMljhGYY+GDZyHwv9a+8CbZHcY372OkxXrDMZA4Lnw==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "4.16.0", - "@algolia/client-search": "4.16.0", - "@algolia/transporter": "4.16.0" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.16.0.tgz", - "integrity": "sha512-cONWXH3BfilgdlCofUm492bJRWtpBLVW/hsUlfoFtiX1u05xoBP7qeiDwh9RR+4pSLHLodYkHAf5U4honQ55Qg==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.40.1.tgz", + "integrity": "sha512-XP008aMffJCRGAY8/70t+hyEyvqqV7YKm502VPu0+Ji30oefrTn2al7LXkITz7CK6I4eYXWRhN6NaIUi65F1OA==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "4.16.0", - "@algolia/client-search": "4.16.0", - "@algolia/requester-common": "4.16.0", - "@algolia/transporter": "4.16.0" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.16.0.tgz", - "integrity": "sha512-QVdR4019ukBH6f5lFr27W60trRxQF1SfS1qo0IP6gjsKhXhUVJuHxOCA6ArF87jrNkeuHEoRoDU+GlvaecNo8g==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.40.1.tgz", + "integrity": "sha512-gWfQuQUBtzUboJv/apVGZMoxSaB0M4Imwl1c9Ap+HpCW7V0KhjBddqF2QQt5tJZCOFsfNIgBbZDGsEPaeKUosw==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.40.1.tgz", + "integrity": "sha512-RTLjST/t+lsLMouQ4zeLJq2Ss+UNkLGyNVu+yWHanx6kQ3LT5jv8UvPwyht9s7R6jCPnlSI77WnL80J32ZuyJg==", + "license": "MIT", "dependencies": { - "@algolia/requester-common": "4.16.0", - "@algolia/transporter": "4.16.0" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.16.0.tgz", - "integrity": "sha512-irtLafssDGPuhYqIwxqOxiWlVYvrsBD+EMA1P9VJtkKi3vSNBxiWeQ0f0Tn53cUNdSRNEssfoEH84JL97SV2SQ==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.40.1.tgz", + "integrity": "sha512-2FEK6bUomBzEYkTKzD0iRs7Ljtjb45rKK/VSkyHqeJnG+77qx557IeSO0qVFE3SfzapNcoytTofnZum0BQ6r3Q==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.40.1.tgz", + "integrity": "sha512-Nju4NtxAvXjrV2hHZNLKVJLXjOlW6jAXHef/CwNzk1b2qIrCWDO589ELi5ZHH1uiWYoYyBXDQTtHmhaOVVoyXg==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "4.16.0", - "@algolia/requester-common": "4.16.0", - "@algolia/transporter": "4.16.0" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.16.0.tgz", - "integrity": "sha512-xsfrAE1jO/JDh1wFrRz+alVyW+aA6qnkzmbWWWZWEgVF3EaFqzIf9r1l/aDtDdBtNTNhX9H3Lg31+BRtd5izQA==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.40.1.tgz", + "integrity": "sha512-Mw6pAUF121MfngQtcUb5quZVqMC68pSYYjCRZkSITC085S3zdk+h/g7i6FxnVdbSU6OztxikSDMh1r7Z+4iPlA==", + "license": "MIT", "dependencies": { - "@algolia/client-common": "4.16.0", - "@algolia/requester-common": "4.16.0", - "@algolia/transporter": "4.16.0" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" + }, + "engines": { + "node": ">= 14.0.0" } }, "node_modules/@algolia/events": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", - "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "license": "MIT" }, - "node_modules/@algolia/logger-common": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.16.0.tgz", - "integrity": "sha512-U9H8uCzSDuePJmbnjjTX21aPDRU6x74Tdq3dJmdYu2+pISx02UeBJm4kSgc9RW5jcR5j35G9gnjHY9Q3ngWbyQ==" - }, - "node_modules/@algolia/logger-console": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.16.0.tgz", - "integrity": "sha512-+qymusiM+lPZKrkf0tDjCQA158eEJO2IU+Nr/sJ9TFyI/xkFPjNPzw/Qbc8Iy/xcOXGlc6eMgmyjtVQqAWq6UA==", + "node_modules/@algolia/ingestion": { + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.40.1.tgz", + "integrity": "sha512-z+BPlhs45VURKJIxsR99NNBWpUEEqIgwt10v/fATlNxc4UlXvALdOsWzaFfe89/lbP5Bu4+mbO59nqBC87ZM/g==", + "license": "MIT", "dependencies": { - "@algolia/logger-common": "4.16.0" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.16.0.tgz", - "integrity": "sha512-gK+kvs6LHl/PaOJfDuwjkopNbG1djzFLsVBklGBsSU6h6VjFkxIpo6Qq80IK14p9cplYZfhfaL12va6Q9p3KVQ==", + "node_modules/@algolia/monitoring": { + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.40.1.tgz", + "integrity": "sha512-VJMUMbO0wD8Rd2VVV/nlFtLJsOAQvjnVNGkMkspFiFhpBA7s/xJOb+fJvvqwKFUjbKTUA7DjiSi1ljSMYBasXg==", + "license": "MIT", "dependencies": { - "@algolia/requester-common": "4.16.0" + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/requester-common": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.16.0.tgz", - "integrity": "sha512-3Zmcs/iMubcm4zqZ3vZG6Zum8t+hMWxGMzo0/uY2BD8o9q5vMxIYI0c4ocdgQjkXcix189WtZNkgjSOBzSbkdw==" + "node_modules/@algolia/recommend": { + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.40.1.tgz", + "integrity": "sha512-ehvJLadKVwTp9Scg9NfzVSlBKH34KoWOQNTaN8i1Ac64AnO6iH2apJVSP6GOxssaghZ/s8mFQsDH3QIZoluFHA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" + }, + "engines": { + "node": ">= 14.0.0" + } }, - "node_modules/@algolia/requester-node-http": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.16.0.tgz", - "integrity": "sha512-L8JxM2VwZzh8LJ1Zb8TFS6G3icYsCKZsdWW+ahcEs1rGWmyk9SybsOe1MLnjonGBaqPWJkn9NjS7mRdjEmBtKA==", + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.40.1.tgz", + "integrity": "sha512-PbidVsPurUSQIr6X9/7s34mgOMdJnn0i6p+N6Ab+lsNhY5eiu+S33kZEpZwkITYBCIbhzDLOvb7xZD3gDi+USA==", + "license": "MIT", "dependencies": { - "@algolia/requester-common": "4.16.0" + "@algolia/client-common": "5.40.1" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@algolia/transporter": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.16.0.tgz", - "integrity": "sha512-H9BVB2EAjT65w7XGBNf5drpsW39x2aSZ942j4boSAAJPPlLmjtj5IpAP7UAtsV8g9Beslonh0bLa1XGmE/P0BA==", + "node_modules/@algolia/requester-fetch": { + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.40.1.tgz", + "integrity": "sha512-ThZ5j6uOZCF11fMw9IBkhigjOYdXGXQpj6h4k+T9UkZrF2RlKcPynFzDeRgaLdpYk8Yn3/MnFbwUmib7yxj5Lw==", + "license": "MIT", "dependencies": { - "@algolia/cache-common": "4.16.0", - "@algolia/logger-common": "4.16.0", - "@algolia/requester-common": "4.16.0" + "@algolia/client-common": "5.40.1" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "node_modules/@algolia/requester-node-http": { + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.40.1.tgz", + "integrity": "sha512-H1gYPojO6krWHnUXu/T44DrEun/Wl95PJzMXRcM/szstNQczSbwq6wIFJPI9nyE95tarZfUNU3rgorT+wZ6iCQ==", + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@algolia/client-common": "5.40.1" }, "engines": { - "node": ">=6.0.0" + "node": ">= 14.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", - "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.3", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.3", - "@babel/types": "^7.21.3", - "convert-source-map": "^1.7.0", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -237,102 +388,80 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.21.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.27.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.0.tgz", - "integrity": "sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -341,13 +470,24 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.0.tgz", - "integrity": "sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -356,140 +496,113 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dependencies": { - "@babel/types": "^7.18.6" - }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.21.0" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -499,199 +612,142 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dependencies": { - "@babel/types": "^7.20.2" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "license": "MIT", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/types": "^7.28.4" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=4" + "node": ">=6.0.0" } }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", - "bin": { - "parser": "bin/babel-parser.js" + "node": ">=6.9.0" }, - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -701,13 +757,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -716,31 +773,27 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -748,29 +801,25 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "@babel/core": "^7.12.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -779,13 +828,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -794,13 +843,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -809,13 +858,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -824,28 +873,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -854,16 +904,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -872,13 +921,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -887,14 +938,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -903,13 +953,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -918,15 +968,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -935,49 +984,66 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { - "node": ">=4" + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -986,34 +1052,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1022,23 +1068,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1047,78 +1083,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1127,12 +1114,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" }, "engines": { "node": ">=6.9.0" @@ -1141,12 +1130,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1155,12 +1145,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1169,14 +1160,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1185,12 +1176,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1199,12 +1193,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1213,20 +1208,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1235,13 +1223,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1250,12 +1238,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1264,13 +1253,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1279,12 +1269,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1293,13 +1285,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1308,12 +1303,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1322,28 +1319,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1352,12 +1350,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1366,13 +1365,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1381,14 +1380,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1397,15 +1399,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1414,13 +1415,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1429,27 +1430,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1458,13 +1461,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1473,12 +1477,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1488,11 +1495,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1502,11 +1510,12 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.21.3.tgz", - "integrity": "sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1516,11 +1525,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1530,15 +1540,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz", - "integrity": "sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.21.0" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1548,11 +1559,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" + "@babel/plugin-transform-react-jsx": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1562,12 +1574,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1577,12 +1590,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1591,12 +1604,29 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1606,16 +1636,17 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz", - "integrity": "sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz", + "integrity": "sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg==", + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1625,19 +1656,21 @@ } }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1647,12 +1680,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1662,11 +1696,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1676,11 +1711,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1690,11 +1726,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1704,14 +1741,16 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", - "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1721,11 +1760,28 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1735,12 +1791,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1749,86 +1806,98 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.3", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1838,39 +1907,40 @@ } }, "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1880,13 +1950,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.0.tgz", - "integrity": "sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-transform-typescript": "^7.21.0" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1895,75 +1968,67 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.0.tgz", - "integrity": "sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz", + "integrity": "sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==", + "license": "MIT", "dependencies": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.11" + "core-js-pure": "^3.43.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", - "debug": "^4.1.0", - "globals": "^11.1.0" + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1973,4301 +2038,5033 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", "optional": true, "engines": { "node": ">=0.1.90" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", + "integrity": "sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@docsearch/css": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", - "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==" - }, - "node_modules/@docsearch/react": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", - "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", - "dependencies": { - "@algolia/autocomplete-core": "1.7.4", - "@algolia/autocomplete-preset-algolia": "1.7.4", - "@docsearch/css": "3.3.3", - "algoliasearch": "^4.0.0" + "node": ">=18" }, "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" }, - "react-dom": { - "optional": true + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" } }, - "node_modules/@docusaurus/core": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.0.tgz", - "integrity": "sha512-J55/WEoIpRcLf3afO5POHPguVZosKmJEQWKBL+K7TAnfuE7i+Y0NPLlkKtnWCehagGsgTqClfQEexH/UT4kELA==", - "dependencies": { - "@babel/core": "^7.18.6", - "@babel/generator": "^7.18.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.18.6", - "@babel/preset-env": "^7.18.6", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@babel/runtime": "^7.18.6", - "@babel/runtime-corejs3": "^7.18.6", - "@babel/traverse": "^7.18.8", - "@docusaurus/cssnano-preset": "2.4.0", - "@docusaurus/logger": "2.4.0", - "@docusaurus/mdx-loader": "2.4.0", - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "2.4.0", - "@docusaurus/utils-common": "2.4.0", - "@docusaurus/utils-validation": "2.4.0", - "@slorber/static-site-generator-webpack-plugin": "^4.0.7", - "@svgr/webpack": "^6.2.1", - "autoprefixer": "^10.4.7", - "babel-loader": "^8.2.5", - "babel-plugin-dynamic-import-node": "^2.3.3", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "clean-css": "^5.3.0", - "cli-table3": "^0.6.2", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", - "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.23.3", - "css-loader": "^6.7.1", - "css-minimizer-webpack-plugin": "^4.0.0", - "cssnano": "^5.1.12", - "del": "^6.1.1", - "detect-port": "^1.3.0", - "escape-html": "^1.0.3", - "eta": "^2.0.0", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "html-minifier-terser": "^6.1.0", - "html-tags": "^3.2.0", - "html-webpack-plugin": "^5.5.0", - "import-fresh": "^3.3.0", - "leven": "^3.1.0", - "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.6.1", - "postcss": "^8.4.14", - "postcss-loader": "^7.0.0", - "prompts": "^2.4.2", - "react-dev-utils": "^12.0.1", - "react-helmet-async": "^1.3.0", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", - "react-loadable-ssr-addon-v5-slorber": "^1.0.1", - "react-router": "^5.3.3", - "react-router-config": "^5.1.1", - "react-router-dom": "^5.3.3", - "rtl-detect": "^1.0.4", - "semver": "^7.3.7", - "serve-handler": "^6.1.3", - "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.3", - "tslib": "^2.4.0", - "update-notifier": "^5.1.0", - "url-loader": "^4.1.1", - "wait-on": "^6.0.1", - "webpack": "^5.73.0", - "webpack-bundle-analyzer": "^4.5.0", - "webpack-dev-server": "^4.9.3", - "webpack-merge": "^5.8.0", - "webpackbar": "^5.0.2" - }, - "bin": { - "docusaurus": "bin/docusaurus.mjs" - }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@docusaurus/core/node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", - "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", - "engines": { - "node": ">=10" + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@docusaurus/core/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", - "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@docusaurus/core/node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", - "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@docusaurus/core/node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", - "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", - "engines": { - "node": ">=10" + "node_modules/@csstools/postcss-alpha-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz", + "integrity": "sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/core/node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", - "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", - "engines": { - "node": ">=10" + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/core/node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", - "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss-selector-parser": "^7.0.0" } }, - "node_modules/@docusaurus/core/node_modules/@svgr/babel-preset": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", - "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=4" } }, - "node_modules/@docusaurus/core/node_modules/@svgr/core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", - "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz", + "integrity": "sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/core/node_modules/@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", - "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "node_modules/@csstools/postcss-color-function-display-p3-linear": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz", + "integrity": "sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "@babel/types": "^7.20.0", - "entities": "^4.4.0" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/core/node_modules/@svgr/plugin-jsx": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", - "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz", + "integrity": "sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", - "svg-parser": "^2.0.4" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=18" }, "peerDependencies": { - "@svgr/core": "^6.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/core/node_modules/@svgr/plugin-svgo": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", - "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "node_modules/@csstools/postcss-color-mix-variadic-function-arguments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz", + "integrity": "sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "svgo": "^2.8.0" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=18" }, "peerDependencies": { - "@svgr/core": "*" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/core/node_modules/@svgr/webpack": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", - "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz", + "integrity": "sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "@babel/core": "^7.19.6", - "@babel/plugin-transform-react-constant-elements": "^7.18.12", - "@babel/preset-env": "^7.19.4", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@svgr/core": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "@svgr/plugin-svgo": "^6.5.1" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/core/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/@csstools/postcss-contrast-color-function": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz", + "integrity": "sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/core/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz", + "integrity": "sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/core/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/core/node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.11.tgz", + "integrity": "sha512-fCpCUgZNE2piVJKC76zFsgVW1apF6dpYsqGyH8SIeCcM4pTEsRTWTLCaJIMKFEundsCKwY1rwfhtrio04RJ4Dw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "css-tree": "^1.1.2" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, "engines": { - "node": ">=8.0.0" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/core/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/@docusaurus/core/node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@docusaurus/core/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz", + "integrity": "sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "domelementtype": "^2.2.0" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">= 4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/core/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz", + "integrity": "sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/core/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/@docusaurus/core/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz", + "integrity": "sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=10.13.0" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/core/node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "node_modules/@csstools/postcss-initial": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz", + "integrity": "sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">= 10" - } - }, - "node_modules/@docusaurus/cssnano-preset": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.0.tgz", - "integrity": "sha512-RmdiA3IpsLgZGXRzqnmTbGv43W4OD44PCo+6Q/aYjEM2V57vKCVqNzuafE94jv0z/PjHoXUrjr69SaRymBKYYw==", - "dependencies": { - "cssnano-preset-advanced": "^5.3.8", - "postcss": "^8.4.14", - "postcss-sort-media-queries": "^4.2.1", - "tslib": "^2.4.0" + "node": ">=18" }, - "engines": { - "node": ">=16.14" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/logger": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.0.tgz", - "integrity": "sha512-T8+qR4APN+MjcC9yL2Es+xPJ2923S9hpzDmMtdsOcUGLqpCGBbU1vp3AAqDwXtVgFkq+NsEk7sHdVsfLWR/AXw==", + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz", + "integrity": "sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "chalk": "^4.1.2", - "tslib": "^2.4.0" + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">=16.14" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/@docusaurus/mdx-loader": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.0.tgz", - "integrity": "sha512-GWoH4izZKOmFoC+gbI2/y8deH/xKLvzz/T5BsEexBye8EHQlwsA7FMrVa48N063bJBH4FUOiRRXxk5rq9cC36g==", - "dependencies": { - "@babel/parser": "^7.18.8", - "@babel/traverse": "^7.18.8", - "@docusaurus/logger": "2.4.0", - "@docusaurus/utils": "2.4.0", - "@mdx-js/mdx": "^1.6.22", - "escape-html": "^1.0.3", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "image-size": "^1.0.1", - "mdast-util-to-string": "^2.0.0", - "remark-emoji": "^2.2.0", - "stringify-object": "^3.3.0", - "tslib": "^2.4.0", - "unified": "^9.2.2", - "unist-util-visit": "^2.0.3", - "url-loader": "^4.1.1", - "webpack": "^5.73.0" - }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "postcss-selector-parser": "^7.0.0" } }, - "node_modules/@docusaurus/module-type-aliases": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.0.tgz", - "integrity": "sha512-YEQO2D3UXs72qCn8Cr+RlycSQXVGN9iEUyuHwTuK4/uL/HFomB2FHSU0vSDM23oLd+X/KibQ3Ez6nGjQLqXcHg==", + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", "dependencies": { - "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "2.4.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "@types/react-router-dom": "*", - "react-helmet-async": "*", - "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, - "peerDependencies": { - "react": "*", - "react-dom": "*" + "engines": { + "node": ">=4" } }, - "node_modules/@docusaurus/plugin-content-blog": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.0.tgz", - "integrity": "sha512-YwkAkVUxtxoBAIj/MCb4ohN0SCtHBs4AS75jMhPpf67qf3j+U/4n33cELq7567hwyZ6fMz2GPJcVmctzlGGThQ==", - "dependencies": { - "@docusaurus/core": "2.4.0", - "@docusaurus/logger": "2.4.0", - "@docusaurus/mdx-loader": "2.4.0", - "@docusaurus/types": "2.4.0", - "@docusaurus/utils": "2.4.0", - "@docusaurus/utils-common": "2.4.0", - "@docusaurus/utils-validation": "2.4.0", - "cheerio": "^1.0.0-rc.12", - "feed": "^4.2.2", - "fs-extra": "^10.1.0", - "lodash": "^4.17.21", - "reading-time": "^1.5.0", - "tslib": "^2.4.0", - "unist-util-visit": "^2.0.3", - "utility-types": "^3.10.0", - "webpack": "^5.73.0" + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz", + "integrity": "sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/plugin-content-docs": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.0.tgz", - "integrity": "sha512-ic/Z/ZN5Rk/RQo+Io6rUGpToOtNbtPloMR2JcGwC1xT2riMu6zzfSwmBi9tHJgdXH6CB5jG+0dOZZO8QS5tmDg==", - "dependencies": { - "@docusaurus/core": "2.4.0", - "@docusaurus/logger": "2.4.0", - "@docusaurus/mdx-loader": "2.4.0", - "@docusaurus/module-type-aliases": "2.4.0", - "@docusaurus/types": "2.4.0", - "@docusaurus/utils": "2.4.0", - "@docusaurus/utils-validation": "2.4.0", - "@types/react-router-config": "^5.0.6", - "combine-promises": "^1.1.0", - "fs-extra": "^10.1.0", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "tslib": "^2.4.0", - "utility-types": "^3.10.0", - "webpack": "^5.73.0" - }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/plugin-content-pages": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.0.tgz", - "integrity": "sha512-Pk2pOeOxk8MeU3mrTU0XLIgP9NZixbdcJmJ7RUFrZp1Aj42nd0RhIT14BGvXXyqb8yTQlk4DmYGAzqOfBsFyGw==", - "dependencies": { - "@docusaurus/core": "2.4.0", - "@docusaurus/mdx-loader": "2.4.0", - "@docusaurus/types": "2.4.0", - "@docusaurus/utils": "2.4.0", - "@docusaurus/utils-validation": "2.4.0", - "fs-extra": "^10.1.0", - "tslib": "^2.4.0", - "webpack": "^5.73.0" - }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/plugin-debug": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.0.tgz", - "integrity": "sha512-KC56DdYjYT7Txyux71vXHXGYZuP6yYtqwClvYpjKreWIHWus5Zt6VNi23rMZv3/QKhOCrN64zplUbdfQMvddBQ==", - "dependencies": { - "@docusaurus/core": "2.4.0", - "@docusaurus/types": "2.4.0", - "@docusaurus/utils": "2.4.0", - "fs-extra": "^10.1.0", - "react-json-view": "^1.21.3", - "tslib": "^2.4.0" - }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/plugin-google-analytics": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.0.tgz", - "integrity": "sha512-uGUzX67DOAIglygdNrmMOvEp8qG03X20jMWadeqVQktS6nADvozpSLGx4J0xbkblhJkUzN21WiilsP9iVP+zkw==", + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "@docusaurus/core": "2.4.0", - "@docusaurus/types": "2.4.0", - "@docusaurus/utils-validation": "2.4.0", - "tslib": "^2.4.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/plugin-google-gtag": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.0.tgz", - "integrity": "sha512-adj/70DANaQs2+TF/nRdMezDXFAV/O/pjAbUgmKBlyOTq5qoMe0Tk4muvQIwWUmiUQxFJe+sKlZGM771ownyOg==", + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz", + "integrity": "sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "@docusaurus/core": "2.4.0", - "@docusaurus/types": "2.4.0", - "@docusaurus/utils-validation": "2.4.0", - "tslib": "^2.4.0" + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.0.tgz", - "integrity": "sha512-E66uGcYs4l7yitmp/8kMEVQftFPwV9iC62ORh47Veqzs6ExwnhzBkJmwDnwIysHBF1vlxnzET0Fl2LfL5fRR3A==", + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz", + "integrity": "sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "dependencies": { - "@docusaurus/core": "2.4.0", - "@docusaurus/types": "2.4.0", - "@docusaurus/utils-validation": "2.4.0", - "tslib": "^2.4.0" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" }, "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/plugin-sitemap": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.0.tgz", - "integrity": "sha512-pZxh+ygfnI657sN8a/FkYVIAmVv0CGk71QMKqJBOfMmDHNN1FeDeFkBjWP49ejBqpqAhjufkv5UWq3UOu2soCw==", - "dependencies": { - "@docusaurus/core": "2.4.0", - "@docusaurus/logger": "2.4.0", - "@docusaurus/types": "2.4.0", - "@docusaurus/utils": "2.4.0", - "@docusaurus/utils-common": "2.4.0", - "@docusaurus/utils-validation": "2.4.0", - "fs-extra": "^10.1.0", - "sitemap": "^7.1.1", - "tslib": "^2.4.0" + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz", + "integrity": "sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" }, "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/preset-classic": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.0.tgz", - "integrity": "sha512-/5z5o/9bc6+P5ool2y01PbJhoGddEGsC0ej1MF6mCoazk8A+kW4feoUd68l7Bnv01rCnG3xy7kHUQP97Y0grUA==", + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "@docusaurus/core": "2.4.0", - "@docusaurus/plugin-content-blog": "2.4.0", - "@docusaurus/plugin-content-docs": "2.4.0", - "@docusaurus/plugin-content-pages": "2.4.0", - "@docusaurus/plugin-debug": "2.4.0", - "@docusaurus/plugin-google-analytics": "2.4.0", - "@docusaurus/plugin-google-gtag": "2.4.0", - "@docusaurus/plugin-google-tag-manager": "2.4.0", - "@docusaurus/plugin-sitemap": "2.4.0", - "@docusaurus/theme-classic": "2.4.0", - "@docusaurus/theme-common": "2.4.0", - "@docusaurus/theme-search-algolia": "2.4.0", - "@docusaurus/types": "2.4.0" + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/react-loadable": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", - "dependencies": { - "@types/react": "*", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/@docusaurus/theme-classic": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.0.tgz", - "integrity": "sha512-GMDX5WU6Z0OC65eQFgl3iNNEbI9IMJz9f6KnOyuMxNUR6q0qVLsKCNopFUDfFNJ55UU50o7P7o21yVhkwpfJ9w==", - "dependencies": { - "@docusaurus/core": "2.4.0", - "@docusaurus/mdx-loader": "2.4.0", - "@docusaurus/module-type-aliases": "2.4.0", - "@docusaurus/plugin-content-blog": "2.4.0", - "@docusaurus/plugin-content-docs": "2.4.0", - "@docusaurus/plugin-content-pages": "2.4.0", - "@docusaurus/theme-common": "2.4.0", - "@docusaurus/theme-translations": "2.4.0", - "@docusaurus/types": "2.4.0", - "@docusaurus/utils": "2.4.0", - "@docusaurus/utils-common": "2.4.0", - "@docusaurus/utils-validation": "2.4.0", - "@mdx-js/react": "^1.6.22", - "clsx": "^1.2.1", - "copy-text-to-clipboard": "^3.0.1", - "infima": "0.2.0-alpha.43", - "lodash": "^4.17.21", - "nprogress": "^0.2.0", - "postcss": "^8.4.14", - "prism-react-renderer": "^1.3.5", - "prismjs": "^1.28.0", - "react-router-dom": "^5.3.3", - "rtlcss": "^3.5.0", - "tslib": "^2.4.0", - "utility-types": "^3.10.0" + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", + "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/theme-common": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.0.tgz", - "integrity": "sha512-IkG/l5f/FLY6cBIxtPmFnxpuPzc5TupuqlOx+XDN+035MdQcAh8wHXXZJAkTeYDeZ3anIUSUIvWa7/nRKoQEfg==", - "dependencies": { - "@docusaurus/mdx-loader": "2.4.0", - "@docusaurus/module-type-aliases": "2.4.0", - "@docusaurus/plugin-content-blog": "2.4.0", - "@docusaurus/plugin-content-docs": "2.4.0", - "@docusaurus/plugin-content-pages": "2.4.0", - "@docusaurus/utils": "2.4.0", - "@docusaurus/utils-common": "2.4.0", - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router-config": "*", - "clsx": "^1.2.1", - "parse-numeric-range": "^1.3.0", - "prism-react-renderer": "^1.3.5", - "tslib": "^2.4.0", - "use-sync-external-store": "^1.2.0", - "utility-types": "^3.10.0" + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/theme-search-algolia": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.0.tgz", - "integrity": "sha512-pPCJSCL1Qt4pu/Z0uxBAuke0yEBbxh0s4fOvimna7TEcBLPq0x06/K78AaABXrTVQM6S0vdocFl9EoNgU17hqA==", - "dependencies": { - "@docsearch/react": "^3.1.1", - "@docusaurus/core": "2.4.0", - "@docusaurus/logger": "2.4.0", - "@docusaurus/plugin-content-docs": "2.4.0", - "@docusaurus/theme-common": "2.4.0", - "@docusaurus/theme-translations": "2.4.0", - "@docusaurus/utils": "2.4.0", - "@docusaurus/utils-validation": "2.4.0", - "algoliasearch": "^4.13.1", - "algoliasearch-helper": "^3.10.0", - "clsx": "^1.2.1", - "eta": "^2.0.0", - "fs-extra": "^10.1.0", - "lodash": "^4.17.21", - "tslib": "^2.4.0", - "utility-types": "^3.10.0" + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/theme-translations": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.0.tgz", - "integrity": "sha512-kEoITnPXzDPUMBHk3+fzEzbopxLD3fR5sDoayNH0vXkpUukA88/aDL1bqkhxWZHA3LOfJ3f0vJbOwmnXW5v85Q==", + "node_modules/@csstools/postcss-random-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz", + "integrity": "sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "fs-extra": "^10.1.0", - "tslib": "^2.4.0" + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, "engines": { - "node": ">=16.14" - } - }, - "node_modules/@docusaurus/types": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.0.tgz", - "integrity": "sha512-xaBXr+KIPDkIaef06c+i2HeTqVNixB7yFut5fBXPGI2f1rrmEV2vLMznNGsFwvZ5XmA3Quuefd4OGRkdo97Dhw==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "commander": "^5.1.0", - "joi": "^17.6.0", - "react-helmet-async": "^1.3.0", - "utility-types": "^3.10.0", - "webpack": "^5.73.0", - "webpack-merge": "^5.8.0" + "node": ">=18" }, "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.0.tgz", - "integrity": "sha512-89hLYkvtRX92j+C+ERYTuSUK6nF9bGM32QThcHPg2EDDHVw6FzYQXmX6/p+pU5SDyyx5nBlE4qXR92RxCAOqfg==", + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz", + "integrity": "sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "@docusaurus/logger": "2.4.0", - "@svgr/webpack": "^6.2.1", - "escape-string-regexp": "^4.0.0", - "file-loader": "^6.2.0", - "fs-extra": "^10.1.0", - "github-slugger": "^1.4.0", - "globby": "^11.1.0", - "gray-matter": "^4.0.3", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "micromatch": "^4.0.5", - "resolve-pathname": "^3.0.0", - "shelljs": "^0.8.5", - "tslib": "^2.4.0", - "url-loader": "^4.1.1", - "webpack": "^5.73.0" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils-common": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.0.tgz", - "integrity": "sha512-zIMf10xuKxddYfLg5cS19x44zud/E9I7lj3+0bv8UIs0aahpErfNrGhijEfJpAfikhQ8tL3m35nH3hJ3sOG82A==", + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "tslib": "^2.4.0" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">=16.14" + "node": ">=18" }, "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils-validation": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.0.tgz", - "integrity": "sha512-IrBsBbbAp6y7mZdJx4S4pIA7dUyWSA0GNosPk6ZJ0fX3uYIEQgcQSGIgTeSC+8xPEx3c16o03en1jSDpgQgz/w==", + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", "dependencies": { - "@docusaurus/logger": "2.4.0", - "@docusaurus/utils": "2.4.0", - "joi": "^17.6.0", - "js-yaml": "^4.1.0", - "tslib": "^2.4.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=16.14" + "node": ">=4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", - "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", - "engines": { - "node": ">=10" + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz", + "integrity": "sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", - "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", - "engines": { - "node": ">=10" + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz", + "integrity": "sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", - "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", - "engines": { - "node": ">=10" + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz", + "integrity": "sha512-KSkGgZfx0kQjRIYnpsD7X2Om9BUXX/Kii77VBifQW9Ih929hK0KNjVngHDH0bFB9GmfWcR9vJYJJRvw/NQjkrA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/color-helpers": "^5.1.0", + "postcss-value-parser": "^4.2.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", - "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", - "engines": { - "node": ">=10" + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz", + "integrity": "sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-calc": "^2.1.4", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "engines": { + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", - "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", - "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=18" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "postcss": "^8.4" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/babel-preset": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", - "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" - }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.2.0.tgz", + "integrity": "sha512-65KU9Fw5fGsPPPlgIghonMcndyx1bszzrDQYLfierN+Ha29yotMHzVS94bPkZS6On9LS8dE4qmW4P/fGjtCf/g==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.2.0.tgz", + "integrity": "sha512-zSN/KblmtBcerf7Z87yuKIHZQmxuXvYc6/m0+qnjyNu+Ir67AVOagTa1zBqcxkVUVkmBqUExdcyrdo9hbGbqTw==", + "license": "MIT", + "dependencies": { + "@ai-sdk/react": "^2.0.30", + "@algolia/autocomplete-core": "1.19.2", + "@docsearch/css": "4.2.0", + "ai": "^5.0.30", + "algoliasearch": "^5.28.0", + "marked": "^16.3.0", + "zod": "^4.1.8" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/react": ">= 16.8.0 < 20.0.0", + "react": ">= 16.8.0 < 20.0.0", + "react-dom": ">= 16.8.0 < 20.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", - "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "node_modules/@docusaurus/babel": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.9.0.tgz", + "integrity": "sha512-QcZ+Rey0OvlLK9SPN4/+VWL+ut/tuADVdunA1fmC96fytdYjatdJrcw1koYdp/c+3k6lVYlwg9DDVNDecyLCAA==", + "license": "MIT", "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/runtime-corejs3": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.9.0", + "@docusaurus/utils": "3.9.0", + "babel-plugin-dynamic-import-node": "^2.3.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=20.0" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", - "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", - "dependencies": { - "@babel/types": "^7.20.0", - "entities": "^4.4.0" + "node_modules/@docusaurus/bundler": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.9.0.tgz", + "integrity": "sha512-HaRLSmiwnJQ3uHBV3rd/BRDM9S/nHAshRk54djRZ+RX9ze4ONuFAovdD5es20ZDj7PRTjo38GVnBtHvuL/SwsQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.9.0", + "@docusaurus/cssnano-preset": "3.9.0", + "@docusaurus/logger": "3.9.0", + "@docusaurus/types": "3.9.0", + "@docusaurus/utils": "3.9.0", + "babel-loader": "^9.2.1", + "clean-css": "^5.3.3", + "copy-webpack-plugin": "^11.0.0", + "css-loader": "^6.11.0", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.2", + "null-loader": "^4.0.1", + "postcss": "^8.5.4", + "postcss-loader": "^7.3.4", + "postcss-preset-env": "^10.2.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=20.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/plugin-jsx": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", - "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", - "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", - "svg-parser": "^2.0.4" + "node_modules/@docusaurus/core": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.9.0.tgz", + "integrity": "sha512-sEJ4MW/zuh1MfPORCRbSwnW/PjsVmOigWwBU6clcxm221/CNdnI/XqgfBrl2jj/zocSdNoQM8E3IP2W8dygi6g==", + "license": "MIT", + "dependencies": { + "@docusaurus/babel": "3.9.0", + "@docusaurus/bundler": "3.9.0", + "@docusaurus/logger": "3.9.0", + "@docusaurus/mdx-loader": "3.9.0", + "@docusaurus/utils": "3.9.0", + "@docusaurus/utils-common": "3.9.0", + "@docusaurus/utils-validation": "3.9.0", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "execa": "5.1.1", + "fs-extra": "^11.1.1", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.6.0", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "p-map": "^4.0.0", + "prompts": "^2.4.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.6", + "tinypool": "^1.0.2", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^5.2.2", + "webpack-merge": "^6.0.1" }, - "engines": { - "node": ">=10" + "bin": { + "docusaurus": "bin/docusaurus.mjs" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "engines": { + "node": ">=20.0" }, "peerDependencies": { - "@svgr/core": "^6.0.0" + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/plugin-svgo": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", - "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.9.0.tgz", + "integrity": "sha512-prCJXUcoJZBlovJzSFkfnfWr1gXd53VZfE+17fIpUWS6Zioc7WE4FPoXPi5ldAGZ8brhXre5xQ8NWDE90XP9yw==", + "license": "MIT", "dependencies": { - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "svgo": "^2.8.0" + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.5.4", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" + "node": ">=20.0" } }, - "node_modules/@docusaurus/utils/node_modules/@svgr/webpack": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", - "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "node_modules/@docusaurus/logger": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.9.0.tgz", + "integrity": "sha512-lDtThsocWTF8ZrVF01ltfctA/xgtD/3oXWqEkKIDzF4fCWsWXH7hC4LCqT23xSuxZTIo8N+y02XSPvA/8DLInw==", + "license": "MIT", "dependencies": { - "@babel/core": "^7.19.6", - "@babel/plugin-transform-react-constant-elements": "^7.18.12", - "@babel/preset-env": "^7.19.4", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@svgr/core": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "@svgr/plugin-svgo": "^6.5.1" + "chalk": "^4.1.2", + "tslib": "^2.6.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=20.0" } }, - "node_modules/@docusaurus/utils/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "node_modules/@docusaurus/mdx-loader": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.9.0.tgz", + "integrity": "sha512-9bfJYdkZFE+REwevkT4CYdTJ2f6ydgkbUFylkzTXrNGtBXtx25TRJGdn2cVzm3eVkeWdJrGkG/ypwrIWnbu5UA==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.9.0", + "@docusaurus/utils": "3.9.0", + "@docusaurus/utils-validation": "3.9.0", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^2.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, "engines": { - "node": ">= 10" + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/utils/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.2.tgz", + "integrity": "sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==", + "dev": true, + "license": "MIT", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "@docusaurus/types": "3.9.2", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "react": "*", + "react-dom": "*" } }, - "node_modules/@docusaurus/utils/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "node_modules/@docusaurus/module-type-aliases/node_modules/@docusaurus/types": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.2.tgz", + "integrity": "sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==", + "dev": true, + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/utils/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "node_modules/@docusaurus/module-type-aliases/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "license": "MIT", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=10.0.0" } }, - "node_modules/@docusaurus/utils/node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dependencies": { - "css-tree": "^1.1.2" + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.9.0.tgz", + "integrity": "sha512-XZXJ/rQgi2jT0XWNXOnSKooJgtGHPzkjaBjww6K9PD+YevNMTP9U8Y5sA7cLA5Bwuqrpee4i8NO3tSrjhhDW5w==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.0", + "@docusaurus/logger": "3.9.0", + "@docusaurus/mdx-loader": "3.9.0", + "@docusaurus/theme-common": "3.9.0", + "@docusaurus/types": "3.9.0", + "@docusaurus/utils": "3.9.0", + "@docusaurus/utils-common": "3.9.0", + "@docusaurus/utils-validation": "3.9.0", + "cheerio": "1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@docusaurus/utils/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "node": ">=20.0" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/@docusaurus/utils/node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/utils/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.0.tgz", + "integrity": "sha512-PP+iDJg+lj4cn/7GbbmiguaQ8OX08YxnzQ17KqRC4ufJm11jdyXD33wA7vVtbeG/BkkgkiB/K7YyPHCPwmfVhg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.0", + "@docusaurus/logger": "3.9.0", + "@docusaurus/mdx-loader": "3.9.0", + "@docusaurus/module-type-aliases": "3.9.0", + "@docusaurus/theme-common": "3.9.0", + "@docusaurus/types": "3.9.0", + "@docusaurus/utils": "3.9.0", + "@docusaurus/utils-common": "3.9.0", + "@docusaurus/utils-validation": "3.9.0", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "schema-dts": "^1.1.2", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" }, "engines": { - "node": ">= 4" + "node": ">=20.0" }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@docusaurus/utils/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/module-type-aliases": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.0.tgz", + "integrity": "sha512-0ucYr79FpTCebN+l3ZlKqoW7HbMqSKT8JdsEg6QoUtxD3C7trF6KZiK/X6Yh+xekO1w3zzXYgPcIYTF2DV81tQ==", + "license": "MIT", "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "@docusaurus/types": "3.9.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "peerDependencies": { + "react": "*", + "react-dom": "*" } }, - "node_modules/@docusaurus/utils/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/@docusaurus/utils/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.9.0.tgz", + "integrity": "sha512-ngetCpAZuivlaHC0l8a5KoK6PQWGuZ8742VwK7dbXeIW0Y70P4xwuocBdsCIQ9J6nB9rlTXRYMpNVyYyCpD7/Q==", + "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" + "@docusaurus/core": "3.9.0", + "@docusaurus/mdx-loader": "3.9.0", + "@docusaurus/types": "3.9.0", + "@docusaurus/utils": "3.9.0", + "@docusaurus/utils-validation": "3.9.0", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" }, "engines": { - "node": ">=10.13.0" + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@faker-js/faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==" - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "node_modules/@docusaurus/plugin-css-cascade-layers": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.9.0.tgz", + "integrity": "sha512-giPTCjEzeaamMn8EHY/oDvsPDxF5ei1/q5lPUFQLldbc65jFQ1k6pPwKjtOznYy3TSfClCF1F1DNpYWIx7B5LA==", + "license": "MIT", "dependencies": { - "@hapi/hoek": "^9.0.0" + "@docusaurus/core": "3.9.0", + "@docusaurus/types": "3.9.0", + "@docusaurus/utils": "3.9.0", + "@docusaurus/utils-validation": "3.9.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=20.0" } }, - "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "node_modules/@docusaurus/plugin-debug": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.9.0.tgz", + "integrity": "sha512-DuFOZya+bcrYiL54qBEn2rdKuoWWNyOV5IoHI2MURLzwuYaKu/J9Gi618XUsj3N3qvqG2uxWQiXZcs9ecfMadA==", + "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.25.16" + "@docusaurus/core": "3.9.0", + "@docusaurus/types": "3.9.0", + "@docusaurus/utils": "3.9.0", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^2.3.0", + "tslib": "^2.6.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.9.0.tgz", + "integrity": "sha512-mUXvpasTDR2pXdnkkhGxEgB9frVAvLGc+T3fp6SGT2F+YoEQtjcmz9D43zubQawLn+W1KEhoj+vPusYe+HAl+A==", + "license": "MIT", "dependencies": { - "@jest/schemas": "^29.4.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@docusaurus/core": "3.9.0", + "@docusaurus/types": "3.9.0", + "@docusaurus/utils-validation": "3.9.0", + "tslib": "^2.6.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.9.0.tgz", + "integrity": "sha512-L4tCKYnmcyLV6VQs7XWQ3r7YSllagAU2GylZzdvz7NRMcXE12uSW5MCC2aSltbk09MYlqrYv1Ntp+ESsMvptYw==", + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@docusaurus/core": "3.9.0", + "@docusaurus/types": "3.9.0", + "@docusaurus/utils-validation": "3.9.0", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.9.0.tgz", + "integrity": "sha512-+jWO3tkrvsMUKQ69KTIj9ZBf8sKY5kodLcP4yIaEkPzfWq9IEpE+ekQCtFWlrAmkJUtSxbjHK6HNZZkUNwwq7w==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.0", + "@docusaurus/types": "3.9.0", + "@docusaurus/utils-validation": "3.9.0", + "tslib": "^2.6.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.9.0.tgz", + "integrity": "sha512-QOyLooWuF+On4q2RDGVZtKY0tlfdZwD9e/p7g1sJLUfOwN518V2Bo+kZtU82Or42SCKjyJ0lhSqAUOZfbeFhFw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.0", + "@docusaurus/logger": "3.9.0", + "@docusaurus/types": "3.9.0", + "@docusaurus/utils": "3.9.0", + "@docusaurus/utils-common": "3.9.0", + "@docusaurus/utils-validation": "3.9.0", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "node_modules/@docusaurus/plugin-svgr": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-svgr/-/plugin-svgr-3.9.0.tgz", + "integrity": "sha512-pUZIfnhFtAYDmDwimFiBY+sxNUigyJnKbCwI9pTiXr3uGp43CsSsN8gwl/i8jBmqfsZzvNnGZNxc75wy9v6RXA==", + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@docusaurus/core": "3.9.0", + "@docusaurus/types": "3.9.0", + "@docusaurus/utils": "3.9.0", + "@docusaurus/utils-validation": "3.9.0", + "@svgr/core": "8.1.0", + "@svgr/webpack": "^8.1.0", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "node_modules/@docusaurus/plugin-svgr/node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/types": "^7.21.3", + "entities": "^4.4.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "node_modules/@docusaurus/plugin-svgr/node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "dev": true, + "node_modules/@docusaurus/plugin-svgr/node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", "dependencies": { - "debug": "^4.1.1" + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "dev": true - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" - }, - "node_modules/@mdx-js/mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", - "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", - "dependencies": { - "@babel/core": "7.12.9", - "@babel/plugin-syntax-jsx": "7.12.1", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@mdx-js/util": "1.6.22", - "babel-plugin-apply-mdx-type-prop": "1.6.22", - "babel-plugin-extract-import-names": "1.6.22", - "camelcase-css": "2.0.1", - "detab": "2.0.4", - "hast-util-raw": "6.0.1", - "lodash.uniq": "4.5.0", - "mdast-util-to-hast": "10.0.1", - "remark-footnotes": "2.0.0", - "remark-mdx": "1.6.22", - "remark-parse": "8.0.3", - "remark-squeeze-paragraphs": "4.0.0", - "style-to-object": "0.3.0", - "unified": "9.2.0", - "unist-builder": "2.0.3", - "unist-util-visit": "2.0.3" + "node_modules/@docusaurus/plugin-svgr/node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@mdx-js/mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "node_modules/@docusaurus/preset-classic": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.9.0.tgz", + "integrity": "sha512-nLoiDxf8bDNNxDSZ28+pFfSfT+QRi08Pn2K0zIvbjkM/X/otMs4ho0K8+2FpoLOoGApifaSuNfJXpGYnQV3rGA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.0", + "@docusaurus/plugin-content-blog": "3.9.0", + "@docusaurus/plugin-content-docs": "3.9.0", + "@docusaurus/plugin-content-pages": "3.9.0", + "@docusaurus/plugin-css-cascade-layers": "3.9.0", + "@docusaurus/plugin-debug": "3.9.0", + "@docusaurus/plugin-google-analytics": "3.9.0", + "@docusaurus/plugin-google-gtag": "3.9.0", + "@docusaurus/plugin-google-tag-manager": "3.9.0", + "@docusaurus/plugin-sitemap": "3.9.0", + "@docusaurus/plugin-svgr": "3.9.0", + "@docusaurus/theme-classic": "3.9.0", + "@docusaurus/theme-common": "3.9.0", + "@docusaurus/theme-search-algolia": "3.9.0", + "@docusaurus/types": "3.9.0" + }, + "engines": { + "node": ">=20.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.9.0.tgz", + "integrity": "sha512-RToUIabJOyX41nMIxkFn8LPeA+uHgySzyd6Ak/gsINqWHHTLDMoYPxBUmNm3S+okcfuMI54kNYvD6TY+6TIYDA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.9.0", + "@docusaurus/logger": "3.9.0", + "@docusaurus/mdx-loader": "3.9.0", + "@docusaurus/module-type-aliases": "3.9.0", + "@docusaurus/plugin-content-blog": "3.9.0", + "@docusaurus/plugin-content-docs": "3.9.0", + "@docusaurus/plugin-content-pages": "3.9.0", + "@docusaurus/theme-common": "3.9.0", + "@docusaurus/theme-translations": "3.9.0", + "@docusaurus/types": "3.9.0", + "@docusaurus/utils": "3.9.0", + "@docusaurus/utils-common": "3.9.0", + "@docusaurus/utils-validation": "3.9.0", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "infima": "0.2.0-alpha.45", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.5.4", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=20.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/module-type-aliases": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.0.tgz", + "integrity": "sha512-0ucYr79FpTCebN+l3ZlKqoW7HbMqSKT8JdsEg6QoUtxD3C7trF6KZiK/X6Yh+xekO1w3zzXYgPcIYTF2DV81tQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@docusaurus/types": "3.9.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "react": "*", + "react-dom": "*" } }, - "node_modules/@mdx-js/mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" + "node_modules/@docusaurus/theme-classic/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/@mdx-js/mdx/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "node_modules/@docusaurus/theme-common": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.9.0.tgz", + "integrity": "sha512-pqNoQgttIpk7Ndm6N8OGbhi+1wBIQXQPYM7bPf1HDraXfvVpOzhcDty1yyK4coPWl0M7NxednZvKw4atfQ70Ew==", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.9.0", + "@docusaurus/module-type-aliases": "3.9.0", + "@docusaurus/utils": "3.9.0", + "@docusaurus/utils-common": "3.9.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=20.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@mdx-js/mdx/node_modules/unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/module-type-aliases": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.9.0.tgz", + "integrity": "sha512-0ucYr79FpTCebN+l3ZlKqoW7HbMqSKT8JdsEg6QoUtxD3C7trF6KZiK/X6Yh+xekO1w3zzXYgPcIYTF2DV81tQ==", + "license": "MIT", "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" + "@docusaurus/types": "3.9.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "peerDependencies": { + "react": "*", + "react-dom": "*" } }, - "node_modules/@mdx-js/react": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", - "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/@docusaurus/theme-common/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.9.0.tgz", + "integrity": "sha512-nbY7ZJVA10kTiBLJtscxK1aECeYvYFz+Sno9PkCE9KeFXqRDr6omtNmLVkbvyl4b6xgz+6yOIBdO/idLPVDpWg==", + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.9.0 || ^4.1.0", + "@docusaurus/core": "3.9.0", + "@docusaurus/logger": "3.9.0", + "@docusaurus/plugin-content-docs": "3.9.0", + "@docusaurus/theme-common": "3.9.0", + "@docusaurus/theme-translations": "3.9.0", + "@docusaurus/utils": "3.9.0", + "@docusaurus/utils-validation": "3.9.0", + "algoliasearch": "^5.37.0", + "algoliasearch-helper": "^3.26.0", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=20.0" }, "peerDependencies": { - "react": "^16.13.1 || ^17.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@mdx-js/util": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", - "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/@docusaurus/theme-search-algolia/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/@monaco-editor/loader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", - "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", + "node_modules/@docusaurus/theme-translations": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.9.0.tgz", + "integrity": "sha512-4HUELBsE+rhtlnR1MsaNB9nJXPFZANeDQa5If1GfFVlis5mWUfdmXmbGangR7PfpK2tc56UETMtzjKrX5L5UWw==", + "license": "MIT", "dependencies": { - "state-local": "^1.0.6" + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" }, - "peerDependencies": { - "monaco-editor": ">= 0.21.0 < 1" + "engines": { + "node": ">=20.0" } }, - "node_modules/@monaco-editor/react": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", - "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", + "node_modules/@docusaurus/tsconfig": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.9.2.tgz", + "integrity": "sha512-j6/Fp4Rlpxsc632cnRnl5HpOWeb6ZKssDj6/XzzAzVGXXfm9Eptx3rxCC+fDzySn9fHTS+CWJjPineCR1bB5WQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docusaurus/types": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.9.0.tgz", + "integrity": "sha512-0klJLhHFHqkYoxIVp1LD7dnU1ASRTfSX+HFDiELOdz+YQUkOSfuU5hDa46zD8bLxrYffCb8FtJI7Z6BWAmVodg==", + "license": "MIT", "dependencies": { - "@monaco-editor/loader": "^1.4.0" + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/mdast": "^4.0.2", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "npm:@slorber/react-helmet-async@1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.95.0", + "webpack-merge": "^5.9.0" }, "peerDependencies": { - "monaco-editor": ">= 0.25.0 < 1", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" }, "engines": { - "node": ">= 8" + "node": ">=10.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@docusaurus/utils": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.9.0.tgz", + "integrity": "sha512-wpVRQbDhXxqbb1llhkpu++aD4UdHHQ5M7J8DmJELDphlwmpI44TdS5elQZOsjzPfGyITZyQLekcDXjyteJ0/bw==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.9.0", + "@docusaurus/types": "3.9.0", + "@docusaurus/utils-common": "3.9.0", + "escape-string-regexp": "^4.0.0", + "execa": "5.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "p-queue": "^6.6.2", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, "engines": { - "node": ">= 8" + "node": ">=20.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@docusaurus/utils-common": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.9.0.tgz", + "integrity": "sha512-zpmzRn2mniMnrx8ZEYyyDsr0/7EksVgUXL9IuODp0DSK+R19nDGCY7w2NaMGRmGnrQQKsT3t0NDZzBk0V6N9Iw==", + "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@docusaurus/types": "3.9.0", + "tslib": "^2.6.0" }, "engines": { - "node": ">= 8" + "node": ">=20.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, + "node_modules/@docusaurus/utils-validation": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.9.0.tgz", + "integrity": "sha512-xpVLdFPpsE5dYuE7hOtghccCrRWRhM6tUQ4YpfSy5snCDWgROITG5Mj22fGstd/HBqTzKD8NFs7qPPs42qjgWg==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.9.0", + "@docusaurus/utils": "3.9.0", + "@docusaurus/utils-common": "3.9.0", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, "engines": { - "node": ">=14" + "node": ">=20.0" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", + "license": "MIT" }, - "node_modules/@reduxjs/toolkit": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", - "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", - "dependencies": { - "immer": "^9.0.21", - "redux": "^4.2.1", - "redux-thunk": "^2.4.2", - "reselect": "^4.1.8" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18", - "react-redux": "^7.2.1 || ^8.0.2" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } - } + "node_modules/@faker-js/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==", + "deprecated": "Please update to a newer version.", + "license": "MIT" }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" - }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/@slorber/static-site-generator-webpack-plugin": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", - "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", "dependencies": { - "eval": "^0.1.8", - "p-map": "^4.0.0", - "webpack-sources": "^3.2.2" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">=14" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-7.0.0.tgz", - "integrity": "sha512-khWbXesWIP9v8HuKCl2NU2HNAyqpSQ/vkIl36Nbn4HIwEYSRWL0H7Gs6idJdha2DkpFDWlsqMELvoCE8lfFY6Q==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-7.0.0.tgz", - "integrity": "sha512-iiZaIvb3H/c7d3TH2HBeK91uI2rMhZNwnsIrvd7ZwGLkFw6mmunOCoVnjdYua662MqGFxlN9xTq4fv9hgR4VXQ==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-7.0.0.tgz", - "integrity": "sha512-sQQmyo+qegBx8DfFc04PFmIO1FP1MHI1/QEpzcIcclo5OAISsOJPW76ZIs0bDyO/DBSJEa/tDa1W26pVtt0FRw==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-7.0.0.tgz", - "integrity": "sha512-i6MaAqIZXDOJeikJuzocByBf8zO+meLwfQ/qMHIjCcvpnfvWf82PFvredEZElErB5glQFJa2KVKk8N2xV6tRRA==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-7.0.0.tgz", - "integrity": "sha512-BoVSh6ge3SLLpKC0pmmN9DFlqgFy4NxNgdZNLPNJWBUU7TQpDWeBuyVuDW88iXydb5Cv0ReC+ffa5h3VrKfk1w==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-7.0.0.tgz", - "integrity": "sha512-tNDcBa+hYn0gO+GkP/AuNKdVtMufVhU9fdzu+vUQsR18RIJ9RWe7h/pSBY338RO08wArntwbDk5WhQBmhf2PaA==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "license": "Apache-2.0", "engines": { - "node": ">=14" + "node": ">=10.0" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/sponsors/streamich" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "tslib": "2" } }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-7.0.0.tgz", - "integrity": "sha512-qw54u8ljCJYL2KtBOjI5z7Nzg8LnSvQOP5hPKj77H4VQL4+HdKbAT5pnkkZLmHKYwzsIHSYKXxHouD8zZamCFQ==", + "node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "license": "Apache-2.0", "engines": { - "node": ">=14" + "node": ">=10.0" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/sponsors/streamich" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "tslib": "2" } }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-7.0.0.tgz", - "integrity": "sha512-CcFECkDj98daOg9jE3Bh3uyD9kzevCAnZ+UtzG6+BQG/jOQ2OA3jHnX6iG4G1MCJkUQFnUvEv33NvQfqrb/F3A==", + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": ">=10.0" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/sponsors/streamich" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "tslib": "2" } }, - "node_modules/@svgr/babel-preset": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-7.0.0.tgz", - "integrity": "sha512-EX/NHeFa30j5UjldQGVQikuuQNHUdGmbh9kEpBKofGUtF0GUPJ4T4rhoYiqDAOmBOxojyot36JIFiDUHUK1ilQ==", + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "license": "Apache-2.0", "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^7.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^7.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^7.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^7.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "^7.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "^7.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "^7.0.0", - "@svgr/babel-plugin-transform-svg-component": "^7.0.0" + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" }, "engines": { - "node": ">=14" + "node": ">=10.0" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/sponsors/streamich" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "tslib": "2" } }, - "node_modules/@svgr/core": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-7.0.0.tgz", - "integrity": "sha512-ztAoxkaKhRVloa3XydohgQQCb0/8x9T63yXovpmHzKMkHO6pkjdsIAWKOS4bE95P/2quVh1NtjSKlMRNzSBffw==", + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "license": "Apache-2.0", "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "^7.0.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3" + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" }, "engines": { - "node": ">=14" + "node": ">=10.0" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-7.0.0.tgz", - "integrity": "sha512-42Ej9sDDEmsJKjrfQ1PHmiDiHagh/u9AHO9QWbeNx4KmD9yS5d1XHmXUNINfUcykAU+4431Cn+k6Vn5mWBYimQ==", + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" }, "engines": { - "node": ">=14" + "node": ">=10.0" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@svgr/plugin-jsx": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-7.0.0.tgz", - "integrity": "sha512-SWlTpPQmBUtLKxXWgpv8syzqIU8XgFRvyhfkam2So8b3BE0OS0HPe5UfmlJ2KIC+a7dpuuYovPR2WAQuSyMoPw==", + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "^7.0.0", - "@svgr/hast-util-to-babel-ast": "^7.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@svgr/plugin-svgo": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-7.0.0.tgz", - "integrity": "sha512-263znzlu3qTKj71/ot5G9l2vpL4CW+pr2IexBFIwwB+fRAXE9Xnw2rUFgE6P4+37N9siOuC4lKkgBfUCOLFRKQ==", + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "license": "MIT", "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - }, - "engines": { - "node": ">=14" + "@types/mdx": "^2.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "type": "opencollective", + "url": "https://opencollective.com/unified" }, "peerDependencies": { - "@svgr/core": "*" + "@types/react": ">=16", + "react": ">=16" } }, - "node_modules/@svgr/webpack": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-7.0.0.tgz", - "integrity": "sha512-XWzIhLTr5WYns/cNFXpXrmFy+LFf2xp60VnNUBZCpM1CGTx47FCDuUj2DQjxirMf2L6CP2jTRELK8ef01TecFQ==", + "node_modules/@monaco-editor/loader": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.6.1.tgz", + "integrity": "sha512-w3tEnj9HYEC73wtjdpR089AqkUPskFRcdkxsiSFt3SoUc3OHpmu+leP94CXBm4mHfefmhsdfI0ZQu6qJ0wgtPg==", + "license": "MIT", "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "^7.0.0", - "@svgr/plugin-jsx": "^7.0.0", - "@svgr/plugin-svgo": "^7.0.0" + "state-local": "^1.0.6" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", + "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", + "license": "MIT", + "dependencies": { + "@monaco-editor/loader": "^1.5.0" }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", "engines": { - "node": ">=14" + "node": "^14.21.3 || >=16" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "dependencies": { - "defer-to-connect": "^1.0.1" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=6" + "node": ">= 8" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">= 8" } }, - "node_modules/@tsconfig/docusaurus": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz", - "integrity": "sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg==", - "dev": true - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { - "@types/connect": "*", - "@types/node": "*" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dependencies": { - "@types/node": "*" + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "node_modules/@paralleldrive/cuid2": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", + "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", + "license": "MIT", "dependencies": { - "@types/node": "*" + "@noble/hashes": "^1.1.5" } }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/eslint": { - "version": "8.21.3", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.3.tgz", - "integrity": "sha512-fa7GkppZVEByMWGbTtE5MbmXWJTVbrjjaS8K6uQj+XtuuUv1fsuPAxhygfqLmsb/Ufb3CV8deFCpiMfAgi00Sw==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", - "dependencies": { - "@types/unist": "*" + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/@types/http-proxy": { - "version": "1.17.10", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz", - "integrity": "sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==", - "dependencies": { - "@types/node": "*" + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dependencies": { - "@types/istanbul-lib-report": "*" + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" } }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } }, - "node_modules/@types/mdast": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", - "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", "dependencies": { - "@types/unist": "*" + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" } }, - "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" - }, - "node_modules/@types/node": { - "version": "18.15.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.10.tgz", - "integrity": "sha512-9avDaQJczATcXgfmMAW3MIWArOO7A+m90vuCFLr8AotWf8igO/mRoYukrk2cqZVtv38tHs33retzHEilM7FpeQ==" - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "node_modules/@types/parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", - "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" }, - "node_modules/@types/react": { - "version": "18.0.30", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.30.tgz", - "integrity": "sha512-AnME2cHDH11Pxt/yYX6r0w448BfTwQOLEhQEjCdwB7QskEI7EKtxhGUsExTQe/MsY3D9D5rMtu62WRocw9A8FA==", + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "license": "MIT", "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@types/react-redux": { - "version": "7.1.33", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", - "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "license": "MIT" + }, + "node_modules/@reduxjs/toolkit": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", + "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", + "license": "MIT", "dependencies": { - "@types/hoist-non-react-statics": "^3.3.0", - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0", - "redux": "^4.0.0" + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } } }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" + "@hapi/hoek": "^9.0.0" } }, - "node_modules/@types/react-router-config": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.6.tgz", - "integrity": "sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" }, - "node_modules/@types/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==", - "dependencies": { - "@types/node": "*" + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" - }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", "dependencies": { - "@types/express": "*" + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" } }, - "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dependencies": { - "@types/node": "*" + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", - "dependencies": { - "@types/node": "*" + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dependencies": { - "@types/yargs-parser": "*" + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dependencies": { - "@xtuc/long": "4.2.2" + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-7.0.0.tgz", + "integrity": "sha512-42Ej9sDDEmsJKjrfQ1PHmiDiHagh/u9AHO9QWbeNx4KmD9yS5d1XHmXUNINfUcykAU+4431Cn+k6Vn5mWBYimQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "node_modules/@svgr/plugin-jsx": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-7.0.0.tgz", + "integrity": "sha512-SWlTpPQmBUtLKxXWgpv8syzqIU8XgFRvyhfkam2So8b3BE0OS0HPe5UfmlJ2KIC+a7dpuuYovPR2WAQuSyMoPw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "^7.0.0", + "@svgr/hast-util-to-babel-ast": "^7.0.0", + "svg-parser": "^2.0.4" }, "engines": { - "node": ">= 0.6" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-7.0.0.tgz", + "integrity": "sha512-khWbXesWIP9v8HuKCl2NU2HNAyqpSQ/vkIl36Nbn4HIwEYSRWL0H7Gs6idJdha2DkpFDWlsqMELvoCE8lfFY6Q==", + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/accepts/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, + "node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-7.0.0.tgz", + "integrity": "sha512-iiZaIvb3H/c7d3TH2HBeK91uI2rMhZNwnsIrvd7ZwGLkFw6mmunOCoVnjdYua662MqGFxlN9xTq4fv9hgR4VXQ==", + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "bin": { - "acorn": "bin/acorn" - }, + "node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-7.0.0.tgz", + "integrity": "sha512-sQQmyo+qegBx8DfFc04PFmIO1FP1MHI1/QEpzcIcclo5OAISsOJPW76ZIs0bDyO/DBSJEa/tDa1W26pVtt0FRw==", + "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-7.0.0.tgz", + "integrity": "sha512-i6MaAqIZXDOJeikJuzocByBf8zO+meLwfQ/qMHIjCcvpnfvWf82PFvredEZElErB5glQFJa2KVKk8N2xV6tRRA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, "peerDependencies": { - "acorn": "^8" + "@babel/core": "^7.0.0-0" } }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-7.0.0.tgz", + "integrity": "sha512-BoVSh6ge3SLLpKC0pmmN9DFlqgFy4NxNgdZNLPNJWBUU7TQpDWeBuyVuDW88iXydb5Cv0ReC+ffa5h3VrKfk1w==", + "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-7.0.0.tgz", + "integrity": "sha512-tNDcBa+hYn0gO+GkP/AuNKdVtMufVhU9fdzu+vUQsR18RIJ9RWe7h/pSBY338RO08wArntwbDk5WhQBmhf2PaA==", + "license": "MIT", "engines": { - "node": ">= 10.0.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, + "node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-7.0.0.tgz", + "integrity": "sha512-qw54u8ljCJYL2KtBOjI5z7Nzg8LnSvQOP5hPKj77H4VQL4+HdKbAT5pnkkZLmHKYwzsIHSYKXxHouD8zZamCFQ==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-7.0.0.tgz", + "integrity": "sha512-CcFECkDj98daOg9jE3Bh3uyD9kzevCAnZ+UtzG6+BQG/jOQ2OA3jHnX6iG4G1MCJkUQFnUvEv33NvQfqrb/F3A==", + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "node_modules/@svgr/plugin-jsx/node_modules/@svgr/babel-preset": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-7.0.0.tgz", + "integrity": "sha512-EX/NHeFa30j5UjldQGVQikuuQNHUdGmbh9kEpBKofGUtF0GUPJ4T4rhoYiqDAOmBOxojyot36JIFiDUHUK1ilQ==", + "license": "MIT", "dependencies": { - "ajv": "^8.0.0" + "@svgr/babel-plugin-add-jsx-attribute": "^7.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^7.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^7.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^7.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "^7.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "^7.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "^7.0.0", + "@svgr/babel-plugin-transform-svg-component": "^7.0.0" }, - "peerDependencies": { - "ajv": "^8.0.0" + "engines": { + "node": ">=14" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/@svgr/plugin-svgo": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-7.0.0.tgz", + "integrity": "sha512-263znzlu3qTKj71/ot5G9l2vpL4CW+pr2IexBFIwwB+fRAXE9Xnw2rUFgE6P4+37N9siOuC4lKkgBfUCOLFRKQ==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "url": "https://github.com/sponsors/gregberge" + }, "peerDependencies": { - "ajv": "^6.9.1" + "@svgr/core": "*" } }, - "node_modules/algoliasearch": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.16.0.tgz", - "integrity": "sha512-HAjKJ6bBblaXqO4dYygF4qx251GuJ6zCZt+qbJ+kU7sOC+yc84pawEjVpJByh+cGP2APFCsao2Giz50cDlKNPA==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.16.0", - "@algolia/cache-common": "4.16.0", - "@algolia/cache-in-memory": "4.16.0", - "@algolia/client-account": "4.16.0", - "@algolia/client-analytics": "4.16.0", - "@algolia/client-common": "4.16.0", - "@algolia/client-personalization": "4.16.0", - "@algolia/client-search": "4.16.0", - "@algolia/logger-common": "4.16.0", - "@algolia/logger-console": "4.16.0", - "@algolia/requester-browser-xhr": "4.16.0", - "@algolia/requester-common": "4.16.0", - "@algolia/requester-node-http": "4.16.0", - "@algolia/transporter": "4.16.0" + "node_modules/@svgr/webpack": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-7.0.0.tgz", + "integrity": "sha512-XWzIhLTr5WYns/cNFXpXrmFy+LFf2xp60VnNUBZCpM1CGTx47FCDuUj2DQjxirMf2L6CP2jTRELK8ef01TecFQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "^7.0.0", + "@svgr/plugin-jsx": "^7.0.0", + "@svgr/plugin-svgo": "^7.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/algoliasearch-helper": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.12.0.tgz", - "integrity": "sha512-/j1U3PEwdan0n6P/QqSnSpNSLC5+cEMvyljd5CnmNmUjDlGrys+vFEOwjVEnqELIiAGMHEA/Nl3CiKVFBUYqyQ==", - "dependencies": { - "@algolia/events": "^4.0.1" + "node_modules/@svgr/webpack/node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-7.0.0.tgz", + "integrity": "sha512-khWbXesWIP9v8HuKCl2NU2HNAyqpSQ/vkIl36Nbn4HIwEYSRWL0H7Gs6idJdha2DkpFDWlsqMELvoCE8lfFY6Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { - "algoliasearch": ">= 3.1 < 6" + "@babel/core": "^7.0.0-0" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "node_modules/@svgr/webpack/node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-7.0.0.tgz", + "integrity": "sha512-iiZaIvb3H/c7d3TH2HBeK91uI2rMhZNwnsIrvd7ZwGLkFw6mmunOCoVnjdYua662MqGFxlN9xTq4fv9hgR4VXQ==", + "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@svgr/webpack/node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-7.0.0.tgz", + "integrity": "sha512-sQQmyo+qegBx8DfFc04PFmIO1FP1MHI1/QEpzcIcclo5OAISsOJPW76ZIs0bDyO/DBSJEa/tDa1W26pVtt0FRw==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, + "node_modules/@svgr/webpack/node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-7.0.0.tgz", + "integrity": "sha512-i6MaAqIZXDOJeikJuzocByBf8zO+meLwfQ/qMHIjCcvpnfvWf82PFvredEZElErB5glQFJa2KVKk8N2xV6tRRA==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "node_modules/@svgr/webpack/node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-7.0.0.tgz", + "integrity": "sha512-BoVSh6ge3SLLpKC0pmmN9DFlqgFy4NxNgdZNLPNJWBUU7TQpDWeBuyVuDW88iXydb5Cv0ReC+ffa5h3VrKfk1w==", + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/@svgr/webpack/node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-7.0.0.tgz", + "integrity": "sha512-tNDcBa+hYn0gO+GkP/AuNKdVtMufVhU9fdzu+vUQsR18RIJ9RWe7h/pSBY338RO08wArntwbDk5WhQBmhf2PaA==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "node_modules/@svgr/webpack/node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-7.0.0.tgz", + "integrity": "sha512-qw54u8ljCJYL2KtBOjI5z7Nzg8LnSvQOP5hPKj77H4VQL4+HdKbAT5pnkkZLmHKYwzsIHSYKXxHouD8zZamCFQ==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "node_modules/@svgr/webpack/node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-7.0.0.tgz", + "integrity": "sha512-CcFECkDj98daOg9jE3Bh3uyD9kzevCAnZ+UtzG6+BQG/jOQ2OA3jHnX6iG4G1MCJkUQFnUvEv33NvQfqrb/F3A==", + "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], + "node_modules/@svgr/webpack/node_modules/@svgr/babel-preset": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-7.0.0.tgz", + "integrity": "sha512-EX/NHeFa30j5UjldQGVQikuuQNHUdGmbh9kEpBKofGUtF0GUPJ4T4rhoYiqDAOmBOxojyot36JIFiDUHUK1ilQ==", + "license": "MIT", "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" + "@svgr/babel-plugin-add-jsx-attribute": "^7.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^7.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^7.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^7.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "^7.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "^7.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "^7.0.0", + "@svgr/babel-plugin-transform-svg-component": "^7.0.0" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axios": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", - "dependencies": { - "follow-redirects": "^1.14.7" + "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "node_modules/@svgr/webpack/node_modules/@svgr/core": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-7.0.0.tgz", + "integrity": "sha512-ztAoxkaKhRVloa3XydohgQQCb0/8x9T63yXovpmHzKMkHO6pkjdsIAWKOS4bE95P/2quVh1NtjSKlMRNzSBffw==", + "license": "MIT", "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "^7.0.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3" }, "engines": { - "node": ">= 8.9" + "node": ">=14" }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/babel-plugin-apply-mdx-type-prop": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", - "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "7.10.4", - "@mdx-js/util": "1.6.22" + "defer-to-connect": "^2.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@babel/core": "^7.11.6" + "engines": { + "node": ">=14.16" } }, - "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "license": "MIT", "dependencies": { - "object.assign": "^4.1.0" + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/babel-plugin-extract-import-names": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", - "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "7.10.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "@types/node": "*" } }, - "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/express-serve-static-core": "*", + "@types/node": "*" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" } }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/bail": { + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", - "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base16": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", - "integrity": "sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==" + "node_modules/@types/express": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/@types/express-serve-static-core": { + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", + "license": "MIT" }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", + "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "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" + "hoist-non-react-statics": "^3.3.0" }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "peerDependencies": { + "@types/react": "*" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "license": "MIT" }, - "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "license": "MIT", "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" + "@types/node": "*" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" }, - "node_modules/boxen": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", - "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^6.2.0", - "chalk": "^4.1.2", - "cli-boxes": "^3.0.0", - "string-width": "^5.0.1", - "type-fest": "^2.5.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@types/istanbul-lib-report": "*" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" + "@types/unist": "*" } }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz", + "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==", + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "undici-types": "~7.16.0" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "@types/node": "*" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "node_modules/@types/prismjs": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "license": "MIT" }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "engines": { - "node": ">= 0.8" + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", + "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" } }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "node_modules/@types/react-redux": { + "version": "7.1.34", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.34.tgz", + "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", + "license": "MIT", "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" } }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/history": "^4.7.11", + "@types/react": "*" } }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" } }, - "node_modules/cacheable-request/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "engines": { - "node": ">=8" + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", "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.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@types/node": "*" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" + "node_modules/@types/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.0.tgz", + "integrity": "sha512-zBF6vZJn1IaMpg3xUF25VK3gd3l8zwE0ZLRX7dsQyQi+jp4E8mMDJNGDYnYse+bQhYwWERTxVwHpi3dMOq7RKQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" + "@types/express": "*" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/@types/serve-static": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.9.tgz", + "integrity": "sha512-dOTIuqpWLyl3BBXU3maNQsS4A3zuuoYRNIvYSxxhebPfXg2mzWQEPne/nlJ37yOse6uGgR386uTpdsx4D0QZWA==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" + "@types/node": "*" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001470", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001470.tgz", - "integrity": "sha512-065uNwY6QtHCBOExzbV6m236DDhYCCtPmQUCoQtwkVqzud8v5QPidoMr6CoMkC2nfp6nksjttqWQRRh75LqUmA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" }, - "node_modules/ccount": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", - "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@types/yargs-parser": "*" } }, - "node_modules/character-entities": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", - "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" }, - "node_modules/character-entities-legacy": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", - "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" }, - "node_modules/character-reference-invalid": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", - "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/@vercel/oidc": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.3.tgz", + "integrity": "sha512-yNEQvPcVrK9sIe637+I0jD6leluPxzwJKx/Haw6F4H77CdDsszUn5V3o96LPziXkSNE2B83+Z3mjqGKBK/R6Gg==", + "license": "Apache-2.0", + "engines": { + "node": ">= 20" } }, - "node_modules/charset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", - "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", - "engines": { - "node": ">=4.0.0" + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" } }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", "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.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "engines": { - "node": ">=6.0" + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" } }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "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" } }, - "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" + "@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" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "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" } }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/cli-table3/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=10.13.0" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependencies": { + "acorn": "^8.14.0" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", "dependencies": { - "mimic-response": "^1.0.0" + "acorn": "^8.11.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", "engines": { - "node": ">=6" + "node": ">=0.4.0" } }, - "node_modules/collapse-white-space": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", - "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" - }, - "node_modules/combine-promises": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", - "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==", - "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/ai": { + "version": "5.0.76", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.76.tgz", + "integrity": "sha512-ZCxi1vrpyCUnDbtYrO/W8GLvyacV9689f00yshTIQ3mFFphbD7eIv40a2AOZBv3GGRA7SSRYIDnr56wcS/gyQg==", + "license": "Apache-2.0", "dependencies": { - "delayed-stream": "~1.0.0" + "@ai-sdk/gateway": "2.0.0", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.12", + "@opentelemetry/api": "1.9.0" }, "engines": { - "node": ">= 0.8" + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4.1.8" } }, - "node_modules/comma-separated-tokens": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", - "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, "funding": { "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "engines": { - "node": ">= 6" + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", "dependencies": { - "mime-db": ">= 1.43.0 < 2" + "fast-deep-equal": "^3.1.3" }, - "engines": { - "node": ">= 0.6" + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/compressible/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" + "node_modules/algoliasearch": { + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.40.1.tgz", + "integrity": "sha512-iUNxcXUNg9085TJx0HJLjqtDE0r1RZ0GOGrt8KNQqQT5ugu8lZsHuMUYW/e0lHhq6xBvmktU9Bw4CXP9VQeKrg==", + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.6.1", + "@algolia/client-abtesting": "5.40.1", + "@algolia/client-analytics": "5.40.1", + "@algolia/client-common": "5.40.1", + "@algolia/client-insights": "5.40.1", + "@algolia/client-personalization": "5.40.1", + "@algolia/client-query-suggestions": "5.40.1", + "@algolia/client-search": "5.40.1", + "@algolia/ingestion": "1.40.1", + "@algolia/monitoring": "1.40.1", + "@algolia/recommend": "5.40.1", + "@algolia/requester-browser-xhr": "5.40.1", + "@algolia/requester-fetch": "5.40.1", + "@algolia/requester-node-http": "5.40.1" + }, + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "node_modules/algoliasearch-helper": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz", + "integrity": "sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw==", + "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" + "@algolia/events": "^4.0.1" }, - "engines": { - "node": ">= 0.8.0" + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", "dependencies": { - "ms": "2.0.0" + "string-width": "^4.1.0" } }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/configstore": { + "node_modules/ansi-align/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, "engines": { - "node": ">= 0.6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" - }, - "node_modules/copy-text-to-clipboard": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz", - "integrity": "sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==", + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", "engines": { - "node": ">= 14.15.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", "dependencies": { - "fast-deep-equal": "^3.1.3" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, - "peerDependencies": { - "ajv": "^8.8.2" + "engines": { + "node": ">= 8" } }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" } }, - "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "license": "MIT" }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": ">= 12.13.0" + "node": "^10 || ^12 || >=14" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 14.15.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" } }, - "node_modules/core-js": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz", - "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" } }, - "node_modules/core-js-compat": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz", - "integrity": "sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "license": "MIT", "dependencies": { - "browserslist": "^4.21.5" + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/core-js-pure": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.29.1.tgz", - "integrity": "sha512-4En6zYVi0i0XlXHVz/bi6l1XDjCqkKRq765NXuX+SnaIatlE96Odt5lMLjdxUiNI1v9OXI5DSLWYPlmTfkTktg==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cosmiconfig": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", - "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "license": "MIT", "dependencies": { - "node-fetch": "2.6.7" + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.19.tgz", + "integrity": "sha512-zoKGUdu6vb2jd3YOq0nnhEDQVbPcHhco3UImJrv5dSkvxTc2pl2WjOPsjZXDwPDSl5eghIMuY3R6J9NDKF3KcQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/css-declaration-sorter": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", - "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" + "node": "*" } }, - "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", "engines": { - "node": ">= 12.13.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", - "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", "dependencies": { - "cssnano": "^5.1.8", - "jest-worker": "^29.1.2", - "postcss": "^8.4.17", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" + "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.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "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 - } + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "ms": "2.0.0" } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" + "safer-buffer": ">= 2.1.2 < 3" }, - "peerDependencies": { - "ajv": "^8.8.2" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, - "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "side-channel": "^1.0.6" }, "engines": { - "node": ">= 12.13.0" + "node": ">=0.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" + "fill-range": "^7.1.1" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=8" } }, - "node_modules/cssnano-preset-advanced": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", - "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "autoprefixer": "^10.4.12", - "cssnano-preset-default": "^5.2.14", - "postcss-discard-unused": "^5.1.0", - "postcss-merge-idents": "^5.1.1", - "postcss-reduce-idents": "^5.2.0", - "postcss-zindex": "^5.1.0" + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "bin": { + "browserslist": "cli.js" }, - "peerDependencies": { - "postcss": "^8.2.15" + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" - }, - "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" + "run-applescript": "^7.0.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dependencies": { - "mimic-response": "^1.0.0" + "node": ">=18" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", "engines": { - "node": ">=4.0.0" + "node": ">= 0.8" } }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=14.16" } }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", "dependencies": { - "execa": "^5.0.0" + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">= 10" + "node": ">=14.16" } }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" }, "engines": { "node": ">= 0.4" @@ -6276,21 +7073,27 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -6299,20 +7102,36 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -6320,1343 +7139,1330 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/caniuse-lite": { + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=10" } }, - "node_modules/detab": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", - "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", - "dependencies": { - "repeat-string": "^1.5.4" - }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/detect-node": { + "node_modules/character-entities-html4": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node_modules/charset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" } }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", "dependencies": { - "path-type": "^4.0.0" + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" - }, - "node_modules/dns-packet": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.5.0.tgz", - "integrity": "sha512-USawdAUzRkV6xrqTjiAEp6M9YagZEzWcSUaZTcIFAiyQWW1SoI6KyId8y2+/71wbgHKQAKd+iupLv4YvEwYWvA==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=6" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/docusaurus-plugin-openapi": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/docusaurus-plugin-openapi/-/docusaurus-plugin-openapi-0.6.4.tgz", - "integrity": "sha512-RkJ68mndhbpx7x1Dukj6BUgUqQEuL5Iv3FFiVIxSCVFw5IuIk+5Oo7tiKbIUMfUHPbvmGSp4839JBTmM99153Q==", - "dependencies": { - "@docusaurus/mdx-loader": "^2.0.0", - "@docusaurus/plugin-content-docs": "^2.0.0", - "@docusaurus/utils": "^2.0.0", - "@docusaurus/utils-validation": "^2.0.0", - "axios": "^0.26.1", - "chalk": "^4.1.2", - "clsx": "^1.1.1", - "fs-extra": "^9.0.1", - "js-yaml": "^4.1.0", - "json-refs": "^3.0.15", - "json-schema-resolve-allof": "^1.5.0", - "lodash": "^4.17.20", - "openapi-to-postmanv2": "^1.2.1", - "postman-collection": "^4.1.0", - "remark-admonitions": "^1.2.1", - "webpack": "^5.73.0" - }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "node": ">=6.0" } }, - "node_modules/docusaurus-plugin-openapi/node_modules/axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", - "dependencies": { - "follow-redirects": "^1.14.8" + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/docusaurus-plugin-openapi/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "source-map": "~0.6.0" }, "engines": { - "node": ">=10" + "node": ">= 10.0" } }, - "node_modules/docusaurus-plugin-proxy": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/docusaurus-plugin-proxy/-/docusaurus-plugin-proxy-0.6.3.tgz", - "integrity": "sha512-HAR76IsuSWlVI1K6P8fEJDjhHxT3LLdXGr+ZxNBm6DJTUQ8Xf057nHR8BhB5sfwmzrDPup5wChP/nuOVAfU6wg==", + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { - "node": ">=14" + "node": ">=0.10.0" } }, - "node_modules/docusaurus-plugin-sass": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.3.tgz", - "integrity": "sha512-FbaE06K8NF8SPUYTwiG+83/jkXrwHJ/Afjqz3SUIGon6QvFwSSoKOcoxGQmUBnjTOk+deUONDx8jNWsegFJcBQ==", - "dependencies": { - "sass-loader": "^10.1.1" - }, - "peerDependencies": { - "@docusaurus/core": "^2.0.0-beta", - "sass": "^1.30.0" + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/docusaurus-preset-openapi": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/docusaurus-preset-openapi/-/docusaurus-preset-openapi-0.6.4.tgz", - "integrity": "sha512-jSgc23SDp13AHqFu4ehsCIRWwHNkQu9llKV56s3Ik2x7B7hWTQtVXBScz+m3qfXClztEx/XSF5nbZ55OfutyPA==", - "dependencies": { - "@docusaurus/preset-classic": "^2.0.0", - "docusaurus-plugin-openapi": "^0.6.4", - "docusaurus-plugin-proxy": "^0.6.3", - "docusaurus-theme-openapi": "^0.6.4" - }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", "engines": { - "node": ">=14" + "node": ">=10" }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/docusaurus-theme-openapi": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/docusaurus-theme-openapi/-/docusaurus-theme-openapi-0.6.4.tgz", - "integrity": "sha512-j+KZTo8f/jtIQ13WVsXUybOXsdUfKabJLE8Wi/RbVacVhB7WSR2in1wy4/gBmQ7xTPptedJOZm2cRB72dXgbiw==", + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", "dependencies": { - "@docusaurus/theme-common": "^2.0.0", - "@mdx-js/react": "^1.6.22", - "@monaco-editor/react": "^4.3.1", - "@reduxjs/toolkit": "^1.7.1", - "buffer": "^6.0.3", - "clsx": "^1.1.1", - "crypto-js": "^4.1.1", - "docusaurus-plugin-openapi": "^0.6.4", - "immer": "^9.0.7", - "lodash": "^4.17.20", - "monaco-editor": "^0.31.1", - "postman-code-generators": "^1.0.0", - "postman-collection": "^4.1.0", - "prism-react-renderer": "^1.2.1", - "process": "^0.11.10", - "react-magic-dropzone": "^1.0.1", - "react-redux": "^7.2.0", - "redux-devtools-extension": "^2.13.8", - "webpack": "^5.73.0" + "string-width": "^4.2.0" }, "engines": { - "node": ">=14" + "node": "10.* || >= 12.*" }, - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0", - "react-dom": "^16.8.4 || ^17.0.0" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dependencies": { - "utila": "~0.4" + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "node_modules/cli-table3/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { - "domelementtype": "^2.3.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "node": ">=8" } }, - "node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "engines": { + "node": ">=8" } }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { - "is-obj": "^2.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/dot-prop/node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.341", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.341.tgz", - "integrity": "sha512-R4A8VfUBQY9WmAhuqY5tjHRf5fH2AAf6vqitBOE0y6u2PgHgqHSrhZmu78dIX3fVZtjqlwJNX1i2zwC3VpHtQQ==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/emoticon": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", - "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { - "once": "^1.4.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=0.12" + "node": ">=10" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8.0.0" + "node": ">=7.0.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=4.0" + "node": ">= 0.8" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">= 6" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" }, - "node_modules/eta": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/eta/-/eta-2.0.1.tgz", - "integrity": "sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg==", - "engines": { - "node": ">=6.0.0" - }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "license": "MIT", "funding": { - "url": "https://github.com/eta-dev/eta?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, "engines": { "node": ">= 0.6" } }, - "node_modules/eval": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", - "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", "dependencies": { - "@types/node": "*", - "require-like": ">= 0.1.1" + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8.0" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/compression/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { - "node": ">=0.8.x" + "node": ">= 0.8" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "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" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/express/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { + "node_modules/compression/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, - "node_modules/express/node_modules/ms": { + "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, - "node_modules/express/node_modules/range-parser": { + "node_modules/compute-gcd": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" + "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", + "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "node_modules/compute-lcm": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", + "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "compute-gcd": "^1.2.1", + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" } }, - "node_modules/faker": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/faker/-/faker-5.1.0.tgz", - "integrity": "sha512-RrWKFSSA/aNLP0g3o2WW1Zez7/MnMr7xkiZmoCfAGZmdkDQZ6l2KtuXHN5XjdvpRjDl8+3vf+Rrtl06Z352+Mw==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", "dependencies": { - "punycode": "^1.3.2" + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" } }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" } }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/fbemitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", - "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", - "dependencies": { - "fbjs": "^3.0.0" + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/fbjs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", - "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", - "dependencies": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" }, - "node_modules/feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", - "dependencies": { - "xml-js": "^1.6.11" - }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", "engines": { - "node": ">=0.4.0" + "node": ">= 0.6" } }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "license": "MIT" + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "webpack": "^5.1.0" } }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 10.13.0" + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "engines": { - "node": ">= 0.4.0" + "node_modules/core-js": { + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", + "integrity": "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/core-js-compat": { + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", + "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "browserslist": "^4.26.3" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "node_modules/core-js-pure": { + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.46.0.tgz", + "integrity": "sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", "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" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "type-fest": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=8" - } - }, - "node_modules/flux": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz", - "integrity": "sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==", - "dependencies": { - "fbemitter": "^3.0.0", - "fbjs": "^3.0.1" + "node": ">=10" }, - "peerDependencies": { - "react": "^15.0.2 || ^16.0.0 || ^17.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", "funding": [ { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, "engines": { - "node": ">=4.0" + "node": ">=18" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", - "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", - "dev": true, + "node_modules/css-declaration-sorter": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.3.0.tgz", + "integrity": "sha512-LQF6N/3vkAMYF4xoHLJfG718HRJh34Z8BnNhd6bosOMIVjMlhuZK5++oZa3uYAgrI5+7x2o27gUqTR2U/KjUOQ==", + "license": "ISC", "engines": { - "node": ">=14" + "node": "^14 || ^16 || >=18" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "postcss": "^8.0.9" } }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "node_modules/css-has-pseudo": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", + "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=10", - "yarn": ">=1.0.0" + "node": ">=18" }, "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } + "postcss": "^8.4" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" }, "engines": { - "node": "*" + "node": ">= 12.13.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" }, "engines": { - "node": ">= 8.9.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "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 + } } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": ">=6" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/formidable": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", - "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", "dependencies": { - "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", - "once": "^1.4.0", - "qs": "^6.11.0" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", "engines": { - "node": "*" + "node": ">= 6" }, "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } + "node_modules/cssdb": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.4.2.tgz", + "integrity": "sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node": "^14 || ^16 || >=18.0" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" }, "engines": { - "node": ">= 0.4" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } }, - "node_modules/get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==", + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", "dependencies": { - "pump": "^3.0.0" + "css-tree": "~2.2.0" }, "engines": { - "node": ">=6" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==" - }, - "node_modules/glob": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.2.tgz", - "integrity": "sha512-Xsa0BcxIC6th9UwNjZkhrMtNo/MnyRL8jGCP+uEwhA5oFOCY1f2s1/oNKY47xQ0Bg5nkjsfAEIej1VeH62bDDQ==", - "dev": true, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.0", - "minipass": "^5.0.0", - "path-scurry": "^1.7.0" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "ms": "^2.1.3" }, "engines": { - "node": ">= 6" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz", - "integrity": "sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==", - "dev": true, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "mimic-response": "^3.1.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dependencies": { - "ini": "2.0.0" - }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -7664,1659 +8470,5765 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=4.0.0" } }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "license": "MIT", "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "license": "MIT", + "engines": { + "node": ">=18" }, - "bin": { - "which": "bin/which" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=0.4.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "node_modules/graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "dependencies": { - "lodash": "^4.17.15" + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" }, "engines": { - "node": ">=6.0" + "node": ">=0.10" } }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-package-manager": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-3.0.2.tgz", + "integrity": "sha512-8JFjJHutStYrfWwzfretQoyNGoZVW1Fsrp4JO9spa7h/fBfwgTMEIy4/LBzRDGsxwVPHU0q+T9YvwLDJoOApLQ==", + "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "execa": "^5.1.1" + }, + "engines": { + "node": ">=12" } }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "address": "^1.0.1", + "debug": "4" }, "bin": { - "js-yaml": "bin/js-yaml.js" + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" + "dequal": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "license": "ISC", "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" + "asap": "^2.0.0", + "wrappy": "1" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "node_modules/docusaurus-plugin-openapi": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-openapi/-/docusaurus-plugin-openapi-0.7.7.tgz", + "integrity": "sha512-l+GX8lNxPC45+ygTaaHQJ2/woGzHbjFUR90L9IH5PWJX4n5VtZ7ehc4St2YFl+3VvSkb+oIu9z0iBy3DEpeykw==", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "^3.7.0", + "@docusaurus/plugin-content-docs": "^3.7.0", + "@docusaurus/utils": "^3.7.0", + "@docusaurus/utils-common": "^3.7.0", + "@docusaurus/utils-validation": "^3.7.0", + "chalk": "^4.1.2", + "clsx": "^1.2.1", + "js-yaml": "^4.1.0", + "json-refs": "^3.0.15", + "json-schema-resolve-allof": "^1.5.0", + "lodash": "^4.17.20", + "openapi-to-postmanv2": "^4.20.1", + "postman-collection": "^4.1.0", + "webpack": "^5.95.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/docusaurus-plugin-proxy": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-proxy/-/docusaurus-plugin-proxy-0.7.7.tgz", + "integrity": "sha512-WD3CdKOyvND9pTeDVyXlFVMZChVc1ds4JyIN2eUI6EtC/nmMH27tgBOo/74Dkbm4hnxZzWVB7lhKFL0+1j/9ug==", + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14" } }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "engines": { - "node": ">=8" + "node_modules/docusaurus-plugin-sass": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.6.tgz", + "integrity": "sha512-2hKQQDkrufMong9upKoG/kSHJhuwd+FA3iAe/qzS/BmWpbIpe7XKmq5wlz4J5CJaOPu4x+iDJbgAxZqcoQf0kg==", + "license": "MIT", + "dependencies": { + "sass-loader": "^16.0.2" + }, + "peerDependencies": { + "@docusaurus/core": "^2.0.0-beta || ^3.0.0-alpha", + "sass": "^1.30.0" } }, - "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "node_modules/docusaurus-preset-openapi": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/docusaurus-preset-openapi/-/docusaurus-preset-openapi-0.7.7.tgz", + "integrity": "sha512-yHVsenJCTLD76jhBN0NTXSoWUPbA/KZt8twZfqfWrGc54tP5ZmEVV8j0ccmdacIPxC5cneZsl9O1q1zIdmfMQw==", + "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "@docusaurus/preset-classic": "^3.8.0", + "docusaurus-plugin-openapi": "^0.7.7", + "docusaurus-plugin-proxy": "^0.7.7", + "docusaurus-theme-openapi": "^0.7.7" }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/hast-to-hyperscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", - "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", - "dependencies": { - "@types/unist": "^2.0.3", - "comma-separated-tokens": "^1.0.0", - "property-information": "^5.3.0", - "space-separated-tokens": "^1.0.0", - "style-to-object": "^0.3.0", - "unist-util-is": "^4.0.0", - "web-namespaces": "^1.0.0" + "node_modules/docusaurus-theme-openapi": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/docusaurus-theme-openapi/-/docusaurus-theme-openapi-0.7.7.tgz", + "integrity": "sha512-QDlM68h2xzOE+4RBsl+w6BIzWd5ZCNDAxGSh5GdE5MBnhma6Tdtaewe2ZHHcDKH3Q1kTuXGxxikPKnKt1Wwu1w==", + "license": "MIT", + "dependencies": { + "@docusaurus/theme-common": "^3.7.0", + "@mdx-js/react": "^3.0.0", + "@monaco-editor/react": "^4.7.0", + "@reduxjs/toolkit": "^1.7.1", + "buffer": "^6.0.3", + "clsx": "^1.2.1", + "crypto-js": "^4.1.1", + "docusaurus-plugin-openapi": "^0.7.7", + "immer": "^9.0.7", + "lodash": "^4.17.20", + "marked": "^11.0.0", + "monaco-editor": "^0.31.1", + "postman-code-generators": "^1.0.0", + "postman-collection": "^4.1.0", + "prism-react-renderer": "^2.1.0", + "process": "^0.11.10", + "react-magic-dropzone": "^1.0.1", + "react-redux": "^7.2.0", + "redux-devtools-extension": "^2.13.8", + "refractor": "^4.8.1", + "striptags": "^3.2.0", + "webpack": "^5.95.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" } }, - "node_modules/hast-util-from-parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", - "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", - "dependencies": { - "@types/parse5": "^5.0.0", - "hastscript": "^6.0.0", - "property-information": "^5.0.0", - "vfile": "^4.0.0", - "vfile-location": "^3.2.0", - "web-namespaces": "^1.0.0" + "node_modules/docusaurus-theme-openapi/node_modules/marked": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-11.2.0.tgz", + "integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 18" } }, - "node_modules/hast-util-parse-selector": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", - "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" } }, - "node_modules/hast-util-raw": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", - "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^6.0.0", - "hast-util-to-parse5": "^6.0.0", - "html-void-elements": "^1.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^3.0.0", - "vfile": "^4.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/hast-util-raw/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" }, - "node_modules/hast-util-to-parse5": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", - "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", "dependencies": { - "hast-to-hyperscript": "^9.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.0.0", - "xtend": "^4.0.0", - "zwitch": "^1.0.0" + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/hastscript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", - "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "engines": { - "node": ">=8" + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", "dependencies": { - "react-is": "^16.7.0" + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" }, - "node_modules/hpack.js/node_modules/string_decoder": { + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" }, - "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + "node_modules/electron-to-chromium": { + "version": "1.5.237", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz", + "integrity": "sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==", + "license": "ISC" }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" }, - "node_modules/html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4" } }, - "node_modules/html-void-elements": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", - "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "license": "MIT", "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "is-arrayish": "^0.2.1" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.4" } }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "es-errors": "^1.3.0" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" } }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=12.0.0" + "node": ">= 0.4" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "license": "MIT" + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" }, - "peerDependencies": { - "@types/express": "^4.17.13" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-reasons": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", - "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==" - }, - "node_modules/http2-client": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", - "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==" + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "engines": { - "node": ">=10.17.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" }, - "peerDependencies": { - "postcss": "^8.1.0" + "engines": { + "node": ">=4.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", "engines": { - "node": ">= 4" + "node": ">=4.0" } }, - "node_modules/image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", "dependencies": { - "queue": "6.0.2" + "@types/estree": "^1.0.0" }, - "bin": { - "image-size": "bin/image-size.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" }, - "engines": { - "node": ">=14.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", "funding": { "type": "opencollective", - "url": "https://opencollective.com/immer" + "url": "https://opencollective.com/unified" } }, - "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" }, - "engines": { - "node": ">=6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.4.1.tgz", + "integrity": "sha512-E4fEc8KLhDXnbyDa5XrbdT9PbgSMt0AGZPFUsGFok8N2Q7DTO+F6xAFJjIdw71EkidRg186I1mQCKzZ1ZbEsCw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/remcohaszing" } }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "engines": { - "node": ">=4" + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", "engines": { - "node": ">=0.8.19" + "node": ">=0.10.0" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" } }, - "node_modules/infima": { - "version": "0.2.0-alpha.43", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", - "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.6" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">=18.0.0" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, "engines": { - "node": ">= 10" - } - }, - "node_modules/is-alphabetical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", - "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "node": ">=10" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/is-alphanumerical": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", - "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", "dependencies": { - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" + "ms": "2.0.0" } }, - "node_modules/is-ci/node_modules/ci-info": { + "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", "dependencies": { - "has": "^1.0.3" + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-decimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", - "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8.6.0" } }, - "node_modules/is-extglob": { + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "format": "^0.2.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", - "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" + "websocket-driver": ">=0.5.1" }, "engines": { - "node": ">=10" + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "engines": { - "node": ">=8" + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", "dependencies": { - "isobject": "^3.0.1" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.8" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-whitespace-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", - "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/is-word-character": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", - "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/jackspeak": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.1.0.tgz", - "integrity": "sha512-DiEwVPqsieUzZBNxQ2cxznmFzfg/AMgJUjYw5xl6rSmCxAQXECcbSdwcLM6Ds6T09+SBfSNCGPhYUoQ96P4h7A==", + "node_modules/foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", + "license": "MIT" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, + "license": "ISC", "dependencies": { - "cliui": "^7.0.4" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 6" } }, - "node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.5.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 14.17" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=0.4.x" } }, - "node_modules/joi": { - "version": "17.9.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.1.tgz", - "integrity": "sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw==", + "node_modules/formidable": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz", + "integrity": "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==", + "license": "MIT", "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-refs": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/json-refs/-/json-refs-3.0.15.tgz", - "integrity": "sha512-0vOQd9eLNBL18EGl5yYaO44GhixmImes2wiYn9Z3sag3QnehWrYWlB9AFtMxCL2Bj3fyxgDYkxGFEU/chlYssw==", + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "license": "MIT", "dependencies": { - "commander": "~4.1.1", - "graphlib": "^2.1.8", - "js-yaml": "^3.13.1", - "lodash": "^4.17.15", - "native-promise-only": "^0.8.1", - "path-loader": "^1.0.10", - "slash": "^3.0.0", - "uri-js": "^4.2.2" - }, - "bin": { - "json-refs": "bin/json-refs" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=0.8" + "node": ">=14.14" } }, - "node_modules/json-refs/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" }, - "node_modules/json-refs/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 6" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/json-refs/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/json-schema-resolve-allof": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/json-schema-resolve-allof/-/json-schema-resolve-allof-1.5.0.tgz", - "integrity": "sha512-Jgn6BQGSLDp3D7bTYrmCbP/p7SRFz5BfpeEJ9A7sXuVADMc14aaDN1a49zqk9D26wwJlcNvjRpT63cz1VgFZeg==", - "dependencies": { - "get-stdin": "^5.0.1", - "lodash": "^4.14.0" - }, - "bin": { - "json-schema-resolve-allof": "bin/json-schema-resolve-allof" + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { - "node": ">=6" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { - "universalify": "^2.0.0" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dependencies": { - "json-buffer": "3.0.0" - } + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "node_modules/get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.12.0" } }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "license": "ISC" + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", "dependencies": { - "package-json": "^6.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">=8" + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "license": "Apache-2.0", "engines": { - "node": ">=6" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/liquid-json": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", - "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "engines": { - "node": ">=6.11.5" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">=8.9.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/lodash": { + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", + "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector/node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/hast-util-parse-selector/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.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.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", + "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript/node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/hastscript/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/hastscript/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", + "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-reasons": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/http-reasons/-/http-reasons-0.1.0.tgz", + "integrity": "sha512-P6kYh0lKZ+y29T2Gqz+RlC9WBLhKe8kDmcJ+A+611jFfxdPsbMRQ5aNmFRM3lENqFkK+HTTL+tlQviAiv0AbLQ==", + "license": "Apache-2.0" + }, + "node_modules/http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", + "license": "MIT" + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "license": "MIT", + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/immutable": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", + "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "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.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", + "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", + "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "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" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-pointer": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz", + "integrity": "sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==", + "license": "MIT", + "dependencies": { + "foreach": "^2.0.4" + } + }, + "node_modules/json-refs": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/json-refs/-/json-refs-3.0.15.tgz", + "integrity": "sha512-0vOQd9eLNBL18EGl5yYaO44GhixmImes2wiYn9Z3sag3QnehWrYWlB9AFtMxCL2Bj3fyxgDYkxGFEU/chlYssw==", + "license": "MIT", + "dependencies": { + "commander": "~4.1.1", + "graphlib": "^2.1.8", + "js-yaml": "^3.13.1", + "lodash": "^4.17.15", + "native-promise-only": "^0.8.1", + "path-loader": "^1.0.10", + "slash": "^3.0.0", + "uri-js": "^4.2.2" + }, + "bin": { + "json-refs": "bin/json-refs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/json-refs/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/json-refs/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/json-refs/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-compare": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", + "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.4" + } + }, + "node_modules/json-schema-merge-allof": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz", + "integrity": "sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==", + "license": "MIT", + "dependencies": { + "compute-lcm": "^1.1.2", + "json-schema-compare": "^0.2.2", + "lodash": "^4.17.20" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/json-schema-resolve-allof": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/json-schema-resolve-allof/-/json-schema-resolve-allof-1.5.0.tgz", + "integrity": "sha512-Jgn6BQGSLDp3D7bTYrmCbP/p7SRFz5BfpeEJ9A7sXuVADMc14aaDN1a49zqk9D26wwJlcNvjRpT63cz1VgFZeg==", + "license": "ISC", + "dependencies": { + "get-stdin": "^5.0.1", + "lodash": "^4.14.0" + }, + "bin": { + "json-schema-resolve-allof": "bin/json-schema-resolve-allof" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/liquid-json": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", + "integrity": "sha512-wUayTU8MS827Dam6MxgD72Ui+KOSF+u/eIqpatOtjnvgJ0+mnDq33uC2M7J0tPK+upe/DpUAuK4JUU89iBoNKQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.1.tgz", + "integrity": "sha512-ntROs7RaN3EvWfy3EZi14H4YxmT6A5YvywfhO+0pm+cH/dnSQRmdAmoFIc3B9aiwTehyk7pESH4ofyBY+V5hZg==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "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.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.49.0.tgz", + "integrity": "sha512-L9uC9vGuc4xFybbdOpRLoOAOq1YEBBsocCs5NVW32DfU+CZWWIn3OVF+lB8Gp4ttBVSMazwrTrjv8ussX/e3VQ==", + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/lodash.curry": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", - "integrity": "sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==" + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } }, - "node_modules/lodash.flow": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", - "integrity": "sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==" + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } }, - "node_modules/lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/lower-case": { + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "tslib": "^2.0.3" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "engines": { - "node": ">=0.10.0" + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "yallist": "^3.0.2" + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/markdown-escapes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", - "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/marked": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-1.1.1.tgz", - "integrity": "sha512-mJzT8D2yPxoPh7h0UXkB+dBj4FykPJ2OIfxAWeIHrvoHDkFxukV/29QxoFQoPM6RLEwhIFdJpmKBlqVM3s2ZIw==", - "bin": { - "marked": "bin/marked" - }, - "engines": { - "node": ">= 8.16.2" - } + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/mdast-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "unist-util-remove": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-types": "^2.0.0" } }, - "node_modules/mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/mdast-util-to-hast": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", - "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "mdast-util-definitions": "^4.0.0", - "mdurl": "^1.0.0", - "unist-builder": "^2.0.0", - "unist-util-generated": "^1.0.0", - "unist-util-position": "^3.0.0", - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mdast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", - "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, - "node_modules/memfs": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", - "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "fs-monkey": "^1.0.3" - }, - "engines": { - "node": ">= 4.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -9324,20 +14236,22 @@ } }, "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "license": "MIT", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4" + "node": ">=4.0.0" } }, "node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -9346,16 +14260,18 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.1.tgz", "integrity": "sha512-XxU3ngPbEnrYnNbIX+lYSaYg0M01v6p2ntd2YaFksTu0vayaw5OJvbdRyWs07EYRlLED5qadUZ+xo+XhOvFhwg==", + "license": "Apache-2.0", "dependencies": { "charset": "^1.0.0" } }, "node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { - "mime-db": "~1.33.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -9365,76 +14281,31 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz", - "integrity": "sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==", - "dependencies": { - "schema-utils": "^4.0.0" - }, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "node_modules/mini-css-extract-plugin": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz", + "integrity": "sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" @@ -9442,63 +14313,78 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/monaco-editor": { "version": "0.31.1", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.31.1.tgz", - "integrity": "sha512-FYPwxGZAeP6mRRyrr5XTGHD9gRXVjy7GUzF4IPChnyt3fS5WrNxIkS8DNujWf6EQy0Zlzpxw8oTVE+mWI2/D1Q==" + "integrity": "sha512-FYPwxGZAeP6mRRyrr5XTGHD9gRXVjy7GUzF4IPChnyt3fS5WrNxIkS8DNujWf6EQy0Zlzpxw8oTVE+mWI2/D1Q==", + "license": "MIT" }, "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -9508,15 +14394,16 @@ } }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -9527,12 +14414,14 @@ "node_modules/native-promise-only": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==" + "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==", + "license": "MIT" }, "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -9540,29 +14429,55 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/neotraverse": { + "version": "0.6.15", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.15.tgz", + "integrity": "sha512-HZpdkco+JeXq0G+WWpMJ4NsX3pqb5O7eR9uGz3FfoFt+LYzU8iRWp49nJtud6hsDoywM8tIrDo3gjgmOqJA8LA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "optional": true + }, "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", + "license": "MIT", "dependencies": { - "lodash": "^4.17.21" + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -9582,6 +14497,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "license": "MIT", "dependencies": { "http2-client": "^1.2.5" }, @@ -9593,19 +14509,31 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } }, + "node_modules/node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", + "license": "MIT", + "dependencies": { + "es6-promise": "^3.2.1" + } + }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", + "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==", + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9614,16 +14542,18 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", + "integrity": "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9633,6 +14563,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -9643,12 +14574,14 @@ "node_modules/nprogress": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -9656,33 +14589,129 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/null-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/null-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/oas-kit-common": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "license": "BSD-3-Clause", "dependencies": { "fast-safe-stringify": "^2.0.7" } }, + "node_modules/oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", + "license": "BSD-3-Clause", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, "node_modules/oas-resolver-browser": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/oas-resolver-browser/-/oas-resolver-browser-2.3.3.tgz", - "integrity": "sha512-KvggQ6xU7WlUWRYZKEktR90zJtNCHi1wbTAZuUX6oSfmBSdZo/b26rzfg3w2AdPVwQPRXMga6tqLW3OhbUF0Qg==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver-browser/-/oas-resolver-browser-2.5.6.tgz", + "integrity": "sha512-Jw5elT/kwUJrnGaVuRWe1D7hmnYWB8rfDDjBnpQ+RYY/dzAewGXeTexXzt4fGEo6PUE4eqKqPWF79MZxxvMppA==", + "license": "BSD-3-Clause", "dependencies": { "node-fetch-h2": "^2.3.0", "oas-kit-common": "^1.0.8", "path-browserify": "^1.0.1", - "reftools": "^1.1.1", - "yaml": "^1.8.3", - "yargs": "^15.3.1" + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" }, "bin": { "resolve": "resolve.js" @@ -9691,18 +14720,60 @@ "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, + "node_modules/oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "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.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9711,18 +14782,22 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -9735,12 +14810,14 @@ "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -9749,9 +14826,10 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -9760,259 +14838,142 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/openapi-to-postmanv2": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/openapi-to-postmanv2/-/openapi-to-postmanv2-1.2.7.tgz", - "integrity": "sha512-oG3PZfAAljy5ebot8DZGLFDNNmDZ/qWqI/dboWlgg5hRj6dSSrXeiyXL6VQpcGDalxVX4jSChufOq2eDsFXp4w==", - "dependencies": { - "ajv": "6.12.3", - "async": "3.2.0", - "commander": "2.20.3", - "js-yaml": "3.13.1", - "lodash": "4.17.20", - "oas-resolver-browser": "2.3.3", - "path-browserify": "1.0.1", - "postman-collection": "3.6.6", - "yaml": "1.8.3" - }, - "bin": { - "openapi2postmanv2": "bin/openapi2postmanv2.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/openapi-to-postmanv2/node_modules/ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/openapi-to-postmanv2/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/openapi-to-postmanv2/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/openapi-to-postmanv2/node_modules/iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/openapi-to-postmanv2/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/openapi-to-postmanv2/node_modules/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "node_modules/openapi-to-postmanv2/node_modules/mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/openapi-to-postmanv2/node_modules/mime-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mime-format/-/mime-format-2.0.0.tgz", - "integrity": "sha512-sv1KDeJFutfXbT+MpIuExruuVZ7LSNQVHIxf7IZVr0a/qWKcHY8DHklWoO6CWf7QnGLl0eC8vBEghl5paWSqqg==", - "dependencies": { - "charset": "^1.0.0" - } - }, - "node_modules/openapi-to-postmanv2/node_modules/mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dependencies": { - "mime-db": "1.44.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/openapi-to-postmanv2/node_modules/postman-collection": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-3.6.6.tgz", - "integrity": "sha512-fm9AGKHbL2coSzD5nw+F07JrX7jzqu2doGIXevPPrwlpTZyTM6yagEdENeO/Na8rSUrI1+tKPj+TgAFiLvtF4w==", - "dependencies": { - "escape-html": "1.0.3", - "faker": "5.1.0", - "file-type": "3.9.0", - "http-reasons": "0.1.0", - "iconv-lite": "0.6.2", - "liquid-json": "0.3.1", - "lodash": "4.17.20", - "marked": "1.1.1", - "mime-format": "2.0.0", - "mime-types": "2.1.27", - "postman-url-encoder": "2.1.3", - "sanitize-html": "1.20.1", - "semver": "7.3.2", - "uuid": "3.4.0" - } - }, - "node_modules/openapi-to-postmanv2/node_modules/postman-url-encoder": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-2.1.3.tgz", - "integrity": "sha512-CwQjnoxaugCGeOyzVeZ4k1cNQ6iS8OBCzuWzcf4kLStKeRp0MwmLKYv25frynmDpugUUimq/d+FZCq6GtIX9Ag==", - "dependencies": { - "postman-collection": "^3.6.4", - "punycode": "^2.1.1" - } - }, - "node_modules/openapi-to-postmanv2/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/openapi-to-postmanv2/node_modules/semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "bin": { - "semver": "bin/semver.js" + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/openapi-to-postmanv2/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "node_modules/openapi-to-postmanv2": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/openapi-to-postmanv2/-/openapi-to-postmanv2-4.25.0.tgz", + "integrity": "sha512-sIymbkQby0gzxt2Yez8YKB6hoISEel05XwGwNrAhr6+vxJWXNxkmssQc/8UEtVkuJ9ZfUXLkip9PYACIpfPDWg==", + "license": "Apache-2.0", + "dependencies": { + "ajv": "8.11.0", + "ajv-draft-04": "1.0.0", + "ajv-formats": "2.1.1", + "async": "3.2.4", + "commander": "2.20.3", + "graphlib": "2.1.8", + "js-yaml": "4.1.0", + "json-pointer": "0.6.2", + "json-schema-merge-allof": "0.8.1", + "lodash": "4.17.21", + "neotraverse": "0.6.15", + "oas-resolver-browser": "2.5.6", + "object-hash": "3.0.0", + "path-browserify": "1.0.1", + "postman-collection": "^4.4.0", + "swagger2openapi": "7.0.8", + "yaml": "1.10.2" + }, "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/openapi-to-postmanv2/node_modules/yaml": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz", - "integrity": "sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw==", - "dependencies": { - "@babel/runtime": "^7.8.7" + "openapi2postmanv2": "bin/openapi2postmanv2.js" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, + "node_modules/openapi-to-postmanv2/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", "bin": { "opener": "bin/opener-bin.js" } }, "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12.20" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -10023,52 +14984,81 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, "engines": { - "node": ">=6" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" + "p-finally": "^1.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -10078,6 +15068,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -10086,26 +15077,35 @@ } }, "node_modules/parse-entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", - "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", "dependencies": { - "character-entities": "^1.0.0", - "character-entities-legacy": "^1.0.0", - "character-reference-invalid": "^1.0.0", - "is-alphanumerical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-hexadecimal": "^1.0.0" + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -10122,35 +15122,51 @@ "node_modules/parse-numeric-range": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", "dependencies": { - "entities": "^4.4.0" + "entities": "^6.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", "dependencies": { - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "parse5": "^7.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -10159,322 +15175,761 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "license": "MIT", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-loader": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.12.tgz", + "integrity": "sha512-n7oDG8B+k/p818uweWrOixY9/Dsr89o2TkCm6tOTex3fpdo2+BFDgR+KpB37mGKBRsBAlR8CIJMFN0OEy/7hIQ==", + "license": "MIT", + "dependencies": { + "native-promise-only": "^0.8.1", + "superagent": "^7.1.6" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "license": "MIT", "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=8" + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/postcss-color-functional-notation": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz", + "integrity": "sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/path-loader": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/path-loader/-/path-loader-1.0.12.tgz", - "integrity": "sha512-n7oDG8B+k/p818uweWrOixY9/Dsr89o2TkCm6tOTex3fpdo2+BFDgR+KpB37mGKBRsBAlR8CIJMFN0OEy/7hIQ==", + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "native-promise-only": "^0.8.1", - "superagent": "^7.1.6" + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-scurry": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.7.0.tgz", - "integrity": "sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg==", - "dev": true, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "license": "MIT", "dependencies": { - "lru-cache": "^9.0.0", - "minipass": "^5.0.0" + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^14 || ^16 || >=18.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", - "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", - "dev": true, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": "14 || >=16.14" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "node_modules/postcss-custom-media": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz", + "integrity": "sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "dependencies": { - "isarray": "0.0.1" + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/postcss-custom-properties": { + "version": "14.0.6", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz", + "integrity": "sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/postcss-custom-selectors": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz", + "integrity": "sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.5", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "postcss-selector-parser": "^7.0.0" + }, "engines": { - "node": ">=8.6" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", "dependencies": { - "find-up": "^4.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "find-up": "^3.0.0" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", "dependencies": { - "locate-path": "^3.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "license": "MIT", "engines": { - "node": ">=6" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "license": "MIT", "engines": { - "node": ">=6" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, "engines": { - "node": ">=4" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "node_modules/postcss-double-position-gradients": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz", + "integrity": "sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g==", "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "type": "github", + "url": "https://github.com/sponsors/csstools" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" + "type": "opencollective", + "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.2.2" + "postcss": "^8.4" } }, - "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4" } }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" + "node": ">=4" } }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4" } }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "engines": { - "node": "^10 || ^12 || >=14.0" + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.1.0" } }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4" } }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4" } }, - "node_modules/postcss-discard-unused": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", - "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", + "node_modules/postcss-lab-function": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz", + "integrity": "sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "postcss-selector-parser": "^6.0.5" + "@csstools/css-color-parser": "^3.1.0", + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/utilities": "^2.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4" } }, "node_modules/postcss-loader": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.1.0.tgz", - "integrity": "sha512-vTD2DJ8vJD0Vr1WzMQkRZWRjcynGh3t7NeoLg+Sb1TeuK7etiZfL/ZwHbaVa3M+Qni7Lj/29voV9IggnIUjlIw==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "license": "MIT", "dependencies": { - "cosmiconfig": "^8.0.0", - "klona": "^2.0.6", - "semver": "^7.3.8" + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" }, "engines": { "node": ">= 14.15.0" @@ -10488,117 +15943,150 @@ "webpack": "^5.0.0" } }, + "node_modules/postcss-logical": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.1.0.tgz", + "integrity": "sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/postcss-merge-idents": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", - "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", + "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", + "license": "MIT", "dependencies": { - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" + "stylehacks": "^6.1.1" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "license": "MIT", "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.5" + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, @@ -10607,12 +16095,13 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "engines": { @@ -10622,12 +16111,26 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.0.4" + "postcss-selector-parser": "^7.0.0" }, "engines": { "node": "^10 || ^12 || >= 14" @@ -10636,10 +16139,24 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-modules-values": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, @@ -10650,193 +16167,441 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-nesting": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz", + "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/selector-resolve-nested": "^3.1.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz", + "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", + "browserslist": "^4.23.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "license": "MIT", "dependencies": { - "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "license": "MIT", "dependencies": { - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.2", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, - "node_modules/postcss-reduce-idents": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", - "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4" } }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4" } }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "node_modules/postcss-preset-env": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.4.0.tgz", + "integrity": "sha512-2kqpOthQ6JhxqQq1FSAAZGe9COQv75Aw8WbsOvQVNJ2nSevc9Yx/IKZGuZ7XJ+iOTtVon7LfO7ELRzg8AZ+sdw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "dependencies": { + "@csstools/postcss-alpha-function": "^1.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", + "@csstools/postcss-color-function": "^4.0.12", + "@csstools/postcss-color-function-display-p3-linear": "^1.0.1", + "@csstools/postcss-color-mix-function": "^3.0.12", + "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.2", + "@csstools/postcss-content-alt-text": "^2.0.8", + "@csstools/postcss-contrast-color-function": "^2.0.12", + "@csstools/postcss-exponential-functions": "^2.0.9", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.11", + "@csstools/postcss-gradients-interpolation-method": "^5.0.12", + "@csstools/postcss-hwb-function": "^4.0.12", + "@csstools/postcss-ic-unit": "^4.0.4", + "@csstools/postcss-initial": "^2.0.1", + "@csstools/postcss-is-pseudo-class": "^5.0.3", + "@csstools/postcss-light-dark-function": "^2.0.11", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.4", + "@csstools/postcss-media-minmax": "^2.0.9", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.5", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.0", + "@csstools/postcss-oklab-function": "^4.0.12", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", + "@csstools/postcss-random-function": "^2.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.12", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.4", + "@csstools/postcss-stepped-value-functions": "^4.0.9", + "@csstools/postcss-text-decoration-shorthand": "^4.0.3", + "@csstools/postcss-trigonometric-functions": "^4.0.9", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.21", + "browserslist": "^4.26.0", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.3", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.4.2", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.12", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.6", + "postcss-custom-properties": "^14.0.6", + "postcss-custom-selectors": "^8.0.5", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.4", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.12", + "postcss-logical": "^8.1.0", + "postcss-nesting": "^13.0.2", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "postcss-value-parser": "^4.2.0" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -10845,194 +16610,188 @@ "node": ">=4" } }, - "node_modules/postcss-sort-media-queries": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.3.0.tgz", - "integrity": "sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==", + "node_modules/postcss-reduce-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", + "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", + "license": "MIT", "dependencies": { - "sort-css-media-queries": "2.1.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=10.0.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.4.16" + "postcss": "^8.4.31" } }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, - "node_modules/postcss-svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 10" + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/postcss-svgo/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" } }, - "node_modules/postcss-svgo/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/postcss-svgo/node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "license": "MIT", "dependencies": { - "css-tree": "^1.1.2" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/postcss-svgo/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "engines": { + "node": ">=4" } }, - "node_modules/postcss-svgo/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/postcss-sort-media-queries": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", + "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", + "license": "MIT", "dependencies": { - "domelementtype": "^2.2.0" + "sort-css-media-queries": "2.2.0" }, "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "peerDependencies": { + "postcss": "^8.4.23" } }, - "node_modules/postcss-svgo/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/postcss-svgo/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" }, "engines": { - "node": ">=10.13.0" + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.5" + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" }, "node_modules/postcss-zindex": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", - "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", + "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", + "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/postman-code-generators": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/postman-code-generators/-/postman-code-generators-1.9.0.tgz", - "integrity": "sha512-ZM4H7cU1dNUuMPw9CsEoQ7aONl/n8bpSEunZcvzyJd1WtLNj5ktGBGOlDtbTo773dZy5CiVrugdCdt0jhdnUOA==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/postman-code-generators/-/postman-code-generators-1.14.2.tgz", + "integrity": "sha512-qZAyyowfQAFE4MSCu2KtMGGQE/+oG1JhMZMJNMdZHYCSfQiVVeKxgk3oI4+KJ3d1y5rrm2D6C6x+Z+7iyqm+fA==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "async": "3.2.2", + "detect-package-manager": "3.0.2", "lodash": "4.17.21", "path": "0.12.7", - "postman-collection": "4.0.0", + "postman-collection": "^4.4.0", "shelljs": "0.8.5" }, "engines": { @@ -11042,117 +16801,14 @@ "node_modules/postman-code-generators/node_modules/async": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==" - }, - "node_modules/postman-code-generators/node_modules/faker": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", - "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==" - }, - "node_modules/postman-code-generators/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postman-code-generators/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postman-code-generators/node_modules/mime-db": { - "version": "1.48.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", - "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/postman-code-generators/node_modules/mime-types": { - "version": "2.1.31", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", - "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", - "dependencies": { - "mime-db": "1.48.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/postman-code-generators/node_modules/postman-collection": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.0.0.tgz", - "integrity": "sha512-vDrXG/dclSu6RMqPqBz4ZqoQBwcj/a80sJYsQZmzWJ6dWgXiudPhwu6Vm3C1Hy7zX5W8A6am1Z6vb/TB4eyURA==", - "dependencies": { - "faker": "5.5.3", - "file-type": "3.9.0", - "http-reasons": "0.1.0", - "iconv-lite": "0.6.3", - "liquid-json": "0.3.1", - "lodash": "4.17.21", - "mime-format": "2.0.1", - "mime-types": "2.1.31", - "postman-url-encoder": "3.0.1", - "semver": "7.3.5", - "uuid": "8.3.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postman-code-generators/node_modules/postman-url-encoder": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.1.tgz", - "integrity": "sha512-dMPqXnkDlstM2Eya+Gw4MIGWEan8TzldDcUKZIhZUsJ/G5JjubfQPhFhVWKzuATDMvwvrWbSjF+8VmAvbu6giw==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postman-code-generators/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/postman-code-generators/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postman-code-generators/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", + "license": "MIT" }, "node_modules/postman-collection": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.4.0.tgz", - "integrity": "sha512-2BGDFcUwlK08CqZFUlIC8kwRJueVzPjZnnokWPtJCd9f2J06HBQpGL7t2P1Ud1NEsK9NHq9wdipUhWLOPj5s/Q==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.5.0.tgz", + "integrity": "sha512-152JSW9pdbaoJihwjc7Q8lc3nPg/PC9lPTHdMk7SHnHhu/GBJB7b2yb9zG7Qua578+3PxkQ/HYBuXpDSvsf7GQ==", + "license": "Apache-2.0", "dependencies": { "@faker-js/faker": "5.5.3", "file-type": "3.9.0", @@ -11163,61 +16819,18 @@ "mime-format": "2.0.1", "mime-types": "2.1.35", "postman-url-encoder": "3.0.5", - "semver": "7.5.4", + "semver": "7.6.3", "uuid": "8.3.2" }, "engines": { "node": ">=10" } }, - "node_modules/postman-collection/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postman-collection/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postman-collection/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/postman-collection/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/postman-collection/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -11225,15 +16838,11 @@ "node": ">=10" } }, - "node_modules/postman-collection/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/postman-url-encoder": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-3.0.5.tgz", "integrity": "sha512-jOrdVvzUXBC7C+9gkIkpDJ3HIxOHTIqjpQ4C1EMt1ZGeMvSEpbFCKq23DEfgsj46vMnDgyQf+1ZLp2Wm+bKSsA==", + "license": "Apache-2.0", "dependencies": { "punycode": "^2.1.1" }, @@ -11241,26 +16850,11 @@ "node": ">=10" } }, - "node_modules/postman-url-encoder/node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "engines": { - "node": ">=4" - } - }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -11270,22 +16864,38 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/prism-react-renderer": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz", - "integrity": "sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.1.tgz", + "integrity": "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, "peerDependencies": { - "react": ">=0.14.9" + "react": ">=16.0.0" + } + }, + "node_modules/prism-react-renderer/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" } }, "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", "engines": { "node": ">=6" } @@ -11294,6 +16904,7 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -11301,20 +16912,14 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dependencies": { - "asap": "~2.0.3" - } + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -11327,28 +16932,34 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } - }, - "node_modules/property-information": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", - "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", - "dependencies": { - "xtend": "^4.0.0" - }, + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -11361,46 +16972,42 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } }, "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", + "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", + "license": "MIT", "dependencies": { - "escape-goat": "^2.0.0" + "escape-goat": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pure-color": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", - "integrity": "sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==" - }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -11409,14 +17016,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dependencies": { - "inherits": "~2.0.3" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -11434,12 +17033,26 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -11448,14 +17061,16 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -11470,14 +17085,28 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -11488,163 +17117,58 @@ "rc": "cli.js" } }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/react-base16-styling": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", - "integrity": "sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==", - "dependencies": { - "base16": "^1.0.0", - "lodash.curry": "^4.0.1", - "lodash.flow": "^3.3.0", - "pure-color": "^1.2.0" - } - }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-dev-utils/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dev-utils/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "17.0.2" + "react": "^18.3.1" } }, - "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, "node_modules/react-fast-compare": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.1.tgz", - "integrity": "sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg==" + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" }, "node_modules/react-helmet-async": { + "name": "@slorber/react-helmet-async", "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", - "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", + "resolved": "https://registry.npmjs.org/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.12.5", "invariant": "^2.2.4", @@ -11653,14 +17177,15 @@ "shallowequal": "^1.1.0" }, "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/react-icons": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.8.0.tgz", - "integrity": "sha512-N6+kOLcihDiAnj5Czu637waJqSnwlMNROzVZMhfX68V/9bu9qHaMIJC4UdozWoOk57gahFCNHwVvWzm0MTzRjg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz", + "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==", + "license": "MIT", "peerDependencies": { "react": "*" } @@ -11668,36 +17193,29 @@ "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" }, - "node_modules/react-json-view": { - "version": "1.21.3", - "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", - "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", - "dependencies": { - "flux": "^4.0.1", - "react-base16-styling": "^0.6.0", - "react-lifecycles-compat": "^3.0.4", - "react-textarea-autosize": "^8.3.2" + "node_modules/react-json-view-lite": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz", + "integrity": "sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==", + "license": "MIT", + "engines": { + "node": ">=18" }, "peerDependencies": { - "react": "^17.0.0 || ^16.3.0 || ^15.5.4", - "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" + "react": "^18.0.0 || ^19.0.0" } }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, "node_modules/react-loadable": { "name": "@docusaurus/react-loadable", - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", - "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", "dependencies": { - "@types/react": "*", - "prop-types": "^15.6.2" + "@types/react": "*" }, "peerDependencies": { "react": "*" @@ -11707,6 +17225,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.10.3" }, @@ -11721,12 +17240,14 @@ "node_modules/react-magic-dropzone": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/react-magic-dropzone/-/react-magic-dropzone-1.0.1.tgz", - "integrity": "sha512-0BIROPARmXHpk4AS3eWBOsewxoM5ndk2psYP/JmbCq8tz3uR2LIV1XiroZ9PKrmDRMctpW+TvsBCtWasuS8vFA==" + "integrity": "sha512-0BIROPARmXHpk4AS3eWBOsewxoM5ndk2psYP/JmbCq8tz3uR2LIV1XiroZ9PKrmDRMctpW+TvsBCtWasuS8vFA==", + "license": "MIT" }, "node_modules/react-redux": { "version": "7.2.9", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.15.4", "@types/react-redux": "^7.1.20", @@ -11750,12 +17271,14 @@ "node_modules/react-redux/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" }, "node_modules/react-router": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -11775,6 +17298,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.1.2" }, @@ -11787,6 +17311,7 @@ "version": "5.3.4", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -11800,26 +17325,11 @@ "react": ">=15" } }, - "node_modules/react-textarea-autosize": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz", - "integrity": "sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q==", - "dependencies": { - "@babel/runtime": "^7.20.13", - "use-composed-ref": "^1.3.0", - "use-latest": "^1.2.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11833,6 +17343,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -11840,11 +17351,6 @@ "node": ">=8.10.0" } }, - "node_modules/reading-time": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" - }, "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -11856,21 +17362,78 @@ "node": ">= 0.10" } }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", "dependencies": { - "minimatch": "^3.0.5" + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" }, - "engines": { - "node": ">=6.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/redux": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.9.2" } @@ -11880,6 +17443,7 @@ "resolved": "https://registry.npmjs.org/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz", "integrity": "sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A==", "deprecated": "Package moved to @redux-devtools/extension.", + "license": "MIT", "peerDependencies": { "redux": "^3.1.0 || ^4.0.0" } @@ -11888,14 +17452,47 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "license": "MIT", "peerDependencies": { "redux": "^4" } }, + "node_modules/refractor": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-4.9.0.tgz", + "integrity": "sha512-nEG1SPXFoGGx+dcjftjv8cAjEusIh6ED1xhf5DG3C0x/k+rmZ2duKnc3QLpt6qeHv5fPb8uwN3VWN2BT7fr3Og==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/prismjs": "^1.0.0", + "hastscript": "^7.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/refractor/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, "node_modules/reftools": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "license": "BSD-3-Clause", "funding": { "url": "https://github.com/Mermade/oas-kit?sponsor=1" } @@ -11903,12 +17500,14 @@ "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, @@ -11916,323 +17515,229 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" } }, "node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", + "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", + "license": "MIT", "dependencies": { - "rc": "1.2.8" + "@pnpm/npm-conf": "^2.1.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=14" } }, "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", "dependencies": { - "rc": "^1.2.8" + "rc": "1.2.8" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/rehype-parse": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", - "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", - "dependencies": { - "hast-util-from-parse5": "^5.0.0", - "parse5": "^5.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse/node_modules/hast-util-from-parse5": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", - "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", "dependencies": { - "ccount": "^1.0.3", - "hastscript": "^5.0.0", - "property-information": "^5.0.0", - "web-namespaces": "^1.1.2", - "xtend": "^4.0.1" + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-parse/node_modules/hastscript": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", - "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", "dependencies": { - "comma-separated-tokens": "^1.0.0", - "hast-util-parse-selector": "^2.0.0", - "property-information": "^5.0.0", - "space-separated-tokens": "^1.0.0" + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-parse/node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" - }, "node_modules/relateurl": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remark-admonitions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", - "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", - "dependencies": { - "rehype-parse": "^6.0.2", - "unified": "^8.4.2", - "unist-util-visit": "^2.0.1" - } - }, - "node_modules/remark-admonitions/node_modules/unified": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", - "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", - "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", - "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", - "dependencies": { - "emoticon": "^3.2.0", - "node-emoji": "^1.10.0", - "unist-util-visit": "^2.0.3" - } - }, - "node_modules/remark-footnotes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", - "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" } }, - "node_modules/remark-mdx": { - "version": "1.6.22", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", - "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", "dependencies": { - "@babel/core": "7.12.9", - "@babel/helper-plugin-utils": "7.10.4", - "@babel/plugin-proposal-object-rest-spread": "7.12.1", - "@babel/plugin-syntax-jsx": "7.12.1", - "@mdx-js/util": "1.6.22", - "is-alphabetical": "1.0.4", - "remark-parse": "8.0.3", - "unified": "9.2.0" + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-mdx/node_modules/@babel/core": { - "version": "7.12.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", - "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.7", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.9", - "@babel/types": "^7.12.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" }, "engines": { - "node": ">=6.9.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/babel" + "url": "https://opencollective.com/unified" } }, - "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", - "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" - }, - "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" + "@types/mdast": "^4.0.0", + "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.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", - "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/remark-mdx/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/remark-mdx/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/remark-mdx/node_modules/unified": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", - "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", "dependencies": { - "bail": "^1.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-parse": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", - "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", - "dependencies": { - "ccount": "^1.0.0", - "collapse-white-space": "^1.0.2", - "is-alphabetical": "^1.0.0", - "is-decimal": "^1.0.0", - "is-whitespace-character": "^1.0.0", - "is-word-character": "^1.0.0", - "markdown-escapes": "^1.0.0", - "parse-entities": "^2.0.0", - "repeat-string": "^1.5.4", - "state-toggle": "^1.0.0", - "trim": "0.0.1", - "trim-trailing-lines": "^1.0.0", - "unherit": "^1.0.4", - "unist-util-remove-position": "^2.0.0", - "vfile-location": "^3.0.0", - "xtend": "^4.0.1" + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-squeeze-paragraphs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", - "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", "dependencies": { - "mdast-squeeze-paragraphs": "^4.0.0" + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", @@ -12243,6 +17748,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -12251,10 +17757,20 @@ "strip-ansi": "^6.0.1" } }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/renderkid/node_modules/css-select": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -12270,6 +17786,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -12283,6 +17800,7 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, @@ -12297,6 +17815,7 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -12310,6 +17829,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -12325,6 +17845,7 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -12332,10 +17853,23 @@ "entities": "^2.0.0" } }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "license": "MIT", "engines": { "node": ">=0.10" } @@ -12344,6 +17878,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12352,6 +17887,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12364,41 +17900,49 @@ "node": "*" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" }, "node_modules/reselect": { "version": "4.1.8", "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", - "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==", + "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", "engines": { "node": ">=4" } @@ -12406,137 +17950,68 @@ "node_modules/resolve-pathname": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" }, "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", "dependencies": { - "lowercase-keys": "^1.0.0" + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rtl-detect": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", - "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" - }, "node_modules/rtlcss": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz", - "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "license": "MIT", "dependencies": { - "find-up": "^5.0.0", + "escalade": "^3.1.1", "picocolors": "^1.0.0", - "postcss": "^8.3.11", + "postcss": "^8.4.21", "strip-json-comments": "^3.1.1" }, "bin": { "rtlcss": "bin/rtlcss.js" - } - }, - "node_modules/rtlcss/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rtlcss/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.0.0" } }, - "node_modules/rtlcss/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -12558,256 +18033,83 @@ { "type": "consulting", "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sanitize-html": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.20.1.tgz", - "integrity": "sha512-txnH8TQjaQvg2Q0HY06G6CDJLVYCpbnxrdO0WN8gjCKaU5J0KbyGYhZxx5QJg3WLZ1lB7XU9kDkfrCXUozqptA==", - "dependencies": { - "chalk": "^2.4.1", - "htmlparser2": "^3.10.0", - "lodash.clonedeep": "^4.5.0", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.mergewith": "^4.6.1", - "postcss": "^7.0.5", - "srcset": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "node_modules/sanitize-html/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sanitize-html/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sanitize-html/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/sanitize-html/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/sanitize-html/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/sanitize-html/node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/sanitize-html/node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/sanitize-html/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/sanitize-html/node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/sanitize-html/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/sanitize-html/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "node_modules/sanitize-html/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/sanitize-html/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/sanitize-html/node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/sanitize-html/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" - }, - "node_modules/sanitize-html/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/sanitize-html/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + } + ], + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "queue-microtask": "^1.2.2" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, "node_modules/sass": { - "version": "1.60.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.60.0.tgz", - "integrity": "sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ==", + "version": "1.93.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", + "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", + "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "chokidar": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { "sass": "sass.js" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/sass-loader": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.4.1.tgz", - "integrity": "sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ==", + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "license": "MIT", "dependencies": { - "klona": "^2.0.4", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0", - "semver": "^7.3.2" + "neo-async": "^2.6.2" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", - "webpack": "^4.36.0 || ^5.0.0" + "sass-embedded": "*", + "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "fibers": { + "@rspack/core": { "optional": true }, "node-sass": { @@ -12815,61 +18117,95 @@ }, "sass": { "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true } } }, - "node_modules/sass-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 14.16.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" }, "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, + "node_modules/schema-dts": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/schema-dts/-/schema-dts-1.1.5.tgz", + "integrity": "sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==", + "license": "Apache-2.0" + }, "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 8.9.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "license": "MIT", + "peer": true + }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" @@ -12881,13 +18217,16 @@ "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" }, "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", "dependencies": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" }, "engines": { @@ -12895,12 +18234,10 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -12909,44 +18246,25 @@ } }, "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", "dependencies": { - "semver": "^6.3.0" + "semver": "^7.3.5" }, "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" + "node": ">=12" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -12970,6 +18288,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -12977,53 +18296,117 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, "node_modules/send/node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", + "license": "MIT", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", "mime-types": "2.1.18", "minimatch": "3.1.2", "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", + "path-to-regexp": "3.3.0", "range-parser": "1.2.0" } }, + "node_modules/serve-handler/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/serve-handler/node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", + "license": "MIT" }, "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -13041,6 +18424,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -13049,6 +18433,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13057,6 +18442,7 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -13070,75 +18456,73 @@ "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "dependencies": { - "define-data-property": "^1.1.2", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -13149,12 +18533,14 @@ "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -13166,14 +18552,19 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -13182,6 +18573,7 @@ "version": "0.8.5", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -13194,10 +18586,22 @@ "node": ">=4" } }, + "node_modules/shelljs/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/shelljs/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13213,15 +18617,136 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/shelljs/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "license": "MIT", + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "license": "MIT", + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", + "license": "MIT" + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", + "license": "MIT" + }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -13233,17 +18758,19 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" }, "node_modules/simple-git": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.17.0.tgz", - "integrity": "sha512-JozI/s8jr3nvLd9yn2jzPVHnhVzt7t7QWfcIoDcqRIGN+f1IINGv52xoZti2kkYfoRhhRvzMSNPfogHMp97rlw==", + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.28.0.tgz", + "integrity": "sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==", "dev": true, + "license": "MIT", "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.4" + "debug": "^4.4.0" }, "funding": { "type": "github", @@ -13251,13 +18778,14 @@ } }, "node_modules/sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^1.0.0" + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" }, "engines": { "node": ">= 10" @@ -13266,12 +18794,14 @@ "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" }, "node_modules/sitemap": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", - "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", + "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", + "license": "MIT", "dependencies": { "@types/node": "^17.0.5", "@types/sax": "^1.2.1", @@ -13289,20 +18819,45 @@ "node_modules/sitemap/node_modules/@types/node": { "version": "17.0.45", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -13310,25 +18865,28 @@ } }, "node_modules/sort-css-media-queries": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", - "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", + "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", + "license": "MIT", "engines": { "node": ">= 6.3.0" } }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">= 12" } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -13337,15 +18895,26 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -13355,6 +18924,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -13370,6 +18940,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -13382,57 +18953,47 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" }, "node_modules/srcset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz", - "integrity": "sha512-UH8e80l36aWnhACzjdtLspd4TAWldXJMa45NuOkTTU+stwekswObdqM63TtQixN4PPd/vO/kxLa6RD+tUPeFMg==", - "dependencies": { - "array-uniq": "^1.0.2", - "number-is-nan": "^1.0.0" - }, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" - }, "node_modules/state-local": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" - }, - "node_modules/state-toggle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", - "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", + "license": "MIT" }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/std-env": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", - "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==" + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "license": "MIT" }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -13441,6 +19002,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -13453,35 +19015,71 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=12" + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", @@ -13492,9 +19090,27 @@ } }, "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -13502,10 +19118,21 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13514,6 +19141,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -13522,6 +19150,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -13529,34 +19158,52 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/striptags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.2.0.tgz", + "integrity": "sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==", + "license": "MIT" + }, + "node_modules/style-to-js": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.18.tgz", + "integrity": "sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.11" + } + }, "node_modules/style-to-object": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", - "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.11.tgz", + "integrity": "sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==", + "license": "MIT", "dependencies": { - "inline-style-parser": "0.1.1" + "inline-style-parser": "0.2.4" } }, "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { - "postcss": "^8.2.15" + "postcss": "^8.4.31" } }, "node_modules/superagent": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/superagent/-/superagent-7.1.6.tgz", "integrity": "sha512-gZkVCQR1gy/oUXr+kxJMLDjla434KmSOKbx5iGD30Ql+AkJQ/YlPKECJy2nhqOsHLjGHzoDTXNSjhnvWhzKk7g==", - "deprecated": "Please downgrade to v7.1.5 if you need IE/ActiveXObject support OR upgrade to v8.0.0 as we no longer support IE and published an incorrect patch version (see https://github.com/visionmedia/superagent/issues/1731)", + "deprecated": "Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net", + "license": "MIT", "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.3", @@ -13574,21 +19221,11 @@ "node": ">=6.4.0 <13 || >=14" } }, - "node_modules/superagent/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -13600,6 +19237,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13610,17 +19248,20 @@ "node_modules/svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" }, "node_modules/svgo": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", - "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", - "css-tree": "^2.2.1", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.0.0" }, @@ -13639,25 +19280,72 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", "engines": { "node": ">= 10" } }, + "node_modules/swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "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.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/swr": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.6.tgz", + "integrity": "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", "engines": { "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser": { - "version": "5.16.8", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz", - "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==", + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "license": "BSD-2-Clause", "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -13669,15 +19357,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", - "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -13705,6 +19394,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -13714,27 +19404,11 @@ "node": ">= 10.13.0" } }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -13748,60 +19422,79 @@ "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "node_modules/thingies": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", + "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", + "license": "MIT", + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" }, "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" }, "node_modules/tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "license": "MIT", "engines": { - "node": ">=4" + "node": "^18.0.0 || >=20.0.0" } }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=14.14" } }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -13813,14 +19506,16 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -13828,41 +19523,56 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" }, - "node_modules/trim": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", - "deprecated": "Use String.prototype.trim() instead" + "node_modules/tree-dump": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } }, - "node_modules/trim-trailing-lines": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", - "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/trough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", - "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -13874,6 +19584,7 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -13882,80 +19593,49 @@ "node": ">= 0.6" } }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/type-is/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, - "node_modules/ua-parser-js": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.34.tgz", - "integrity": "sha512-cJMeh/eOILyGu0ejgTKB95yKT3zOenSe9UGE3vj6WfiOwgGYnmATUsnDixMFvdU+rNMvWih83hrUP8VwhF9yXQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "engines": { - "node": "*" - } + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" }, - "node_modules/unherit": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", - "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", - "dependencies": { - "inherits": "^2.0.0", - "xtend": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", "engines": { "node": ">=4" } @@ -13964,6 +19644,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -13973,32 +19654,36 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unified": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", - "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", - "dependencies": { - "bail": "^1.0.0", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^2.0.0", - "trough": "^1.0.0", - "vfile": "^4.0.0" + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", @@ -14006,70 +19691,53 @@ } }, "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", "dependencies": { - "crypto-random-string": "^2.0.0" + "crypto-random-string": "^4.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/unist-builder": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", - "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-generated": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", - "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-position": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", - "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", - "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", "dependencies": { - "unist-util-is": "^4.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-remove-position": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", - "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", "dependencies": { - "unist-util-visit": "^2.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", @@ -14077,11 +19745,12 @@ } }, "node_modules/unist-util-stringify-position": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", - "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", "dependencies": { - "@types/unist": "^2.0.2" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", @@ -14089,13 +19758,14 @@ } }, "node_modules/unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, "funding": { "type": "opencollective", @@ -14103,12 +19773,13 @@ } }, "node_modules/unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", @@ -14116,9 +19787,10 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", "engines": { "node": ">= 10.0.0" } @@ -14127,14 +19799,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "funding": [ { "type": "opencollective", @@ -14143,163 +19816,125 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" } }, "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "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": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" }, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/yeoman/update-notifier?sponsor=1" } }, "node_modules/update-notifier/node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-notifier/node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "engines": { - "node": ">=6" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/update-notifier/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/update-notifier/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/update-notifier/node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, "node_modules/url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "license": "MIT", "dependencies": { "punycode": "^1.4.1", - "qs": "^6.11.2" + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/url-loader": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "mime-types": "^2.1.27", @@ -14322,29 +19957,42 @@ } } }, - "node_modules/url-loader/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/url-loader/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">= 0.6" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" } }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -14358,80 +20006,26 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/url/node_modules/qs": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", - "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/use-composed-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", - "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-latest": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", - "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", - "dependencies": { - "use-isomorphic-layout-effect": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "license": "MIT" }, "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "license": "MIT", "dependencies": { "inherits": "2.0.3" } @@ -14439,22 +20033,26 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/util/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" }, "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" }, "node_modules/utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", "engines": { "node": ">= 4" } @@ -14463,6 +20061,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", "engines": { "node": ">= 0.4.0" } @@ -14471,32 +20070,67 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, + "node_modules/validate.io-array": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==", + "license": "MIT" + }, + "node_modules/validate.io-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", + "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==" + }, + "node_modules/validate.io-integer": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", + "dependencies": { + "validate.io-number": "^1.0.3" + } + }, + "node_modules/validate.io-integer-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", + "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-integer": "^1.0.4" + } + }, + "node_modules/validate.io-number": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==" + }, "node_modules/value-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/vfile": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", - "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^2.0.0", - "vfile-message": "^2.0.0" + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", @@ -14504,49 +20138,38 @@ } }, "node_modules/vfile-location": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", - "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/vfile-message": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", - "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^2.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/wait-on": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz", - "integrity": "sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==", - "dependencies": { - "axios": "^0.25.0", - "joi": "^17.6.0", - "lodash": "^4.17.21", - "minimist": "^1.2.5", - "rxjs": "^7.5.4" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -14559,14 +20182,16 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } }, "node_modules/web-namespaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", - "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -14575,37 +20200,40 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.76.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.3.tgz", - "integrity": "sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "version": "5.102.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", + "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.26.3", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -14624,19 +20252,22 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", - "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "license": "MIT", "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", - "lodash": "^4.17.20", + "html-escaper": "^2.0.2", "opener": "^1.5.2", - "sirv": "^1.0.7", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", "ws": "^7.3.1" }, "bin": { @@ -14650,77 +20281,56 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", + "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", + "license": "MIT", "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", + "memfs": "^4.43.1", + "mime-types": "^3.0.1", + "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" + "webpack": "^5.0.0" }, - "peerDependencies": { - "ajv": "^8.8.2" + "peerDependenciesMeta": { + "webpack": { + "optional": true + } } }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, "node_modules/webpack-dev-middleware/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" @@ -14730,76 +20340,58 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/webpack-dev-server": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.1.tgz", - "integrity": "sha512-5tWg00bnWbYgkN+pd5yISQKDejRBYGEw15RaEEslH+zdbNDxxaZvEAO2WulaSaFKb5n3YG8JXsGaDsut1D0xdA==", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", + "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", + "express": "^4.21.2", "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" + "webpack": "^5.0.0" }, "peerDependenciesMeta": { "webpack": { @@ -14810,59 +20402,41 @@ } } }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "node_modules/webpack-dev-server/node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -14880,82 +20454,126 @@ } }, "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" + "flat": "^5.0.2", + "wildcard": "^2.0.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0" } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", "engines": { "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/webpackbar": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", + "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", + "license": "MIT", + "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.7.0", + "wrap-ansi": "^7.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=14.21.3" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" } }, - "node_modules/webpack/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/webpackbar/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpackbar/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/webpackbar/node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "repeat-string": "^1.0.0" }, - "engines": { - "node": ">= 0.6" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "node_modules/webpackbar/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 10.13.0" + "node": ">=8" + } + }, + "node_modules/webpackbar/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "engines": { + "node": ">=8" } }, - "node_modules/webpackbar": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "node_modules/webpackbar/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.3", - "pretty-time": "^1.1.0", - "std-env": "^3.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, - "peerDependencies": { - "webpack": "3 || 4 || 5" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -14969,6 +20587,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } @@ -14977,6 +20596,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -14986,6 +20606,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -14996,15 +20617,11 @@ "node": ">= 8" } }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" - }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", "dependencies": { "string-width": "^5.0.1" }, @@ -15016,14 +20633,16 @@ } }, "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -15036,51 +20655,93 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^5.0.1" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -15089,9 +20750,10 @@ } }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -15108,18 +20770,53 @@ } } }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsl-utils/node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/xml-js": { "version": "1.6.11", "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", "dependencies": { "sax": "^1.2.4" }, @@ -15127,92 +20824,77 @@ "xml-js": "bin/cli.js" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { - "node": ">=0.4" + "node": ">=10" } }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", "engines": { "node": ">= 6" } }, "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "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.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=8" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "node": ">=8" } }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -15222,34 +20904,44 @@ "node": ">=8" } }, - "node_modules/yargs/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/zwitch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", - "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" diff --git a/package.json b/package.json index 57010fa..2c87ad0 100644 --- a/package.json +++ b/package.json @@ -16,16 +16,16 @@ "import-defradb-cli-docs": "node scripts/import-defradb-cli-docs.js" }, "dependencies": { - "@docusaurus/core": "2.4.0", - "@docusaurus/preset-classic": "2.4.0", - "@mdx-js/react": "^1.6.22", + "@docusaurus/core": "3.9.0", + "@docusaurus/preset-classic": "3.9.0", + "@mdx-js/react": "^3.0.0", "@svgr/webpack": "^7.0.0", "clsx": "^1.2.1", - "docusaurus-plugin-sass": "^0.2.3", - "docusaurus-preset-openapi": "^0.6.4", - "prism-react-renderer": "^1.3.5", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "docusaurus-plugin-sass": "^0.2.5", + "docusaurus-preset-openapi": "^0.7.1", + "prism-react-renderer": "^2.1.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", "react-icons": "^4.8.0", "sass": "^1.60.0", "url": "^0.11.3" @@ -43,8 +43,8 @@ ] }, "devDependencies": { - "@docusaurus/module-type-aliases": "^2.4.0", - "@tsconfig/docusaurus": "^1.0.7", + "@docusaurus/module-type-aliases": "^3.9.0", + "@docusaurus/tsconfig": "^3.9.0", "glob": "^10.2.2", "simple-git": "^3.17.0", "tmp": "^0.2.1", diff --git a/src/pages/index.module.scss b/src/pages/index.module.scss index 9e7b161..e412099 100644 --- a/src/pages/index.module.scss +++ b/src/pages/index.module.scss @@ -1,4 +1,4 @@ -@import "http://github.com/utils"; +@import "http://github.com/css/utils"; .homeWrapper { margin: auto 0; diff --git a/src/theme/DocItem/Content/index.js b/src/theme/DocItem/Content/index.js index 9f5d8ca..12ee749 100644 --- a/src/theme/DocItem/Content/index.js +++ b/src/theme/DocItem/Content/index.js @@ -1,7 +1,7 @@ import React from 'react'; import clsx from 'clsx'; import {ThemeClassNames} from '@docusaurus/theme-common'; -import {useDoc} from '@docusaurus/theme-common/internal'; +import {useDoc} from '@docusaurus/plugin-content-docs/client'; import Heading from '@theme/Heading'; import MDXContent from '@theme/MDXContent'; /** diff --git a/src/theme/DocItem/Footer/index.js b/src/theme/DocItem/Footer/index.js index 7e12433..c3641de 100644 --- a/src/theme/DocItem/Footer/index.js +++ b/src/theme/DocItem/Footer/index.js @@ -1,7 +1,7 @@ import React from 'react'; import clsx from 'clsx'; import {ThemeClassNames} from '@docusaurus/theme-common'; -import {useDoc} from '@docusaurus/theme-common/internal'; +import {useDoc} from '@docusaurus/plugin-content-docs/client'; import LastUpdated from '@theme/LastUpdated'; import EditThisPage from '@theme/EditThisPage'; import TagsListInline from '@theme/TagsListInline'; diff --git a/src/theme/DocItem/Layout/index.tsx b/src/theme/DocItem/Layout/index.tsx index e042bb0..c1dbb4c 100644 --- a/src/theme/DocItem/Layout/index.tsx +++ b/src/theme/DocItem/Layout/index.tsx @@ -1,5 +1,6 @@ import { useThemeConfig, useWindowSize } from "@docusaurus/theme-common"; -import { useDoc, useFilteredAndTreeifiedTOC } from "@docusaurus/theme-common/internal"; +import { useDoc } from "@docusaurus/plugin-content-docs/client"; +import { useFilteredAndTreeifiedTOC } from "@docusaurus/theme-common/internal"; import DocBreadcrumbs from "@theme/DocBreadcrumbs"; import DocItemContent from "@theme/DocItem/Content"; import DocItemFooter from "@theme/DocItem/Footer"; diff --git a/src/theme/DocItem/Metadata/index.js b/src/theme/DocItem/Metadata/index.js index 1a2fc63..b18a536 100644 --- a/src/theme/DocItem/Metadata/index.js +++ b/src/theme/DocItem/Metadata/index.js @@ -1,6 +1,6 @@ import React from 'react'; import {PageMetadata} from '@docusaurus/theme-common'; -import {useDoc} from '@docusaurus/theme-common/internal'; +import {useDoc} from '@docusaurus/plugin-content-docs/client'; export default function DocItemMetadata() { const {metadata, frontMatter, assets} = useDoc(); return ( diff --git a/src/theme/DocItem/Paginator/index.js b/src/theme/DocItem/Paginator/index.js index be73c91..caaed73 100644 --- a/src/theme/DocItem/Paginator/index.js +++ b/src/theme/DocItem/Paginator/index.js @@ -1,5 +1,5 @@ import React from 'react'; -import {useDoc} from '@docusaurus/theme-common/internal'; +import {useDoc} from '@docusaurus/plugin-content-docs/client'; import DocPaginator from '@theme/DocPaginator'; /** * This extra component is needed, because should remain generic. diff --git a/src/theme/DocItem/TOC/Desktop/index.js b/src/theme/DocItem/TOC/Desktop/index.js index 3e2190f..f24be82 100644 --- a/src/theme/DocItem/TOC/Desktop/index.js +++ b/src/theme/DocItem/TOC/Desktop/index.js @@ -1,6 +1,6 @@ import React from 'react'; import {ThemeClassNames} from '@docusaurus/theme-common'; -import {useDoc} from '@docusaurus/theme-common/internal'; +import {useDoc} from '@docusaurus/plugin-content-docs/client'; import TOC from '@theme/TOC'; export default function DocItemTOCDesktop() { const {toc, frontMatter} = useDoc(); diff --git a/src/theme/DocItem/TOC/Mobile/index.js b/src/theme/DocItem/TOC/Mobile/index.js index a966564..e7a81e0 100644 --- a/src/theme/DocItem/TOC/Mobile/index.js +++ b/src/theme/DocItem/TOC/Mobile/index.js @@ -1,7 +1,7 @@ import React from 'react'; import clsx from 'clsx'; import {ThemeClassNames} from '@docusaurus/theme-common'; -import {useDoc} from '@docusaurus/theme-common/internal'; +import {useDoc} from '@docusaurus/plugin-content-docs/client'; import TOCCollapsible from '@theme/TOCCollapsible'; import styles from './styles.module.css'; export default function DocItemTOCMobile() { diff --git a/src/theme/DocItem/index.js b/src/theme/DocItem/index.js index 8f8f5be..ef49754 100644 --- a/src/theme/DocItem/index.js +++ b/src/theme/DocItem/index.js @@ -1,6 +1,6 @@ import React from 'react'; import {HtmlClassNameProvider} from '@docusaurus/theme-common'; -import {DocProvider} from '@docusaurus/theme-common/internal'; +import {DocProvider} from '@docusaurus/plugin-content-docs/client'; import DocItemMetadata from '@theme/DocItem/Metadata'; import DocItemLayout from '@theme/DocItem/Layout'; export default function DocItem(props) { diff --git a/src/theme/DocPage/Layout/Main/index.tsx b/src/theme/DocPage/Layout/Main/index.tsx index 4c17324..4d81b79 100644 --- a/src/theme/DocPage/Layout/Main/index.tsx +++ b/src/theme/DocPage/Layout/Main/index.tsx @@ -1,6 +1,6 @@ import React from "react"; import clsx from "clsx"; -import { useDocsSidebar } from "@docusaurus/theme-common/internal"; +import { useDocsSidebar } from "@docusaurus/plugin-content-docs/client"; import styles from "./styles.module.scss"; export default function DocPageLayoutMain({ diff --git a/src/theme/DocPage/Layout/index.tsx b/src/theme/DocPage/Layout/index.tsx index 2802770..1c4c115 100644 --- a/src/theme/DocPage/Layout/index.tsx +++ b/src/theme/DocPage/Layout/index.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import { useDocsSidebar } from '@docusaurus/theme-common/internal'; +import { useDocsSidebar } from '@docusaurus/plugin-content-docs/client'; import Layout from '@theme/Layout'; import BackToTopButton from '@theme/BackToTopButton'; import DocPageLayoutSidebar from '@theme/DocPage/Layout/Sidebar'; diff --git a/src/theme/DocPage/index.tsx b/src/theme/DocPage/index.tsx index 900a3ef..a79c973 100644 --- a/src/theme/DocPage/index.tsx +++ b/src/theme/DocPage/index.tsx @@ -6,11 +6,11 @@ import { PageMetadata, } from '@docusaurus/theme-common'; import { - docVersionSearchTag, + getDocsVersionSearchTag, DocsSidebarProvider, DocsVersionProvider, - useDocRouteMetadata, -} from '@docusaurus/theme-common/internal'; + useDocRootMetadata, +} from '@docusaurus/plugin-content-docs/client'; import DocPageLayout from '@theme/DocPage/Layout'; import NotFound from '@theme/NotFound'; import SearchMetadata from '@theme/SearchMetadata'; @@ -20,7 +20,7 @@ function DocPageMetadata(props) { <> ; } diff --git a/src/theme/EditThisPage/index.tsx b/src/theme/EditThisPage/index.tsx index 908e1df..f1ec691 100644 --- a/src/theme/EditThisPage/index.tsx +++ b/src/theme/EditThisPage/index.tsx @@ -2,7 +2,7 @@ import React from 'react'; import Translate from '@docusaurus/Translate'; import { ThemeClassNames } from '@docusaurus/theme-common'; import IconEdit from '@theme/Icon/Edit'; -import { GoMarkGithub } from "react-icons/go"; +import { VscGithub } from "react-icons/vsc"; export default function EditThisPage({ editUrl }) { return ( @@ -12,7 +12,7 @@ export default function EditThisPage({ editUrl }) { rel="noreferrer noopener" className={ThemeClassNames.common.editThisPage}> {/* */} - + Date: Thu, 6 Nov 2025 13:07:48 -0800 Subject: [PATCH 45/48] feat: Switch to mutli-instance docusaurus with versioning. (#182) This sets up each individual project (DefraDB, SourceHub, Orbis, and LensVM) to be its own independent docs instance with its own versioning. Each project with initialized with its current latest released version (or pre-release in some cases). I dont see much merit in going further back then this. --- .../version-0.19.0/BSL-License.md | 80 ++ .../version-0.19.0/concepts/_category_.json | 5 + .../version-0.19.0/concepts/ipfs.md | 102 +++ .../version-0.19.0/concepts/libp2p.md | 65 ++ .../version-0.19.0/getting-started.md | 455 ++++++++++ .../version-0.19.0/guides/_category_.json | 5 + .../version-0.19.0/guides/akash-deployment.md | 146 ++++ .../guides/content-addressable-storage.md | 98 +++ .../guides/content-identifier.md | 94 +++ .../version-0.19.0/guides/deployment-guide.md | 156 ++++ .../version-0.19.0/guides/explain-systems.md | 171 ++++ .../version-0.19.0/guides/merkle-crdt.md | 61 ++ .../version-0.19.0/guides/peer-to-peer.md | 144 ++++ .../version-0.19.0/guides/schema-migration.md | 286 +++++++ .../guides/schema-relationship.md | 356 ++++++++ .../version-0.19.0/guides/secondary-index.md | 263 ++++++ .../guides/time-traveling-queries.md | 60 ++ .../version-0.19.0/references/_category_.json | 5 + .../version-0.19.0/references/acp.md | 795 ++++++++++++++++++ .../references/cli/_category_.json | 4 + .../version-0.19.0/references/cli/defradb.md | 41 + .../references/cli/defradb_client.md | 53 ++ .../references/cli/defradb_client_acp.md | 46 + .../cli/defradb_client_acp_policy.md | 41 + .../cli/defradb_client_acp_policy_add.md | 91 ++ .../cli/defradb_client_acp_relationship.md | 42 + .../defradb_client_acp_relationship_add.md | 89 ++ .../defradb_client_acp_relationship_delete.md | 73 ++ .../references/cli/defradb_client_backup.md | 43 + .../cli/defradb_client_backup_export.md | 55 ++ .../cli/defradb_client_backup_import.md | 47 ++ .../cli/defradb_client_collection.md | 51 ++ .../cli/defradb_client_collection_create.md | 83 ++ .../cli/defradb_client_collection_delete.md | 61 ++ .../cli/defradb_client_collection_describe.md | 61 ++ .../cli/defradb_client_collection_docIDs.md | 55 ++ .../cli/defradb_client_collection_get.md | 56 ++ .../cli/defradb_client_collection_patch.md | 62 ++ .../cli/defradb_client_collection_update.md | 67 ++ .../references/cli/defradb_client_dump.md | 40 + .../references/cli/defradb_client_index.md | 43 + .../cli/defradb_client_index_create.md | 62 ++ .../cli/defradb_client_index_drop.md | 49 ++ .../cli/defradb_client_index_list.md | 51 ++ .../cli/defradb_client_node-identity.md | 55 ++ .../references/cli/defradb_client_p2p.md | 43 + .../cli/defradb_client_p2p_collection.md | 44 + .../cli/defradb_client_p2p_collection_add.md | 52 ++ .../defradb_client_p2p_collection_getall.md | 45 + .../defradb_client_p2p_collection_remove.md | 52 ++ .../references/cli/defradb_client_p2p_info.md | 44 + .../cli/defradb_client_p2p_replicator.md | 44 + .../defradb_client_p2p_replicator_delete.md | 50 ++ .../defradb_client_p2p_replicator_getall.md | 49 ++ .../cli/defradb_client_p2p_replicator_set.md | 50 ++ .../references/cli/defradb_client_purge.md | 46 + .../references/cli/defradb_client_query.md | 64 ++ .../references/cli/defradb_client_schema.md | 45 + .../cli/defradb_client_schema_add.md | 61 ++ .../cli/defradb_client_schema_describe.md | 60 ++ .../cli/defradb_client_schema_migration.md | 45 + .../defradb_client_schema_migration_down.md | 57 ++ .../defradb_client_schema_migration_reload.md | 44 + ...db_client_schema_migration_set-registry.md | 50 ++ .../defradb_client_schema_migration_set.md | 57 ++ .../cli/defradb_client_schema_migration_up.md | 57 ++ .../cli/defradb_client_schema_patch.md | 60 ++ .../cli/defradb_client_schema_set-active.md | 45 + .../references/cli/defradb_client_tx.md | 43 + .../cli/defradb_client_tx_commit.md | 44 + .../cli/defradb_client_tx_create.md | 46 + .../cli/defradb_client_tx_discard.md | 44 + .../references/cli/defradb_client_view.md | 42 + .../references/cli/defradb_client_view_add.md | 50 ++ .../cli/defradb_client_view_refresh.md | 66 ++ .../references/cli/defradb_identity.md | 39 + .../references/cli/defradb_identity_new.md | 53 ++ .../references/cli/defradb_keyring.md | 57 ++ .../references/cli/defradb_keyring_export.md | 50 ++ .../cli/defradb_keyring_generate.md | 64 ++ .../references/cli/defradb_keyring_import.md | 50 ++ .../references/cli/defradb_keyring_list.md | 48 ++ .../references/cli/defradb_server-dump.md | 38 + .../references/cli/defradb_start.md | 55 ++ .../references/cli/defradb_version.md | 40 + .../version-0.19.0/references/config.md | 171 ++++ .../query-specification/_category_.json | 4 + .../aggregate-functions.md | 47 ++ .../references/query-specification/aliases.md | 51 ++ .../query-specification/collections.md | 9 + .../query-specification/database-api.md | 113 +++ .../query-specification/execution-flow.md | 43 + .../query-specification/filtering.md | 213 +++++ .../query-specification/grouping.md | 83 ++ .../limiting-and-pagination.md | 33 + .../query-specification/mutation-block.md | 156 ++++ .../query-specification/query-block.md | 9 + .../query-language-overview.md | 19 + .../query-specification/relationships.md | 187 ++++ .../sorting-and-ordering.md | 128 +++ .../release notes/_category_.json | 5 + .../version-0.19.0/release notes/v0.10.0.md | 45 + .../version-0.19.0/release notes/v0.11.0.md | 41 + .../version-0.19.0/release notes/v0.12.0.md | 60 ++ .../version-0.19.0/release notes/v0.13.0.md | 40 + .../version-0.19.0/release notes/v0.14.0.md | 64 ++ .../version-0.19.0/release notes/v0.15.0.md | 44 + .../version-0.19.0/release notes/v0.2.0.md | 86 ++ .../version-0.19.0/release notes/v0.2.1.md | 57 ++ .../version-0.19.0/release notes/v0.3.0.md | 178 ++++ .../version-0.19.0/release notes/v0.3.1.md | 94 +++ .../version-0.19.0/release notes/v0.4.0.md | 80 ++ .../version-0.19.0/release notes/v0.5.0.md | 144 ++++ .../version-0.19.0/release notes/v0.5.1.md | 91 ++ .../version-0.19.0/release notes/v0.6.0.md | 85 ++ .../version-0.19.0/release notes/v0.7.0.md | 74 ++ .../version-0.19.0/release notes/v0.8.0.md | 75 ++ .../version-0.19.0/release notes/v0.9.0.md | 78 ++ .../version-0.19.0-sidebars.json | 31 + defradb_versions.json | 3 + docs/defradb/getting-started.md | 2 +- docs/lensvm/lens-vm.md | 2 +- docs/orbis/overview.md | 2 +- docs/sourcehub/overview.md | 2 +- docusaurus.config.js | 151 +++- .../version-0.9.3/lens-vm.md | 146 ++++ .../version-0.9.3-sidebars.json | 31 + lensvm_versions.json | 3 + .../version-0.2.3/concepts/_category_.json | 5 + .../version-0.2.3/concepts/dkg.md | 33 + .../version-0.2.3/concepts/mpc.md | 32 + .../version-0.2.3/concepts/pre.md | 37 + .../version-0.2.3/concepts/pss.md | 34 + .../getting-started/1-install.md | 35 + .../version-0.2.3/getting-started/2-create.md | 95 +++ .../version-0.2.3/getting-started/3-policy.md | 51 ++ .../getting-started/4-secrets.md | 77 ++ .../getting-started/_category_.json | 4 + .../version-0.2.3/networks/_category_.json | 4 + .../networks/testnet/_category_.json | 4 + .../version-0.2.3/networks/testnet/join.md | 267 ++++++ .../version-0.2.3/overview.md | 21 + .../version-0.2.3/reference/_category_.json | 4 + .../version-0.2.3/reference/config.md | 3 + .../version-0.2.3/reference/manifest.md | 24 + .../version-0.2.3-sidebars.json | 31 + orbis_versions.json | 3 + sidebars.js | 28 +- .../version-0.3.2/concepts/_category_.json | 4 + .../version-0.3.2/concepts/zanzibar.md | 248 ++++++ .../version-0.3.2/getting-started/1-readme.md | 27 + .../getting-started/2-account.md | 46 + .../getting-started/3-create-a-policy.md | 63 ++ .../getting-started/4-acp-check.md | 54 ++ .../getting-started/_category_.json | 5 + .../version-0.3.2/networks/_category_.json | 3 + .../networks/testnet-1/_category_.json | 4 + .../version-0.3.2/networks/testnet-1/join.md | 158 ++++ .../networks/testnet-1/overview.md | 155 ++++ .../version-0.3.2/overview.md | 23 + .../version-0.3.2-sidebars.json | 31 + sourcehub_versions.json | 3 + .../DocsVersionDropdownNavbarItem.js | 53 ++ 163 files changed, 11380 insertions(+), 30 deletions(-) create mode 100644 defradb_versioned_docs/version-0.19.0/BSL-License.md create mode 100644 defradb_versioned_docs/version-0.19.0/concepts/_category_.json create mode 100644 defradb_versioned_docs/version-0.19.0/concepts/ipfs.md create mode 100644 defradb_versioned_docs/version-0.19.0/concepts/libp2p.md create mode 100644 defradb_versioned_docs/version-0.19.0/getting-started.md create mode 100644 defradb_versioned_docs/version-0.19.0/guides/_category_.json create mode 100644 defradb_versioned_docs/version-0.19.0/guides/akash-deployment.md create mode 100644 defradb_versioned_docs/version-0.19.0/guides/content-addressable-storage.md create mode 100644 defradb_versioned_docs/version-0.19.0/guides/content-identifier.md create mode 100644 defradb_versioned_docs/version-0.19.0/guides/deployment-guide.md create mode 100644 defradb_versioned_docs/version-0.19.0/guides/explain-systems.md create mode 100644 defradb_versioned_docs/version-0.19.0/guides/merkle-crdt.md create mode 100644 defradb_versioned_docs/version-0.19.0/guides/peer-to-peer.md create mode 100644 defradb_versioned_docs/version-0.19.0/guides/schema-migration.md create mode 100644 defradb_versioned_docs/version-0.19.0/guides/schema-relationship.md create mode 100644 defradb_versioned_docs/version-0.19.0/guides/secondary-index.md create mode 100644 defradb_versioned_docs/version-0.19.0/guides/time-traveling-queries.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/_category_.json create mode 100644 defradb_versioned_docs/version-0.19.0/references/acp.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/_category_.json create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_policy.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_policy_add.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_relationship.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_relationship_add.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_relationship_delete.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_backup.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_backup_export.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_backup_import.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_create.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_delete.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_describe.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_docIDs.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_get.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_patch.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_update.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_dump.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index_create.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index_drop.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index_list.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_node-identity.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection_add.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection_getall.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection_remove.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_info.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator_delete.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator_getall.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator_set.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_purge.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_query.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_add.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_describe.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_down.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_reload.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_set-registry.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_set.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_up.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_patch.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_set-active.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx_commit.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx_create.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx_discard.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_view.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_view_add.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_view_refresh.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_identity.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_identity_new.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_export.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_generate.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_import.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_list.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_server-dump.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_start.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/cli/defradb_version.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/config.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/query-specification/_category_.json create mode 100644 defradb_versioned_docs/version-0.19.0/references/query-specification/aggregate-functions.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/query-specification/aliases.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/query-specification/collections.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/query-specification/database-api.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/query-specification/execution-flow.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/query-specification/filtering.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/query-specification/grouping.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/query-specification/limiting-and-pagination.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/query-specification/mutation-block.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/query-specification/query-block.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/query-specification/query-language-overview.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/query-specification/relationships.md create mode 100644 defradb_versioned_docs/version-0.19.0/references/query-specification/sorting-and-ordering.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/_category_.json create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.10.0.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.11.0.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.12.0.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.13.0.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.14.0.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.15.0.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.2.0.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.2.1.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.3.0.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.3.1.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.4.0.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.5.0.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.5.1.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.6.0.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.7.0.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.8.0.md create mode 100644 defradb_versioned_docs/version-0.19.0/release notes/v0.9.0.md create mode 100644 defradb_versioned_sidebars/version-0.19.0-sidebars.json create mode 100644 defradb_versions.json create mode 100644 lensvm_versioned_docs/version-0.9.3/lens-vm.md create mode 100644 lensvm_versioned_sidebars/version-0.9.3-sidebars.json create mode 100644 lensvm_versions.json create mode 100644 orbis_versioned_docs/version-0.2.3/concepts/_category_.json create mode 100644 orbis_versioned_docs/version-0.2.3/concepts/dkg.md create mode 100644 orbis_versioned_docs/version-0.2.3/concepts/mpc.md create mode 100644 orbis_versioned_docs/version-0.2.3/concepts/pre.md create mode 100644 orbis_versioned_docs/version-0.2.3/concepts/pss.md create mode 100644 orbis_versioned_docs/version-0.2.3/getting-started/1-install.md create mode 100644 orbis_versioned_docs/version-0.2.3/getting-started/2-create.md create mode 100644 orbis_versioned_docs/version-0.2.3/getting-started/3-policy.md create mode 100644 orbis_versioned_docs/version-0.2.3/getting-started/4-secrets.md create mode 100644 orbis_versioned_docs/version-0.2.3/getting-started/_category_.json create mode 100644 orbis_versioned_docs/version-0.2.3/networks/_category_.json create mode 100644 orbis_versioned_docs/version-0.2.3/networks/testnet/_category_.json create mode 100644 orbis_versioned_docs/version-0.2.3/networks/testnet/join.md create mode 100644 orbis_versioned_docs/version-0.2.3/overview.md create mode 100644 orbis_versioned_docs/version-0.2.3/reference/_category_.json create mode 100644 orbis_versioned_docs/version-0.2.3/reference/config.md create mode 100644 orbis_versioned_docs/version-0.2.3/reference/manifest.md create mode 100644 orbis_versioned_sidebars/version-0.2.3-sidebars.json create mode 100644 orbis_versions.json create mode 100644 sourcehub_versioned_docs/version-0.3.2/concepts/_category_.json create mode 100644 sourcehub_versioned_docs/version-0.3.2/concepts/zanzibar.md create mode 100644 sourcehub_versioned_docs/version-0.3.2/getting-started/1-readme.md create mode 100644 sourcehub_versioned_docs/version-0.3.2/getting-started/2-account.md create mode 100644 sourcehub_versioned_docs/version-0.3.2/getting-started/3-create-a-policy.md create mode 100644 sourcehub_versioned_docs/version-0.3.2/getting-started/4-acp-check.md create mode 100644 sourcehub_versioned_docs/version-0.3.2/getting-started/_category_.json create mode 100644 sourcehub_versioned_docs/version-0.3.2/networks/_category_.json create mode 100644 sourcehub_versioned_docs/version-0.3.2/networks/testnet-1/_category_.json create mode 100644 sourcehub_versioned_docs/version-0.3.2/networks/testnet-1/join.md create mode 100644 sourcehub_versioned_docs/version-0.3.2/networks/testnet-1/overview.md create mode 100644 sourcehub_versioned_docs/version-0.3.2/overview.md create mode 100644 sourcehub_versioned_sidebars/version-0.3.2-sidebars.json create mode 100644 sourcehub_versions.json create mode 100644 src/theme/NavbarItem/DocsVersionDropdownNavbarItem.js diff --git a/defradb_versioned_docs/version-0.19.0/BSL-License.md b/defradb_versioned_docs/version-0.19.0/BSL-License.md new file mode 100644 index 0000000..a5018a4 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/BSL-License.md @@ -0,0 +1,80 @@ +--- +sidebar_position: 7 +title: BSL 1.1 License +--- + +We are pleased to announce that Source is transitioning its source-code license from Apache 2.0 to the Business Source License version (BSL 1.1). This strategic move empowers Source to exercise greater control over its source code's commercialization while providing open access to the community. + +The timing for this shift is perfect because our latest release brings revolutionary design changes. At this stage of development, it is typical for some commercial users to fork the software for commercial gains. This move is not beneficial to our community. Moreover, it can result in forks jungle, brand dilution, confused users, and code fragmentation. Thus, we must make this change right now to protect our community and developers. + +As you know, DefraDB is a community-driven and developer-centric project. We strongly value our community's active participation and feedback. We genuinely seek your valuable insights to explore and expand the possibilities of the Additional Use Grant in alignment with our shared vision. Together, we can shape the future of DefraDB to serve the needs of our collective community better. + +At our mission's core, we are steadfast in promoting fairness and social good. Similarly, security, interpretability, user data portability, privacy, democratization, and the long-lasting vitality of the network is of prime importance to us. +. + +## BSL Overview + +Here is a brief BSL introduction and key points of our licensing terms. + +### Brief History of BSL +The founders of MySQL and MariaDB introduced BSL. They implemented it first in 2013 for MariaDB products. In 2017, they updated the license and further refined it to version 1.1, benefiting from valuable insights and guidance from Bruce Perens, the co-founder of the Open-Source Initiative (OSI). + +### Other Open-Source Companies Using Commercial Licenses + +It's worth mentioning that providing some sort of commercial licensing is gaining attention and adoption in the open-source community. Today, many notable companies use these licenses for their specific software products. For example, MariaDB, WP Engine (WordPress), MySQL AB (MySQL), Canonical (Ubuntu), Mozilla Corporation (Firefox), Docker, SUSE (Linux Kernel), GitLab (Git), JetBrains (IntelliJ), GitHub (Git), Red Hat (Linux), and Redis Labs are among them. + +### What Are the provisions of BSL? + +The license design provides a balance between open-source principles and commercial interests. It allows companies to maintain control over the commercialization of their source code while providing necessary access to the community. + +## Key Points of BSL 1.1 +* The standard term for the BSL is four years, providing time for DefraDB to gain support and stability before broader adoption. +* The standard BSL allows copying, modifying, redistributing, and non-production use of the source code. + +### Production Use Criteria +As you can see, the non-production use of the source code does not benefit the community's financial sustainability. Thus, to allow running DefraDB in production, we created the following four criteria under the Additional Use Grant Conditions. In summary, the production use is allowed if: +1. The application is connected to the Source Hub Mainnet, with ongoing support through the OPEN utility token. +2. The application is connected to any sidechain protocol integrated with the Source Hub Mainnet. +3. The applications use the Source Network Access Control Policy on any public protocols. +4. The project is a non-profit project. +If none of the above criteria apply to your use case, you can obtain commercial licensing by contacting Source. + +### How Will This Change Benefit DefraDB? + +BSL offers compelling advantages for us. +1. It allows us to maintain a balance between openness and commercial viability. +2. By providing a time-limited license that reverts to open-source after a specified period, BSL allows us to benefit from community collaboration. +3. It also safeguards our ability to monetize and protect our IP. It balances source code accessibility and commercial interests. +4. It also enables transparency and trust while preserving proprietary innovations. The defined roadmap for licensing transitions provides predictability, aligning development efforts and business objectives. Endorsement by influential figures in the open-source community enhances credibility and reputation. +5. Adopting BSL demonstrates our commitment to collaboration and innovation. It will attract developers and foster partnerships. Overall, BSL combines the best elements of open source with safeguards for commercial success. It will empower DefraDB to thrive, innovate, and position itself as a leader in the open-source ecosystem. + +### How Will This Change Benefit Our Community? + +This move also brings compelling benefits to our open-source community. It can create a thriving environment for collaboration and innovation. Here's why BSL is advantageous to our community: +1. Source Code Access: BSL ensures transparency by making the source code readily available. It fosters trust and empowers developers to understand, enhance, and improve the software. +2. Collaborative Community: BSL encourages active participation. It enables developers to contribute their expertise, ideas, and enhancements. This collective effort drives continuous innovation and creates a supportive network within the community. +3. Increased Adoption: BSL's balanced licensing structure will promote wider adoption of DefraDB. Aligning openness with commercial viability attracts organizations to embrace and distribute the software, expanding its reach and impact. +4. Protection of Open-Source Values: BSL maintains the core principles of open source. At the same time, it also acknowledges the need for sustainable commercial models. It strikes a crucial balance that safeguards developers' and companies' interests. +By choosing BSL, we can contribute to the growth and advancement of our project. Thus, it will enable our vibrant community to thrive more. + +## Frequently Asked Questions + +### Q: What Distinguishes the BSL From Other Licenses Such As AGPL, SSPL, Or the Inclusion of The Common Clause in Agreements? +BSL 1.1 stands apart due to its unique characteristic as a time-limited license. It reverts to an open-source license (specifically Apache) after four years. Conversely, the other mentioned options impose permanent restrictions on specific usage scenarios. Our approach aims to strike an optimal balance between ensuring the availability of our source code and supporting the developer community. It also safeguards our capacity to commercialize and provide support for it. + +### Q: Why Make the Change Now? +Our current release is a revolutionary one. It introduces captivating design changes that could lead to third-party forks of the Source code. It allows them to create commercial derivatives without contributing to the developer community. In the best interest of the community and our customers, we believe it is crucial to avoid such an outcome. +### Q: After Four Years, Can I Develop My Own Commercial Product Under the Apache 2.0 license? +Absolutely, if that is your intention. + +### Q: Is Source Still Committed to Being an Open-Source Company? +Absolutely, yes. We continue to license a significant portion of our source code under approved open-source licenses for specific uses. We remain dedicated to servicing various open-source projects related to Source. Furthermore, the BSL only imposes restrictions on the commercialization of our source code. Lastly, after four years, the source code automatically converts to an OSI-approved license (Apache 2.0), further solidifying our commitment to open-source principles. + +### Q: Which of Your Products Will Be Under The BSL? +Currently, BSL 1.1 is only for DefraDB. However, if, in the future, we need to update the licensing of any of our other projects, we will inform the community accordingly. + +### Q: Can I Use DefraDB Licensed Under BSL In a Test and Development Environment? +Yes, you can use DefraDB licensed under BSL in a non-production test and development environment without requiring a subscription from us. + +### Q: Can I Apply BSL To My Own Software? +Yes, you can utilize the BSL framework for your software if you hold the copyright or if the software has a permissive license, such as BSD. Converting your software to BSL involves adding the BSL header to all software files and including the BSL license file in your software distribution. You also need to specify an Additional Use Grant (or declare its absence) and a Change Date suitable for your software in the header of the BSL license file. diff --git a/defradb_versioned_docs/version-0.19.0/concepts/_category_.json b/defradb_versioned_docs/version-0.19.0/concepts/_category_.json new file mode 100644 index 0000000..dbc4274 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/concepts/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Concepts", + "position": 3 + } + \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/concepts/ipfs.md b/defradb_versioned_docs/version-0.19.0/concepts/ipfs.md new file mode 100644 index 0000000..5573386 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/concepts/ipfs.md @@ -0,0 +1,102 @@ +--- +title: InterPlanetary File System (IPFS) +--- + +## Overview + +The **InterPlanetary File System (IPFS)** is a **distributed** system designed to enable peer-to-peer access to websites, applications, files, and data using **content addressing** instead of traditional location-based addressing. The fundamental goal of IPFS is to revolutionize how information is shared across networks by making it more **efficient, resilient, and censorship-resistant**. + +## Key Features + +IPFS is built on several core principles that distinguish it from conventional web technologies: + +- **Distributed Infrastructure:** Information is retrieved from multiple nodes instead of relying on a single centralized server. +- **Content Addressing:** Data is identified by its **cryptographic hash**, ensuring content integrity and eliminating reliance on specific locations (URLs). +- **Decentralized Participation:** The network thrives on active participation, where multiple users store and share files, making data more accessible and resilient to failures. + +## Why IPFS? Advantages of a Distributed Web + +Unlike traditional web systems that rely on centralized servers, IPFS offers several benefits: + +- **Resilience to Failures:** Since content is retrieved from multiple sources, it remains available even if some nodes go offline. +- **Faster Content Delivery:** By retrieving content from the nearest available node, IPFS can significantly reduce latency and bandwidth costs. +- **Censorship Resistance:** IPFS makes it difficult for a single entity to control or restrict access to content. +- **Efficient Storage:** Duplicate files are automatically deduplicated across the network, optimizing storage usage. + +## How IPFS Works + +IPFS operates using three key mechanisms: + +### 1. Content Addressing + +- Each file is assigned a **unique cryptographic hash** (Content Identifier or CID). +- Any change to the file results in a new hash, ensuring integrity and version control. + +### 2. Directed Acyclic Graphs (DAGs) for Content Linking + +- Data is structured as a **Merkle Directed Acyclic Graph (DAG)**, where each node contains links to its components. +- This allows for efficient data distribution and version tracking. + +### 3. Distributed Hash Tables (DHTs) for Content Discovery + +- When a user requests a file, IPFS looks up its CID in a **Distributed Hash Table** (DHT) to locate peers storing the requested content. +- The system retrieves the file from the nearest or most efficient source. + +## How to Use IPFS + +### 1. Adding a File to IPFS + +- A user adds a file to IPFS using an IPFS node. +- The file is broken into chunks and given a unique CID. +- The CID can be used to retrieve the file later. + +### 2. Retrieving a File from IPFS + +- Users request content by CID. +- IPFS locates the closest nodes storing that file and delivers the data in a peer-to-peer fashion. + +### 3. Pinning and Persistence + +- IPFS does not permanently store all files; users must "pin" files to keep them accessible on their own nodes. +- Content persistence is ensured by either pinning files manually or using **IPFS pinning services**. + +## Considerations and Limitations + +While IPFS offers significant advantages, users should be aware of: + +- **Storage Responsibility:** Files may disappear unless pinned or actively shared by multiple peers. +- **No Built-in Encryption:** While data integrity is ensured, encryption must be handled separately if needed. +- **Bandwidth Usage:** Nodes that participate in the network contribute bandwidth, which may impact performance on limited connections. + +## Getting Started with IPFS + +To start using IPFS: + +1. Install IPFS from the [official IPFS website](https://ipfs.io). +1. Initialize an IPFS node using: + +```sh +ipfs init +``` + +1. Add a file to IPFS: + +```sh +ipfs add myfile.txt +``` + +1. Retrieve a file using its CID + +```s +ipfs cat +``` + +## Further Reading + +For more in-depth knowledge, explore: + +- [IPFS Official Documentation](https://docs.ipfs.tech/) +- [IPFS Whitepaper](https://ipfs.io/ipfs/QmR7GSQM93Cx5eAg6a6vTyWKNXq8Rz5KZX3u37aS1WbDyB) +- [IPFS GitHub Repository](https://github.com/ipfs) + +IPFS represents a fundamental shift towards a more open, resilient, and decentralized internet, paving the way for the future of data distribution and web applications. diff --git a/defradb_versioned_docs/version-0.19.0/concepts/libp2p.md b/defradb_versioned_docs/version-0.19.0/concepts/libp2p.md new file mode 100644 index 0000000..108e3d7 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/concepts/libp2p.md @@ -0,0 +1,65 @@ +# libp2p: A Modular Peer-to-Peer Networking Framework + +## Overview + +libp2p is a flexible and modular framework designed to simplify the development of peer-to-peer (P2P) network applications. It provides a suite of **protocols, specifications, and libraries** that allow applications to communicate efficiently without relying on centralized servers. + +Originally developed for IPFS, libp2p has evolved into a **standalone networking stack** used in decentralized applications, blockchain networks, and distributed systems. + +## Understanding Peer-to-Peer Networks + +Peer-to-peer (P2P) networking is a communication model where **nodes (peers) interact directly** with each other instead of depending on a central server. This approach contrasts with the traditional **client-server model**, where a server acts as the central point for data exchange. + +### Examples of P2P Networks: + +- **File-sharing networks** (e.g., BitTorrent) – Allow users to share and download files without a central server. +- **Blockchain networks** (e.g., Ethereum, Bitcoin) – Enable decentralized transaction validation and consensus mechanisms. + +By eliminating central authorities, P2P networks enhance **resilience, scalability, and censorship resistance** in distributed applications. + +## Key Challenges Solved by libp2p + +libp2p provides solutions to fundamental networking challenges that arise in P2P environments: + +### 1. **Transport Abstraction** + +- Supports multiple transport protocols (TCP, WebSockets, QUIC, etc.). +- Enables seamless communication across different network environments. + +### 2. **Identity & Security** + +- Uses **cryptographic identities** to verify peers. +- Ensures encrypted and authenticated communication between nodes. + +### 3. **Peer Routing** + +- Implements **Distributed Hash Tables (DHTs)** for efficient peer discovery. +- Helps nodes locate and connect with others dynamically. + +### 4. **Content Routing** + +- Allows efficient lookup and retrieval of data across the network. +- Optimizes distributed content addressing for performance and reliability. + +### 5. **Messaging & PubSub** + +- Supports **publish-subscribe (PubSub) messaging** for real-time data exchange. +- Facilitates decentralized event-driven communication in distributed applications. + +## Why Use libp2p? + +libp2p is widely adopted in decentralized technologies because of its: + +- **Modularity** – Developers can mix and match components based on project needs. +- **Interoperability** – Works across different networks, transport protocols, and applications. +- **Scalability** – Designed to handle thousands of peers efficiently. +- **Security** – Implements robust encryption and authentication mechanisms. + +## Getting Started with libp2p + +To start using libp2p, explore the following resources: + +- [libp2p Conceptual Documentation](https://docs.libp2p.io/concepts/) +- [libp2p GitHub Repository](https://github.com/libp2p/) + +libp2p is shaping the future of **decentralized communication** by enabling efficient, secure, and scalable peer-to-peer networking. diff --git a/defradb_versioned_docs/version-0.19.0/getting-started.md b/defradb_versioned_docs/version-0.19.0/getting-started.md new file mode 100644 index 0000000..9e833cd --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/getting-started.md @@ -0,0 +1,455 @@ +--- +sidebar_position: 1 +title: Getting Started +slug: / +--- + +# DefraDB Overview + +![DefraDB Overview](/img/defradb-cover.png) + +DefraDB is an application-centric database that prioritizes data ownership, personal privacy, and information security. Its data model, powered by the convergence of [MerkleCRDTs](https://arxiv.org/pdf/2004.00107.pdf) and the content-addressability of [IPLD](https://docs.ipld.io/), enables a multi-write-master architecture. It features [DQL](./references/query-specification/query-language-overview.md), a query language compatible with GraphQL but providing extra convenience. By leveraging peer-to-peer infrastructure, it can be deployed nimbly in novel topologies. Access control is determined by a relationship-based DSL, supporting document or field-level policies, secured by the SourceHub infrastructure. DefraDB is a core part of the [Source technologies](https://source.network/) that enable new paradigms of local-first software, edge compute, access-control management, application-centric features, data trustworthiness, and much more. + +Disclaimer: At this early stage, DefraDB does not offer data encryption, and the default configuration exposes the database to the infrastructure. The software is provided "as is" and is not guaranteed to be stable, secure, or error-free. We encourage you to experiment with DefraDB and provide feedback, but please do not use it for production purposes until it has been thoroughly tested and developed. + +## Install + +Install `defradb` by [downloading an executable](https://github.com/sourcenetwork/defradb/releases) or building it locally using the [Go toolchain](https://golang.org/): + +```bash +git clone git@github.com:sourcenetwork/defradb.git +cd defradb +make install +``` + +Ensure `defradb` is included in your `PATH`: + +```bash +export PATH=$PATH:$(go env GOPATH)/bin +``` + +We recommend experimenting with queries using a native GraphQL client. [GraphiQL](https://altairgraphql.dev/#download) is a popular option. + +## Key Management - Initial Setup + +DefraDB has a built-in keyring for storing private keys securely. Keys are loaded at startup, and a secret must be provided via the `DEFRA_KEYRING_SECRET` environment variable. The following keys are loaded from the keyring on start: + +- `peer-key` Ed25519 private key (required) +- `encryption-key` AES-128, AES-192, or AES-256 key (optional) +- `node-identity-key` Secp256k1 private key (optional). This key is used for node's identity. + +If a `.env` file is available in the working directory, the secret can be stored there or via a file at a path defined by the `--secret-file` flag. + +Keys will be randomly generated on the initial start of the node if they are not found. If not, to generate keys: + +```bash +defradb keyring generate +``` + +Import external keys: + +```bash +defradb keyring import +``` + +To learn more about the available options: + +```bash +defradb keyring --help +``` + +NOTE: Node identity is an identity assigned to the node. It is used to exchange encryption keys with other nodes. + +## Start + +Start a node by executing: + +```bash +defradb start +``` + +Verify the local connection: + +```bash +defradb client collection describe +``` + +## Configuration + +DefraDB uses a default configuration: + +- Data directory: `~/.defradb/` +- GraphQL endpoint: `http://localhost:9181/api/v0/graphql` + +The `client` command interacts with the locally running node. + +The GraphQL endpoint can be used with a GraphQL client (e.g., Altair) to conveniently perform requests (`query`, `mutation`) and obtain schema introspection. Read more about [configuration options](./references/config.md). + +## Add a schema type + +Define and add a schema type. + +```bash +defradb client schema add ' + type User { + name: String + age: Int + verified: Boolean + points: Float + } +' +``` + +For more examples of schema type definitions, see the [examples/schema/](examples/schema/) folder. + +## Create a document + +Submit a `mutation` request to create a document of the `User` type: + +```bash +defradb client query ' + mutation { + create_User(input: {age: 31, verified: true, points: 90, name: "Bob"}) { + _docID + } + } +' +``` + +Expected response: + +```json +{ + "data": { + "create_User": [ + { + "_docID": "bae-91171025-ed21-50e3-b0dc-e31bccdfa1ab", + } + ] + } +} +``` + +`_docID` is the document's unique identifier determined by its schema and initial data. + +## Query documents + +Once you have populated your node with data, you can query it: + +```bash +defradb client query ' + query { + User { + _docID + age + name + points + } + } +' +``` + +This query obtains *all* users and returns their fields `_docID, age, name, points`. GraphQL queries only return the exact fields requested. + +You can further filter results with the `filter` argument. + +```bash +defradb client query ' + query { + User(filter: {points: {_ge: 50}}) { + _docID + age + name + points + } + } +' +``` + +This returns only user documents which have a value for the `points` field *Greater Than or Equal to* (`_ge`) 50. + +## Obtain document commits + +DefraDB's data model is based on [MerkleCRDTs](https://arxiv.org/pdf/2004.00107.pdf). Each document has a graph of all of its updates, similar to Git. The updates are called `commit`s and are identified by `cid`, a content identifier. Each references its parents by their `cid`s. To get the most recent commit in the MerkleDAG for the document identified as `bae-91171025-ed21-50e3-b0dc-e31bccdfa1ab`: + +```bash +defradb client query ' + query { + latestCommits(docID: "bae-91171025-ed21-50e3-b0dc-e31bccdfa1ab") { + cid + delta + height + links { + cid + name + } + } + } +' +``` + +It returns a structure similar to the following, which contains the update payload that caused this new commit (`delta`) and any subgraph commits it references. + +```json +{ + "data": { + "latestCommits": [ + { + "cid": "bafybeifhtfs6vgu7cwbhkojneh7gghwwinh5xzmf7nqkqqdebw5rqino7u", + "delta": "pGNhZ2UYH2RuYW1lY0JvYmZwb2ludHMYWmh2ZXJpZmllZPU=", + "height": 1, + "links": [ + { + "cid": "bafybeiet6foxcipesjurdqi4zpsgsiok5znqgw4oa5poef6qtiby5hlpzy", + "name": "age" + }, + { + "cid": "bafybeielahxy3r3ulykwoi5qalvkluojta4jlg6eyxvt7lbon3yd6ignby", + "name": "name" + }, + { + "cid": "bafybeia3tkpz52s3nx4uqadbm7t5tir6gagkvjkgipmxs2xcyzlkf4y4dm", + "name": "points" + }, + { + "cid": "bafybeia4off4javopmxcdyvr6fgb5clo7m5bblxic5sqr2vd52s6khyksm", + "name": "verified" + } + ] + } + ] + } +} +``` + +Obtain a specific commit by its content identifier (`cid`): + +```graphql +defradb client query ' + query { + commits(cid: "bafybeifhtfs6vgu7cwbhkojneh7gghwwinh5xzmf7nqkqqdebw5rqino7u") { + cid + delta + height + links { + cid + name + } + } + } +' +``` + +## DefraDB Query Language (DQL) + +DQL is compatible with GraphQL but features various extensions. + +Read its documentation [here](./references/query-specification/query-language-overview.md) to discover its filtering, ordering, limiting, relationships, variables, aggregate functions, and other useful features. + +## Peer-to-peer data synchronization + +DefraDB leverages peer-to-peer networking for data exchange, synchronization, and replication of documents and commits. + +When starting a node for the first time, a key pair is generated and stored in its "root directory" (`~/.defradb/` by default). + +Each node has a unique `PeerID` generated from its public key. This ID allows other nodes to connect to it. + +To view your node's peer info: + +```bash +defradb client p2p info +``` + +There are two types of peer-to-peer relationships supported: **pubsub** peering and **replicator** peering. + +Pubsub peering *passively* synchronizes data between nodes by broadcasting *Document Commit* updates to the topic of the commit's document key. Nodes need to be listening on the pubsub channel to receive updates. This is for when two nodes *already* have shared a document and want to keep them in sync. + +Replicator peering *actively* pushes changes from a specific collection *to* a target peer. + +
    +Pubsub example + +Pubsub peers can be specified on the command line using the `--peers` flag, which accepts a comma-separated list of peer [multiaddresses](https://docs.libp2p.io/concepts/addressing/). For example, a node at IP `192.168.1.12` listening on 9000 with PeerID `12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B` would be referred to using the multiaddress `/ip4/192.168.1.12/tcp/9000/p2p/12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B`. + +Let's go through an example of two nodes (*nodeA* and *nodeB*) connecting with each other over pubsub, on the same machine. + +Start *nodeA* with a default configuration: + +```bash +defradb start +``` + +Obtain the node's peer info: + +```bash +defradb client p2p info +``` + +In this example, we use `12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B`, but locally it will be different. + +For *nodeB*, we provide the following configuration: + +```bash +defradb start --rootdir ~/.defradb-nodeB --url localhost:9182 --p2paddr /ip4/127.0.0.1/tcp/9172 --peers /ip4/127.0.0.1/tcp/9171/p2p/12D3KooWNXm3dmrwCYSxGoRUyZstaKYiHPdt8uZH5vgVaEJyzU8B +``` + +About the flags: + +- `--rootdir` specifies the root dir (config and data) to use +- `--url` is the address to listen on for the client HTTP and GraphQL API +- `--p2paddr` is a comma-separated list of multiaddresses to listen on for p2p networking +- `--peers` is a comma-separated list of peer multiaddresses + +This starts two nodes and connects them via pubsub networking. +
    + +
    +Subscription example + +It is possible to subscribe to updates on a given collection by using its ID as the pubsub topic. The ID of a collection is found as the field `collectionID` in one of its documents. Here we use the collection ID of the `User` type we created above. After setting up 2 nodes as shown in the [Pubsub example](#pubsub-example) section, we can subscribe to collections updates on *nodeA* from *nodeB* by using the following command: + +```bash +defradb client p2p collection add --url localhost:9182 bafkreibpnvkvjqvg4skzlijka5xe63zeu74ivcjwd76q7yi65jdhwqhske +``` + +Multiple collection IDs can be added at once. + +```bash +defradb client p2p collection add --url localhost:9182 ,, +``` + +
    + +
    +Replicator example + +Replicator peering is targeted: it allows a node to actively send updates to another node. Let's go through an example of *nodeA* actively replicating to *nodeB*: + +Start *nodeA*: + +```bash +defradb start +``` + +In another terminal, add this example schema to it: + +```bash +defradb client schema add ' + type Article { + content: String + published: Boolean + } +' +``` + +Start (or continue running from above) *nodeB*, that will be receiving updates: + +```bash +defradb start --rootdir ~/.defradb-nodeB --url localhost:9182 --p2paddr /ip4/0.0.0.0/tcp/9172 +``` + +Here we *do not* specify `--peers` as we will manually define a replicator after startup via the `rpc` client command. + +In another terminal, add the same schema to *nodeB*: + +```bash +defradb client schema add --url localhost:9182 ' + type Article { + content: String + published: Boolean + } +' +``` + +Then copy the peer info from *nodeB*: + +```bash +defradb client p2p info --url localhost:9182 +``` + +Set *nodeA* to actively replicate the Article collection to *nodeB*: + +```bash +defradb client p2p replicator set -c Article +``` + +As we add or update documents in the Article collection on *nodeA*, they will be actively pushed to *nodeB*. Note that changes to *nodeB* will still be passively published back to *nodeA*, via pubsub. +
    + +## Securing the HTTP API with TLS + +By default, DefraDB will expose its HTTP API at `http://localhost:9181/api/v0`. It's also possible to configure the API to use TLS with self-signed certificates or Let's Encrypt. + +To start defradb with self-signed certificates placed under `~/.defradb/certs/` with `server.key` +being the public key and `server.crt` being the private key, just do: + +```bash +defradb start --tls +``` + +The keys can be generated with your generator of choice or with `make tls-certs`. + +Since the keys should be stored within the DefraDB data and configuration directory, the recommended key generation command is `make tls-certs path="~/.defradb/certs"`. + +If not saved under `~/.defradb/certs` then the public (`pubkeypath`) and private (`privkeypaths`) key paths need to be explicitly defined in addition to the `--tls` flag or `tls` set to `true` in the config. + +Then to start the server with TLS, using your generated keys in custom path: + +```bash +defradb start --tls --pubkeypath ~/path-to-pubkey.key --privkeypath ~/path-to-privkey.crt + +``` + +## Access Control System + +Read more about the access control [here](./references/acp.md). + +## Supporting CORS + +When accessing DefraDB through a frontend interface, you may be confronted with a CORS error. That is because, by default, DefraDB will not have any allowed origins set. To specify which origins should be allowed to access your DefraDB endpoint, you can specify them when starting the database: + +```bash +defradb start --allowed-origins=https://yourdomain.com +``` + +If running a frontend app locally on localhost, allowed origins must be set with the port of the app: + +```bash +defradb start --allowed-origins=http://localhost:3000 +``` + +The catch-all `*` is also a valid origin. + +## External port binding + +By default the HTTP API and P2P network will use localhost. If you want to expose the ports externally you need to specify the addresses in the config or command line parameters. + +```bash +defradb start --p2paddr /ip4/0.0.0.0/tcp/9171 --url 0.0.0.0:9181 +``` + +## Backing up and restoring + +It is currently not possible to do a full backup of DefraDB that includes the history of changes through the Merkle DAG. However, DefraDB currently supports a simple backup of the current data state in JSON format that can be used to seed a database or help with transitioning from one DefraDB version to another. + +To backup the data, run the following command: + +```bash +defradb client backup export path/to/backup.json +``` + +To pretty print the JSON content when exporting, run the following command: + +```bash +defradb client backup export --pretty path/to/backup.json +``` + +To restore the data, run the following command: + +```bash +defradb client backup import path/to/backup.json +``` + +## Conclusion + +This gets you started to use DefraDB. Read on the documentation website for guides and further information. diff --git a/defradb_versioned_docs/version-0.19.0/guides/_category_.json b/defradb_versioned_docs/version-0.19.0/guides/_category_.json new file mode 100644 index 0000000..7494f24 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/guides/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Guides", + "position": 2 + } + \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/guides/akash-deployment.md b/defradb_versioned_docs/version-0.19.0/guides/akash-deployment.md new file mode 100644 index 0000000..4caceec --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/guides/akash-deployment.md @@ -0,0 +1,146 @@ +--- +sidebar_label: Akash Deployment Guide +sidebar_position: 70 +draft: true +--- +# Deploy DefraDB on Akash + +## Overview + +This guide will walk you through the required steps to deploy DefraDB on Akash. + +## Prerequisites + +Before you get started you will need an Akash account with at least 5 AKT. If don't have an Akash account you can create one by installing [Keplr](https://www.keplr.app/). + +## Deploy + +![Cloudmos console](/img/akash/deploy.png "Cloudmos console") + +Deploying on Akash can be done through the [Cloudmos console](https://deploy.cloudmos.io/new-deployment). Click on the "Empty" deployment type and copy the config below into the editor. + +```yaml +--- +version: "2.0" + +services: + defradb: + image: sourcenetwork/defradb:develop + args: + - start + - --url=0.0.0.0:9181 + expose: + - port: 9171 + as: 9171 + to: + - global: true + - port: 9181 + as: 80 + to: + - global: true + +profiles: + compute: + defradb: + resources: + cpu: + units: 1.0 + memory: + size: 1Gi + storage: + size: 1Gi + placement: + akash: + attributes: + host: akash + signedBy: + anyOf: + - "akash1365yvmc4s7awdyj3n2sav7xfx76adc6dnmlx63" + - "akash18qa2a2ltfyvkyj0ggj3hkvuj6twzyumuaru9s4" + pricing: + defradb: + denom: uakt + amount: 10000 + +deployment: + defradb: + akash: + profile: defradb + count: 1 +``` + +Next click the "Create Deployment" button. A pop-up will appear asking you to confirm the configuration transaction. + +After confirming you will be prompted to select a provider. Select a provider with a price and location that makes sense for your use case. + +A final pop-up will appear asking you to confirm the deployment transaction. If the deployment is successful you should now see deployment info similar to the image below. + +## Deployment Info + +![Cloudmos deployment](/img/akash/info.png "Cloudmos deployment") + +To configure and interact with your DefraDB node, you will need the P2P and API addresses. They can be found at the labeled locations in the image above. + +## P2P Replication + +To replicate documents from a local DefraDB instance to your Akash deployment you will need to create a shared schema on both nodes. + +Run the commands below to create the shared schema. + +First on the local node: + +```bash +defradb client schema add ' + type User { + name: String + age: Int + } +' +``` + +Then on the Akash node: + +```bash +defradb client schema add --url ' + type User { + name: String + age: Int + } +' +``` + +> The API address can be found in the [deployment info](#deployment-info). + +Next you will need the peer ID of the Akash node. Run the command below to view the node's peer info. + +```bash +defradb client p2p info --url +``` + +If the command is successful, you should see output similar to the text below. + +```json +{ + "ID": "12D3KooWQr7voGBQPTVQrsk76k7sYWRwsAdHRbRjXW39akYomLP3", + "Addrs": [ + "/ip4/0.0.0.0/tcp/9171" + ] +} +``` + +> The address here is the node's p2p bind address. The public p2p address can be found in the [deployment info](#deployment-info). + +Setup the replicator from your local node to the Akash node by running the command below. + +```bash +defradb client p2p replicator set --collection User '{ + "ID": "12D3KooWQr7voGBQPTVQrsk76k7sYWRwsAdHRbRjXW39akYomLP3", + "Addrs": [ + "/dns//" + ] +}' +``` + +> The p2p host and port can be found in the [deployment info](#deployment-info). For example: if your p2p address is http://provider.bdl.computer:32582/ the host would be provider.bdl.computer and the port would be 32582. + +The local node should now be replicating all User documents to the Akash node. diff --git a/defradb_versioned_docs/version-0.19.0/guides/content-addressable-storage.md b/defradb_versioned_docs/version-0.19.0/guides/content-addressable-storage.md new file mode 100644 index 0000000..97dfa87 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/guides/content-addressable-storage.md @@ -0,0 +1,98 @@ +--- +sidebar_label: Content Addressable Storage +sidebar_position: 80 +--- + +# Content Addressable Storage + +## Overview + +Content-Addressable Storage (CAS) is a way to store data that works differently from what you might be used to. Normally, when you save something on your computer or online, you find it by where it is stored, like a file path or a website address. But with CAS, each piece of data gets its own special ID based on what it actually is. + +This special ID comes from running the data through a hash function, which turns it into a unique digest. If the data changes even a little, the digest changes too. Content-addressable storage can tell if someone tried to change or mess with the data. It also saves space because if two pieces of data are exactly the same, it stores that data only once. + +This method matters because it helps keep data safe and trustworthy. It makes it easy to track different versions over time and works well in systems where many computers share data with each other. + +## How DefraDB uses CAS + +DefraDB’s data model is built on IPLD (InterPlanetary Linked Data), which connects and represents data using Merkle Directed Acyclic Graphs (Merkle DAGs) and hash-based addressing. Here’s what these terms mean in simple language: + +* **IPLD**: This is a way to represent and connect data across distributed systems using hashes. It makes data universally linkable and verifiable. + +* **Merkle DAGs**: In DefraDB, every document and every update is a node in a Merkle DAG. Each change creates a “commit,” similar to Git. The commit has its own hash and also links back to earlier commits by their hashes. + +* **Hash-based addressing**: Each version of a document, or even a field update, is given a unique identifier called a CID (Content Identifier). The CID is generated from the content itself, so if the content changes, the CID changes too. + +* **Storage and retrieval**: When you create or update a document, DefraDB saves the difference (the part that changed) and assigns it a CID. To fetch the data, a user or peer asks for the CID. The system then finds the content and verifies it by recalculating the hash. + +## Why it matters + +Using CAS in DefraDB brings many benefits that make data safer, easier to manage, and more flexible. + +* **Immutability and auditability**: Every time you change a document, DefraDB records that update permanently. You can always see what happened and when, making the data trustworthy. + +* **Deduplication**: DefraDB stores only one copy of identical data because it identifies data by its content. This saves space and makes storage efficient. + +* **Tamper-evidence**: If someone changes data without permission, the content hash stops matching. DefraDB can detect this easily. + +* **Peer-to-peer friendly**: CAS works well when many computers share data directly. DefraDB syncs updates quickly, even when offline or on weak networks. + +* **Efficient versioning**: DefraDB saves every change with its own ID. You can go back to any earlier version of the data, making “time travel” through history possible. + +## CAS in Action + +Here’s how it works step by step: + +* **Storing data**: When you create a new document, like a user profile, DefraDB calculates a unique digest called a CID by hashing the document content. The CID becomes the document’s permanent ID. DefraDB stores the document under that CID. If two documents have the same content, then they share the same CID and DefraDB stores the data only once. + +* **Updating data**: When you change a document, DefraDB does not replace the old data. It saves the update as a separate new node, linking it to the previous version and forming a chain called a Merkle DAG. Each update gets its own CID representing a new version. DefraDB keeps the full change history this way. + +## Synchronization Process + +Content-addressable storage gives DefraDB a strong foundation to manage data across devices, users, and network conditions. Here is how it supports key features step by step: + +### Supporting CRDTs for Conflict-free Collaboration + +DefraDB implements **Merkle CRDTs**, a specialized type of Conflict-free Replicated Data Type that combines traditional CRDT merge semantics with Merkle DAGs for efficient distributed collaboration: + +**Merkle Clock Implementation:** + +1. Each document change creates a new node in the Merkle DAG with a unique CID and a height value (incremental counter) +2. The Merkle clock uses the inherent causality of the DAG structure—since node A's CID is embedded in node B, A must exist before B +3. This eliminates the need to maintain per-peer metadata, making DefraDB efficient in high-churn networks with unlimited peers + +**Delta State CRDT Semantics:** + +1. DefraDB uses delta state-based CRDTs that only transmit the minimum "delta" needed to transform one state to another +2. Instead of sending entire document states, only the changed portion (like adding "banana" to a fruit set) is transmitted +3. This hybrid approach provides the benefits of both operation-based (small message size) and state-based (reliable delivery) CRDTs + +**Branching and Merging:** + +1. When peers make concurrent edits, the Merkle DAG naturally branches into independent states +2. Each branch maintains its own valid history until synchronization occurs +3. Merging creates a new "merge node" with multiple parents, applying CRDT-specific merge semantics +4. The system finds common ancestral nodes using height parameters and CIDs to resolve conflicts deterministically + +**Conflict Resolution Process:** + +1. When conflicts occur, DefraDB traverses both branches back to their common ancestor +2. The embedded CRDT type (register, counter, set, etc.) defines the specific merge rules +3. All changes are preserved in the final merged state, ensuring no data loss +4. The resulting merge maintains the DAG structure and provides a new canonical head + +### Enabling Efficient Synchronization Across Peers + +1. Peers exchange CIDs representing the latest document versions. +1. Compare received CIDs with its own and requests only missing data. +1. Verify data by recalculating the hash and matching it to the CID. Peers reject any data that does not match. +1. Verified data is added to the local Merkle DAG to update the document history. + +### Making Offline-first Work Smoothly + +1. Users make changes locally even without internet. Each update gets a new CID and joins the local Merkle DAG. +1. When online again, devices share new CIDs and sync changes. +1. DefraDB merges updates from different peers using CRDT rules using full change histories. +1. This process ensures all peers arrive at the same up-to-date data without conflicts or loss. + +Overall, content-addressable storage lets DefraDB create reliable, easy-to-sync, and conflict-free data systems that work online and offline. diff --git a/defradb_versioned_docs/version-0.19.0/guides/content-identifier.md b/defradb_versioned_docs/version-0.19.0/guides/content-identifier.md new file mode 100644 index 0000000..556d176 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/guides/content-identifier.md @@ -0,0 +1,94 @@ +--- +sidebar_label: Content Identifiers (CID) +sidebar_position: 90 +--- + +# Content Identifiers (CID) + +## Overview + +Content Identifiers (CIDs) are foundational in content-addressable storage (CAS) systems, providing a globally unique, self-describing reference to digital content based on its data rather than its location. CIDs enable systems to efficiently and securely retrieve, verify, link, and manage data, enabling immutable and decentralized data storage solutions such as IPFS, IPLD, and DefraDB. + +## Why Content Identifiers Matter + +Traditional web addresses (URLs) tell you **where** data lives—on a specific server, at a specific location. + +Content Identifiers tell you **what** the data is—a unique fingerprint of the content itself. + +This fundamental shift enables: + +- **Decentralized architecture:** Any node can serve data, not just the original source +- **Self-verifying data:** Content proves its own integrity through cryptographic hashing +- **Permanent links:** References that never break, even when data moves +- **Automatic deduplication:** The same content always has the same identifier, eliminating redundant storage +- **True data portability:** Content can move freely between platforms while maintaining its identity + +This transformation from location-based to content-based addressing is as significant as the shift from IP addresses to domain names—but instead of making locations human-readable, CIDs make content itself addressable. + +## Content Identifier Basics + +A **CID** uniquely identifies data by combining a cryptographic hash with encoding metadata. This makes a CID: + +- **Deterministic:** No randomness—the same input always yields the same CID +- **Consistent across locations:** The same content always produces the same CID +- **Unique:** Different content results in different CIDs +- **Self-describing:** The identifier encodes what the data is and how to verify it + +### Understanding Cryptographic Hashes + +To understand how CIDs achieve these properties, we first need to understand the cryptographic hashes that power them. + +A **cryptographic hash** is a mathematical function that takes input data of any size and transforms it into a fixed-length string of bits, called a hash value or digest. This process is: + +- **Deterministic:** The same input always produces the same output +- **Collision-resistant:** Different inputs produce different outputs +- **One-way:** Cannot reverse the hash to get the original data +- **Sensitive:** Even a tiny change in input results in a completely different hash value + +Content-Addressable Storage (CAS) uses these cryptographic fingerprints to store and access data, ensuring integrity and enabling efficient deduplication. + +### Key CID Properties + +| Property | Description | Technical Benefit | +|----------|-------------|-------------------| +| **Immutability** | Any change to content changes the CID | Enables trustless verification | +| **Deduplication** | Same content anywhere yields the same CID | Reduces storage significantly in typical datasets | +| **Integrity verification** | CIDs ensure the authenticity of retrieved data | Cryptographic proof of data integrity | +| **Versioning** | Unique CIDs support tracking content over time | Implicit version control | + +## CID Structure + +With these fundamentals in place, let's examine how CIDs are actually structured and what each component does. + +### Visual Overview + +A CID consists of multiple components that work together to create a self-describing content identifier: +```bash +bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi +│ └┬┘└───────────────────────────────────────────────────────┘ +│ │ │ +│ │ └── Base32-encoded multihash +│ └──────────────────────────────── Multicodec (dag-pb) +└──────────────────────────────────── Multibase prefix (b = base32) +``` + +### Component Breakdown + +- **Multibase prefix:** Indicates how the CID is encoded (like choosing between binary and text). This allows CIDs to be represented in different formats for different use cases +- **Multicodec:** Specifies what format the content uses (raw bytes, JSON, CBOR, etc.). This tells systems how to interpret the data +- **Multihash:** Contains the actual cryptographic fingerprint of your content, along with information about which hash function was used + +### Technical Components + +| Component | Description | Details | Example Values | +|-----------|-------------|---------|----------------| +| **Multibase prefix** | Specifies encoding format | First character(s) of the CID | `b` (base32), `z` (base58btc), `f` (base16) | +| **Multicodec** | Identifies content type/format | Varint-encoded codec identifier | `0x70` (dag-pb), `0x71` (dag-cbor), `0x55` (raw) | +| **Multihash** | Hash function and digest | Function ID + digest length + digest | SHA-256, Blake2b-256, SHA-3 | + +### CID Versions + +| Version | Details | Example CID | Binary Structure | +|---------|---------|-------------|------------------| +| **CIDv0** | Base58btc encoding, supports only dag-pb and SHA-256 | `QmYwAPJzv5CZsnA...` | `` only | +| **CIDv1** | Supports multiple codecs, hash functions, and encodings | `bafybeigdyrzt5sf...` | `` | diff --git a/defradb_versioned_docs/version-0.19.0/guides/deployment-guide.md b/defradb_versioned_docs/version-0.19.0/guides/deployment-guide.md new file mode 100644 index 0000000..dfb6bba --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/guides/deployment-guide.md @@ -0,0 +1,156 @@ +--- +sidebar_label: Deployment Guide +sidebar_position: 80 +--- +# A Guide to DefraDB Deployment +DefraDB aspires to be a versatile database, supporting both single-node and clustered deployments. In a clustered setup, multiple nodes collaborate seamlessly. This guide walks you through deploying DefraDB, from single-node configurations to cloud and server environments. Let’s begin. + +## Prerequisites +The prerequisites listed in this section should be met before starting the deployment process. + +**Pre-Compiled Binaries** - Each release has its own set of pre-compiled binaries for different Operating Systems. Obtain the pre-compiled binaries for your operating system from the [official releases](https://github.com/sourcenetwork/defradb/releases). + +### Bare Metal Deployment + +For Bare Metal deployments, there are two methods available: + +- ### Building from Source + +Ensure Git, Go and make are installed for all your development environments. + +1. **Unix (Mac and Linux)** - The main thing required is the [Go language toolchain](https://go.dev/dl/), which is supported up to Go 1.20 in DefraDB due to the current dependencies. +2. **Windows** - Install the [MinGW toolchain](https://www.mingw-w64.org/) specific to GCC and add the [Make toolchain](https://www.gnu.org/software/make/). + +Follow these steps to build from source: + +1. Run git clone to download the [DefraDB repository](https://github.com/sourcenetwork/defradb#install) to your local machine. +2. Navigate to the repository using `cd`. +3. Execute the Make command to build a local DefraDB setup with default configurations. +4. Set the compiler and build tags for the playground: `GOFLAGS="-tags=playground"` + +#### Build Playground + +Refer to the Playground Basics Guide for detailed instructions. + +1. Compile the playground separately using the command: `make deps:playground` +2. This produces a bundle file in a folder called dist. +3. Set the environment variable using the [NodeJS language toolchain](https://nodejs.org/en/download/current) and npm to build locally on your machine. The JavaScript and Typescript code create an output bundle for the frontend code to work. +4. Build a specific playground version of DefraDB. Use the go flags environment variable, instructing the compiler to include the playground directly embedded in all files. Execute the [go binary embed](https://pkg.go.dev/embed) command, producing a binary of approximately 4MB. + + + +- ### Docker Deployments + +Docker deployments are designed for containerized environments. The main prerequisite is that Docker should be installed on your machine. + + +The steps for Docker deployment are as follows: + +1. Install Docker by referring to the [official Docker documentation](https://docs.docker.com/get-docker/). +2. Navigate to the root of the repository where the Dockerfile is located. +3. Run the following command: +`docker build -t defra -f tools/defradb.containerfile ` + + +**Note**: The period at the end is important and the -f flag specifies the file location. + +The container file is in a subfolder called tools: `path: tools/defradb.containerfile` + +Docker images streamline the deployment process, requiring fewer dependencies. This produces a DefraDB binary file for manual building and one-click deployments, representing the database in binary form as a system. + +## Deployment + +### Manual Deployment + +DefraDB is a single statically built binary with no third-party dependencies. Similar to bare metal, it can run on any cloud or machine. Execute the following command to start DefraDB: +`defradb start --store badger` + + + +### AWS Environment + +For deploying to an AWS environment, note the following: + +- Deploy effortlessly with a prebuilt [AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html) (Amazon Machine Image) featuring DefraDB. +- Access the image ID or opt for the convenience of the Amazon Marketplace link. +- Refer to [AWS documentation](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html) for an easy EC2 instance launch with your specified image size. +- Customize your setup using Packer and Terraform scripts in this directory: `tools/cloud/aws/packer` + +  + +### Akash Deployments + +For detailed instructions on deploying DefraDB with Akash, refer to the [Akash Deployment Guide](https://nasdf-feat-akash-deploy.docs-source-network.pages.dev/guides/akash-deployment). + +  + +## Configurations + +- The default root directory on Unix machines is `$HOME/.defradb`. For Windows it is `%USERPROFILE%\.defradb`​. +- Specifiy the DefraDB folder with this command: `defradb --rootdir start`. +- The default directory for where data is specified is `/data`. + +  + +## Storage Engine + +The storage engines currently used include: + +- Fileback persistent storage powered the [Badger](https://github.com/dgraph-io/badger%5D ) database. +- [In-Memory Storage](https://github.com/sourcenetwork/defradb/blob/develop/datastore/memory/memory.go) which is B-Tree based, ideal for testing does not work with the file system. It is specified with this flag: `--store memory` + +  + +## Network and Connectivity + +As a P2P database, DefraDB requires two ports for node communication, they include: + +  + +1. **API Port**: It powers the HTTP API, handling queries  from the client to the database  and various API commands. The default port number is *9181*. + +2. **P2P Port**: It facilitates communication between nodes, supporting data sharing, synchronization, and replication. The default port no is *9171*. + +  + +The P2P networking functionality can't be disabled entirely, but you can use the `defradb start --no-p2p`​ command through the config files and CLI to deactivate it. + +  + +### Port Customization + +The API port can be specified using the [bind address](https://docs.libp2p.io/concepts/fundamentals/addressing/): + +`API: --url :` + +For P2P use the P2P adder to a multi-address: + +`--p2paddr ` + +Here is an [infographic](https://images.ctfassets.net/efgoat6bykjh/XQrDLqpkV06rFhT24viJc/1c2c72ddebe609c80fc848bfa9c4771e/multiaddress.png) to further understand multi-address. + + +## The Peer Key + +Secure communication between nodes in DefraDB is established with a unique peer key for each node. Key details include: + +  + +- The peer key is automatically generated on startup, replacing the key file in a specific path. +- There is no current method for generating a new key except for overwriting an existing one. +- The peer key type uses a specific elliptic curve, called an Ed25519, which can be used to generate private keys. +- In-memory mode generates a new key with each startup. +- The config file located at `/config.yaml` is definable and used for specification. +- Additional methods for users to generate their own Ed25519 key: +openssl genpkey -algorithm ed25519 -text + +## Future Outlook + +As DefraDB evolves, the roadmap includes expanding compatibility with diverse deployment environments: + +- **Google Cloud Platform (GCP)**: Tailored deployment solutions for seamless integration with GCP environments. +- **Kubernetes**: Optimization for Kubernetes deployments, ensuring scalability and flexibility. +- **Embedded/IoT for Small Environments**: Adaptations to cater to the unique demands of embedded systems and IoT applications. +- **Web Assembly (WASM) Deployments**: Exploring deployment strategies utilizing Web Assembly for enhanced cross-platform compatibility. + +  \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/guides/explain-systems.md b/defradb_versioned_docs/version-0.19.0/guides/explain-systems.md new file mode 100644 index 0000000..3620e18 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/guides/explain-systems.md @@ -0,0 +1,171 @@ +--- +sidebar_label: Explain Systems Guide +sidebar_position: 20 +--- +# A Guide to Explain Systems in DefraDB + +## Overview + +The DefraDB Explain System is a powerful tool designed to introspect requests, examine plan graphs, and deliver insights into the execution of queries and mutations in DefraDB. These requests can range from basic information queries to highly intricate multi-step operations, all enabled with a single directive added to the request. + +### Regular Request + +```graphql +query { + Author { + _docID + name + age + } +} +``` + +### Explain Request + +```graphql +query @explain { + Author { + _docID + name + age + } +} +``` + +As application demand grows and schemas expand, requests often become more complex. This could involve adding a type-join or sorting large data sets, which can significantly increase the workload for the database. This often requires tweaking the query or the schema to ensure requests run as faster. However, without the capability to introspect and understand the request's execution flow, the database will be a black box to developers, limiting their capacity to optimize. This is why DefraDB allows developers to ask for an explanation of the request execution, plan graph, and runtime metrics. + +DefraDB provides the option to explain or analyze requests to gain insight into query resolution. Instead of directly requesting data, these queries ask the database to outline the steps it would take to resolve the request and execute all necessary operations before generating the result. This provides transparency into potential bottlenecks, such as inefficient scans or redundant sorting operations. Explain requests enable developers to better understand the database's inner workings and clarify the operations required for request resolution. + +Explain requests interact directly with the request planner, executor, and the resulting Plan Graph. + +## Planner and Plan Graph + +The request planner plays a crucial role in DefraDB as it is responsible for executing and presenting request results. When a database receives a request, it converts it into a series of operations planned and implemented by the request planner. These operations are represented as a Plan Graph, which is a directed graph of operations the database must perform to deliver the requested information. + +The Plan Graph is beneficial because it offers a structured request representation, allowing concurrent traversal, branch exploration, and independent subgraph optimization. Each Plan Graph node represents a specific work unit and consists of smaller graphs. For instance, the Plan Graph may contain scan nodes, index nodes, sorting nodes, and filter nodes, among others. The Plan Graph's order and structure are hierarchical, with each node relying on the previous node's output. For example, the final output may depend on the state rendering, which in turn relies on the state limiting, state sorting, and state scanning. + + + +The Plan Graph is a vital component of request processing as it enables the database to simplify complex operations into smaller, more manageable units. In this way, the Plan Graph contributes to the database's performance and scalability enhancement. + +The Explain System and Plan Graph collectively provide structured, accessible insights and transparency into the steps a database takes to execute a request. + +## Benefits + +At its core, the Explain System is a tool that assists developers in optimizing database queries and enhancing performance. Here is an example that emphasizes its advantages. + +Quick scans - Most queries begin with a scan node, which is a brute-force method of searching the entire key-value collection. This can be slow for large data sets. However, by using a secondary index, a space-time tradeoff can be made to improve query performance and avoid full scans. + +Use of Secondary Indexes- Determining the performance benefits of adding a secondary index can be challenging. Fortunately, the Explain System offers valuable insights into DefraDB's internal processing and Plan Graph, helping to identify the impact. Most importantly, developers can run a simple Explain request and obtain these insights without actually executing the request or building the index, as it only operates on the plan graph. + +Improved transparency- Submitting an explain request informs developers whether a full table scan or an index scan will be conducted, and which other elements will be involved in the process. This information enables developers to understand the steps required to execute their queries and create more efficient ones. + +Query Optimization- For example, it is more efficient to query from primary to secondary than from secondary to primary. The Explain System can also accurately demonstrate the inefficiency of certain queries, such as a simple point lookup compared to an efficient join index. Overall, the Explain System helps developers gain insight into the inner workings of the database and queries, allowing for greater introspection and understanding. + +## How it works + +When you send a request to the database, it can either execute the request or explain it. By default, the database will execute the request as expected. This will compile the request, construct a plan, and evaluate the nodes of the plan to render the results. + +Conversely, an Explain will compile the request, construct a plan, and finally walk the plan graph, collecting node attributes and execution metrics. The goal is to gather details about each part of the plan and show this information to the developer in a clear and organized way. + +Having the plan arranged as parts in a graph is helpful because it's both fast to process and simple to understand. When a request is changed into an Explain request, it creates an organized view of the plan graph that developers can make sense of. Some smaller details might be left out, but the main points and important features give a clear link between the internal and external views of the graph. By gathering the structure and features of the plan graph, developers can learn the steps needed to run their requests and make them work better and faster. + +## Types of Explain Requests + +### Simple Explain + +Simple Explain Requests is the default mode for explanation, only requiring the additional `@explain` directive. You can also be explicit and provide a type argument to the directive like this `@explain(type: simple)`. + +This mode of explanation returns only the syntactic and structural information of the Plan Graph, its nodes, and their attributes. + +The following example shows a Simple Explain request applies to an `Author` query request. + +```graphql +query @explain { + Author { + name + age + } +} +``` + +```json +// Response +{ + "explain": { + "select TopNode": { + "selectNode": { + "filter": null, + "scanNode": { + "filter":null, + "collectionID": "3", + "collectionName": "Author", + "spans": [{ + "start": "/3", + "end": "/4" + }] + } + } + } + } +} +``` + +With the corresponding Plan Graph: + +Simple Explain requests are extremely fast, since it does not actually execute the constructed Plan Graph. It is intended to give transparency back to the developer, and to understand the structure and operations of how the database would resolve their request. + +### Execute Explain + +Execute explanation differs from Simple mode because it actually executes the constructed plan graph from the request. However, it doesn't return the results, but instead collects various metrics and runtime information about how the request was executed, and returns it using using the same rendered plan graph structure that the Simple Explain does. This is similar to EXPLAIN ANALYZE from PostgreSQL or MySQL + +You can create an Execute Explain by specifying the explain type using the directive type​arguments @explain(type: execute). + +The following example shows a Execute Explain request applies to an author query request. + +```graphql +query @explain(type: execute) { + Author { + name + age + } +} +``` + +```json +// Response +[ + { + "explain": { + "executionSuccess": true, + "sizeOfResult": 1, + "planExecutions": 2, + "selectTopNode": { + "selectNode": { + "iterations": 2, + "filterMatches": 1, + "scanNode": { + "iterations": 2, + "docFetches": 2, + "filterMatches": 1 + } + } + } + } + } +] +``` + +Because Execute Explain actually executes the plan, it will of course take more time to complete and return results than the Simple Explain. It will actually take slightly longer to execute than the non-explain counterpart, as it has the overhead of measuring and collecting information. + +## Limitations + +One disadvantage of the Explain System is that it violates the formal specification of the GraphQL API. This means that certain guarantees, such as the symmetry between the structure of the request and result, is not maintained. + +For example, if a request is sent to a user collection, the GraphQL Schema specifies that it will return an array of users. However, if the explain directive is added, the structure of the result will not match the schema specified and will instead be the plan graph representation. While this violation is considered acceptable in order to improve the developer experience, it is important to be aware of this limitation. + +## Next Steps + +A future feature called Prediction Explain aims to provide a balance between speed and information. These requests do not execute the plan graph, but instead make educated guesses about the potential impact of the query based on attributes and metrics. Prediction Explain Requests take longer than the Simple Explain System, but not as long as Execution Explain Requests. + +The Explain System is being developed with additional tooling in mind. Currently, it returns a structured JSON object that represents the plan graph. In the future, the aim is for the tool to provide different representations of the Plan Graph, including a text output that is more easily readable by humans and a visual graph that displays the top-down structure of the graph. In addition to the Simple and Execution Explain Requests that the Explain System currently supports or will support in the future, the team is also working on serializing and representing the returned object in various ways. This will provide developers with more options for understanding and analyzing the database and queries. diff --git a/defradb_versioned_docs/version-0.19.0/guides/merkle-crdt.md b/defradb_versioned_docs/version-0.19.0/guides/merkle-crdt.md new file mode 100644 index 0000000..a4c20ea --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/guides/merkle-crdt.md @@ -0,0 +1,61 @@ +--- +sidebar_label: Merkle CRDT Guide +sidebar_position: 30 +--- +# A Guide to Merkle CRDTs in DefraDB + +## Overview + +Merkle CRDTs are a type of Conflict-free Replicated Data Type (CRDT). They are designed to support independent updates across multiple peers and to merge those updates automatically without conflicts. The goal is to achieve deterministic, automatic data synchronization while maintaining consistency. [CRDTs](https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type) were first formalized in 2011 and have become an important tool in distributed computing. This approach is particularly useful in distributed applications where data must be updated and merged consistently across many actors, such as peer-to-peer networks or offline-first systems. + +## Concepts + +### Regular CRDTs + +Conflict-free Replicated Data Types (CRDTs) allow peers to collaborate and update data structures without explicit synchronization. They can be applied to registers, counters, sets, lists, maps, and much more. + +The key feature of CRDTs is deterministic merging. In other words, they always merge updates in a predictable way. No matter the order in which updates arrive, all peers eventually agree on the same final state. To make this possible, CRDTs keep track of when events happen, often using logical or vector clocks. These clocks store metadata for each peer, but this becomes inefficient when the number of peers is very large or constantly changing. + +### Limitations with Ordering + +In distributed systems, it is difficult to know the exact order of events across different machines. System clocks may not match, or they can even be manipulated, which leads to inconsistencies. + +Merkle CRDTs solve this by building causality directly into the structure of a Merkle Directed Acyclic Graph (Merkle DAG). This removes the need to maintain separate metadata for every peer, making the system more scalable. + +## Formalization of Merkle CRDTs + +A Merkle CRDT is built by combining a Merkle clock with a standard CRDT. The Merkle DAG ensures causality through its structure: every node includes the hash of its parent, so a new node cannot exist without its predecessor. This creates a verifiable, tamper-resistant chain of updates. + +Merkle CRDT includes: + +- **Merkle clock** – provides causality and ordering of events. +- **Embedded CRDT** – manages the type of data structure and the rules for merging updates. + +### Merkle Clock + +A Merkle clock uses the properties of Merkle DAGs, similar to blockchains. Each new node contains the identifier of its parent, creating a cryptographically verifiable chain of events that cannot be altered without detection. + +Each node also records a height value, which acts like a counter. This makes it easier to tell whether one event happened before, after, or at the same time as another. + +With these properties, a Merkle clock ensures that causality is always preserved and that the history of updates cannot be forged or tampered with. + +## Delta State Semantics + +There are two main ways to represent changes in CRDTs: operation-based and state-based. + +- **Operation-based CRDTs** send the intent of an action as the message. For example, “set the value to 10” or “increment the counter by 4.” These messages are usually small because they only contain the operation being performed. +- **State-based CRDTs** send the full resulting state as the message. For example, to set a value to 10, the message would contain the value 10 as the content. These messages are larger because they include both the current state and the change. + +Both approaches work, but each has trade-offs. Operation-based CRDTs are compact but depend on reliable delivery of every operation. State-based CRDTs are easier to reason about but become inefficient as the state grows. + +**Delta State CRDTs** combine the strengths of both. Instead of sending either the full operation or the full state, they only send the minimum change needed to move from one state to another. This small change is called a delta. + +For example, if there is a set of nine fruit names and you add “banana,” the delta message contains only the word “banana.” It does not resend the entire set of ten fruits. In this way, the message is as small as an operation-based CRDT but still captures the actual difference in state, like a state-based CRDT. + +This hybrid model is efficient and expressive, making it a practical choice for distributed systems where both bandwidth and consistency are important. + +## Branching and Merging + +Merkle CRDTs naturally support branching. When two peers update the same ancestor independently, their updates form separate branches. Each peer treats its branch as the main state, without requiring immediate resolution. This makes the system ideal for offline-first applications. + +Merging occurs when branches are brought back together. A merge node is created with multiple parents, and the embedded CRDT defines how to resolve differences between the branches. The Merkle clock ensures that the process respects causality, while the CRDT ensures that the merged state is valid and consistent. diff --git a/defradb_versioned_docs/version-0.19.0/guides/peer-to-peer.md b/defradb_versioned_docs/version-0.19.0/guides/peer-to-peer.md new file mode 100644 index 0000000..09de3c7 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/guides/peer-to-peer.md @@ -0,0 +1,144 @@ +--- +sidebar_label: Peer-to-Peer Guide +sidebar_position: 10 +--- +# A Guide to Peer-to-Peer Networking in DefraDB + +## Overview + +P2P networking is a way for devices to communicate and share data directly with each other without the need for a central server. In a P2P network, all devices, also known as peers, are equal and can both send and receive data. DefraDB is a database that uses P2P networking instead of the traditional client-server model. + +One advantage of this is that it allows for the development of offline-first or local-first applications. These are apps that can still work even when there is no internet connection and can sync data between multiple devices without the need for a central server to facilitate the synchronization. This makes it possible for a peer-to-peer network and database like DefraDB to function in a trustless environment, where no one device is more important or trustworthy than any other. This aligns with the goals of a decentralized, private, and user-centric database. + +P2P networking is the primary method of communication used in DefraDB, a decentralized database. The libp2p library was developed specifically for this purpose and forms the technological foundation of the database. In DefraDB, documents are replicated and combined into an update graph, similar to a version control client like Git or a hash chain or a hash graph. P2P networking allows nodes in DefraDB to communicate directly with each other, without the need for an intermediate node, making it easier to synchronize the updates within the update graph of a document. + +Libp2p is a decentralized network framework that enables the development of P2P applications. It consists of a set of protocols, specifications, and libraries created by Protocol Labs for the IPFS project. As the network layer for IPFS, libp2p provides various features for P2P communication such as transport, security, peer routing, and content discovery. + +Libp2p is modular, meaning it can be customized and integrated into different P2P projects and applications. It is designed to work with the IPLD (Inter Planetary Linked Data) data model, which is a suite of technologies for representing and navigating hash-linked data. IPLD allows for the unification of all data models that link data with hashes as instances of IPLD, making it a suitable choice for use with libp2p in P2P networking. + +## Documents and Collections + +The high-level distinction between a document is as follows: + +* A document is a single record that contains multiple fields. These documents are bound by schema. For example, each row in an SQL table has multiple individual columns. These rows are analogous to documents with multiple individual fields. + +* A collection refers to a collection of documents under a single schema. For example, a table from an SQL database comprising of rows and columns is analogous to collections. + +## Need for P2P Networking in DefraDB + +The DefraDB database requires peer-to-peer (P2P) networking to facilitate data synchronization between nodes. This is necessary because DefraDB can store documents and individual IPLD blocks on various nodes around the world, which may be used by a single application or multiple applications. P2P networking allows local instances of DefraDB, whether on a single device or in a web browser, to replicate information with other devices owned by the user or with trusted third parties. These third parties may serve as historical archival nodes or may be other users with whom the user is collaborating. For example, if a collaborative document powered by DefraDB is being shared with others, it should be transmitted over a P2P network to avoid the need for a trusted intermediary node. DefraDB offers two types of replication over the P2P network: + +* Passive replication + +* Active replication + +## How it works + +There are two, concrete types of data replication within DefraDB, i.e., active, and passive replication. Both these replication types serve different use cases and are implemented using different mechanics. + +### Passive Replication + +In DefraDB, passive replication is a type of data replication in which updates are automatically broadcast to the network and its peers without explicit coordination. This occurs over a global publish-subscrib network (PubSub), which is a way to broadcast updates on a specific topic and receive updates on that topic. + +This is called passive replication because it is similar to a "fire and forget" scenario. Passive replication is enabled for all nodes by default and all nodes will always publish to the larger PubSub network. Passive replication can be compared to the connectionless protocol UDP, while active replication can be compared to the connection-oriented protocol TCP. + +### Active Replication + +In active replication, data is replicated between nodes in a direct, point-to-point manner. This means that a specific node is chosen to constantly receive updates from the local node. In contrast, passive replication uses the Gossip protocol, which is a peer-to-peer communication mechanism in which nodes exchange state information about themselves and other nodes they know about. In the Gossip protocol, each node initiates a gossip round every second to exchange information with another random node, and the process is repeated until the whole system is synchronized. One difference between active and passive replication is that the Gossip protocol is a multi-hop protocol, meaning that there may be multiple connections between nodes in the network. Active replication, on the other hand, creates a direct connection between two nodes and ensures that updates are actively pushed to the other node, which then acknowledges receipt of the update to establish two-way communication. + +Passive replication is a good choice for situations where you want your peers to be able to follow your updates without requiring much coordination from you. It is often used in collaborative environments where multiple people are working on a document and want to ensure that both peers are in sync with each other. On the other hand, active replication is better for situations where you have a specific peer you are collaborating with and want to ensure that all of your data is being replicated to an archival node. This is because active replication involves a direct, point-to-point connection between the two nodes, allowing for more efficient and reliable data replication. + +## Implementation of Peer-to-Peer Networking in DefraDB + +In the DefraDB software architecture, a PubSub system is used for peer-to-peer networking. In this system, publishers send messages without specifying specific receivers, and subscribers express interest in certain types of messages without knowing which publishers they come from. This allows for a more dynamic network topology and better scalability. In the DefraDB PubSub network, nodes can publish or subscribe to specific topics. When a node publishes a message in passive replication, it is broadcasted to all nodes in the network. These nodes then coordinate with each other, re-broadcast the message, and use a process called "gossiping" to spread the published information through multiple connections, or "hops." This is known as the Gossip protocol. + +In passive replication, updates are broadcasted on a per-document level over the global PubSub network. Each document has its own topic, and nodes can subscribe to the topic corresponding to a specific document to receive updates passively. This is useful in environments where certain documents are in high demand or are being frequently updated, as the connections to these "hot documents" can be kept open to ensure they are kept up-to-date. However, if a document has not been accessed in a while, it is less important for it to be constantly updated and it is easy to resync these "cold documents" by submitting a query for the relevant updates. Passive replication and the PubSub system are therefore focused on individual documents. + +One major difference between active and passive networks is that an active network can focus on both collections and individual documents, while a passive network is only focused on individual documents. Active networks operate over a direct, point-to-point connection and allow you to select an entire collection to replicate to another node. For example, if you have a collection of books and specify a target node for active replication, the entire collection will be replicated to that node, including any updates to individual books. However, it is also possible to replicate granularly by selecting specific books within the collection for replication. Passive networks, on the other hand, are only concerned with replicating individual documents. + + +## Concrete Features of P2P in DefraDB + +### Passive Replication Features + +The Defra Command Line Interface (CLI) allows you to modify the behavior of the peer-to-peer data network. When a DefraDB node starts up, it is assigned a libp2p host by default. + +```bash +$ defradb start +... +Jan 2 10:15:49.124 INF cli Starting DefraDB +Jan 2 10:15:49.161 INF net Created LibP2P host PeerId=12D3KooWEFCQ1iGMobsmNTPXb758kJkFc7XieQyGKpsuMxeDktz4 Address=[/ip4/127.0.0.1/tcp/9171] +Jan 2 10:15:49.162 INF net Starting internal broadcaster for pubsub network +Jan 2 10:15:49.163 INF node Providing HTTP API at http://127.0.0.1:9181 PlaygroundEnabled=false +Jan 2 10:15:49.163 INF node Providing GraphQL endpoint at http://127.0.0.1:9181/api/v0/graphql +``` + +This host has a Peer ID, which is a function of a secret private key generated when the node is started for the first time. The Peer ID is important to know as it may be relevant for different parts of the peer-to-peer networking system. The libp2p networking stack can be enabled or disabled. + +```bash +$ defradb start --no-p2p +``` + +The passive networking system can also be enabled or disabled. By default, if the P2P network is online, the passive networking system is turned on. + +```bash +$ defradb start --peers /ip4/0.0.0.0/tcp/9171/p2p/ +``` + +A node automatically listens on multiple addresses or ports when the P2P module is instantiated. These are referred to as the peer-to-peer address, which is expressed as a multi-address. A multi-address is a string that represents a network address and includes information about the transport protocol and addresses for multiple layers of the network stack. + + +```bash +/ip4/0.0.0.0/tcp/9171/p2p/ + +scheme/ip_address/protocol/port/protocol/peer_id +``` +The peer listens in on the p2p port 9171​ by default, which can be customized through the CLI or the configuration file. + +```bash +$ defradb start --p2paddr /ip4/0.0.0.0/tcp/9172 +``` + +The peer-to-peer address is the first of the addresses that the peer listens in on. + +At the start of a node, flags can be specified to enable, disable, or switch the host that the peer is listening on. When a new node is started, every existing or new document goes through an LRU (Least Recently Used) cache to identify the most important, relevant, or frequently used documents over a specific period of time. Then, by default, the passive replication system automatically subscribes to and creates the corresponding document topics on the PubSub network. + +When a node is started, it specifies a list of peers that it wants to stay connected to. The peer-to-peer node is self-organizing, meaning that if a node joins a new topic, it asks the larger network for other peers that are sharing information on that topic. This ensures that the node is always connected to some relevant nodes. A node also tries to find other relevant nodes, particularly when an individual topic is joined, subscribed to, or published. + +### Active Replication Features + +To use the active replication feature in DefraDB, you can submit an add replicator Remote Procedure Call (RPC) command through the client API. You will need to specify the multi-address and Peer ID of the peer that you want to include in the replicator set, as well as the name of the collection that you want to replicate to that peer. These steps handle the process of defining which peers you want to connect to, enabling or disabling the underlying subsystems, and sending additional RPC commands to add any necessary replicators. + +```bash +$ defradb client p2p replicator set -c Books +``` + +## Benefits of the P2P System + +One of the main benefits of the peer-to-peer (P2P) system is its robustness and ability to work even in the event of network failures. This allows developers to create local-first, offline-first applications. If a developer's node loses its internet connection, the P2P system will continue making changes and queue up updates. When the system is back online and reconnects to the network, it will automatically resolve the updates and resume publishing or replicating to the nodes specified by the developer. This means that the developer can rely on a trustless mechanism and does not need to rely on a central, trusted peer for data replication or repositories to save data. Instead, data is directly passed from the developer's node to any other collaborating node. This global P2P network allows developers to collaborate with anyone across the internet with no fundamental limitations. Additionally, since the P2P system is built on top of libp2p, developers have access to other useful features as well. These factors make it highly advantageous to work with a P2P network, especially from a local-first perspective. + +In DefraDB, the peer-to-peer system has several benefits. It is easy to connect to a server in a data center because each server has its own individual IP address. However, in a home network, there is a single IP for the modem and multiple devices connected to it are protected by a NAT firewall, making it difficult for other nodes to connect directly. The libp2p framework offers two solutions to this problem: + +Circuit Relays - This allow you to specify a third-party node that acts as an intermediary to resolve the NAT firewall issue. This works when you connect to the firewall/circuit relay node, which is a publicly accessible node, and another node connects to it as well. The third-party node acts as a conduit in this situation. This process requires trust in the third-party node to properly relay information, but it operates over encrypted transport layers, so the third-party node cannot use man-in-the-middle attacks to listen in on the data exchange. However, it does require the third-party node to be online and accessible. + +NAT Hole Punching - This is a technique that allows nodes to connect directly to a device behind a NAT firewall. This ensures that a user can directly connect with another node and vice versa, without the need for a trusted intermediary within the peer-to-peer network. + +## Current Limitations and Future Outlook + +Here are some of the limitations of the P2P system: + +One limitation of the peer-to-peer system is the potential scalability issue with having every document have its own independent topic. This can lead to overhead if a user has thousands or tens of thousands of documents in their node, or if an application developer has hundreds of thousands or millions of documents in their node. To address this issue, the team is exploring ways to create aggregate topics that can be scoped to subnets. These subnets can be group-specific or application-specific. Multiple hops are required between subnets. This means that if a user wants to synchronize and broadcast updates from their subnet to another subnet, they have to go from their subnet to the global net and back to the other subnet. The team is exploring ways to navigate this limitation through multi-hop mechanisms. + +In a peer-to-peer network, when a user broadcasts an update, it is sent to other nodes on the network. However, if a node is offline or experiences some other issue, it may miss some updates. In DefraDB's passive replication mode, the most recent update is broadcasted through the network using a Merkle DAG (directed acyclic graph). The broadcasting node does not verify that the receiving node has received all previous updates, so it is the responsibility of the receiving node to ensure it has received all necessary updates. If a node misses a couple of updates and then receives a new update, it must synchronize all previous updates before considering the document up to date. This is because the internal data model of the document is based on all changes made over time, not just the most recent change. When broadcasting the most recent update, it is sent over the peer-to-peer PubSub network. However, if a node needs to go back in time through the Merkle DAG to get updates from previous broadcasts, it uses a different system called the Distributed Hash Table (DHT). + +The scalability of Bitswap and the Distributed Hash Table (DHT) have been identified as limitations in the peer-to-peer (P2P) system. To address these issues, we are exploring the use of two new protocols.: + +PubSub based query system - This that allows users to query and receive updates through the global PubSub network using query topics that are independent of document topics. + +Graph Sync - This is a protocol developed by Protocol Labs, which has the potential to resolve issues with the Bitswap algorithm and DHT. These two approaches show promise in improving the scalability of the P2P system. + +There are currently some limitations with the peer-to-peer system being used. One issue is that replicators, which are added to a node, do not persist through updates or restarts. This means that the user must re-add the replicators every time the node is restarted. However, this issue will be resolved in the next version of the system. + +Currently, when a replicator is added to a node, it doesn't persist between node updates or node restarts. This means that every time there is a restart, the user must re-add these replicators. This is a minor oversight that the Source team plans to fix in a future release. In the meantime, they are also wWorking on a new protocol called Head Exchange to address issues with syncing the Merkel DAG when updates have been missed or concurrent, diverged updates have been made. The Head Exchange protocol aims to efficiently establish the most recent update seen by each node, determine if there are any divergent updates, and figure out the most efficient way to synchronize the nodes with the least amount of communication. + +One issue with peer-to-peer local-first development is that it can be difficult for nodes to connect with each other when they are running on devices within the same home Wi-Fi network. This is due to a NAT firewall, which is a router that operates to protect private networks. A NAT firewall only allows internet traffic to pass through if it was requested by a device on the private network. It protects the identity of a network by not exposing internal IP addresses to the internet. This can make it difficult for other nodes to connect directly to a node running behind a NAT firewall. diff --git a/defradb_versioned_docs/version-0.19.0/guides/schema-migration.md b/defradb_versioned_docs/version-0.19.0/guides/schema-migration.md new file mode 100644 index 0000000..6df51f6 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/guides/schema-migration.md @@ -0,0 +1,286 @@ +--- +sidebar_label: Schema Migration Guide +sidebar_position: 90 +--- +# A Guide to Schema Migration in DefraDB + +## Overview +In a database system, an application’s requirements can change at any given time, to meet this change, Schema migrations are necessary. This is where Lens comes in, as a migration engine that produces effective schema migration. + +This guide will provide an understanding of schema migrations, focusing on the Lens migration engine. Let’s dive in! + +Lens is a pipeline for user-defined transformations. It enables users to write their transformations in any programming language and run them through the Lens pipeline, which transforms the cached representation of the data. + +## Goals of the Lens Migration System + +Here are some of the goals of the Lens schema migration system: + +- **Presenting a consistent view of data across nodes**: The Lens schema migration system can present data across nodes consistently, regardless of the schema version being used. + +- **Verifiability of data**: Schema migration in the Lens migration system is presented as data, this preserves the user-defined mutations without corrupting system-defined mutations and also allows migrating from one schema version to another. + +- **A language-agnostic way of writing schema migrations**: Schema migrations can be written in any programming language and executed properly as Lens is language-agnostic. + +- **Safe usage of migrations by others through a sandbox**: Migrations written in Lens are run in a sandbox, which ensures safety and eliminates the concern for remote code executions (RCE). + +- **Peer-to-peer sync of schema migrations**: Lens allows peers to write their migrations in different application versions and sync without worrying about the versions other peers are using. + +- **Local autonomy of schema migrations**: Lens enables local autonomy in writing schema migrations by giving users control of the schema version they choose to use. The users can stay in a particular schema version and still communicate with peers on different versions, as Lens is not restricted to a particular schema version. + +- **Reproducibility and deterministic nature of executing migrations**: When using the Lens migration system, changes to schemas can be written, tagged and shared with other peers regardless of their infrastructure and requirements for deployments. + + +## Mechanism + +In this section, we’ll look at the mechanism behind the Lens migration system and explain how it works. + +Lens migration system functions as a bi-directional transformation engine, enabling the migration of data documents in both forward and reverse directions. It allows for the transformation of documents from schema X to Y in the forward direction and Y to X in the reverse direction. + +The above process is done foundationally, through a verifiable system powered by WebAssembly (Wasm). Wasm also enables the sandbox safety and language-agnostic feature of Lens. + +Internally, schema migrations are evaluated lazily. This avoids the upfront cost of doing a massive migration at once. + +*Lazy evaluation is a technique in programming where an expression is only evaluated when its value is needed.* + +Adopting lazy evaluation in the migration system also allows rapid toggling between schema versions and representations. + +## Usage + +The Lens migration system addresses critical use cases related to schema migrations in peer-to-peer, eventually consistent databases. These use cases include: + +  + +- **Safe Schema Progression**: Ensuring the seamless progression of database schemas is vital for accommodating changing application requirements. Lens facilitates the modification, upgrade, or reversion of schemas while upholding data integrity. + +- **Handling Peer-to-Peer Complexity**: In environments where different clients operate on varying application and database versions, Lens offers a solution to address the complexity of schema migrations. It ensures coherence and effectiveness across different networks. + +- **Language-Agnostic Flexibility**: Functions in Lens are designed to be language-agnostic, offering the versatility to define schema changes in the preferred programming language. This adaptability makes Lens suitable for diverse development environments and preferences. + +- **Lazy Evaluation**: Lens employs a lazy evaluation mechanism, initiating migrations without immediate execution. Schema changes are applied only when documents are read, queried, or updated. This approach reduces the upfront cost of extensive schema migrations while maintaining data consistency. + +- **On-Demand Schema Selection**: Lens supports on-demand schema selection during data queries. Users can specify the schema version they wish to work with, facilitating A/B testing and the seamless transition between different schema versions. + + + +These use cases highlight how Lens empowers users to manage schema migrations effectively, ensuring data consistency and adaptability in evolving database systems. + + +## Example + +In this example we will define a collection using a schema with an `emailAddress` field. We will then patch the schema to add a new field `email`, then define a bi-directional Lens to migrate data to/from the new field. + +**Step One**, define the `Users` collection/schema: + +```graphql +defradb client schema add ' + type Users { + emailAddress: String + } +' +``` + +**Step Two**, patch the `Users` schema, adding the new field, here we pass in `--set-active=true` to automatically apply the schema change to the `Users` collection: + +```graphql +defradb client schema patch ' + [ + { "op": "add", "path": "/Users/Fields/-", "value": {"Name": "email", "Kind": "String"} } + ] +' --set-active=true +``` + +**Step Three**, fetch the schema ids so that we can later tell Defra which schema versions we wish to migrate to/from: + +```graphql +defradb client schema describe --name="Users" +``` + +**Step Four**, in order to define our Lens module - we need to define 4 functions: + +- `next() unsignedInteger8`, this is a host function imported to the module - calling it will return a pointer to a byte array that will either contain + an error, an EndOfStream identifier (indicating that there are no more source values), or a pointer to the start of a json byte array containing the Defra document to migrate. It is typically called from within the `transform` and `inverse` functions, and can be called multiple times within them if desired. + + - `alloc(size: unsignedInteger64) unsignedInteger8`​, this is required by all lens modules regardless of language or content - this function should allocate a block of memory of the given `size` , it is used by the Lens engine to pass stuff in to the wasm instance. The memory needs to remain reserved until the next wasm call, e.g. until `transform` or `set_param` has been called. It's implementation will be different depending on which language you are working with, but it should not need to differ between modules of the same language. The Rust SDK contains an alloc function that you can call. + +- `set_param(ptr: unsignedInteger8) unsignedInteger8`​, this function is only required by modules that accept a set of parameters. As an input parameter it receives a single pointer that will point to the start of a json byte array containing the parameters defined in the configuration file. It returns a pointer to either nil, or an error message. It will be called once, when the the migration is defined in Defra (and on restart of the database). How it is implemented is up to you. + +- `transform() unsignedInteger8`​, this function is required by all Lens modules - it is the migration, and within this function you should define what the migration should do, in this example it will copy the data from the `emailAddress` field into the `email` field. Lens Modules can call the `next` function zero to many times to draw documents from the Defra datastore, however modules used in schema migrations should currently limit this to a single call per `transform` call (Lens based views may call it more or less frequently in order to filter or create documents). + +- `inverse() unsignedInteger8`​, this function is optional, you only need to define it if you wish to define the inverse migration. It follows the same pattern as the `transform` function, only you should implement it to do the reverse. In this example we want this to copy the value from the `email` field into the `emailAddress`​ field. + +Here is what our migration would look like if we were to write it in Rust: + +```graphql +#[link(wasm_import_module = "lens")] +extern "C" { + fn next() -> *mut u8; +} + +#[derive(Deserialize, Clone)] +pub struct Parameters { + pub src: String, + pub dst: String, +} + +static PARAMETERS: RwLock> = RwLock::new(None); + +#[no_mangle] +pub extern fn alloc(size: usize) -> *mut u8 { + lens_sdk::alloc(size) +} + +#[no_mangle] +pub extern fn set_param(ptr: *mut u8) -> *mut u8 { + match try_set_param(ptr) { + Ok(_) => lens_sdk::nil_ptr(), + Err(e) => lens_sdk::to_mem(lens_sdk::ERROR_TYPE_ID, &e.to_string().as_bytes()) + } +} + +fn try_set_param(ptr: *mut u8) -> Result<(), Box> { + let parameter = lens_sdk::try_from_mem::(ptr)?; + + let mut dst = PARAMETERS.write()?; + *dst = Some(parameter); + Ok(()) +} + +#[no_mangle] +pub extern fn transform() -> *mut u8 { + match try_transform() { + Ok(o) => match o { + Some(result_json) => lens_sdk::to_mem(lens_sdk::JSON_TYPE_ID, &result_json), + None => lens_sdk::nil_ptr(), + EndOfStream => lens_sdk::to_mem(lens_sdk::EOS_TYPE_ID, &[]), + }, + Err(e) => lens_sdk::to_mem(lens_sdk::ERROR_TYPE_ID, &e.to_string().as_bytes()) + } +} + +fn try_transform() -> Result>, Box> { + let ptr = unsafe { next() }; + let mut input = match lens_sdk::try_from_mem::>(ptr)? { + Some(v) => v, + // Implementations of `transform` are free to handle nil however they like. In this + // implementation we chose to return nil given a nil input. + None => return Ok(None), + EndOfStream => return Ok(EndOfStream) + }; + + let params = PARAMETERS.read()?; + + let value = input.get_mut(¶ms.src) + .ok_or(ModuleError::PropertyNotFoundError{requested: params.src.clone()})? + .clone(); + + let mut result = input.clone(); + result.insert(params.dst, value); + + let result_json = serde_json::to_vec(&result)?; + lens_sdk::free_transport_buffer(ptr)?; + Ok(Some(result_json)) +} + +#[no_mangle] +pub extern fn inverse() -> *mut u8 { + match try_inverse() { + Ok(o) => match o { + Some(result_json) => lens_sdk::to_mem(lens_sdk::JSON_TYPE_ID, &result_json), + None => lens_sdk::nil_ptr(), + EndOfStream => lens_sdk::to_mem(lens_sdk::EOS_TYPE_ID, &[]), + }, + Err(e) => lens_sdk::to_mem(lens_sdk::ERROR_TYPE_ID, &e.to_string().as_bytes()) + } +} + +fn try_inverse() -> Result>, Box> { + let ptr = unsafe { next() }; + let mut input = match lens_sdk::try_from_mem::>(ptr)? { + Some(v) => v, + // Implementations of `transform` are free to handle nil however they like. In this + // implementation we chose to return nil given a nil input. + None => return Ok(None), + EndOfStream => return Ok(EndOfStream) + }; + + let params = PARAMETERS.read()?; + + // Note: In this example `inverse` is exactly the same as `transform`, only the useage + // of `params.dst` and `params.src` is reversed. + let value = input.get_mut(¶ms.dst)?; + + let mut result = input.clone(); + result.insert(params.src, value); + + let result_json = serde_json::to_vec(&result)?; + lens_sdk::free_transport_buffer(ptr)?; + Ok(Some(result_json)) +} +``` + + + + +More fully coded example modules, including an AssemblyScript example can be found in our integration tests here: https://github.com/sourcenetwork/defradb/tree/develop/tests/lenses + +and here: https://github.com/lens-vm/lens/tree/main/tests/modules + +We should then compile it to wasm, and copy the resultant `.wasm` file to a location that the Defra node has access to. Make sure that the file is safe there, at the moment Defra will not copy it and will refer back to that location on database restart. + +**Step Five**, now that we have updated the collection, and defined our migration, we need to tell Defra to use it, by providing it the source and destination schema IDs from our earlier `defradb client schema describe`​ call, and a configuration file defining the parameters we wish to pass it: + +```graphql +defradb client schema migration set ' + { + "lenses": [ + { + "path": , + "arguments": { + "src": "emailAddress", + "dst": "email" + } + } + ] + } +' +``` + + +Now the migration has been configured! Any documents committed under the original schema version will now be returned as if they were committed using the newer schema version. + +As we have defined an inverse migration, we can give this migration to other nodes in our peer network still on the original schema version, and they will be able to query our documents committed using the new schema version applying the inverse. + +We can also change our active schema version on this node back to the original to see the inverse in action: + +```graphql +defradb client schema set-active +``` + +Now when we query Defra, any documents committed after the schema update will be rendered as if they were committed on the original schema version, with `email` field values being copied to the `emailAddress` field at query time. + +## Advantages  + +Here are some advantages of Lens as a schema migration system: + +- Lens is not bound to a particular deployment, programming language, or interaction method. It can be used globally and is accessible to clients regardless of their location or infrastructure. +- Users can query on-demand even with different schema versions. +- Migration between different schemas is a seamless process. + +## Disadvantages + +The Lens migration system also has some downsides to schema migration which include: + +- Using a Lazy execution approach, errors might be found later when querying through the migration. +- There’s a time constraint as the Lens migration system is a work in progress +- The performance of the system is secondary, with more focus on overall functionality. + +## Future Outlook + +The core problem we currently have in the Lens schema migration system is the performance issues when migrating schemas, hence for future versions, the following would be considered: + +- Increasing the performance of the migration system. +- Making migrations easier to write. +- Expansion of the schema update system to include the removal of fields, not just adding fields. +- Enabling users to query the schema version of their choice on-demand. +- Support for Eager evaluation. +- Implementing dry run testing for development and branching scenarios, and handling divergent schemas. \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/guides/schema-relationship.md b/defradb_versioned_docs/version-0.19.0/guides/schema-relationship.md new file mode 100644 index 0000000..59745b6 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/guides/schema-relationship.md @@ -0,0 +1,356 @@ +--- +sidebar_label: Schema Relationship Guide +sidebar_position: 50 +--- +# A Guide to Schema Relationship in DefraDB + +## Overview +Schema systems allow developers to enforce a structure on a given object type or database, which might be represented as rows in a SQL-based database or documents in a no SQL-based database. This enables developers to understand the structure of these objects so they can have type safety, structure safety, or the ability to enforce certain invariance or priorities syntactically or semantically. + +A developer can easily enforce two separate local schema types for two objects. However, many variables need to be properly handled when it comes to the mechanism of cross-schema relationships. For example, when creating relationships between instances of documents, the developer has to design these relationships in advance with certain considerations. + +Different types of relationships exist between documents and schemas. It is generally categorized based on the number of types as follows: + +One-to-One Relationship: One document has a single reference to another document of a different type and vice versa. + +One-to-Many/Many-to-One Relationship: One document can be referenced by many documents. For example, an author has many books and each of these books refer to one author. + +Many-to-Many Relationship: Many-to-many allows developers to correlate a set of schema objects on one side to a whole set of schema objects on the other side. For example, a defined set of genres has a series of books. An intermediary relationship is created such that many correlated books have various genres. Conversely, various genres have many correlated books. Note: Many-to-many relationship is currently not supported by DefraDB, but it can be implemented through other techniques. + +The developer will design and structure these relationships within the actual data of the database. Conversely, with managed relationships, the database assumes some of the responsibility of designing and maintaining the data. It depends on how the developer designs the primary and foreign keys, and how they correlate from the respective relationship model. + +## How It Works + +DefraDB supports managed relationships but not unmanaged relationships, i.e., the database is responsible for accurately correlating and associating documents to their respective relationship types, primary keys, and foreign keys. The developer will be explicit about the kind of correlation they are choosing, i.e., one-to-one, one-to-many, or many-to-many; but does not have to be explicit in defining their schemas. However, the developer is not responsible for defining the field that manages the foreign keys, how that relates to the primary keys of the respective types, which side of the document is responsible for maintaining the relationship, etc. This is because the side that holds on to the foreign key is decided based on the type of relationship. In general, when querying over a relationship, the developer will define a join operation (which will allow querying from two separate tables or collections) and find a way to correlate the results into a single set of values. It should be noted that it is more efficient to query from the primary side to the secondary side. + +By default, for unmanaged databases (e.g., SQL model) that has normalized tables and uses a left join, the developer will define which field on which table correlates to which field on another table. This is not the case with managed databases like DefraDB, where a type join is used in place of any other join. Type join systems reduce the complexities when defining the row join or the field join as this is automatically handled by the database. + +Managing relationships for schemas is both easy and powerful in DefraDB. This is why in one-to-one relationships, DefraDB can automatically configure which side is the primary side of the relationship and can define how a developer queries different types. + +However, there are some shortcomings in how Defra handles these relationships. This is because, firstly, documents in Defra are self-describing, and secondly, content identifiers of the documents are used to create the primary keys. Eventually, it becomes a little different when compared to regular databases where a primary key is an auto-incrementing integer or a randomly generated UID. Therefore, because of the operations taking place between the documents and Merkle security, the developer must keep certain causality mechanisms in mind. An example for this is a primary relationship between an "author" and "book", where "author” is the primary side in that system. The developer will either know the doc key of the book before they create the relationship, or they will create a primary key i.e., "author", which will reference "book", and then update that document once they have created the "book" to build the relationship. + +When it comes to a one-to-many relationship, there is no primary side, i.e., the developer has no option of choosing which side is primary or  secondary. In this relationship type, the “many” type is the primary, and the “one” type is the secondary. Therefore, in the example of "author" to "books", if one "author" has many "books”, the book type holds the reference to the foreign key of the author type. This allows DefraDB to keep single fields on the respective type, otherwise "author" will have an array of values, thereby complicating the structure and breaking the normalization mechanism of databases. + +Note: When adding related types, the developer must add both types or all related types at the same time, i.e., define all the types within the Schema Definition Language (SDL), and send them as a single schema add operation, or the database will not understand the correlated types. + +With respect to filtering on related types, for both one-to-one and one-to-many relationships, the developer can filter on parent objects, which have different semantics than filtering on the child objects or the related object. Filtering on the parent object only returns the parent object if the related type matches the filter. However, filtering on the related type returns the parent regardless, but it won't return the related sub-type unless it matches the filter. For example, if we ask for authors that have books in a certain genre, it will only return authors with those sub-values for the books. If we apply a filter to the sub-type, it will return all the authors, but only return the books that match that filter. + +Note: In managed relationships, the developer can also apply filtering on the values of the sub-types. + +Currently, DefraDB does not support many-to-many relationships as it relates to content-identifiable data structures, self-verifying documents, and other variables, making its implementation complicated. An intermediary table, often referred to as the junction table, is used to correlate the primary key of one side of the many to the primary key of the other side of the many. Also, when creating a relationship, there is implicit data created which becomes complicated for the purposes of self-describing, self-authenticated data structures, and privacy-preserving, ownership verification of data. + +Defra also does not support cascading deletes. In cascading deletes, if the developer deletes one side of a relationship, they can define a side effect or a cascade that will affect other documents, rows, or tables. While Defra does not support this feature currently, it may be included in a future version update. + +## Guidelines + +The following pointers provide a concrete guide on how to implement various definitions for the two managed relationship types: one-to-one and one-to-many, as well as the process of creating, updating and querying documents for the respective relationship types. + +### Guidelines for One-to-One Type + +1. Define the Schema and Add Types - Here, an example of two schema types - "user" and "address", where "user" has one "address" and "address" has one "user", thereby establishing a one-to-one relationship between them. The user type contains the name, age, and username, while the address type contains the street name, street number, and country. “user" is specified as the primary side of this relationship because it is more likely that the developer will query from a user to find their address rather than querying from an address to find its respective user. + + Once these schemas are loaded into the database, it will automatically create the necessary foreign keys in the respective types. + +```graphql +type User { + name: String + username: String + age: Int + address: Address @primary +} + +type Address { + streetNumber: String + streetName: String + country: String + user: User +} +``` + +2. Create and Update Mutations - Creating documents in Defra is based on the nature of how these documents need to exist because of their content identifiable structure. The developer has to first create the primary side, then the secondary side, and then update the primary side. + + In the above example, the developer will first create the "user". This is the first mutation. + +```graphql +mutation { + create_Address(input: {streetNumber: "123", streetName: "Test road", country: "Canada"}) { + _key + } +} +``` + +```graphql +mutation { + create_User(input: {name: "Alice", username: "awesomealice", age: 35, address_id: "bae-fd541c25-229e-5280-b44b-e5c2af3e374d"}) { + _key + } +} +``` + +Note: Currently, the developer must create the secondary side of the relation (`Address`) first followed by the primary side with the secondary id (`address_id`) included, but in a future version of Defra, this can be done in either order. + +3. Querying Types - After creating the required documents, the developer has to send a query request from the primary side. Therefore, in the above example, it will ask for the three respective fields of the "user", and it will also have the embedded address type in the selection set. As the developer will query from the "user" into the "address", and as defined above, the "user" is the primary type, this lookup of "user" into "address" will be an efficient lookup that will only require a single point. A single point lookup means that it won't incur a table scan. This is explained in the query below: + +```graphql +query { + User { + name + username + age + Address { + streetNumber + streetName + country + } + } +} + +``` + +```graphql +query { + Address { + streetNumber + streetName + country + User { + name + username + age + } + } +} + +``` + +```graphql +query { + User (filter: {Address: {country: "Canada"}}) { + name + username + age + Address { + streetNumber + streetName + country + } + } +} + +``` + +Going from the secondary into the primary will be a more expensive query operation because it requires a table scan looking for the correlated user for this address. + +Note: Defra supports queries from both sides, regardless of which side is the primary or secondary, i.e., the developer can query in the reverse direction. + +## Guidelines for One-to-Many Type + +1. Define the Schema and Add Types - For the one-to-many relationship, two types are defined, for example, "author" and "book". The author type has a name, a birth date, and authored books. This is going to be a one-to-many relationship into the book type. The book type has a name, a description, a single genre string, and the author to which it is related. So "author" is the one, and the "book" is the many. + + +```graphql +# schema.graphql + +type Author { + name: String + dateOfBirth: DateTime + authoredBooks: [Book] +} + +type Book { + name: String + description: String + genre: String + author: Author +} + +``` + + +```bash +defradb client schema add -f schema.graphql +``` + +2. Create Documents - In this step, first the "one" type from the one-to-many type needs to be created. Therefore, in the above-mentioned example, a blank author type will be created. Once "author" is created, then the related books published by the author will be created. + + Note: Currently Defra only supports creating one type at a time, but the developer can repeat this as many times as required. + +```graphql +mutation { + create_Author(input: {name: "Saadi", dateOfBirth: "1210-07-23T03:46:56.647Z"}) { + _key + } +} +``` + + +```graphql +mutation { + create_Book(input: {name: "Gulistan", genre: "Poetry", author_id: "bae-0e7c3bb5-4917-5d98-9fcf-b9db369ea6e4"}) { + _key + } +} +``` + + +```graphql +mutation { + update_Author(id: "bae-0e7c3bb5-4917-5d98-9fcf-b9db369ea6e4", input: {name: "Saadi Shirazi"}) { + _key + } +} +``` + + +```graphql +mutation { + update_Book(filter: {name: {_eq: "Gulistan"}}, input: {description: "Persian poetry of ideas"}) { + _key + } +} +``` +This demonstrates that the developer should define or correlate the two types "author" and "book" using the same property of querying from the primary type to the secondary type and that in a one-to-many relationship, the "many" side is always the primary. This means that the developer has to store the related ID on the primary side, i.e., the "many" side. So, the "book" in the author-book relationship needs to hold onto the ID of the related type, i.e., the author ID. + +Note: The developer can create as many books they require by using this pattern. + +3. Querying Types - There are two directions in which the developer can run a query, i.e., secondary-to-primary or primary-to-secondary. In the first example, we are sending a query request from the "author", i.e., the secondary. It asks for all the authors in the author collection, their names, their ages, and the other fields that are on the author type, including the related book field. This book field forms the "many" end of the relationship and based on how it is defined under Point 1 above, is an array of book. Hence, it returns multiple values as an array as opposed to returning a single object, as in the case of one-to-one relationships. + + As a result, on querying a related type for a one-to-many, the developer can also sub-filter the related type. In other words, if an author has a certain number of books, we can filter the author by their name but return the books that are part of a particular genre. So, in the author-to-book direction, the developer can filter on two different levels - filter on the top level of the actual author type of the collection or filter on the book level - both having two different implications. This is further explained in the Query Specifications document. + +```graphql +query { + Author { + name + dateOfBirth + authoredBooks { + name + genre + description + } + } +} +``` + + +```json +// Results: +[ + { + "name": "Saadi Shirazi", + "dateOfBirth": "1210-07-23T03:46:56.647Z", + "authoredBooks": [ + { + "name": "Gulistan", + "genre": "Poetry", + "description": "Persian poetry of ideas" + }, + { + "name": "Bustan", + "genre": "Poetry" + } + ] + } +] +``` + +```graphql +query { + Book { + name + genre + Author { + name + dateOfBirth + } + } +} +``` + +```json +// Results: +[ + { + "name": "Gulistan", + "genre": "Poetry", + "Author": { + "name": "Saadi Shirazi", + "dateOfBirth": "1210-07-23T03:46:56.647Z", + } + }, + { + "name": "Bustan", + "genre": "Poetry", + "Author": { + "name": "Saadi Shirazi", + "dateOfBirth": "1210-07-23T03:46:56.647Z", + } + } +] +``` + +```graphql +query { + Author { + name + dateOfBirth + authoredBooks(filter: {name: {_eq: "Gulistan"}}) { + name + genre + } + } +} +``` + +```json +// Results: +[ + { + "name": "Saadi Shirazi", + "dateOfBirth": "1210-07-23T03:46:56.647Z", + "authoredBooks": [ + { + "name": "Gulistan", + "genre": "Poetry" + } + ] + } +] +``` + +```graphql +query { + # Filters on the parent object can reference child fields + # even if they are not requested. + Author(filter: {authoredBooks: {name: {_eq: "Gulistan"}}}) { + name + dateOfBirth + } +} +``` + +```json +// Results: +[ + { + "name": "Saadi Shirazi", + "dateOfBirth": "1210-07-23T03:46:56.647Z" + } +] +``` + +Note: +The book-to-author query is included to demonstrate that the developer can query from both sides of the relationship. + +The various mechanisms, filtering, and rendering properties of one-to-one apply to this section as well. Also, the ability to filter on related types in one-to-many also applies to one-to-one relationships. + +## Current Limitations and Future Outlook + +The notable deficiencies of the current system are as follows: + +* It does not support many-to-many relationships. + +* It requires multiple mutations to sort all the related types. + +* It does not support random joins, i.e., currently, unmanaged relationships are not supported. + +The above limitations will be eliminated in future version updates of DefraDB. Our team is also working on secondary indexes, where the developer can make queries from either side, thereby improving the performance of querying from the secondary into the primary. This is almost as efficient as querying from the primary side using point lookup as opposed to a table scan \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/guides/secondary-index.md b/defradb_versioned_docs/version-0.19.0/guides/secondary-index.md new file mode 100644 index 0000000..1c10478 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/guides/secondary-index.md @@ -0,0 +1,263 @@ +--- +sidebar_label: Secondary index guide +sidebar_position: 60 +--- + +## Introduction + +DefraDB provides a powerful and flexible secondary indexing system that enables efficient document lookups and queries. + +## About + +The following sections provide an overview of performance considerations, indexing related objects, and JSON field indexing. + +### Performance considerations + +Indexes can greatly improve query performance, but they also impact system performance during writes. Each index adds write overhead since every document update must also update the relevant indexes. Despite this, the boost in read performance for indexed queries usually makes this trade-off worthwhile. + +#### To optimize performance: + +- Choose indexes based on your query patterns. Focus on fields frequently used in query filters to maximize efficiency. +- Avoid indexing rarely queried fields. Doing so adds unnecessary overhead. +- Be cautious with unique indexes. These require extra validation, making their performance impact more significant. + +Plan your indexes carefully to balance read and write performance. + +### Indexing related objects + +DefraDB supports indexing relationships between documents, allowing for efficient queries across related data. + +#### Example schema: Users and addresses + +```graphql +type User { + name: String + age: Int + address: Address @primary @index +} + +type Address { + user: User + city: String @index + street: String +} +``` + +Key indexes in this schema: + +- **City field in address:** Indexed to enable efficient queries by city. +- **Relationship between user and address**: Indexed to support fast lookups based on relationships. + +#### Query example + +The following query retrieves all users living in Montreal: + +```graphql +query { + User(filter: { + address: {city: {_eq: "Montreal"}} + }) { + name + } +} +``` + +#### How indexing improves efficiency + +**Without indexes:** +- Fetch all user documents. +- For each user, retrieve the corresponding Address. This approach becomes slow with large datasets. + +**With indexes:** +- Fetch address documents matching the city value directly. +- Retrieve the corresponding User documents. This method is much faster because indexes enable direct lookups. + +#### Enforcing relationship cardinality +Indexes can also enforce one-to-one relationships. For instance, to ensure each User has exactly one unique Address: + +```graphql +type User { + name: String + age: Int + address: Address @primary @index(unique: true) +} + +type Address { + user: User + city: String @index + street: String +} +``` + +Here, the @index(unique: true) constraint ensures no two Users can share the same Address. Without it, the relationship defaults to one-to-many, allowing multiple Users to reference a single Address. + +By combining relationship indexing with cardinality constraints, you can create highly efficient and logically consistent data structures. + +### JSON field indexing + +DefraDB offers a specialized indexing system for JSON fields, designed to handle their hierarchical structure efficiently. + +#### JSON indexing overview + +JSON fields differ from other field types (e.g., Int, String, Bool) because they are structured hierarchically. DefraDB uses a path-aware system to manage these complexities, enabling traversal and indexing of all leaf nodes in a JSON document. + +#### JSON Interface + +DefraDB's JSON interface, defined in client/json.go, is essential for managing JSON fields. It allows the system to: + +Traverse all leaf nodes in a JSON document. +Represent a JSON value as either a complete document or a single node within the structure. +Each JSON value also stores its path information, which is crucial for creating accurate and efficient indexes. + +##### Example JSON Document + +```json +{ + "user": { + "device": { + "model": "iPhone" + } + } +} +``` + +Here, the `iPhone` value is represented with its complete path: [`user`, `device`, `model`]. This path-aware representation ensures that the system knows not just the value, but where it resides within the document. + +#### Inverted Indexes for JSON +DefraDB uses inverted indexes for JSON fields. These indexes reverse the traditional "document-to-value" relationship by starting with a value and quickly locating all documents containing that value. + +#### Key Format for JSON Indexes + +``` +/(//)+/ +``` + +##### How It Differs + +- Regular fields map to a single index entry. +- JSON fields generate multiple entries—one for each leaf node, incorporating both the path and the value. + +During indexing, the system traverses the entire JSON structure, creating these detailed index entries. + +#### Value normalization in JSON +DefraDB normalizes JSON leaf values to ensure consistency in ordering and comparisons. For example: + +- JSON values include their normalized value and path information. +- Scalar types (e.g., integers) are normalized to a standard type, such as `int64`. + +This ensures that operations like filtering and sorting are reliable and efficient. + +#### How indexing works +When indexing a document with JSON fields, the system: + +1. Traverses the JSON structure using the JSON interface. +1. Generates index entries for every leaf node, combining path and normalized value. +1. Stores entries efficiently, enabling direct querying. + +##### Query example +Retrieve documents where the model is "iPhone": + +``` +query { + Collection(filter: { + jsonField: { + user: { + device: { + model: {_eq: "iPhone"} + } + } + } + }) +} +``` + +With indexes, the system directly retrieves matching documents, avoiding the need to scan and parse the JSON during queries. + +#### Benefits of JSON field indexing +- **Efficient queries**: Leverages inverted indexes for fast lookups, even in deeply nested structures. +- **Precise path tracking**: Maintains path information for accurate indexing and retrieval. +- **Scalable structure**: Handles complex JSON documents with minimal performance overhead. + +## Usage + +The `@index` directive can be used on GraphQL schema objects and field definitions to configure indexes. + +`@index(name: String, unique: Bool, direction: ORDERING, includes: [{ field: String, direction: ORDERING }])` + +### `name` +Sets the index name. Defaults to concatenated field names with direction. + +### `unique` +Makes the index unique. Defaults to false. + +### `direction` +Sets the default index direction for all fields. Can be one of ASC (ascending) or DESC (descending). Defaults to ASC. + +If a field in the includes list does not specify a direction the default direction from this value will be used instead. + +### `includes` +Sets the fields the index is created on. + +When used on a field definition and the field is not in the includes list it will be implicitly added as the first entry. + +## Examples + +### Field level usage + +Creates an index on the User name field with DESC direction. + +```gql +type User { + name: String @index(direction: DESC) +} +``` + +### Schema level usage + +Creates an index on the User name field with default direction (ASC). + +```gql +type User @index(includes: {field: "name"}) { + name: String + age: Int +} +``` + +### Unique index + +Creates a unique index on the User name field with default direction (ASC). + +```gql +type User { + name: String @index(unique: true) +} +``` + +### Composite index + +Creates a composite index on the User name and age fields with default direction (ASC). + +```gql +type User @index(includes: [{field: "name"}, {field: "age"}]) { + name: String + age: Int +} +``` + +### Relationship index + +Creates a unique index on the User relationship to Address. The unique index constraint ensures that no two Users can reference the same Address document. + +```gql +type User { + name: String + age: Int + address: Address @primary @index(unique: true) +} + +type Address { + user: User + city: String + street: String +} +``` diff --git a/defradb_versioned_docs/version-0.19.0/guides/time-traveling-queries.md b/defradb_versioned_docs/version-0.19.0/guides/time-traveling-queries.md new file mode 100644 index 0000000..0d3b6d1 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/guides/time-traveling-queries.md @@ -0,0 +1,60 @@ +--- +sidebar_label: Time Traveling Queries Guide +sidebar_position: 40 +--- +# A Guide to Time Traveling Queries in DefraDB + +## Overview +Time Traveling queries allow users to query previous states of documents within the query interface. Essentially, it returns data as it had appeared at a specific commit. This is a powerful tool as it allows users to inspect and verify arbitrary states and time regardless of the number of updates made or who made these updates if the user has the current state. Since a current state is always going to be based on some previous state and that previous state is going to be based on another previous state, hence time-traveling queries provide the ability to “go back in time” and look at previous states with minimal changes to the working of the query. A special quality of this query is that there is minimal distinction between a regular query run versus a time-traveling query since both apply almost the same logic to fetch the result of the query. + +## Background + +The Web2 stack has traditional databases, like Postgres or MySQL, that usually have the current state as the only state. Once a user makes an update, the previous state is overwritten. There is no way to retrieve it from the system, unless a snapshot is captured, which exists as an independent file in the backup. The only way to access previous states is by loading the backup onto the database and querying the previous state. Additionally, in traditional systems, this backup occurs only once every hour, once a day, or once a month. This results in a loss of the ability to introspect each update made in the database. Here, the time travel inquiry system provides an edge over the existing databases as the data model of this system is independent of the mechanism of creating snapshots or backups that a user would utilize as part of natural maintenance and administration. The data model of time-traveling queries is such that every update is a function of all the previous updates. Essentially, there is no difference between inspecting the state of a document at a present point in time versus a previous point since the previous state is a function of the document graph. + +## Usage + +A powerful feature of a time-traveling query is that very little work is required from the developer to turn a traditional non-time-traveling query into a time-traveling query. Each update a document goes through gets a version identifier known as a Content Identifier (CID). CIDs are a function of the data model and are used to build out the time travel queries. These CIDs can be used to refer to a version that contains some piece of data. Instead of using some sort of human-invented notion of semantic version labels like Version 1, or Version 3.1 alpha, it uses the hash of the data as the actual identifier. The user can take the entire state of a document and create a single constant-sized CID. Each update in the document produces a new version number for the document, including a new version number for its individual fields. The developer then only needs to submit a new time-traveling query using the doc key of the document that it wants to query backward through its state, just like in a regular query, only here the developer needs to add the 32-bit hexadecimal version identifier that is expressed as it’s CID in an additional argument and the query will fetch the specific update that was made in the document. + +```graphql +# Here we fetch a User of the given docID, in the state that it was at +# at the commit matching the given CID. +query { + User ( + cid: "bafybeieqnthjlvr64aodivtvtwgqelpjjvkmceyz4aqerkk5h23kjoivmu", + docID: "bae-d4303725-7db9-53d2-b324-f3ee44020e52" + ) { + name + age + } +} +``` + +## How It Works + +The mechanism behind time-traveling queries is based on the Merkel CRDT system and the data model of the documents discussed in the above sections. Each time a document is updated, a log of updates known as the Update graph is recorded. This graph consists of every update that the user makes in the document from the beginning till the Nth update. In addition to the document update graph, we also have an independent and individual update graph for each field of the document. The document update graph would capture the overall updates made in the document whereas the independent and individual update graphs would capture the changes made to a specific field of the document. The data model as discussed in the Usage section works in a similar fashion, where it keeps appending the updates of the document to its present state. So even if a user deletes any information in the document, this will be recorded as an update within the update graph. Hence, no information gets deleted from the document, as all updates are stored in the update graph. + +[Merkle CRDT Guide](./merkle-crdt.md) + +Since we now have this update graph of changes, the query also takes its mechanism from the inherent properties of the Delta State Merkel CRDTs. Under this, the actual content of the update added by the user in the document is known as the Delta Payload. This delta payload is the amount of information that a user wants to go from a previous state to the very next state, where the value of the next state is set by some other user. For example, suppose a team of developers is working on a document and one of them wants to change the name of the document, then in this case, the delta payload of the new update would be the name of the document set by that user. Hence, the time-traveling queries work on two core concepts, the appending update graph and the delta payload which contains information that is required to go from the previous state to the next state. With both of these, whenever a user submits a regular query, the query caches the present state of the document within the database. And we internally issue a time-traveling query for the current state, with the only upside being that the user can submit a non-time-traveling query faster since a cached version of the same is already stored in the database. Thus, using this cached version of the present state of the document, the user can apply a time-traveling query using the CID of the specific version they want to query in the document. The database will then set the CID provided by the user as the Target State, a state at which the query will stop and go back to the beginning of the document, known as the Genesis State. The query will then apply all its operations until it reaches back to the Target State. + +The main reason behind setting a Target state is because the Merkel CRDT is a single-direction graph, and it only points backward in time. But to apply all the updates of all the delta payloads from the genesis to the target state, we need the query to track the existence of the target state as the present state of the target version can be a function of multiple operations. We thus perform a two-step process where it starts from the target version, goes to the genesis state, and comes back to the version. And from this, we produce the current present or the actual external facing state, also known as the serialized state. + +## Limitations + +1. Relational Limitation: A user will not be able to apply a time-traveling query to a series of related documents relating to the document that they are applying the query. For example, a person has some books and a list of their respective authors. An author can have many books under their name, but one book can be associated with one author only. Now, if a user applies a time-traveling to a specific version at some point in time of a particular book, it will only be able to query the state of that book and not the related state of its correlated author. A regular query, on the other hand, can go in-depth and present its values or get the state of the book and its correlated author. However, with the time-traveling query, the user will not be able to query beyond the exact state to which the query is applied. + +2. Performance Limitation: As discussed earlier, the present state is stored as a cached version in the database, and based on this cached version, the current present state is computed. Hence the performance of the query depends on two factors: + + a. The size of the update graph of the document + + b. The number of updates that are between the Genesis state and the Target state. + +The larger the number of updates that exist between the Genesis state and the Target state, the longer it is going to take for the query to go back to the genesis state, perform its operations and come back to the target state. And hence, the time taken by the query to provide results would increase in proportion to the number of updates that are present between these two states. + + +## Future Outlook + +The future outlook for time-traveling queries focuses mainly on resolving the current limitations that this query faces. To navigate the relational limitation, the current data model being used the time-traveling query needs to be exposed to the underlying aspects of the Merkel CRDT data model. Here, taking the help of the example mentioned for this limitation in the previous section, the relationship between the author and their book can be expressed by using doc keys of two types. Therefore, book A, which has a particular doc key (doc key A) to represent it, and this book has its author B, will be represented by its different doc key (doc key B). So, whenever the user correlates that book A was published by author B, the user relates the doc keys in the relationship field of the update graph. + +For the performance limitations, snapshots can be the next step toward the elimination of the performance limitation. Currently, we keep a cached version of the present or the current state of the document. Once an update is made, this cached version will get replaced with the current version. Therefore, at any given point in time, there would only be a single cached version of the current state. However, developers can choose to trade this space to decrease the time taken for the query execution. This can be achieved by creating snapshots at various points in the update history. For a document undergoing millions of updates, snapshots can be taken at every 1000th update and a cached version of this snapshot can be created such that if we need to query the 2000th update, we just need to go back to the closest snapshot instead of having to go back to the Genesis state and then moving 2000 states to get to the Target state. For example, if we need to query the 1010th update, then we only need to execute 10 steps backward and 10 steps forward from the cached update, i.e., the 1000th update. Therefore, depending on the interval of the cache set by the user, for every 'x' number of updates, they would be required to execute 'x' number of steps after the closest cached version of the snapshot. + diff --git a/defradb_versioned_docs/version-0.19.0/references/_category_.json b/defradb_versioned_docs/version-0.19.0/references/_category_.json new file mode 100644 index 0000000..cca3d1e --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "References", + "position": 4 + } + \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/references/acp.md b/defradb_versioned_docs/version-0.19.0/references/acp.md new file mode 100644 index 0000000..9e362e3 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/acp.md @@ -0,0 +1,795 @@ +--- +sidebar_label: ACP +sidebar_position: 0 +--- + +# Introduction + +In the realm of information technology (IT) and cybersecurity, **access control** plays a pivotal role in ensuring the confidentiality, integrity, and availability of sensitive resources. Let's delve into why access control policies are crucial for protecting your valuable data. + +## What Is Access Control? + +**Access control** is a mechanism that regulates who or what can view, use, or access a specific resource within a computing environment. Its primary goal is to minimize security risks by ensuring that only **authorized users**, systems, or services have access to the resources they need. But it's more than just granting or denying access, it involves several key components: + +1. **Authentication**: Verifying the identity of an individual or system. +2. **Authorization**: Determining what actions or operations an actor is allowed to perform. +3. **Access**: Granting or denying access based on authorization. +4. **Management**: Administering access rights and permissions. +5. **Audit**: Tracking and monitoring access patterns for accountability. + +## Why Is Access Control Important? + +1. **Mitigating Security Risks**: Cybercriminals are becoming increasingly sophisticated, employing advanced techniques to breach security systems. By controlling who has access to your database, you significantly reduce the risk of unauthorized access, both from external attackers and insider threats. + +2. **Compliance with Regulations**: Various regulatory requirements, such as the **General Data Protection Regulation (GDPR)** and the **Health Insurance Portability and Accountability Act (HIPAA)**, mandate stringent access control measures to protect personal data. Implementing access control ensures compliance with these regulations. + +3. **Preventing Data Breaches**: Access control acts as a proactive measure to deter, detect, and prevent unauthorized access. It ensures that only those with the necessary permissions can access sensitive data or services. + +4. **Managing Complexity**: Modern IT infrastructure, including cloud computing and mobile devices, has exponentially increased the number of access points. Technologies like **identity and access management (IAM)** and approaches like **zero trust** help manage this complexity effectively. + +## Types of Security Access Controls + +Several access control models exist, including: + +- **Role-Based Access Control (RBAC)**: Assigns permissions to roles, roles then are granted to users. A user's active role then defines their access. (e.g., admin, user, manager). +- **Attribute-Based Access Control (ABAC)**: Considers various attributes (e.g., user attributes, resource attributes) for access decisions. +- **Discretionary Access Control (DAC)**: Users with sufficient permissions (resource owners) are to grant / share an object with other users. +- **Mandatory Access Control (MAC)**: Users are not allowed to grant access to other users. Permissions are granted based on a minimum role / hierarchy (security labels and clearances) that must be met. +- **Policy-Based Access Control (PBAC)**: Enforces access based on defined policies. +- **Relation-Based Access Control (ReBac)**: Relations between objects and users in the system are used to derive their permissions. + +- Note: **DefraDB** access control rules strongly resembles **Discretionary Access Control (DAC)**, which is implemented through a **Relation-Based Access Control System (ReBac) Engine** + +## Challenges of Access Control in Cybersecurity + +- **Distributed IT Environments**: Cloud computing and remote work create new challenges. +- **Rise of Mobility**: Mobile devices in the workplace add complexity. +- **Password Fatigue**: Balancing security with usability. +- **Data Governance**: Ensuring visibility and control. +- **Multi-Tenancy**: Managing complex permissions in SaaS applications. + +## Key takeaway +A robust access control policy system is your first line of defense against unauthorized access and data breaches. + + +# DefraDB's Access Control System + +## ReBac Authorization Model + +### Zanzibar +In 2019, Google published their [Zanzibar](https://research.google/pubs/zanzibar-googles-consistent-global-authorization-system/) paper, a paper explaining how they handle authorization across their many services. It uses access control lists but with relationship-based access control rather than role-based access control. Relationship-Based Access Control (ReBAC) establishes an authorization model where a subject's permission to access an object is defined by the presence of relationships between those subjects and objects. +The way Zanzibar works is it exposes an API with (mainly) operations to manage `Relationships` (`tuples`) and Verify Access Requests (can Bob do X) through the `Check` call. A `tuple` includes subject, relation, and object. The Check call performs Graph Search over the `tuples` to find a path between the user and the object, if such a path exist then according to `RelBAC` the user has the queried permission. It operates as a Consistent and Partition-Tolerant System. + +### Zanzi +However the Zanzibar API is centralized, so we (Source Network) created a decentralized implementation of Zanzibar called **Zanzi**. Which is powered by our SourceHub trust protocol. Zanzi is a general purpose Zanzibar implementation which operates over a KV persistence layer. + +### SourceHub ACP Module +DefraDB wraps the `local` and `remote` SourceHub ACP Modules to bring all that magic to DefraDB. + +In order to setup the relation based access control, SourceHub requires an agreed upon contract which models the `relations`, `permissions`, and `actors`. That contract is refered to as a `SourceHub Policy`. The policy model's all the `relations` and `permissions` under a `resource`. +A `resource` corresponds to that "thing" that we want to gate the access control around. This can be a `Type`, `Container`, `Schema`, `Shape` or anything that has Objects that need access control. Once the policy is finalized, it has to be uploaded to the `SourceHub Module` so it can be used. +Once the `Policy` is uploaded to the `SourceHub Module` then an `Actor` can begin registering the `Object` for access control by linking to a `Resource` that exists on the uploaded `Policy`. +After the `Object` is registered successfully, the `Actor` will then get a special built-in relation with that `Object` called the `"owner"` relation. This relation is given to the `Registerer` of an `Object`. +Then an `Actor` can issue `Check` calls to see if they have access to an `Object`. + +## Document Access Control (DAC) +In DefraDB's case we wanted to gate access control around the `Documents` that belonged to a specific `Collection`. Here, the `Collection` (i.e. the type/shape of the `Object`) can be thought of as the `Resource`, and the `Documents` are the `Objects`. + + +## Field Access Control (FAC) (coming soon) +We also want the ability to do a more granular access control than just DAC. Therefore we have `Field` level access control for situations where some fields of a `Document` need to be private, while others do not. In this case the `Document` becomes the `Resource` and the `Fields` are the `Objects` being gated. + + +## Admin Access Control (AAC) (coming soon) +We also want to model access control around the `Admin Level Operations` that exist in `DefraDB`. In this case the entire `Database` would be the `Resource` and the `Admin Level Operations` are the `Objects` being gated. + +A non-exhastive list of some operations only admins should have access for: +- Ability to turnoff ACP +- Ability to interact with the P2P system + +## SourceHub Policies Are Too Flexible +SourceHub Policies are too flexible (atleast until the ability to define `Meta Policies` is implemented). This is because SourceHub leaves it up to the user to specify any type of `Permissions` and `Relations`. However for DefraDB, there are certain guarantees that **MUST** be maintained in order for the `Policy` to be effective. For example the user can input any name for a `Permission`, or `Relation` that DefraDB has no knowledge of. Another example is when a user might make a `Policy` that does not give any `Permission` to the `owner`. Which means in the case of DAC no one will have any access to the `Document` they created. +Therefore There was a very clear need to define some rules while writing a `Resource` in a `Policy` which will be used with DefraDB's DAC, FAC, or AAC. These rules will guarantee that certain `Required Permissions` will always be there on a `Resource` and that `Owner` has the correct `Permissions`. + +We call these rules DPI A.K.A DefraDB Policy Interface. + +## Terminologies +- 'SourceHub Address' is a `Bech32` Address with a specific SourceHub prefix. +- 'Identity' is a combination of SourceHub Address and a Key-Pair Signature. +- 'DPI' means 'DefraDB Policy Interface'. +- 'Partially-DPI' policy means a policy with at least one DPI compliant resource. +- 'Permissioned Collection' means to have a policy on the collection, like: `@policy(id:".." resource: "..")` +- 'Permissioned Request' means to have a request with a SourceHub Identity. + + +## DAC DPI Rules + +To qualify as a DPI-compliant `resource`, the following rules **MUST** be satisfied: +- The resource **must include** the mandatory `registerer` (`owner`) relation within the `relations` attribute. +- The resource **must encompass** all the required permissions under the `permissions` attribute. +- Every required permission must have the required registerer relation (`owner`) in `expr`. +- The required registerer relation **must be positioned** as the leading (first) relation in `expr` (see example below). +- Any relation after the required registerer relation must only be a union set operation (`+`). + +For a `Policy` to be `DPI` compliant for DAC, all of its `resources` must be DPI compliant. +To be `Partially-DPI` at least one of its `resource` must be DPI compliant. + +### More Into The Weeds: + +All mandatory permissions are: +- Specified in the `dpi.go` file within the variable `dpiRequiredPermissions`. + +The name of the required 'registerer' relation is: +- Specified in the `dpi.go` file within the variable `requiredRegistererRelationName`. + +### DPI Resource Examples: +- Check out tests here: [tests/integration/acp/schema/add_dpi](/tests/integration/acp/schema/add_dpi) +- The tests linked are broken into `accept_*_test.go` and `reject_*_test.go` files. +- Accepted tests document the valid DPIs (as the schema is accepted). +- Rejected tests document invalid DPIs (as the schema is rejected). +- There are also some Partially-DPI tests that are both accepted and rejected depending on the resource. + +### Required Permission's Expression: +Even though the following expressions are valid generic policy expressions, they will make a +DPI compliant resource lose its DPI status as these expressions are not in accordance to +our DPI [rules](#dac-dpi-rules). Assuming these `expr` are under a required permission label: +- `expr: owner-owner` +- `expr: owner-reader` +- `expr: owner&reader` +- `expr: owner - reader` +- `expr: ownerMalicious + owner` +- `expr: ownerMalicious` +- `expr: owner_new` +- `expr: reader+owner` +- `expr: reader-owner` +- `expr: reader - owner` + +Here are some valid expression examples. Assuming these `expr` are under a required permission label: +- `expr: owner` +- `expr: owner + reader` +- `expr: owner +reader` +- `expr: owner+reader` + +## DAC Usage CLI: + +### Authentication + +To perform authenticated operations you will need to generate a `secp256k1` key pair. + +The command below will generate a new secp256k1 private key and print the 256 bit X coordinate as a hexadecimal value. + +```sh +openssl ecparam -name secp256k1 -genkey | openssl ec -text -noout | head -n5 | tail -n3 | tr -d '\n:\ ' +``` + +Copy the private key hex from the output. + +```sh +read EC key +e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Use the private key to generate authentication tokens for each request. + +```sh +defradb client ... --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +### Adding a Policy: + +We have in `examples/dpi_policy/user_dpi_policy.yml`: +```yaml +description: A Valid DefraDB Policy Interface (DPI) + +actor: + name: actor + +resources: + users: + permissions: + read: + expr: owner + reader + write: + expr: owner + + relations: + owner: + types: + - actor + reader: + types: + - actor +``` + +CLI Command: +```sh +defradb client acp policy add -f examples/dpi_policy/user_dpi_policy.yml --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "PolicyID": "50d354a91ab1b8fce8a0ae4693de7616fb1d82cfc540f25cfbe11eb0195a5765" +} +``` + +### Add schema, linking to a resource within the policy we added: + +We have in `examples/schema/permissioned/users.graphql`: +```graphql +type Users @policy( + id: "50d354a91ab1b8fce8a0ae4693de7616fb1d82cfc540f25cfbe11eb0195a5765", + resource: "users" +) { + name: String + age: Int +} +``` + +CLI Command: +```sh +defradb client schema add -f examples/schema/permissioned/users.graphql +``` + +Result: +```json +[ + { + "Name": "Users", + "ID": 1, + "RootID": 1, + "SchemaVersionID": "bafkreihhd6bqrjhl5zidwztgxzeseveplv3cj3fwtn3unjkdx7j2vr2vrq", + "Sources": [], + "Fields": [ + { + "Name": "_docID", + "ID": 0 + }, + { + "Name": "age", + "ID": 1 + }, + { + "Name": "name", + "ID": 2 + } + ], + "Indexes": [], + "Policy": { + "ID": "50d354a91ab1b8fce8a0ae4693de7616fb1d82cfc540f25cfbe11eb0195a5765", + "ResourceName": "users" + } + } +] + +``` + +### Create private documents (with identity) + +CLI Command: +```sh +defradb client collection create --name Users '[{ "name": "SecretShahzad" }, { "name": "SecretLone" }]' --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +### Create public documents (without identity) + +CLI Command: +```sh +defradb client collection create --name Users '[{ "name": "PublicShahzad" }, { "name": "PublicLone" }]' +``` + +### Get all docIDs without an identity (shows only public): +CLI Command: +```sh +defradb client collection docIDs --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "docID": "bae-63ba68c9-78cb-5060-ab03-53ead1ec5b83", + "error": "" +} +{ + "docID": "bae-ba315e98-fb37-5225-8a3b-34a1c75cba9e", + "error": "" +} +``` + + +### Get all docIDs with an identity (shows public and owned documents): +```sh +defradb client collection docIDs --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "docID": "bae-63ba68c9-78cb-5060-ab03-53ead1ec5b83", + "error": "" +} +{ + "docID": "bae-a5830219-b8e7-5791-9836-2e494816fc0a", + "error": "" +} +{ + "docID": "bae-ba315e98-fb37-5225-8a3b-34a1c75cba9e", + "error": "" +} +{ + "docID": "bae-eafad571-e40c-55a7-bc41-3cf7d61ee891", + "error": "" +} +``` + + +### Access the private document (including field names): +CLI Command: +```sh +defradb client collection get --name Users "bae-a5830219-b8e7-5791-9836-2e494816fc0a" --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "_docID": "bae-a5830219-b8e7-5791-9836-2e494816fc0a", + "name": "SecretShahzad" +} +``` + +### Accessing the private document without an identity: +CLI Command: +```sh +defradb client collection get --name Users "bae-a5830219-b8e7-5791-9836-2e494816fc0a" +``` + +Error: +``` + Error: document not found or not authorized to access +``` + +### Accessing the private document with wrong identity: +CLI Command: +```sh +defradb client collection get --name Users "bae-a5830219-b8e7-5791-9836-2e494816fc0a" --identity 4d092126012ebaf56161716018a71630d99443d9d5217e9d8502bb5c5456f2c5 +``` + +Error: +``` + Error: document not found or not authorized to access +``` + +### Update private document: +CLI Command: +```sh +defradb client collection update --name Users --docID "bae-a5830219-b8e7-5791-9836-2e494816fc0a" --updater '{ "name": "SecretUpdatedShahzad" }' --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "Count": 1, + "DocIDs": [ + "bae-a5830219-b8e7-5791-9836-2e494816fc0a" + ] +} +``` + +#### Check if it actually got updated: +CLI Command: +```sh +defradb client collection get --name Users "bae-a5830219-b8e7-5791-9836-2e494816fc0a" --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "_docID": "bae-a5830219-b8e7-5791-9836-2e494816fc0a", + "name": "SecretUpdatedShahzad" +} +``` + +### Update With Filter example (coming soon) + +### Delete private document: +CLI Command: +```sh +defradb client collection delete --name Users --docID "bae-a5830219-b8e7-5791-9836-2e494816fc0a" --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "Count": 1, + "DocIDs": [ + "bae-a5830219-b8e7-5791-9836-2e494816fc0a" + ] +} +``` + +#### Check if it actually got deleted: +CLI Command: +```sh +defradb client collection get --name Users "bae-a5830219-b8e7-5791-9836-2e494816fc0a" --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Error: +``` + Error: document not found or not authorized to access +``` + +### Delete With Filter example (coming soon) + +### Typejoin example (coming soon) + +### View example (coming soon) + +### P2P example (coming soon) + +### Backup / Import example (coming soon) + +### Secondary Indexes example (coming soon) + +### Execute Explain example (coming soon) + +### Sharing Private Documents With Others + +To share a document (or grant a more restricted access) with another actor, we must add a relationship between the +actor and the document. Inorder to make the relationship we require all of the following: + +1) **Target DocID**: The `docID` of the document we want to make a relationship for. +2) **Collection Name**: The name of the collection that has the `Target DocID`. +3) **Relation Name**: The type of relation (name must be defined within the linked policy on collection). +4) **Target Identity**: The identity of the actor the relationship is being made with. +5) **Requesting Identity**: The identity of the actor that is making the request. + +Note: + - ACP must be available (i.e. ACP can not be disabled). + - The collection with the target document must have a valid policy and resource linked. + - The target document must be registered with ACP already (private document). + - The requesting identity MUST either be the owner OR the manager (manages the relation) of the resource. + - If the specified relation was not granted the miminum DPI permissions (read or write) within the policy, + and a relationship is formed, the subject/actor will still not be able to access (read or write) the resource. + - If the relationship already exists, then it will just be a no-op. + +Consider the following policy that we have under `examples/dpi_policy/user_dpi_policy_with_manages.yml`: + +```yaml +name: An Example Policy + +description: A Policy + +actor: + name: actor + +resources: + users: + permissions: + read: + expr: owner + reader + writer + + write: + expr: owner + writer + + nothing: + expr: dummy + + relations: + owner: + types: + - actor + + reader: + types: + - actor + + writer: + types: + - actor + + admin: + manages: + - reader + types: + - actor + + dummy: + types: + - actor +``` + +Add the policy: +```sh +defradb client acp policy add -f examples/dpi_policy/user_dpi_policy_with_manages.yml \ +--identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "PolicyID": "ec11b7e29a4e195f95787e2ec9b65af134718d16a2c9cd655b5e04562d1cabf9" +} +``` + +Add schema, linking to the users resource and our policyID: +```sh +defradb client schema add ' +type Users @policy( + id: "ec11b7e29a4e195f95787e2ec9b65af134718d16a2c9cd655b5e04562d1cabf9", + resource: "users" +) { + name: String + age: Int +} +' +``` + +Result: +```json +[ + { + "Name": "Users", + "ID": 1, + "RootID": 1, + "SchemaVersionID": "bafkreihhd6bqrjhl5zidwztgxzeseveplv3cj3fwtn3unjkdx7j2vr2vrq", + "Sources": [], + "Fields": [ + { + "Name": "_docID", + "ID": 0, + "Kind": null, + "RelationName": null, + "DefaultValue": null + }, + { + "Name": "age", + "ID": 1, + "Kind": null, + "RelationName": null, + "DefaultValue": null + }, + { + "Name": "name", + "ID": 2, + "Kind": null, + "RelationName": null, + "DefaultValue": null + } + ], + "Indexes": [], + "Policy": { + "ID": "ec11b7e29a4e195f95787e2ec9b65af134718d16a2c9cd655b5e04562d1cabf9", + "ResourceName": "users" + }, + "IsMaterialized": true + } +] +``` + +Create a private document: +```sh +defradb client collection create --name Users '[{ "name": "SecretShahzadLone" }]' \ +--identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Only the owner can see it: +```sh +defradb client collection docIDs --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "docID": "bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c", + "error": "" +} +``` + +Another actor can not: +```sh +defradb client collection docIDs --identity 4d092126012ebaf56161716018a71630d99443d9d5217e9d8502bb5c5456f2c5 +``` + +**Result is empty from the above command** + + +Now let's make the other actor a reader of the document by adding a relationship: +```sh +defradb client acp relationship add \ +--collection Users \ +--docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ +--relation reader \ +--actor did:key:z7r8os2G88XXBNBTLj3kFR5rzUJ4VAesbX7PgsA68ak9B5RYcXF5EZEmjRzzinZndPSSwujXb4XKHG6vmKEFG6ZfsfcQn \ +--identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "ExistedAlready": false +} +``` + +**Note: If the same relationship is created again the `ExistedAlready` would then be true, indicating no-op** + +Now the other actor can read: +```sh +defradb client collection docIDs --identity 4d092126012ebaf56161716018a71630d99443d9d5217e9d8502bb5c5456f2c5 +``` + +Result: +```json +{ + "docID": "bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c", + "error": "" +} +``` + +But, they still can not perform an update as they were only granted a read permission (through `reader` relation): +```sh +defradb client collection update --name Users --docID "bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c" \ +--identity 4d092126012ebaf56161716018a71630d99443d9d5217e9d8502bb5c5456f2c5 '{ "name": "SecretUpdatedShahzad" }' +``` + +Result: +```sh +Error: document not found or not authorized to access +``` + +Sometimes we might want to give a specific access (i.e. form a relationship) not just with one identity, but with +any identity (includes even requests with no-identity). +In that case we can specify "*" instead of specifying an explicit `actor`: +```sh +defradb client acp relationship add \ +--collection Users \ +--docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ +--relation reader \ +--actor "*" \ +--identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "ExistedAlready": false +} +``` + +**Note: specifying `*` does not overwrite any previous formed relationships, they will remain as is ** + +### Revoking Access To Private Documents + +To revoke access to a document for an actor, we must delete the relationship between the +actor and the document. Inorder to delete the relationship we require all of the following: + +1) Target DocID: The docID of the document we want to delete a relationship for. +2) Collection Name: The name of the collection that has the Target DocID. +3) Relation Name: The type of relation (name must be defined within the linked policy on collection). +4) Target Identity: The identity of the actor the relationship is being deleted for. +5) Requesting Identity: The identity of the actor that is making the request. + +Notes: + - ACP must be available (i.e. ACP can not be disabled). + - The target document must be registered with ACP already (policy & resource specified). + - The requesting identity MUST either be the owner OR the manager (manages the relation) of the resource. + - If the relationship record was not found, then it will be a no-op. + +Consider the same policy and added relationship from the previous example in the section above where we learnt +how to share the document with other actors. + +We made the document accessible to an actor by adding a relationship: +```sh +defradb client acp relationship add \ +--collection Users \ +--docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ +--relation reader \ +--actor did:key:z7r8os2G88XXBNBTLj3kFR5rzUJ4VAesbX7PgsA68ak9B5RYcXF5EZEmjRzzinZndPSSwujXb4XKHG6vmKEFG6ZfsfcQn \ +--identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "ExistedAlready": false +} +``` + +Similarly, inorder to revoke access to a document we have the following command to delete the relationship: +```sh +defradb client acp relationship delete \ +--collection Users \ +--docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ +--relation reader \ +--actor did:key:z7r8os2G88XXBNBTLj3kFR5rzUJ4VAesbX7PgsA68ak9B5RYcXF5EZEmjRzzinZndPSSwujXb4XKHG6vmKEFG6ZfsfcQn \ +--identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "RecordFound": true +} +``` + +**Note: If the same relationship is deleted again (or a record for a relationship does not exist) then the `RecordFound` +would be false, indicating no-op** + +Now the other actor can no longer read: +```sh +defradb client collection docIDs --identity 4d092126012ebaf56161716018a71630d99443d9d5217e9d8502bb5c5456f2c5 +``` + +**Result is empty from the above command** + +We can also revoke the previously granted implicit relationship which gave all actors access using the "*" actor. +Similarly we can just specify "*" to revoke all access given to actors implicitly through this relationship: +```sh +defradb client acp relationship delete \ +--collection Users \ +--docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ +--relation reader \ +--actor "*" \ +--identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac +``` + +Result: +```json +{ + "RecordFound": true +} +``` + +**Note: Deleting with`*` does not remove any explicitly formed relationships, they will remain as they were ** + +## DAC Usage HTTP: + +### Authentication + +To perform authenticated operations you will need to build and sign a JWT token with the following required fields: + +- `sub` public key of the identity +- `aud` host name of the defradb api +- The `exp` and `nbf` fields should also be set to short-lived durations. + +Additionally, if using SourceHub ACP, the following must be set: +- `iss` should be set to the user's DID, e.g. `"did:key:z6MkkHsQbp3tXECqmUJoCJwyuxSKn1BDF1RHzwDGg9tHbXKw"` +- `iat` should be set to the current unix timestamp +- `authorized_account` should be set to the SourceHub address of the account signing SourceHub transactions on your + behalf - WARNING - this will currently enable this account to make any SourceHub as your user for the lifetime of the + token, so please only set this if you fully trust the node/account. + +The JWT must be signed with the `secp256k1` private key of the identity you wish to perform actions as. + +The signed token must be set on the `Authorization` header of the HTTP request with the `bearer ` prefix prepended to it. + +If authentication fails for any reason a `403` forbidden response will be returned. + +## _AAC DPI Rules (coming soon)_ +## _AAC Usage: (coming soon)_ + +## _FAC DPI Rules (coming soon)_ +## _FAC Usage: (coming soon)_ + +## Warning / Caveats +- If using Local ACP, P2P will only work with collections that do not have a policy assigned. If you wish to use ACP +on collections connected to a multi-node network, please use SourceHub ACP. + +The following features currently don't work with ACP, they are being actively worked on. +- [Adding Secondary Indexes](https://github.com/sourcenetwork/defradb/issues/2365) +- [Backing/Restoring Private Documents](https://github.com/sourcenetwork/defradb/issues/2430) + +The following features may have undefined/unstable behavior until they are properly tested: +- [Views](https://github.com/sourcenetwork/defradb/issues/2018) +- [Average Operations](https://github.com/sourcenetwork/defradb/issues/2475) +- [Count Operations](https://github.com/sourcenetwork/defradb/issues/2474) +- [Group Operations](https://github.com/sourcenetwork/defradb/issues/2473) +- [Limit Operations](https://github.com/sourcenetwork/defradb/issues/2472) +- [Order Operations](https://github.com/sourcenetwork/defradb/issues/2471) +- [Sum Operations](https://github.com/sourcenetwork/defradb/issues/2470) +- [Dag/Commit Operations](https://github.com/sourcenetwork/defradb/issues/2469) +- [Delete With Filter Operations](https://github.com/sourcenetwork/defradb/issues/2468) +- [Update With Filter Operations](https://github.com/sourcenetwork/defradb/issues/2467) +- [Type Join Many Operations](https://github.com/sourcenetwork/defradb/issues/2466) +- [Type Join One Operations](https://github.com/sourcenetwork/defradb/issues/2466) +- [Parallel Operations](https://github.com/sourcenetwork/defradb/issues/2465) +- [Execute Explain](https://github.com/sourcenetwork/defradb/issues/2464) diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/_category_.json b/defradb_versioned_docs/version-0.19.0/references/cli/_category_.json new file mode 100644 index 0000000..819b26c --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "CLI Specification", + "position": 2 +} \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb.md new file mode 100644 index 0000000..9def574 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb.md @@ -0,0 +1,41 @@ +## defradb + +DefraDB Edge Database + +### Synopsis + +DefraDB is the edge database to power the user-centric future. + +Start a DefraDB node, interact with a local or remote node, and much more. + + +### Options + +``` + -h, --help help for defradb + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb identity](defradb_identity.md) - Interact with identity features of DefraDB instance +* [defradb keyring](defradb_keyring.md) - Manage DefraDB private keys +* [defradb server-dump](defradb_server-dump.md) - Dumps the state of the entire database +* [defradb start](defradb_start.md) - Start a DefraDB node +* [defradb version](defradb_version.md) - Display the version information of DefraDB and its components + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client.md new file mode 100644 index 0000000..c23547e --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client.md @@ -0,0 +1,53 @@ +## defradb client + +Interact with a DefraDB node + +### Synopsis + +Interact with a DefraDB node. +Execute queries, add schema types, obtain node info, etc. + +### Options + +``` + -h, --help help for client + -i, --identity string Hex formatted private key used to authenticate with ACP + --tx uint Transaction ID +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb](defradb.md) - DefraDB Edge Database +* [defradb client acp](defradb_client_acp.md) - Interact with the access control system of a DefraDB node +* [defradb client backup](defradb_client_backup.md) - Interact with the backup utility +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. +* [defradb client dump](defradb_client_dump.md) - Dump the contents of DefraDB node-side +* [defradb client index](defradb_client_index.md) - Manage collections' indexes of a running DefraDB instance +* [defradb client node-identity](defradb_client_node-identity.md) - Get the public information about the node's identity +* [defradb client p2p](defradb_client_p2p.md) - Interact with the DefraDB P2P system +* [defradb client purge](defradb_client_purge.md) - Delete all persisted data and restart +* [defradb client query](defradb_client_query.md) - Send a DefraDB GraphQL query request +* [defradb client schema](defradb_client_schema.md) - Interact with the schema system of a DefraDB node +* [defradb client tx](defradb_client_tx.md) - Create, commit, and discard DefraDB transactions +* [defradb client view](defradb_client_view.md) - Manage views within a running DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp.md new file mode 100644 index 0000000..d2ffce5 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp.md @@ -0,0 +1,46 @@ +## defradb client acp + +Interact with the access control system of a DefraDB node + +### Synopsis + +Interact with the access control system of a DefraDB node + +Learn more about [ACP](/acp/README.md) + + + +### Options + +``` + -h, --help help for acp +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client acp policy](defradb_client_acp_policy.md) - Interact with the acp policy features of DefraDB instance +* [defradb client acp relationship](defradb_client_acp_relationship.md) - Interact with the acp relationship features of DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_policy.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_policy.md new file mode 100644 index 0000000..c0c8d6e --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_policy.md @@ -0,0 +1,41 @@ +## defradb client acp policy + +Interact with the acp policy features of DefraDB instance + +### Synopsis + +Interact with the acp policy features of DefraDB instance + +### Options + +``` + -h, --help help for policy +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client acp](defradb_client_acp.md) - Interact with the access control system of a DefraDB node +* [defradb client acp policy add](defradb_client_acp_policy_add.md) - Add new policy + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_policy_add.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_policy_add.md new file mode 100644 index 0000000..bef3750 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_policy_add.md @@ -0,0 +1,91 @@ +## defradb client acp policy add + +Add new policy + +### Synopsis + +Add new policy + +Notes: + - Can not add a policy without specifying an identity. + - ACP must be available (i.e. ACP can not be disabled). + - A non-DPI policy will be accepted (will be registered with acp system). + - But only a valid DPI policyID & resource can be specified on a schema. + - DPI validation happens when attempting to add a schema with '@policy'. + - Learn more about [ACP & DPI Rules](/acp/README.md) + +Example: add from an argument string: + defradb client acp policy add -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f \ +' +description: A Valid DefraDB Policy Interface + +actor: + name: actor + +resources: + users: + permissions: + read: + expr: owner + reader + write: + expr: owner + + relations: + owner: + types: + - actor + reader: + types: + - actor +' + +Example: add from file: + defradb client acp policy add -f policy.yml \ + -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f + +Example: add from file, verbose flags: + defradb client acp policy add --file policy.yml \ + --identity 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f + +Example: add from stdin: + cat policy.yml | defradb client acp policy add - + + + +``` +defradb client acp policy add [-i --identity] [policy] [flags] +``` + +### Options + +``` + -f, --file string File to load a policy from + -h, --help help for add +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client acp policy](defradb_client_acp_policy.md) - Interact with the acp policy features of DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_relationship.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_relationship.md new file mode 100644 index 0000000..2518f6c --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_relationship.md @@ -0,0 +1,42 @@ +## defradb client acp relationship + +Interact with the acp relationship features of DefraDB instance + +### Synopsis + +Interact with the acp relationship features of DefraDB instance + +### Options + +``` + -h, --help help for relationship +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client acp](defradb_client_acp.md) - Interact with the access control system of a DefraDB node +* [defradb client acp relationship add](defradb_client_acp_relationship_add.md) - Add new relationship +* [defradb client acp relationship delete](defradb_client_acp_relationship_delete.md) - Delete relationship + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_relationship_add.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_relationship_add.md new file mode 100644 index 0000000..f3313b4 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_relationship_add.md @@ -0,0 +1,89 @@ +## defradb client acp relationship add + +Add new relationship + +### Synopsis + +Add new relationship + +To share a document (or grant a more restricted access) with another actor, we must add a relationship between the +actor and the document. In order to make the relationship we require all of the following: +1) Target DocID: The docID of the document we want to make a relationship for. +2) Collection Name: The name of the collection that has the Target DocID. +3) Relation Name: The type of relation (name must be defined within the linked policy on collection). +4) Target Identity: The identity of the actor the relationship is being made with. +5) Requesting Identity: The identity of the actor that is making the request. + +Notes: + - ACP must be available (i.e. ACP can not be disabled). + - The target document must be registered with ACP already (policy & resource specified). + - The requesting identity MUST either be the owner OR the manager (manages the relation) of the resource. + - If the specified relation was not granted the minimum DPI permissions (read or write) within the policy, + and a relationship is formed, the subject/actor will still not be able to access (read or write) the resource. + - Learn more about [ACP & DPI Rules](/acp/README.md) + +Example: Let another actor (4d092126012ebaf56161716018a71630d99443d9d5217e9d8502bb5c5456f2c5) read a private document: + defradb client acp relationship add \ + --collection Users \ + --docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ + --relation reader \ + --actor did:key:z7r8os2G88XXBNBTLj3kFR5rzUJ4VAesbX7PgsA68ak9B5RYcXF5EZEmjRzzinZndPSSwujXb4XKHG6vmKEFG6ZfsfcQn \ + --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac + +Example: Let all actors read a private document: + defradb client acp relationship add \ + --collection Users \ + --docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ + --relation reader \ + --actor "*" \ + --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac + +Example: Creating a dummy relationship does nothing (from database perspective): + defradb client acp relationship add \ + -c Users \ + --docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ + -r dummy \ + -a did:key:z7r8os2G88XXBNBTLj3kFR5rzUJ4VAesbX7PgsA68ak9B5RYcXF5EZEmjRzzinZndPSSwujXb4XKHG6vmKEFG6ZfsfcQn \ + -i e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac + + +``` +defradb client acp relationship add [--docID] [-c --collection] [-r --relation] [-a --actor] [-i --identity] [flags] +``` + +### Options + +``` + -a, --actor string Actor to add relationship with + -c, --collection string Collection that has the resource and policy for object + --docID string Document Identifier (ObjectID) to make relationship for + -h, --help help for add + -r, --relation string Relation that needs to be set for the relationship +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client acp relationship](defradb_client_acp_relationship.md) - Interact with the acp relationship features of DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_relationship_delete.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_relationship_delete.md new file mode 100644 index 0000000..8da5e6a --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_acp_relationship_delete.md @@ -0,0 +1,73 @@ +## defradb client acp relationship delete + +Delete relationship + +### Synopsis + +Delete relationship + +To revoke access to a document for an actor, we must delete the relationship between the +actor and the document. In order to delete the relationship we require all of the following: + +1) Target DocID: The docID of the document we want to delete a relationship for. +2) Collection Name: The name of the collection that has the Target DocID. +3) Relation Name: The type of relation (name must be defined within the linked policy on collection). +4) Target Identity: The identity of the actor the relationship is being deleted for. +5) Requesting Identity: The identity of the actor that is making the request. + +Notes: + - ACP must be available (i.e. ACP can not be disabled). + - The target document must be registered with ACP already (policy & resource specified). + - The requesting identity MUST either be the owner OR the manager (manages the relation) of the resource. + - If the relationship record was not found, then it will be a no-op. + - Learn more about [ACP & DPI Rules](/acp/README.md) + +Example: Let another actor (4d092126012ebaf56161716018a71630d99443d9d5217e9d8502bb5c5456f2c5) read a private document: + defradb client acp relationship delete \ + --collection Users \ + --docID bae-ff3ceb1c-b5c0-5e86-a024-dd1b16a4261c \ + --relation reader \ + --actor did:key:z7r8os2G88XXBNBTLj3kFR5rzUJ4VAesbX7PgsA68ak9B5RYcXF5EZEmjRzzinZndPSSwujXb4XKHG6vmKEFG6ZfsfcQn \ + --identity e3b722906ee4e56368f581cd8b18ab0f48af1ea53e635e3f7b8acd076676f6ac + + +``` +defradb client acp relationship delete [--docID] [-c --collection] [-r --relation] [-a --actor] [-i --identity] [flags] +``` + +### Options + +``` + -a, --actor string Actor to delete relationship for + -c, --collection string Collection that has the resource and policy for object + --docID string Document Identifier (ObjectID) to delete relationship for + -h, --help help for delete + -r, --relation string Relation that needs to be deleted within the relationship +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client acp relationship](defradb_client_acp_relationship.md) - Interact with the acp relationship features of DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_backup.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_backup.md new file mode 100644 index 0000000..cf7b2d0 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_backup.md @@ -0,0 +1,43 @@ +## defradb client backup + +Interact with the backup utility + +### Synopsis + +Export to or Import from a backup file. +Currently only supports JSON format. + +### Options + +``` + -h, --help help for backup +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client backup export](defradb_client_backup_export.md) - Export the database to a file +* [defradb client backup import](defradb_client_backup_import.md) - Import a JSON data file to the database + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_backup_export.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_backup_export.md new file mode 100644 index 0000000..031a321 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_backup_export.md @@ -0,0 +1,55 @@ +## defradb client backup export + +Export the database to a file + +### Synopsis + +Export the database to a file. If a file exists at the `` location, it will be overwritten. + +If the --collection flag is provided, only the data for that collection will be exported. +Otherwise, all collections in the database will be exported. + +If the --pretty flag is provided, the JSON will be pretty printed. + +Example: export data for the 'Users' collection: + defradb client export --collection Users user_data.json + +``` +defradb client backup export [-c --collections | -p --pretty | -f --format] [flags] +``` + +### Options + +``` + -c, --collections strings List of collections + -f, --format string Define the output format. Supported formats: [json] (default "json") + -h, --help help for export + -p, --pretty Set the output JSON to be pretty printed +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client backup](defradb_client_backup.md) - Interact with the backup utility + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_backup_import.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_backup_import.md new file mode 100644 index 0000000..7511f76 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_backup_import.md @@ -0,0 +1,47 @@ +## defradb client backup import + +Import a JSON data file to the database + +### Synopsis + +Import a JSON data file to the database. + +Example: import data to the database: + defradb client import user_data.json + +``` +defradb client backup import [flags] +``` + +### Options + +``` + -h, --help help for import +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client backup](defradb_client_backup.md) - Interact with the backup utility + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection.md new file mode 100644 index 0000000..d4ea8c3 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection.md @@ -0,0 +1,51 @@ +## defradb client collection + +Interact with a collection. + +### Synopsis + +Create, read, update, and delete documents within a collection. + +### Options + +``` + --get-inactive Get inactive collections as well as active + -h, --help help for collection + -i, --identity string Hex formatted private key used to authenticate with ACP + --name string Collection name + --schema string Collection schema Root + --tx uint Transaction ID + --version string Collection version ID +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client collection create](defradb_client_collection_create.md) - Create a new document. +* [defradb client collection delete](defradb_client_collection_delete.md) - Delete documents by docID or filter. +* [defradb client collection describe](defradb_client_collection_describe.md) - View collection description. +* [defradb client collection docIDs](defradb_client_collection_docIDs.md) - List all document IDs (docIDs). +* [defradb client collection get](defradb_client_collection_get.md) - View document fields. +* [defradb client collection patch](defradb_client_collection_patch.md) - Patch existing collection descriptions +* [defradb client collection update](defradb_client_collection_update.md) - Update documents by docID or filter. + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_create.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_create.md new file mode 100644 index 0000000..ab10761 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_create.md @@ -0,0 +1,83 @@ +## defradb client collection create + +Create a new document. + +### Synopsis + +Create a new document. + +Options: + -i, --identity + Marks the document as private and set the identity as the owner. The access to the document + and permissions are controlled by ACP (Access Control Policy). + + -e, --encrypt + Encrypt flag specified if the document needs to be encrypted. If set, DefraDB will generate a + symmetric key for encryption using AES-GCM. + + --encrypt-fields + Comma-separated list of fields to encrypt. If set, DefraDB will encrypt only the specified fields + and for every field in the list it will generate a symmetric key for encryption using AES-GCM. + If combined with '--encrypt' flag, all the fields in the document not listed in '--encrypt-fields' + will be encrypted with the same key. + +Example: create from string: + defradb client collection create --name User '\{ "name": "Bob" \}' + +Example: create from string, with identity: + defradb client collection create --name User '\{ "name": "Bob" \}' \ + -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f + +Example: create multiple from string: + defradb client collection create --name User '[\{ "name": "Alice" \}, \{ "name": "Bob" \}]' + +Example: create from file: + defradb client collection create --name User -f document.json + +Example: create from stdin: + cat document.json | defradb client collection create --name User - + + +``` +defradb client collection create [-i --identity] [-e --encrypt] [--encrypt-fields] [flags] +``` + +### Options + +``` + -e, --encrypt Flag to enable encryption of the document + --encrypt-fields strings Comma-separated list of fields to encrypt + -f, --file string File containing document(s) + -h, --help help for create +``` + +### Options inherited from parent commands + +``` + --get-inactive Get inactive collections as well as active + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --name string Collection name + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --schema string Collection schema Root + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") + --version string Collection version ID +``` + +### SEE ALSO + +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_delete.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_delete.md new file mode 100644 index 0000000..df1ef3b --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_delete.md @@ -0,0 +1,61 @@ +## defradb client collection delete + +Delete documents by docID or filter. + +### Synopsis + +Delete documents by docID or filter and lists the number of documents deleted. + +Example: delete by docID: + defradb client collection delete --name User --docID bae-123 + +Example: delete by docID with identity: + defradb client collection delete --name User --docID bae-123 \ + -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f + +Example: delete by filter: + defradb client collection delete --name User --filter '\{ "_gte": \{ "points": 100 \} \}' + + +``` +defradb client collection delete [-i --identity] [--filter --docID ] [flags] +``` + +### Options + +``` + --docID string Document ID + --filter string Document filter + -h, --help help for delete +``` + +### Options inherited from parent commands + +``` + --get-inactive Get inactive collections as well as active + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --name string Collection name + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --schema string Collection schema Root + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") + --version string Collection version ID +``` + +### SEE ALSO + +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_describe.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_describe.md new file mode 100644 index 0000000..3de635d --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_describe.md @@ -0,0 +1,61 @@ +## defradb client collection describe + +View collection description. + +### Synopsis + +Introspect collection types. + +Example: view all collections + defradb client collection describe + +Example: view collection by name + defradb client collection describe --name User + +Example: view collection by schema root id + defradb client collection describe --schema bae123 + +Example: view collection by version id. This will also return inactive collections + defradb client collection describe --version bae123 + + +``` +defradb client collection describe [flags] +``` + +### Options + +``` + --get-inactive Get inactive collections as well as active + -h, --help help for describe + --name string Collection name + --schema string Collection schema Root + --version string Collection version ID +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_docIDs.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_docIDs.md new file mode 100644 index 0000000..4e57523 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_docIDs.md @@ -0,0 +1,55 @@ +## defradb client collection docIDs + +List all document IDs (docIDs). + +### Synopsis + +List all document IDs (docIDs). + +Example: list all docID(s): + defradb client collection docIDs --name User + +Example: list all docID(s), with an identity: + defradb client collection docIDs -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f --name User + + +``` +defradb client collection docIDs [-i --identity] [flags] +``` + +### Options + +``` + -h, --help help for docIDs +``` + +### Options inherited from parent commands + +``` + --get-inactive Get inactive collections as well as active + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --name string Collection name + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --schema string Collection schema Root + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") + --version string Collection version ID +``` + +### SEE ALSO + +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_get.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_get.md new file mode 100644 index 0000000..8b5b530 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_get.md @@ -0,0 +1,56 @@ +## defradb client collection get + +View document fields. + +### Synopsis + +View document fields. + +Example: + defradb client collection get --name User bae-123 + +Example to get a private document we must use an identity: + defradb client collection get -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f --name User bae-123 + + +``` +defradb client collection get [-i --identity] [--show-deleted] [flags] +``` + +### Options + +``` + -h, --help help for get + --show-deleted Show deleted documents +``` + +### Options inherited from parent commands + +``` + --get-inactive Get inactive collections as well as active + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --name string Collection name + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --schema string Collection schema Root + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") + --version string Collection version ID +``` + +### SEE ALSO + +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_patch.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_patch.md new file mode 100644 index 0000000..86ec944 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_patch.md @@ -0,0 +1,62 @@ +## defradb client collection patch + +Patch existing collection descriptions + +### Synopsis + +Patch existing collection descriptions. + +Uses JSON Patch to modify collection descriptions. + +Example: patch from an argument string: + defradb client collection patch '[\{ "op": "add", "path": "...", "value": \{...\} \}]' + +Example: patch from file: + defradb client collection patch -p patch.json + +Example: patch from stdin: + cat patch.json | defradb client collection patch - + +To learn more about the DefraDB GraphQL Schema Language, refer to https://docs.source.network. + +``` +defradb client collection patch [patch] [flags] +``` + +### Options + +``` + -h, --help help for patch + -p, --patch-file string File to load a patch from +``` + +### Options inherited from parent commands + +``` + --get-inactive Get inactive collections as well as active + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --name string Collection name + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --schema string Collection schema Root + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") + --version string Collection version ID +``` + +### SEE ALSO + +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_update.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_update.md new file mode 100644 index 0000000..562335c --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_collection_update.md @@ -0,0 +1,67 @@ +## defradb client collection update + +Update documents by docID or filter. + +### Synopsis + +Update documents by docID or filter. + +Example: update from string: + defradb client collection update --name User --docID bae-123 '\{ "name": "Bob" \}' + +Example: update by filter: + defradb client collection update --name User \ + --filter '\{ "_gte": \{ "points": 100 \} \}' --updater '\{ "verified": true \}' + +Example: update by docID: + defradb client collection update --name User \ + --docID bae-123 --updater '\{ "verified": true \}' + +Example: update private docID, with identity: + defradb client collection update -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f --name User \ + --docID bae-123 --updater '\{ "verified": true \}' + + +``` +defradb client collection update [-i --identity] [--filter --docID --updater ] [flags] +``` + +### Options + +``` + --docID string Document ID + --filter string Document filter + -h, --help help for update + --updater string Document updater +``` + +### Options inherited from parent commands + +``` + --get-inactive Get inactive collections as well as active + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --name string Collection name + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --schema string Collection schema Root + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") + --version string Collection version ID +``` + +### SEE ALSO + +* [defradb client collection](defradb_client_collection.md) - Interact with a collection. + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_dump.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_dump.md new file mode 100644 index 0000000..ebc3eec --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_dump.md @@ -0,0 +1,40 @@ +## defradb client dump + +Dump the contents of DefraDB node-side + +``` +defradb client dump [flags] +``` + +### Options + +``` + -h, --help help for dump +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index.md new file mode 100644 index 0000000..7143286 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index.md @@ -0,0 +1,43 @@ +## defradb client index + +Manage collections' indexes of a running DefraDB instance + +### Synopsis + +Manage (create, drop, or list) collection indexes on a DefraDB node. + +### Options + +``` + -h, --help help for index +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client index create](defradb_client_index_create.md) - Creates a secondary index on a collection's field(s) +* [defradb client index drop](defradb_client_index_drop.md) - Drop a collection's secondary index +* [defradb client index list](defradb_client_index_list.md) - Shows the list indexes in the database or for a specific collection + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index_create.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index_create.md new file mode 100644 index 0000000..268cd9e --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index_create.md @@ -0,0 +1,62 @@ +## defradb client index create + +Creates a secondary index on a collection's field(s) + +### Synopsis + +Creates a secondary index on a collection's field(s). + +The --name flag is optional. If not provided, a name will be generated automatically. +The --unique flag is optional. If provided, the index will be unique. +If no order is specified for the field, the default value will be "ASC" + +Example: create an index for 'Users' collection on 'name' field: + defradb client index create --collection Users --fields name + +Example: create a named index for 'Users' collection on 'name' field: + defradb client index create --collection Users --fields name --name UsersByName + +Example: create a unique index for 'Users' collection on 'name' in ascending order, and 'age' in descending order: + defradb client index create --collection Users --fields name:ASC,age:DESC --unique + + +``` +defradb client index create -c --collection --fields [-n --name ] [--unique] [flags] +``` + +### Options + +``` + -c, --collection string Collection name + --fields strings Fields to index + -h, --help help for create + -n, --name string Index name + -u, --unique Make the index unique +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client index](defradb_client_index.md) - Manage collections' indexes of a running DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index_drop.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index_drop.md new file mode 100644 index 0000000..081f5e2 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index_drop.md @@ -0,0 +1,49 @@ +## defradb client index drop + +Drop a collection's secondary index + +### Synopsis + +Drop a collection's secondary index. + +Example: drop the index 'UsersByName' for 'Users' collection: + defradb client index create --collection Users --name UsersByName + +``` +defradb client index drop -c --collection -n --name [flags] +``` + +### Options + +``` + -c, --collection string Collection name + -h, --help help for drop + -n, --name string Index name +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client index](defradb_client_index.md) - Manage collections' indexes of a running DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index_list.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index_list.md new file mode 100644 index 0000000..c5cf211 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_index_list.md @@ -0,0 +1,51 @@ +## defradb client index list + +Shows the list indexes in the database or for a specific collection + +### Synopsis + +Shows the list indexes in the database or for a specific collection. + +If the --collection flag is provided, only the indexes for that collection will be shown. +Otherwise, all indexes in the database will be shown. + +Example: show all index for 'Users' collection: + defradb client index list --collection Users + +``` +defradb client index list [-c --collection ] [flags] +``` + +### Options + +``` + -c, --collection string Collection name + -h, --help help for list +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client index](defradb_client_index.md) - Manage collections' indexes of a running DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_node-identity.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_node-identity.md new file mode 100644 index 0000000..907a959 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_node-identity.md @@ -0,0 +1,55 @@ +## defradb client node-identity + +Get the public information about the node's identity + +### Synopsis + +Get the public information about the node's identity. + +Node uses the identity to be able to exchange encryption keys with other nodes. + +A public identity contains: +- A compressed 33-byte secp256k1 public key in HEX format. +- A "did:key" generated from the public key. + +Example to get the identity of the node: + defradb client node-identity + + + +``` +defradb client node-identity [flags] +``` + +### Options + +``` + -h, --help help for node-identity +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p.md new file mode 100644 index 0000000..d998508 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p.md @@ -0,0 +1,43 @@ +## defradb client p2p + +Interact with the DefraDB P2P system + +### Synopsis + +Interact with the DefraDB P2P system + +### Options + +``` + -h, --help help for p2p +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client p2p collection](defradb_client_p2p_collection.md) - Configure the P2P collection system +* [defradb client p2p info](defradb_client_p2p_info.md) - Get peer info from a DefraDB node +* [defradb client p2p replicator](defradb_client_p2p_replicator.md) - Configure the replicator system + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection.md new file mode 100644 index 0000000..bc1f8c6 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection.md @@ -0,0 +1,44 @@ +## defradb client p2p collection + +Configure the P2P collection system + +### Synopsis + +Add, delete, or get the list of P2P collections. +The selected collections synchronize their events on the pubsub network. + +### Options + +``` + -h, --help help for collection +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p](defradb_client_p2p.md) - Interact with the DefraDB P2P system +* [defradb client p2p collection add](defradb_client_p2p_collection_add.md) - Add P2P collections +* [defradb client p2p collection getall](defradb_client_p2p_collection_getall.md) - Get all P2P collections +* [defradb client p2p collection remove](defradb_client_p2p_collection_remove.md) - Remove P2P collections + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection_add.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection_add.md new file mode 100644 index 0000000..836c066 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection_add.md @@ -0,0 +1,52 @@ +## defradb client p2p collection add + +Add P2P collections + +### Synopsis + +Add P2P collections to the synchronized pubsub topics. +The collections are synchronized between nodes of a pubsub network. + +Example: add single collection + defradb client p2p collection add bae123 + +Example: add multiple collections + defradb client p2p collection add bae123,bae456 + + +``` +defradb client p2p collection add [collectionIDs] [flags] +``` + +### Options + +``` + -h, --help help for add +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p collection](defradb_client_p2p_collection.md) - Configure the P2P collection system + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection_getall.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection_getall.md new file mode 100644 index 0000000..3df290b --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection_getall.md @@ -0,0 +1,45 @@ +## defradb client p2p collection getall + +Get all P2P collections + +### Synopsis + +Get all P2P collections in the pubsub topics. +This is the list of collections of the node that are synchronized on the pubsub network. + +``` +defradb client p2p collection getall [flags] +``` + +### Options + +``` + -h, --help help for getall +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p collection](defradb_client_p2p_collection.md) - Configure the P2P collection system + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection_remove.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection_remove.md new file mode 100644 index 0000000..c3739df --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_collection_remove.md @@ -0,0 +1,52 @@ +## defradb client p2p collection remove + +Remove P2P collections + +### Synopsis + +Remove P2P collections from the followed pubsub topics. +The removed collections will no longer be synchronized between nodes. + +Example: remove single collection + defradb client p2p collection remove bae123 + +Example: remove multiple collections + defradb client p2p collection remove bae123,bae456 + + +``` +defradb client p2p collection remove [collectionIDs] [flags] +``` + +### Options + +``` + -h, --help help for remove +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p collection](defradb_client_p2p_collection.md) - Configure the P2P collection system + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_info.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_info.md new file mode 100644 index 0000000..cf78285 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_info.md @@ -0,0 +1,44 @@ +## defradb client p2p info + +Get peer info from a DefraDB node + +### Synopsis + +Get peer info from a DefraDB node + +``` +defradb client p2p info [flags] +``` + +### Options + +``` + -h, --help help for info +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p](defradb_client_p2p.md) - Interact with the DefraDB P2P system + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator.md new file mode 100644 index 0000000..3c1efbc --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator.md @@ -0,0 +1,44 @@ +## defradb client p2p replicator + +Configure the replicator system + +### Synopsis + +Configure the replicator system. Add, delete, or get the list of persisted replicators. +A replicator replicates one or all collection(s) from one node to another. + +### Options + +``` + -h, --help help for replicator +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p](defradb_client_p2p.md) - Interact with the DefraDB P2P system +* [defradb client p2p replicator delete](defradb_client_p2p_replicator_delete.md) - Delete replicator(s) and stop synchronization +* [defradb client p2p replicator getall](defradb_client_p2p_replicator_getall.md) - Get all replicators +* [defradb client p2p replicator set](defradb_client_p2p_replicator_set.md) - Add replicator(s) and start synchronization + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator_delete.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator_delete.md new file mode 100644 index 0000000..e751ce6 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator_delete.md @@ -0,0 +1,50 @@ +## defradb client p2p replicator delete + +Delete replicator(s) and stop synchronization + +### Synopsis + +Delete replicator(s) and stop synchronization. +A replicator synchronizes one or all collection(s) from this node to another. + +Example: + defradb client p2p replicator delete -c Users '\{"ID": "12D3", "Addrs": ["/ip4/0.0.0.0/tcp/9171"]\}' + + +``` +defradb client p2p replicator delete [-c, --collection] [flags] +``` + +### Options + +``` + -c, --collection strings Collection(s) to stop replicating + -h, --help help for delete +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p replicator](defradb_client_p2p_replicator.md) - Configure the replicator system + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator_getall.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator_getall.md new file mode 100644 index 0000000..c9f9142 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator_getall.md @@ -0,0 +1,49 @@ +## defradb client p2p replicator getall + +Get all replicators + +### Synopsis + +Get all the replicators active in the P2P data sync system. +A replicator synchronizes one or all collection(s) from this node to another. + +Example: + defradb client p2p replicator getall + + +``` +defradb client p2p replicator getall [flags] +``` + +### Options + +``` + -h, --help help for getall +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p replicator](defradb_client_p2p_replicator.md) - Configure the replicator system + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator_set.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator_set.md new file mode 100644 index 0000000..752b3ed --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_p2p_replicator_set.md @@ -0,0 +1,50 @@ +## defradb client p2p replicator set + +Add replicator(s) and start synchronization + +### Synopsis + +Add replicator(s) and start synchronization. +A replicator synchronizes one or all collection(s) from this node to another. + +Example: + defradb client p2p replicator set -c Users '\{"ID": "12D3", "Addrs": ["/ip4/0.0.0.0/tcp/9171"]\}' + + +``` +defradb client p2p replicator set [-c, --collection] [flags] +``` + +### Options + +``` + -c, --collection strings Collection(s) to replicate + -h, --help help for set +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client p2p replicator](defradb_client_p2p_replicator.md) - Configure the replicator system + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_purge.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_purge.md new file mode 100644 index 0000000..82adc92 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_purge.md @@ -0,0 +1,46 @@ +## defradb client purge + +Delete all persisted data and restart + +### Synopsis + +Delete all persisted data and restart. +WARNING this operation cannot be reversed. + +``` +defradb client purge [flags] +``` + +### Options + +``` + -f, --force Must be set for the operation to run + -h, --help help for purge +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_query.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_query.md new file mode 100644 index 0000000..aff8234 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_query.md @@ -0,0 +1,64 @@ +## defradb client query + +Send a DefraDB GraphQL query request + +### Synopsis + +Send a DefraDB GraphQL query request to the database. + +A query request can be sent as a single argument. Example command: + defradb client query 'query \{ ... \}' + +Do a query request from a file by using the '-f' flag. Example command: + defradb client query -f request.graphql + +Do a query request from a file and with an identity. Example command: + defradb client query -i 028d53f37a19afb9a0dbc5b4be30c65731479ee8cfa0c9bc8f8bf198cc3c075f -f request.graphql + +Or it can be sent via stdin by using the '-' special syntax. Example command: + cat request.graphql | defradb client query - + +A GraphQL client such as GraphiQL (https://github.com/graphql/graphiql) can be used to interact +with the database more conveniently. + +To learn more about the DefraDB GraphQL Query Language, refer to https://docs.source.network. + +``` +defradb client query [-i --identity] [request] [flags] +``` + +### Options + +``` + -f, --file string File containing the query request + -h, --help help for query + -o, --operation string Name of the operation to execute in the query + -v, --variables string JSON encoded variables to use in the query +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema.md new file mode 100644 index 0000000..51e3ae0 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema.md @@ -0,0 +1,45 @@ +## defradb client schema + +Interact with the schema system of a DefraDB node + +### Synopsis + +Make changes, updates, or look for existing schema types. + +### Options + +``` + -h, --help help for schema +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client schema add](defradb_client_schema_add.md) - Add new schema +* [defradb client schema describe](defradb_client_schema_describe.md) - View schema descriptions. +* [defradb client schema migration](defradb_client_schema_migration.md) - Interact with the schema migration system of a running DefraDB instance +* [defradb client schema patch](defradb_client_schema_patch.md) - Patch an existing schema type +* [defradb client schema set-active](defradb_client_schema_set-active.md) - Set the active collection version + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_add.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_add.md new file mode 100644 index 0000000..a91c293 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_add.md @@ -0,0 +1,61 @@ +## defradb client schema add + +Add new schema + +### Synopsis + +Add new schema. + +Schema Object with a '@policy(id:".." resource: "..")' linked will only be accepted if: + - ACP is available (i.e. ACP is not disabled). + - The specified resource adheres to the Document Access Control DPI Rules. + - Learn more about [ACP & DPI Rules](/acp/README.md) + +Example: add from an argument string: + defradb client schema add 'type Foo \{ ... \}' + +Example: add from file: + defradb client schema add -f schema.graphql + +Example: add from stdin: + cat schema.graphql | defradb client schema add - + +Learn more about the DefraDB GraphQL Schema Language on https://docs.source.network. + +``` +defradb client schema add [schema] [flags] +``` + +### Options + +``` + -f, --file string File to load a schema from + -h, --help help for add +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema](defradb_client_schema.md) - Interact with the schema system of a DefraDB node + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_describe.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_describe.md new file mode 100644 index 0000000..a3dd96f --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_describe.md @@ -0,0 +1,60 @@ +## defradb client schema describe + +View schema descriptions. + +### Synopsis + +Introspect schema types. + +Example: view all schemas + defradb client schema describe + +Example: view schemas by name + defradb client schema describe --name User + +Example: view schemas by root + defradb client schema describe --root bae123 + +Example: view a single schema by version id + defradb client schema describe --version bae123 + + +``` +defradb client schema describe [flags] +``` + +### Options + +``` + -h, --help help for describe + --name string Schema name + --root string Schema root + --version string Schema Version ID +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema](defradb_client_schema.md) - Interact with the schema system of a DefraDB node + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration.md new file mode 100644 index 0000000..76be24e --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration.md @@ -0,0 +1,45 @@ +## defradb client schema migration + +Interact with the schema migration system of a running DefraDB instance + +### Synopsis + +Make set or look for existing schema migrations on a DefraDB node. + +### Options + +``` + -h, --help help for migration +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema](defradb_client_schema.md) - Interact with the schema system of a DefraDB node +* [defradb client schema migration down](defradb_client_schema_migration_down.md) - Reverses the migration to the specified collection version. +* [defradb client schema migration reload](defradb_client_schema_migration_reload.md) - Reload the schema migrations within DefraDB +* [defradb client schema migration set](defradb_client_schema_migration_set.md) - Set a schema migration within DefraDB +* [defradb client schema migration set-registry](defradb_client_schema_migration_set-registry.md) - Set a schema migration within the DefraDB LensRegistry +* [defradb client schema migration up](defradb_client_schema_migration_up.md) - Applies the migration to the specified collection version. + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_down.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_down.md new file mode 100644 index 0000000..851ea9d --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_down.md @@ -0,0 +1,57 @@ +## defradb client schema migration down + +Reverses the migration to the specified collection version. + +### Synopsis + +Reverses the migration to the specified collection version. +Documents is a list of documents to reverse the migration from. + +Example: migrate from string + defradb client schema migration down --collection 2 '[\{"name": "Bob"\}]' + +Example: migrate from file + defradb client schema migration down --collection 2 -f documents.json + +Example: migrate from stdin + cat documents.json | defradb client schema migration down --collection 2 - + + +``` +defradb client schema migration down --collection [flags] +``` + +### Options + +``` + --collection uint32 Collection id + -f, --file string File containing document(s) + -h, --help help for down +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema migration](defradb_client_schema_migration.md) - Interact with the schema migration system of a running DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_reload.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_reload.md new file mode 100644 index 0000000..07011eb --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_reload.md @@ -0,0 +1,44 @@ +## defradb client schema migration reload + +Reload the schema migrations within DefraDB + +### Synopsis + +Reload the schema migrations within DefraDB + +``` +defradb client schema migration reload [flags] +``` + +### Options + +``` + -h, --help help for reload +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema migration](defradb_client_schema_migration.md) - Interact with the schema migration system of a running DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_set-registry.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_set-registry.md new file mode 100644 index 0000000..e7adb30 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_set-registry.md @@ -0,0 +1,50 @@ +## defradb client schema migration set-registry + +Set a schema migration within the DefraDB LensRegistry + +### Synopsis + +Set a migration to a collection within the LensRegistry of the local DefraDB node. +Does not persist the migration after restart. + +Example: set from an argument string: + defradb client schema migration set-registry 2 '\{"lenses": [...' + +Learn more about the DefraDB GraphQL Schema Language on https://docs.source.network. + +``` +defradb client schema migration set-registry [collectionID] [cfg] [flags] +``` + +### Options + +``` + -h, --help help for set-registry +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema migration](defradb_client_schema_migration.md) - Interact with the schema migration system of a running DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_set.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_set.md new file mode 100644 index 0000000..fa6f094 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_set.md @@ -0,0 +1,57 @@ +## defradb client schema migration set + +Set a schema migration within DefraDB + +### Synopsis + +Set a migration from a source schema version to a destination schema version for +all collections that are on the given source schema version within the local DefraDB node. + +Example: set from an argument string: + defradb client schema migration set bae123 bae456 '\{"lenses": [...' + +Example: set from file: + defradb client schema migration set bae123 bae456 -f schema_migration.lens + +Example: add from stdin: + cat schema_migration.lens | defradb client schema migration set bae123 bae456 - + +Learn more about the DefraDB GraphQL Schema Language on https://docs.source.network. + +``` +defradb client schema migration set [src] [dst] [cfg] [flags] +``` + +### Options + +``` + -f, --file string Lens configuration file + -h, --help help for set +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema migration](defradb_client_schema_migration.md) - Interact with the schema migration system of a running DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_up.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_up.md new file mode 100644 index 0000000..7da6945 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_migration_up.md @@ -0,0 +1,57 @@ +## defradb client schema migration up + +Applies the migration to the specified collection version. + +### Synopsis + +Applies the migration to the specified collection version. +Documents is a list of documents to apply the migration to. + +Example: migrate from string + defradb client schema migration up --collection 2 '[\{"name": "Bob"\}]' + +Example: migrate from file + defradb client schema migration up --collection 2 -f documents.json + +Example: migrate from stdin + cat documents.json | defradb client schema migration up --collection 2 - + + +``` +defradb client schema migration up --collection [flags] +``` + +### Options + +``` + --collection uint32 Collection id + -f, --file string File containing document(s) + -h, --help help for up +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema migration](defradb_client_schema_migration.md) - Interact with the schema migration system of a running DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_patch.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_patch.md new file mode 100644 index 0000000..46460f3 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_patch.md @@ -0,0 +1,60 @@ +## defradb client schema patch + +Patch an existing schema type + +### Synopsis + +Patch an existing schema. + +Uses JSON Patch to modify schema types. + +Example: patch from an argument string: + defradb client schema patch '[\{ "op": "add", "path": "...", "value": \{...\} \}]' '\{"lenses": [...' + +Example: patch from file: + defradb client schema patch -p patch.json + +Example: patch from stdin: + cat patch.json | defradb client schema patch - + +To learn more about the DefraDB GraphQL Schema Language, refer to https://docs.source.network. + +``` +defradb client schema patch [schema] [migration] [flags] +``` + +### Options + +``` + -h, --help help for patch + -t, --lens-file string File to load a lens config from + -p, --patch-file string File to load a patch from + --set-active Set the active schema version for all collections using the root schem +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema](defradb_client_schema.md) - Interact with the schema system of a DefraDB node + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_set-active.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_set-active.md new file mode 100644 index 0000000..7b637da --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_schema_set-active.md @@ -0,0 +1,45 @@ +## defradb client schema set-active + +Set the active collection version + +### Synopsis + +Activates all collection versions with the given schema version, and deactivates all +those without it (if they share the same schema root). + +``` +defradb client schema set-active [versionID] [flags] +``` + +### Options + +``` + -h, --help help for set-active +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client schema](defradb_client_schema.md) - Interact with the schema system of a DefraDB node + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx.md new file mode 100644 index 0000000..01353b8 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx.md @@ -0,0 +1,43 @@ +## defradb client tx + +Create, commit, and discard DefraDB transactions + +### Synopsis + +Create, commit, and discard DefraDB transactions + +### Options + +``` + -h, --help help for tx +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client tx commit](defradb_client_tx_commit.md) - Commit a DefraDB transaction. +* [defradb client tx create](defradb_client_tx_create.md) - Create a new DefraDB transaction. +* [defradb client tx discard](defradb_client_tx_discard.md) - Discard a DefraDB transaction. + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx_commit.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx_commit.md new file mode 100644 index 0000000..557b9f0 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx_commit.md @@ -0,0 +1,44 @@ +## defradb client tx commit + +Commit a DefraDB transaction. + +### Synopsis + +Commit a DefraDB transaction. + +``` +defradb client tx commit [id] [flags] +``` + +### Options + +``` + -h, --help help for commit +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client tx](defradb_client_tx.md) - Create, commit, and discard DefraDB transactions + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx_create.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx_create.md new file mode 100644 index 0000000..f174a09 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx_create.md @@ -0,0 +1,46 @@ +## defradb client tx create + +Create a new DefraDB transaction. + +### Synopsis + +Create a new DefraDB transaction. + +``` +defradb client tx create [flags] +``` + +### Options + +``` + --concurrent Transaction is concurrent + -h, --help help for create + --read-only Transaction is read only +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client tx](defradb_client_tx.md) - Create, commit, and discard DefraDB transactions + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx_discard.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx_discard.md new file mode 100644 index 0000000..671d4f2 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_tx_discard.md @@ -0,0 +1,44 @@ +## defradb client tx discard + +Discard a DefraDB transaction. + +### Synopsis + +Discard a DefraDB transaction. + +``` +defradb client tx discard [id] [flags] +``` + +### Options + +``` + -h, --help help for discard +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client tx](defradb_client_tx.md) - Create, commit, and discard DefraDB transactions + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_view.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_view.md new file mode 100644 index 0000000..bf21e03 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_view.md @@ -0,0 +1,42 @@ +## defradb client view + +Manage views within a running DefraDB instance + +### Synopsis + +Manage (add) views withing a running DefraDB instance + +### Options + +``` + -h, --help help for view +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client](defradb_client.md) - Interact with a DefraDB node +* [defradb client view add](defradb_client_view_add.md) - Add new view +* [defradb client view refresh](defradb_client_view_refresh.md) - Refresh views. + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_view_add.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_view_add.md new file mode 100644 index 0000000..a231362 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_view_add.md @@ -0,0 +1,50 @@ +## defradb client view add + +Add new view + +### Synopsis + +Add new database view. + +Example: add from an argument string: + defradb client view add 'Foo \{ name, ...\}' 'type Foo \{ ... \}' '\{"lenses": [...' + +Learn more about the DefraDB GraphQL Schema Language on https://docs.source.network. + +``` +defradb client view add [query] [sdl] [transform] [flags] +``` + +### Options + +``` + -f, --file string Lens configuration file + -h, --help help for add +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client view](defradb_client_view.md) - Manage views within a running DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_view_refresh.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_view_refresh.md new file mode 100644 index 0000000..28e9151 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_client_view_refresh.md @@ -0,0 +1,66 @@ +## defradb client view refresh + +Refresh views. + +### Synopsis + +Refresh views, executing the underlying query and LensVm transforms and +persisting the results. + +View is refreshed as the current user, meaning the cached items will reflect that user's +permissions. Subsequent query requests to the view, regardless of user, will receive +items from that cache. + +Example: refresh all views + defradb client view refresh + +Example: refresh views by name + defradb client view refresh --name UserView + +Example: refresh views by schema root id + defradb client view refresh --schema bae123 + +Example: refresh views by version id. This will also return inactive views + defradb client view refresh --version bae123 + + +``` +defradb client view refresh [flags] +``` + +### Options + +``` + --get-inactive Get inactive views as well as active + -h, --help help for refresh + --name string View name + --schema string View schema Root + --version string View version ID +``` + +### Options inherited from parent commands + +``` + -i, --identity string Hex formatted private key used to authenticate with ACP + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --tx uint Transaction ID + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb client view](defradb_client_view.md) - Manage views within a running DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_identity.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_identity.md new file mode 100644 index 0000000..cb0d0a6 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_identity.md @@ -0,0 +1,39 @@ +## defradb identity + +Interact with identity features of DefraDB instance + +### Synopsis + +Interact with identity features of DefraDB instance + +### Options + +``` + -h, --help help for identity +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb](defradb.md) - DefraDB Edge Database +* [defradb identity new](defradb_identity_new.md) - Generate a new identity + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_identity_new.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_identity_new.md new file mode 100644 index 0000000..0fc3a73 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_identity_new.md @@ -0,0 +1,53 @@ +## defradb identity new + +Generate a new identity + +### Synopsis + +Generate a new identity + +The generated identity contains: +- A secp256k1 private key that is a 256-bit big-endian binary-encoded number, +padded to a length of 32 bytes in HEX format. +- A compressed 33-byte secp256k1 public key in HEX format. +- A "did:key" generated from the public key. + +Example: generate a new identity: + defradb identity new + + + +``` +defradb identity new [flags] +``` + +### Options + +``` + -h, --help help for new +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb identity](defradb_identity.md) - Interact with identity features of DefraDB instance + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring.md new file mode 100644 index 0000000..362273c --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring.md @@ -0,0 +1,57 @@ +## defradb keyring + +Manage DefraDB private keys + +### Synopsis + +Manage DefraDB private keys. +Generate, import, and export private keys. + +The following keys are loaded from the keyring on start: + peer-key: Ed25519 private key (required) + encryption-key: AES-128, AES-192, or AES-256 key (optional) + +To randomly generate the required keys, run the following command: + defradb keyring generate + +To import externally generated keys, run the following command: + defradb keyring import \ \ + +To learn more about the available options: + defradb keyring --help + + +### Options + +``` + -h, --help help for keyring +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb](defradb.md) - DefraDB Edge Database +* [defradb keyring export](defradb_keyring_export.md) - Export a private key +* [defradb keyring generate](defradb_keyring_generate.md) - Generate private keys +* [defradb keyring import](defradb_keyring_import.md) - Import a private key +* [defradb keyring list](defradb_keyring_list.md) - List all keys in the keyring + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_export.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_export.md new file mode 100644 index 0000000..083654b --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_export.md @@ -0,0 +1,50 @@ +## defradb keyring export + +Export a private key + +### Synopsis + +Export a private key. +Prints the hexadecimal representation of a private key. + +The DEFRA_KEYRING_SECRET environment variable must be set to unlock the keyring. +This can also be done with a .env file in the working directory or at a path +defined with the --secret-file flag. + +Example: + defradb keyring export encryption-key + +``` +defradb keyring export [flags] +``` + +### Options + +``` + -h, --help help for export +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb keyring](defradb_keyring.md) - Manage DefraDB private keys + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_generate.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_generate.md new file mode 100644 index 0000000..9c7b99b --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_generate.md @@ -0,0 +1,64 @@ +## defradb keyring generate + +Generate private keys + +### Synopsis + +Generate private keys. +Randomly generate and store private keys in the keyring. +By default peer and encryption keys will be generated. + +The DEFRA_KEYRING_SECRET environment variable must be set to unlock the keyring. +This can also be done with a .env file in the working directory or at a path +defined with the --secret-file flag. + +WARNING: This will overwrite existing keys in the keyring. + +Example: + defradb keyring generate + +Example: with no encryption key + defradb keyring generate --no-encryption + +Example: with no peer key + defradb keyring generate --no-peer-key + +Example: with system keyring + defradb keyring generate --keyring-backend system + +``` +defradb keyring generate [flags] +``` + +### Options + +``` + -h, --help help for generate + --no-encryption Skip generating an encryption key. Encryption at rest will be disabled + --no-peer-key Skip generating a peer key. +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb keyring](defradb_keyring.md) - Manage DefraDB private keys + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_import.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_import.md new file mode 100644 index 0000000..d6a275d --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_import.md @@ -0,0 +1,50 @@ +## defradb keyring import + +Import a private key + +### Synopsis + +Import a private key. +Store an externally generated key in the keyring. + +The DEFRA_KEYRING_SECRET environment variable must be set to unlock the keyring. +This can also be done with a .env file in the working directory or at a path +defined with the --secret-file flag. + +Example: + defradb keyring import encryption-key 0000000000000000 + +``` +defradb keyring import [flags] +``` + +### Options + +``` + -h, --help help for import +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb keyring](defradb_keyring.md) - Manage DefraDB private keys + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_list.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_list.md new file mode 100644 index 0000000..fb43aef --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_keyring_list.md @@ -0,0 +1,48 @@ +## defradb keyring list + +List all keys in the keyring + +### Synopsis + +List all keys in the keyring. +The DEFRA_KEYRING_SECRET environment variable must be set to unlock the keyring. +This can also be done with a .env file in the working directory or at a path +defined with the --secret-file flag. + +Example: + defradb keyring list + +``` +defradb keyring list [flags] +``` + +### Options + +``` + -h, --help help for list +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb keyring](defradb_keyring.md) - Manage DefraDB private keys + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_server-dump.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_server-dump.md new file mode 100644 index 0000000..3aafdcf --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_server-dump.md @@ -0,0 +1,38 @@ +## defradb server-dump + +Dumps the state of the entire database + +``` +defradb server-dump [flags] +``` + +### Options + +``` + -h, --help help for server-dump +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb](defradb.md) - DefraDB Edge Database + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_start.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_start.md new file mode 100644 index 0000000..5aea7e8 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_start.md @@ -0,0 +1,55 @@ +## defradb start + +Start a DefraDB node + +### Synopsis + +Start a DefraDB node. + +``` +defradb start [flags] +``` + +### Options + +``` + --allowed-origins stringArray List of origins to allow for CORS requests + --development Enables a set of features that make development easier but should not be enabled in production: + - allows purging of all persisted data + - generates temporary node identity if keyring is disabled + -h, --help help for start + --max-txn-retries int Specify the maximum number of retries per transaction (default 5) + --no-encryption Skip generating an encryption key. Encryption at rest will be disabled. WARNING: This cannot be undone. + --no-p2p Disable the peer-to-peer network synchronization system + --p2paddr strings Listen addresses for the p2p network (formatted as a libp2p MultiAddr) (default [/ip4/127.0.0.1/tcp/9171]) + --peers stringArray List of peers to connect to + --privkeypath string Path to the private key for tls + --pubkeypath string Path to the public key for tls + --store string Specify the datastore to use (supported: badger, memory) (default "badger") + --valuelogfilesize int Specify the datastore value log file size (in bytes). In memory size will be 2*valuelogfilesize (default 1073741824) +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb](defradb.md) - DefraDB Edge Database + diff --git a/defradb_versioned_docs/version-0.19.0/references/cli/defradb_version.md b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_version.md new file mode 100644 index 0000000..fdd5010 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/cli/defradb_version.md @@ -0,0 +1,40 @@ +## defradb version + +Display the version information of DefraDB and its components + +``` +defradb version [flags] +``` + +### Options + +``` + -f, --format string Version output format. Options are text, json + --full Display the full version information + -h, --help help for version +``` + +### Options inherited from parent commands + +``` + --keyring-backend string Keyring backend to use. Options are file or system (default "file") + --keyring-namespace string Service name to use when using the system backend (default "defradb") + --keyring-path string Path to store encrypted keys when using the file backend (default "keys") + --log-format string Log format to use. Options are text or json (default "text") + --log-level string Log level to use. Options are debug, info, error, fatal (default "info") + --log-output string Log output path. Options are stderr or stdout. (default "stderr") + --log-overrides string Logger config overrides. Format ,=,...;,... + --log-source Include source location in logs + --log-stacktrace Include stacktrace in error and fatal logs + --no-keyring Disable the keyring and generate ephemeral keys + --no-log-color Disable colored log output + --rootdir string Directory for persistent data (default: $HOME/.defradb) + --secret-file string Path to the file containing secrets (default ".env") + --source-hub-address string The SourceHub address authorized by the client to make SourceHub transactions on behalf of the actor + --url string URL of HTTP endpoint to listen on or connect to (default "127.0.0.1:9181") +``` + +### SEE ALSO + +* [defradb](defradb.md) - DefraDB Edge Database + diff --git a/defradb_versioned_docs/version-0.19.0/references/config.md b/defradb_versioned_docs/version-0.19.0/references/config.md new file mode 100644 index 0000000..e3733e7 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/config.md @@ -0,0 +1,171 @@ +--- +sidebar_label: Config +sidebar_position: 1 +--- + +# DefraDB configuration (YAML) + +The default DefraDB directory is `$HOME/.defradb`. It can be changed via the --rootdir CLI flag. + +Relative paths are interpreted as being rooted in the DefraDB directory. + +## `development` + +Enables a set of features that make development easier but should not be enabled in production. + +## `datastore.store` + +Store can be badger or memory. Defaults to `badger`. + +- badger: fast pure Go key-value store optimized for SSDs (https://github.com/dgraph-io/badger) +- memory: in-memory version of badger + +## `datastore.maxtxnretries` + +The number of retries to make in the event of a transaction conflict. Defaults to `5`. + +Currently this is only used within the P2P system and will not affect operations initiated by users. + +## `datastore.noencryption` + +Skip generating an encryption key. Encryption at rest will be disabled. **WARNING**: This cannot be undone. + +## `datastore.badger.path` + +The path to the database data file(s). Defaults to `data`. + +## `datastore.badger.valuelogfilesize` + +Maximum file size of the value log files. + +## `api.address` + +Address of the HTTP API to listen on or connect to. Defaults to `127.0.0.1:9181`. + +## `api.allowed-origins` + +The list of origins a cross-domain request can be executed from. + +## `api.pubkeypath` + +The path to the public key file for TLS / HTTPS. + +## `api.privkeypath` + +The path to the private key file for TLS / HTTPS. + +## `net.p2pdisabled` + +Whether P2P networking is disabled. Defaults to `false`. + +## `net.p2paddresses` + +List of addresses for the P2P network to listen on. Defaults to `/ip4/127.0.0.1/tcp/9171`. + +## `net.pubsubenabled` + +Whether PubSub is enabled. Defaults to `true`. + +## `net.peers` + +List of peers to boostrap with, specified as multiaddresses. + +https://docs.libp2p.io/concepts/addressing/ + +## `net.relay` + +Enable libp2p's Circuit relay transport protocol. Defaults to `false`. + +https://docs.libp2p.io/concepts/circuit-relay/ + +## `log.level` + +Log level to use. Options are `info` or `error`. Defaults to `info`. + +## `log.output` + +Log output path. Options are `stderr` or `stdout`. Defaults to `stderr`. + +## `log.format` + +Log format to use. Options are `text` or `json`. Defaults to `text`. + +## `log.stacktrace` + +Include stacktrace in error and fatal logs. Defaults to `false`. + +## `log.source` + +Include source location in logs. Defaults to `false`. + +## `log.overrides` + +Logger config overrides. Format `,=,...;,...`. + +## `log.colordisabled` + +Disable colored log output. Defaults to `false`. + +## `keyring.path` + +Path to store encrypted key files in. Defaults to `keys`. + +## `keyring.disabled` + +Disable the keyring and generate ephemeral keys instead. Defaults to `false`. + +## `keyring.namespace` + +The service name to use when using the system keyring. Defaults to `defradb`. + +## `keyring.backend` + +Keyring backend to use. Defaults to `file`. + +- `file` Stores keys in encrypted files +- `system` Stores keys in the OS managed keyring + +## `lens.runtime` + +The LensVM wasm runtime to run lens modules in. + +Possible values: +- `wasm-time` (default): https://github.com/bytecodealliance/wasmtime-go +- `wasmer` (windows not supported): https://github.com/wasmerio/wasmer-go +- `wazero`: https://github.com/tetratelabs/wazero + +## `acp.type` + +The type of ACP module to use. + +Possible values: +- `none` (default): No ACP +- `local` local-only ACP +- `source-hub` source hub ACP: https://github.com/sourcenetwork/sourcehub + +## `acp.sourceHub.ChainID` + +The ID of the SourceHub chain to store ACP data in. Required when using `acp.type`:`source-hub`. + +## `acp.sourceHub.GRPCAddress` + +The address of the SourceHub GRPC server. Required when using `acp.type`:`source-hub`. + +## `acp.sourceHub.CometRPCAddress` + +The address of the SourceHub Comet RPC server. Required when using `acp.type`:`source-hub`. + +## `acp.sourceHub.KeyName` + +The name of the key in the keyring where the SourceHub credentials used to sign (and pay for) SourceHub +transactions created by the node is stored. Required when using `acp.type`:`source-hub`. + +## `acp.sourceHub.address` + +The SourceHub address of the actor that client-side actions should permit to make SourceHub actions on +their behalf. This is a client-side only config param. It is required if the client wishes to make +SourceHub ACP requests in order to create protected data. + +## `secretfile` + +Path to the file containing secrets. Defaults to `.env`. diff --git a/defradb_versioned_docs/version-0.19.0/references/query-specification/_category_.json b/defradb_versioned_docs/version-0.19.0/references/query-specification/_category_.json new file mode 100644 index 0000000..15871c9 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/query-specification/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Query specification", + "position": 1 +} \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/references/query-specification/aggregate-functions.md b/defradb_versioned_docs/version-0.19.0/references/query-specification/aggregate-functions.md new file mode 100644 index 0000000..a22690c --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/query-specification/aggregate-functions.md @@ -0,0 +1,47 @@ +--- +sidebar_label: Aggregate Functions +sidebar_position: 115 +--- + +# Aggregate Functions + +The most common use case of grouping queries is to compute some aggregate function over the sub-group. Like the special `_group` field, aggregate functions are defined and returned using special fields. These fields prefix the target field name with the name of the aggregate function you wish to apply. If we had the field `rating`, we could access the average value of all sub-group ratings by including the special field `_avg { rating }` in our return object. The available aggregate functions and their associated scalars can be found above in `Table 3`. + +The special aggregate function fields' format is the function name and the field name as its sub-elements. Specifically: `_$function { $field }`, where `$function` is the list of functions from `Table 3`, and `$field` is the field name to which the function will be applied to. E.g., applying the `max` function to the `rating` field becomes `_max { rating }`. + +Let us augment the previous grouped books by genre example and include an aggregate function on the sub-groups ratings. +```graphql +{ + Books(filter: {author: {name: {_like: "John%"}}}, groupBy: [genre]) { + genre + _avg { + rating + points + } + _group { + title + rating + } + } +} +``` + +Here we return the average of all the ratings of the books whose authors name begins with "John" grouped by the genres. + +We can also use simpler queries, without any `groupBy` clause, and still use aggregate functions. The difference is, instead of applying the aggregate function to only the sub-group, it applies it to the entire result set. + +Let's simply count all the objects returned by a given filter. +```graphql +{ + _count(Books: {filter: {rating: {_gt: 3.5}}}) +} +``` +This returns an array of objects that includes the respective books title, along with the repeated `_count` field, which is the total number of objects that match the filter. + +> Note, the special aggregate field `_count` has no subfields selected, so instead of applying the `count` function to a field, it applies to the entire object. This is only possible with the `count` function; all the other aggregate functions must specify their target field using the correct field name selection. + +We can further simplify the above count query by including only the `_count` field. If we ***only*** return the `_count` field, then a single object is returned, instead of an array of objects. + +DefraDB also supports applying aggregate functions to relations just like we do fields. However, only the `count` function is available directly on the related object type. + + diff --git a/defradb_versioned_docs/version-0.19.0/references/query-specification/aliases.md b/defradb_versioned_docs/version-0.19.0/references/query-specification/aliases.md new file mode 100644 index 0000000..32be263 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/query-specification/aliases.md @@ -0,0 +1,51 @@ +--- +sidebar_label: Aliases +sidebar_position: 90 +--- +# Aliases + +If the structure of a returned query is not ideal for a given application, you can rename fields and entire query results to suit your use case. This is particularly useful, and sometimes necessary when using multiple queries within a single request. + +```graphql +{ + topTenBooks: Books(order: {rating: DESC}, limit: 10) { + title + genre + description + } +} +``` + +In the above example, the books result is renamed to `topTenBooks`, which can be useful for semantic reasoning about the request, and for organizational purposes. It is suggested in production deployments to name your queries properly. + +```graphql +{ + topTenBooks: Books(order: {rating: DESC}, limit: 10) { + title + genre + description + } + + bottomTenBooks: Books(order: {rating: ASC}, limit: 10) { + title + genre + description + } +} +``` + +In this query the two returned results are named `topTenBooks` and `bottomTenBooks` respectively. When dealing with multiple queries of the same type (e.g., `books`), it is required to alias one from another. + +Additionally, we can alias individual fields within our returned types. Aliasing a field works the same way as aliasing a query. + +```graphql +{ + Books { + name: title + genre + description + } +} +``` + +In the above example, we have renamed the `title` field to `name`. Unlike query aliases, there is no requirement in any context because name collisions are impossible within a defined query return type. diff --git a/defradb_versioned_docs/version-0.19.0/references/query-specification/collections.md b/defradb_versioned_docs/version-0.19.0/references/query-specification/collections.md new file mode 100644 index 0000000..08003c5 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/query-specification/collections.md @@ -0,0 +1,9 @@ +--- +sidebar_label: Collections +sidebar_position: 40 +--- +# Collections + +A **collection** is like a SQL table, which represents a group of documents with similar structures. Every developer-defined type is attached to a collection. + +Each collection gets an auto-generated query field, allowing users and developers to query, filter, select, and interact with documents in different ways. \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/references/query-specification/database-api.md b/defradb_versioned_docs/version-0.19.0/references/query-specification/database-api.md new file mode 100644 index 0000000..4bf9533 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/query-specification/database-api.md @@ -0,0 +1,113 @@ +--- +sidebar_label: Database API +sidebar_position: 160 +--- +# Database API + +So far, all the queries and mutations that have been discussed were specific to the stored and managed developer or user-created objects. However, that is only one aspect of DefraDB's GraphQL API. The other part of DefraDB GraphQL API is the auxiliary APIs, which include MerkleCRDT Traversal, Schema Management, and more. + +## MerkleCRDTs + +All objects in DefraDB are stored in MerkleCRDTs (see [Merkle CRDT Guide](../../guides/merkle-crdt.md)). These MerkleCRDTs are represented as a series of small updates connected in a MerkleDAG. The MerkleDAG is a Merklized version of a DAG (Directed Acyclical Graph), which means that each node in the DAG references a parent node through some kind of Content Identifier (CID). + +The image below shows an example structure of a MerkleDAG. + +![](https://mvpworkshop.co/wp-content/uploads/2021/01/ipfs-inarticle7.jpeg) + +The `Head` CID represents the "current" or "latest" state of a MerkleDAG. + +DefraDB allows you to query, traverse, and validate the DAG structure, allowing for self-verifying data structures. + +In DefraDB Database API, DAG nodes are represented as `Commit`, `CommitLink`, and `Delta` types. They are defined as shown below: + +```graphql +# Commit is an individual node in a CRDTs MerkleDAG +type Commit { + cid: String // cid is the Content Identifier of this commit + height: Int // height is the incremental version of the current commit + delta: Delta // delta is the delta-state update generated by a CRDT mutation + previous: [Commit] // previous is the links to the previous node in the MerkleDAG + links: [CommitLink] // links are any additional commits this commit may reference. +} + +# CommitLink is a named link to a commit +type CommitLink { + name: String // name is the name of the CommitLink + commit: Commit // commit is the linked commit +} + +# Delta is the differential state change from one node to another +type Delta { + payload: String // payload is a base64 encoded byte-array. +} +``` + +To query the latest commit of an object (with id: '123'): +```graphql +query { + latestCommits(docID: "123") { + cid + height + delta { + payload + } + } +} +``` + +To query all the commits of an object (with id: '123'): +```graphql +query { + allCommits(docID: "123") { + cid + height + delta { + payload + } + } +} +``` + +To query a specific commit: +```graphql +query { + Commits(cid: 'Qm123') { + cid + height + delta { + payload + } + } +} +``` + +In addition to using `Commits` specific queries, include commit version sub-fields in object queries. + +```graphql +query { + User { + _key + name + age + + _version { + cid + height + } + } +} +``` + +The above example shows how to query for the additional `_version` field that is generated automatically for each added schema type. The `_version` has the same execution as `latestCommits`. + +Both `_version` and `latestCommits` return an array of `Commits` types because the `HEAD` of the MerkleDAG can point to more than one DAG node. This is caused by two concurrent updates to the DAG at the same height. The DAG usually has a single head. However, it can also have multiple heads. + +Commits queries also work with aggregates, grouping, limit, offset, order, dockey, cid, and depth +There is __typename introspection keyword that works on all queries that does not appear to be documented anywhere, for example: + +```graphql +commits(dockey: "bae-52b9170d-b77a-5887-b877-cbdbb99b009f") { + cid + __typename +} +``` diff --git a/defradb_versioned_docs/version-0.19.0/references/query-specification/execution-flow.md b/defradb_versioned_docs/version-0.19.0/references/query-specification/execution-flow.md new file mode 100644 index 0000000..61d4054 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/query-specification/execution-flow.md @@ -0,0 +1,43 @@ +--- +sidebar_label: Execution Flow +sidebar_position: 140 +--- +# Execution Flow + +Understanding the execution flow of a query can help understand its structure, and help you with your queries. Query execution is broken down into the following three phases: +- Parsing +- Planning +- Executing + +## Parsing Phase + +The parsing phase parses the query as a string and returns a structured Abstract Syntax Tree (AST) representation. It also does a semantic validation of the structure against the schema. + +## Planning Phase + +The planning phase analyzes the query, the storage structure, and any additional indexes to determine query execution. This phase is highly dependant on the deployment environment and underlying storage engine as it uses available features and structure to provide optimal performance. Specific schemas automatically create certain secondary indexes. The planning phase automatically uses available custom secondary indexes created by you. + +## Execution Phase + +The execution phase does data scanning, filtering, and formatting. This phase has a deterministic process towards the steps taken to produce results. This is due to the priority an argument and its parameters have over another. + +The priority order of arguments is as follows: + +1. filter -> groupBy: Filtered Data +1. groupBy -> aggregate: Subgroups +1. aggregate -> having: Subgroups +1. having -> order: Filtered Data +1. order -> limit: Ordered Data + +Each step has a specific purpose as described here. + +1. `filter` argument breaks down the target collection (based on provided parameters and fields) into the output result set. +1. `groupBy` argument divides the result set further into subgroups across potentially several dimensions. +1. `aggregate` phase processes a subgroup's given fields. +1. `having` argument filters the data based on the grouped fields or aggregate results. +1. `order` argument structures the result set based on the ordering (ascending or descending) of one or more field values. +1. `limit` argument and its associated arguments restrict the number of the finalized, filtered, ordered result set. + +See the image below for an example of the execution order: + +![](https://i.imgur.com/Yf0KJ5A.png) \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/references/query-specification/filtering.md b/defradb_versioned_docs/version-0.19.0/references/query-specification/filtering.md new file mode 100644 index 0000000..e19dc94 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/query-specification/filtering.md @@ -0,0 +1,213 @@ +--- +sidebar_label: Filtering +sidebar_position: 50 +--- +# Filtering + +Filtering is used to screen data entries containing the specified fields and predicates (including compound predicates) out of a collection of documents using conditional keywords like `_and`, `_or`, `_not`. To accomplish this, the `filter` keyword can be applied as an argument to root level fields and subfields. + +An empty `filter` object is equivalent to no filters being applied. Hence, the output will return all books. The following example displays an empty filter being applied on the root level field. + +```graphql +{ + Books(filter: {}) { + title + genre + description + } +} +``` + +Some filtering options depend on the available indexes on a field. However, we will not be discuss them in this section. + +To apply a filter to a specific field, we can specify it within the filter object. The example below only returns books with the title “A Painted House”. + +```graphql +{ + Books(filter: { title: { _eq: "A Painted House" }}) { + title + genre + description + } +} +``` + +We can apply filters to all or multiple fields available. + +**NOTE:** Each additional field listed in the filter object implies to a conditional AND relation. + +```graphql +{ + Books(filter: { title: {_eq: "A Painted House"}, genre: {_eq: "Thriller" }}) { + title + genre + description + } +} +``` + +The above query only returns books with the title “A Painted House” AND genre “Thriller”. + +Filters can also be applied on subfields that have relational objects within them. For example: an object Book, with an Author field, has a many-to-one relationship to the Author object. Then we can query and filter based on the value of the Author field. + +```graphql +{ + Books(filter: { genre: {_eq: "Thriller"}, author: {name: {_eq: "John Grisham"}}}) { + title + genre + description + Author { + name + bio + } + } +} +``` + +This query returns all books authored by “John Grisham” with the genre “Thriller”. + +Filtering from the root object level, compared to the sub-object level results in different semantics. Root filters that apply to sub-objects (aka `author` section of the above query), only returns the root object type if both the root object and sub-object conditions are fulfilled. For example, if the author filter condition is satisfied, the above code snippet only returns books. + +This applies to both single sub-objects and array sub-objects, i.e., if we apply a filter on a sub-object array, the output **only** returns the root object, if at least one sub-object matches the given filter instead of requiring **every** sub-object to match the query. For example, the following query will only return authors, if they have **at least** one thriller genre based book. + +```graphql +{ + Authors(filter: {book: {genre: {_eq: "Thriller"}}}) { + name + bio + } +} +``` + +Additionally, in the selection set, if we include the sub-object array we are filtering on, the filter is then implicitly applied unless otherwise specified. + +In the query snippet above, let's add `books` to the selection set using the query below . +```graphql +{ + Authors(filter: {book: {genre: {_eq: "Thriller"}}}) { + name + bio + books { + title + genre + } + } +} +``` + +Here, the `books` section will only contain books that match the root object filter, namely, `{genre: {_eq: "Thriller"}}`. If we wish to return the same authors from the above query and include *all* their books, we can add an explicit filter directly to the sub-object instead of the sub-filters. + +```graphql +{ + Authors(filter: {book: {genre: {_eq: "Thriller"}}}) { + name + bio + books(filter: {}) { + title + genre + } + } +} +``` + +In the code snippet above, the output returns authors who have at least one book with the genre "Thriller". The output also returns **all** the books written by these selected authors (not just the thrillers). + +Filters applied solely to sub-objects, which are only applicable for array types, are computed independently from the root object filters. + +```graphql +{ + Authors(filter: {name: {_eq: "John Grisham"}}) { + name + bio + books(filter: { genre: {_eq: "Thriller" }}) { + title + genre + description + } + } +} +``` + +The above query returns all authors with the name “John Grisham”, then filters and returns all the returned authors' books with the genre “Thriller”. This is similar to the previous query, but an important distinction is that it will return all the matching author objects regardless of the book's sub-object filter. + +The first query, will only return an output if there are any Thriller books written by the author “John Grisham” (using AND condition i.e., both conditions have to be fulfilled). The second query always returns all authors named “John Grisham”, and their Thriller genre books. + +So far, we have only seen examples of EXACT string matches, but we can also filter using scalar value type or object fields. For e.g., booleans, integers, floating points, etc. Also, comparison operators like: Greater Than, Less Than, Equal To or Greater than, Less Than or Equal To, EQUAL can be used. + +Let's query for all books with a rating greater than or equal to 4. + +```graphql +{ + Books(filter: { rating: { _gte: 4 } }) { + title + genre + description + } +} +``` + +**NOTE:** In the above example, the expression contains a new scalar type object `{ _gte: 4 }`. While previously, where we had a simple string value. If a scalar type field has a filter with an object value, then that object's first and only key must be a comparison operator like `_gte`. If the filter is given a simple scalar value like “John Grisham”, “Thriller”, or FALSE, then the default operator that should be used is `_eq` (EQUAL). The following table displays a list of available operators: + + +| Operator | Description | +| -------- | -------- | +| `_eq` | Equal to | +| `_neq` | Not Equal to | +| `_gt` | Greater Than | +| `_gte` | Greater Than or Equal to | +| `_lt` | Less Than | +| `_lte` | Less Than or Equal to | +| `_in` | In the List | +| `_nin` | Not in the List | +| `_like` | Like Sub-String | +|`_nlike` | Unlike Sub-String | +###### Table 1. Supported operators. + +The table below displays the operators that can be used for every value type: + + +| Scalar Type | Operators | +| -------- | -------- | +| String | `_eq, _neq, _like, _in, _nin` | +| Integer | `_eq, _neq, _gt, _gte, _lt, _lte, _in, _nin` | +| Floating Point | `_eq, _neq, _gt, _gte, _lt, _lte, _in, _nin` | +| Boolean | `_eq, _neq, _in, _nin` | +| DateTime | `_eq, _neq, _gt, _gte, _lt, _lte, _in, _nin` | +###### Table 2. Operators supported by Scalar types. + +There are 3 types of conditional keywords, i.e, `_and`, `_or`, and `_not`. Conditional keywords like `_and` and `_or` are used when we need to apply filters on multiple fields simultaneously. The `_not` conditional keyword only accepts an object. + +The code snippet below queries all books that are a part of the Thriller genre, or have a rating between 4 to 5. + +```graphql +{ + Books( + filter: { + _or: [ + {genre: {_eq: "Thriller"}}, + { _and: [ + {rating: { _gte: 4 }}, + {rating: { _lte: 5 }}, + ]}, + ] + } + ) + title + genre + description +} +``` + +An important thing to note about the above query is the `_and` conditional. Even though AND is assumed, if we have two filters on the same field, we MUST specify the `_and` operator. This is because JSON objects cannot contain duplicate fields. + +>**Invalid**: +`filter: { rating: { _gte: 4 }, rating { _lte: 5 } }` +>**Valid**: +`filter: { _and: [ {rating: {_gte: 4}}, {rating: {_lte: 5}} ]}` + +The `_not` conditional accepts an object instead of an array. + +> Filter all objects that *do not* have the genre "Thriller" +> `filter: { _not: { genre: { _eq: "Thriller" } } }` + +*The`_not` operator should only be used when the available filter operators like `_neq` do not fit the use case.* diff --git a/defradb_versioned_docs/version-0.19.0/references/query-specification/grouping.md b/defradb_versioned_docs/version-0.19.0/references/query-specification/grouping.md new file mode 100644 index 0000000..babbc67 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/query-specification/grouping.md @@ -0,0 +1,83 @@ +--- +sidebar_label: Grouping +sidebar_position: 110 +--- +# Grouping + +Grouping allows a collection of results from a query to be "grouped" into sections based on some field. These sections are called sub-groups, and are based on the equality of fields within objects, resulting in clusters of groups. Any object field may be used to group objects together. Additionally, multiple fields may be used in the group by clause to further segment the groups over multiple dimensions. + +Once one or more group by fields have been selected using the `groupBy` argument, which accepts an array of length one or more, you may only access certain fields in the return object. Only the indicated `groupBy` fields and aggregate function results may be included in the result object. If you wish to access the sub-groups of individual objects, a special return field called `_group` is available. This field matches the root query type, and can access any field in the object type. + +In the example below, we are querying for all the books whose author's name begins with 'John'. The results will then be grouped by genre, and will return the genre name and the sub-groups `title` and `rating`. +```graphql +{ + Books(filter: {author: {name: {_like: "John%"}}}, groupBy: [genre]) { + genre + _group { + title + rating + } + } +} +``` + +In the above example, we can see how the `groupBy` argument is provided and that it accepts an array of field names. We can also see how the special `_group` field can be used to access the sub-group elements. + +It's important to note that in the above example, the only available field from the root `Book` type is the `groupBy` field `genre`, along with the special group and aggregate proxy fields. + +#### Grouping on Multiple Fields +As mentioned, we can include any number of fields in the `groupBy` argument to segment the data further. Which can then also be accessed in the return object, as demonstrated in the example below: +```graphql +{ + Books(filter: {author: {name: {_like: "John%"}}}, groupBy: [genre, rating]) { + genre + rating + _group { + title + description + } + } +} +``` + +#### Grouping on Related Objects +Objects often have related objects within their type definition indicated by the `@relation` directive on the respective object. We can use the grouping system to split results over the related object and the root type fields. + +Like any other group query, we are limited in which fields we can access indicated by the `groupBy` argument's fields. If we include a subtype that has a `@relation` directive in the `groupBy` list, we can access the entire relations fields. + +Only "One-to-One" and "One-to-Many" relations can be used in a `groupBy` argument. + +Given a type definition defined as: +```graphql +type Book { + title: String + genre: String + rating: Float + author: Author @relation +} + +type Author { + name: String + written: [Book] @relation +} +``` + +We can create a group query over books and their authors, as demonstrated in the example below: +```graphql +{ + Books(groupBy: [author]) { + Author { + name + } + _group { + title + genre + rating + } + } +} +``` + +As you can see, we can access the entire `Author` object in the main return object without having to use any special proxy fields. + +Group operations can include any combination, single or multiple, individual field or related object, that a developer needs. diff --git a/defradb_versioned_docs/version-0.19.0/references/query-specification/limiting-and-pagination.md b/defradb_versioned_docs/version-0.19.0/references/query-specification/limiting-and-pagination.md new file mode 100644 index 0000000..983c56d --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/query-specification/limiting-and-pagination.md @@ -0,0 +1,33 @@ +--- +sidebar_label: Limiting and Pagination +sidebar_position: 70 +--- +# Limiting and Pagination + +After filtering and sorting a query, we can then limit and skip elements from the returned set of objects. + +Let us get the top 10 rated books: +```graphql +{ + Books(order: {rating: DESC}, limit: 10) { + title + genre + description + } +} +``` + +The `limit` function accepts the maximum number of items to return from the resulting set. Next, we can `skip` elements in the set, to get the following N objects from the return set. Both these functions can be used to create a pagination system, where we have a limit on number of items per page, and can skip through pages as well. + +Let's get the *next* top 10 rated books after the previous query: +```graphql +{ + Books(order: {rating: DESC}, limit: 10, offset: 10) { + title + genre + description + } +} +``` + +Limits and offsets can be combined to create several different pagination methods. \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/references/query-specification/mutation-block.md b/defradb_versioned_docs/version-0.19.0/references/query-specification/mutation-block.md new file mode 100644 index 0000000..c22c46d --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/query-specification/mutation-block.md @@ -0,0 +1,156 @@ +--- +sidebar_label: Mutation Block +sidebar_position: 150 +--- +# Mutation Block + +Mutations are the `write` side of the DefraDB Query Language. They rely on the query system to function properly. Updates, upserts and deletes, all require filtering and finding data before taking action. + +The data and payload format that mutations use is fundamental to maintaining the designed structure of the database. All mutation definitions are generated for each defined type in the Database. This is similar to the read query system. + +Mutations are similar to SQL `INSERT INTO ...` or `UPDATE` statements. Much like the Query system, all mutations exist inside a `mutation { ... }` block. Several mutations can be run at the same time, independently of one another. + +## Insert + +Insert is used to create new documents from scratch. This involves many necessary steps to ensure all the data is structured properly and verifiable. From a developer's perspective, it's the easiest of all the mutations as it doesn't require any queries or document lookups before execution. + +```graphql +type Book { ... } + +mutation { + create_Book(input: createBookInput) [Book] +} +``` + +The above example displays the general structure of an insert mutation. You call the `create_TYPE` mutation, with the given input. + +### Input Object Type + +All mutations use a typed input object to update the data. + +The following is an example with a full type and input object: + +```graphql +type Book { + title: String + description: String + rating: Float +} + +mutation { + create_Book(input: { + title: "Painted House", + description: "The story begins as Luke Chandler ...", + rating: 4.9 + }) { + title + description + rating + } +} +``` + +The above is a simple example of creating a Book using an insert mutation. Additionally, we can see that much like the Query functions, we can select the fields we want to be returned here. + +The generated insert mutation returns the same type it creates, in this case, a Book type. So we can easily include all the fields as a selection set so that we can return them. + +More specifically, the return type is of type `[Book]`. So we can create and return multiple books at once. + +## Update + +Updates are distinct from Inserts in several ways. Firstly, it relies on a query to select the correct document or documents to update. Secondly, it uses a different payload system. + +Update filters use the same format and types from the Query system. Hence, it easily transferable. + +The structure of the generated update mutation for a `Book` type is given below: +```graphql +mutation { + update_Book(docID: ID, filter: BookFilterArg, input: updateBookInput) [Book] +} +``` + +See the structure and syntax of the filter query above. You can also see an additional field `id`, thawhich will supersede the `filter`; this makes it easy to update a single document by a given ID. + +The input object type is the same for both `update_TYPE` and `create_TYPE` mutations. + +Here's an example. +```json +{ + name: "John", + rating: nil +} +``` + +This update sets the `name` field to "John" and deletes the `rating` field value. + +Once we create our update, and select which document(s) to update, we can query the new state of all documents affected by the mutation. This is because our update mutation returns the type it mutates. + +A basic example is provided below: +```graphql +mutation { + update_Book(docID: '123', input: {name: "John"}) { + _key + name + } +} + +``` + +Here, we can see that after applying the mutation, we return the `_key` and `name` fields. We can return any field from the document (not just the updated ones). We can even return and filter on related types. + +Beyond updating by an ID or IDs, we can use a query filter to select which fields to apply our update to. This filter works the same as the queries. + +```graphql +mutation { + update_Book(filter: {rating: {_le: 1.0}}, input: {rating: 1.5}) { + _key + rating + name + } +} +``` + +Here, we select all documents with a rating less than or equal to 1.0, update the rating value to 1.5, and return all the affected documents `_key`, `rating`, and `name` fields. + +For additional filter details, see the above `Query Block` section. + + +## Delete + +Deleting mutations allow developers and users to remove objects from collections. You can delete using specific Document Keys, a list of doc keys, or a filter statement. + +The document selection interface is identical to the `Update` system. Much like the update system, we can return the fields of the deleted documents. + +The structure of the generated delete mutation for a `Book` type is given below: +```graphql +mutation { + delete_Book(docID: ID, ids: [ID], filter: BookFilterArg) [Book] +} +``` + +Here, we can delete a document with ID '123': +```graphql +mutation { + delete_User(docID: '123') { + _key + name + } +} +``` + +This will delete the specific document, and return the `_key` and `name` for the deleted document. + +DefraDB currently uses a Hard Delete system, which means that when a document is deleted, it is completely removed from the database. + +Similar to the Update system, you can use a filter to select which documents to delete, as shown below: + +```graphql +mutation { + delete_User(filter: {rating: {_gt: 3}}) { + _key + name + } +} +``` + +Here, we are deleting all the matching documents (documents with a rating greater than 3). diff --git a/defradb_versioned_docs/version-0.19.0/references/query-specification/query-block.md b/defradb_versioned_docs/version-0.19.0/references/query-specification/query-block.md new file mode 100644 index 0000000..81ff227 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/query-specification/query-block.md @@ -0,0 +1,9 @@ +--- +sidebar_label: Query Block +sidebar_position: 30 +--- +# Query Block + +Query blocks are read-only GraphQL operations designed only to request information from the database, without the ability to mutate the database state. They contain multiple subqueries which are executed concurrently, unless there is some variable dependency between them. + +Queries support database query operations such as filtering, sorting, grouping, skipping/limiting, aggregation, etc. These query operations can be used on different GraphQL object levels, mostly on fields that have some relation or embedding to other objects. \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/references/query-specification/query-language-overview.md b/defradb_versioned_docs/version-0.19.0/references/query-specification/query-language-overview.md new file mode 100644 index 0000000..17b54aa --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/query-specification/query-language-overview.md @@ -0,0 +1,19 @@ +--- +sidebar_label: Query Language Overview +sidebar_position: 10 +--- +# Query Language Overview + +The DefraDB query language (DQL) is a GraphQL defined API which is used to access and query data residing inside a DefraDB node. + +[GraphQL](https://graphql.org) is an open-source query language for APIs, built for making APIs fast, flexible, and developer friendly. Databases such as [DGraph](https://dgraph.io/) and [Fauna](https://fauna.com) use GraphQL API as a query language to read and write data to/from the database. +- DGraph is a distributed, high throughput graph database. +- Fauna is a transactional database delivered as a secure, web-native API GraphQL. + +DefraDB (while using GraphQL) is designed as a document storage database, unlike DGraph and Fauna. DQL exposes every functionality of the database directly, without the need for any additional APIs. The functionalities include: +- Reading, writing, and modifying data. +- Describing data structures, schemas, and architecting data models (via index's and other schema independent, application-specific requirements). + +**Exception**: DefraDBs PeerAPI is used to interact with other databases and with the underlying CRDTs (for collaborative text editing). + +Our initial design relies only on the currently available GraphQL specification (version tagged June 2018 edition). Initially, the GraphQL Query Language will utilize standard GraphQL Schemas, with any additional directives exposed by DefraDB. DefraDBs CRDT types will initially be automatically mapped to GraphQL types. \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/references/query-specification/relationships.md b/defradb_versioned_docs/version-0.19.0/references/query-specification/relationships.md new file mode 100644 index 0000000..b17f667 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/query-specification/relationships.md @@ -0,0 +1,187 @@ +--- +sidebar_label: Relationships +sidebar_position: 80 +--- +# Relationships + +DefraDB supports a number of common relational models that an application may need. These relations are expressed through the Document Model, which has a few differences from the standard SQL model. There are no manually created `Join Tables` which track relationships. Instead, the non-normative nature of NoSQL Document objects allows us to embed and resolve relationships as needed automatically. + +Relationships are defined through the Document Schemas, using a series of GraphQL directives, and inferencing. They are always defined on both sides of the relation, meaning both objects involved in the relationship. + +## One-to-One + +The simplest relationship is a "one-to-one" which directly maps one document to another. The code below defines a one-to-one relationship between the `Author` and their `Address`: + +```graphql +type Author { + name: String + address: Address @primary +} + +type Address { + number: Integer + streetName: String + city: String + postal: String + author: Author +} +``` + +The types of both objects are included and DefraDB infers the relationship. As a result: + +- Both objects which can be queried separately. +- Each object provides field level access to its related object. + +The notable distinction of "one-to-one" relationships is that only the DocKey of the corresponding object is stored. + +On the other hand, if you simply embed the Address within the Author type without the internal relational system, you can include the `@embed` directive, which will embed it within. Objects embedded inside another using the `@embed` directive do not expose a query endpoint, so they can *only* be accessed through their parent object. Additionally they are not assigned a DocKey. + +## One-to-Many + +A "one-to-many" relationship allows us to relate several objects of one type, to a single instance of another. + +Let us define a one-to-many relationship between an author and their books below. This example differs from the above relationship example because we relate the author to an array of books, instead of a single address. + +```graphql +type Author { + name: String + books: [Book] +} + +type Book { + title: String + genre: String + description: String + author: Author +} +``` + +In this case, the books object is defined within the Author object to be an array of books, indicating that *one* Author type has a relationship to *many* Book types. Internally, much like the one-to-one model, only the DocKeys are stored. However, the DocKey is only stored on one side of the relationship (the child type). In this example, only the Book type keeps a reference to its associated Author DocKey. + +## Many-to-Many + +A "many-to-many" relationship allows multiple instances of one type to be related to multiple instances of another type. In DefraDB, many-to-many relationships are implemented using an explicit join type that connects the two related types. Unlike one-to-one or one-to-many relationships that are automatically managed, many-to-many relationships require an intermediary join type to be explicitly defined. + +Let us define a many-to-many relationship between students and courses below. A student can enroll in many courses, and a course can have many students enrolled. + +```graphql +type Student { + name: String + age: Int + enrollment: [Enrollment] +} + +type Course { + title: String + code: String + enrollment: [Enrollment] +} + +type Enrollment { + student: Student @relation(name: "student_enrollments") + course: Course @relation(name: "course_enrollments") +} +``` + +In this example, the `Enrollment` type acts as the join type that creates the many-to-many relationship between `Student` and `Course`. The join type has a one-to-many relationship with both Student and Course. Each enrollment links one student to one course. The `@relation` directive with unique names ensures that the relationships are properly distinguished. + +Similar to traditional SQL databases, you define the join type manually in your schema as a regular type. However, DefraDB automatically handles the relationship management between the join type and the related types, reducing the complexity of maintaining these connections. + +You can query the relationships directly from either the `Student` or `Course` type, or through the intermediary `Enrollment` type. + +```graphql +# Get students with their enrolled courses +query { + Student { + _docID + name + enrollment { + course { + title + code + } + } + } +} +``` + +```graphql +# Get courses with their enrolled students +query { + Course { + _docID + title + enrollment { + student { + name + age + } + } + } +} +``` + +You can also query the join type directly: + +```graphql +# Get all enrollments with student and course details +query { + Enrollment { + student { + name + age + } + course { + title + code + } + } +} +``` + +DefraDB handles the traversal through the join type automatically, allowing you to express complex many-to-many queries in a single request, but it still must go through the join type. + +The join type can also include additional fields specific to the relationship, such as enrollment date, grade, or status: + +```graphql +type Enrollment { + student: Student @relation(name: "student_enrollments") + course: Course @relation(name: "course_enrollments") + enrollmentDate: DateTime + status: String + grade: Float +} +``` + +This pattern allows you to maintain rich, contextual information about the relationship itself, not just the connection between the two types. + +## Multiple Relationships + +It is possible to define a collection of different relationship models. Additionally, we can define multiple relationships within a single type. Relationships containing unique types can simply be added to the types without issue. Like the following: + +```graphql +type Author { + name: String + address: Address + books: [Book] @relation(name: "authored_books") @index +} +``` + +However, in case of multiple relationships using the *same* types, you have to annotate the differences. You can use the `@relation` directive to be explicit. + +```graphql +type Author { + name: String + written: [Book] @relation(name: "written_books") + reviewed: [Book] @relation(name: "reviewed_books") +} + +type Book { + title: String + genre: String + author: Author @relation(name: "written_books") + reviewedBy: Author @relation(name: "reviewed_books") +} +``` + +Here we have two relations of the same type. By default, their association would conflict because internally, type names are used to specify relations. We use the `@relation` to add a custom name to the relation. `@relation` can be added to any relationship, even if it's a duplicate type relationship. It exists to be explicit, and to change the default parameters of the relation. diff --git a/defradb_versioned_docs/version-0.19.0/references/query-specification/sorting-and-ordering.md b/defradb_versioned_docs/version-0.19.0/references/query-specification/sorting-and-ordering.md new file mode 100644 index 0000000..7da53e3 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/references/query-specification/sorting-and-ordering.md @@ -0,0 +1,128 @@ +--- +sidebar_label: Sorting and Ordering +sidebar_position: 60 +--- +# Sorting and Ordering + +Sorting is an integral part of any Database and Query Language. The sorting syntax is similar to filter syntax, in that we use objects, and sub-objects to indicate sorting behavior, instead of filter behavior. + +The query to find all books ordered by their latest published date: +```graphql +{ + Books(order: { published_at: DESC}) { + title + description + published_at + } +} +``` +The syntax indicates: +- The field we wanted to sort on `published_at` +- The direction we wanted to order by `descending`. + +Sorting can be applied to multiple fields in the same query. The sort order is same as the field order in the sorted object. + +The query below finds all books ordered by earliest published date and then by descending order of titles. +```graphql +{ + Books(order: [{ published_at: ASC }, { title: DESC }] }) { + title + genre + description + } +} +``` + +Additionally, you can sort sub-object fields along with root object fields. + +The query below finds all books ordered by earliest published date and then by the latest authors' birthday. +```graphql +{ + Books(order: [{ published_at: ASC }, { Author: { birthday: DESC } }]) { + title + description + published_at + Author { + name + birthday + } + } +} +``` + +Sorting multiple fields simultaneously is primarily driven by the first indicated sort field (primary field). In the query above, it is the “published_at” date. The following sort field (aka, secondary field), is used in the case that more than one record has the same value for the primary sort field. + +Assuming there are more than two sort fields, in that case, the same behavior applies, except the primary, secondary pair shifts by one element. Hence, the 2nd field is the primary, and the 3rd is the secondary, until we reach the end of the sort fields. + +In case of a single sort field and objects with same value, the documents identifier (DocKey) is used as the secondary sort field by default. This is applicable regardless of the number of sort fields. As long as the DocKey is not already included in sort fields, it acts as the final tie-breaking secondary field. + +If the DocKey is included in the sort fields, any field included afterwards will never be evaluated. This is because all DocKeys are unique. If the sort fields are `published_at`, `id`, and `birthday`, the `birthday` sort field will never be evaluated and should be removed from the list. + +> Sorting on sub-objects from the root object is only allowed if the sub-object is not an array. If it is an array, the sort must be applied to the object field directly instead of through the root object. + +*So, instead of:* +```graphql +{ + Authors(order: [{ name: DESC }, { Books: { title: ASC } }]) { + name + Books { + title + } + } +} +``` +*We need:* +```graphql +{ + Authors(order: { name: DESC }) { + name + Books(order: { title: ASC }) { + title + } + } +} +``` + +>Root level filters and order only apply to root object. If you allow the initial version of the query, it would be confusing if the ordering applied to the order of the root object compared to its sibling objects or if the ordering applied solely to the sub-object. + +>If you allow it, it enforces the semantics of root level sorting on array sub-objects to act as a sorting mechanism for the root object. As a result, there is no obvious way to determine which value in the array is used for the root order. + +If you have the following objects in the database: +```json + [ + "Author" { + "name": "John Grisham", + "books": [ + { "title": "A Painted House" }, + { "title": "The Guardians" } + ] + }, + "Author" { + "name": "John Grisham", + "books": [ + { "title": "Camino Winds" }, + ] + }, + "Author" { + "name": "John LeCare", + "books": [ + { "title": "Tinker, Tailor, Soldier, Spy"} + ] + } + ] +``` +> and the following query +```graphql +{ + Authors(order: [{ name: DESC }, { books: { title: ASC } }]) { + name + books { + title + } + } +} +``` + +> Given there are two authors with the same name (John Grisham), the sort object `(sort: { name: DESC, books: { title: ASC }}` would suggest we sort duplicate authors using `books: { title: ASC }` as the secondary sort field. However, because the books field is an array of objects, there is no single value for the title to compare easily. +> +> Therefore, sorting on array sub objects from the root field is ***strictly not allowed***. diff --git a/defradb_versioned_docs/version-0.19.0/release notes/_category_.json b/defradb_versioned_docs/version-0.19.0/release notes/_category_.json new file mode 100644 index 0000000..40addbd --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Release Notes", + "position": 4 + } + \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.10.0.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.10.0.md new file mode 100644 index 0000000..c5471bc --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.10.0.md @@ -0,0 +1,45 @@ +--- +sidebar_position: 100 +--- +# v0.10.0 + +> 2024-03-08 + +## Changelog +DefraDB v0.10 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.9.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. + +### Features +* feat: Add JSON scalar ([#2254](https://github.com/sourcenetwork/defradb/issues/2254)) +* feat: Add case insensitive `like` operator ([#2368](https://github.com/sourcenetwork/defradb/issues/2368)) +* feat: Add composite indexes ([#2226](https://github.com/sourcenetwork/defradb/issues/2226)) +* feat: Add support for views with Lens transforms ([#2311](https://github.com/sourcenetwork/defradb/issues/2311)) +* feat: Allow setting null values on doc fields ([#2273](https://github.com/sourcenetwork/defradb/issues/2273)) +* feat: Generate OpenAPI command ([#2235](https://github.com/sourcenetwork/defradb/issues/2235)) +* feat: Model Col. SchemaVersions and migrations on Cols ([#2286](https://github.com/sourcenetwork/defradb/issues/2286)) +* feat: Multiple docs with nil value on unique-indexed field ([#2276](https://github.com/sourcenetwork/defradb/issues/2276)) +* feat: Replace FieldDescription.RelationType with IsPrimary ([#2288](https://github.com/sourcenetwork/defradb/issues/2288)) +* feat: Reverted order for indexed fields ([#2335](https://github.com/sourcenetwork/defradb/issues/2335)) +* feat: Rework GetCollection/SchemaByFoo funcs into single ([#2319](https://github.com/sourcenetwork/defradb/issues/2319)) +### Fix +* fix: Add `latest` image tag for ghcr ([#2340](https://github.com/sourcenetwork/defradb/issues/2340)) +* fix: Add missing delta payload ([#2306](https://github.com/sourcenetwork/defradb/issues/2306)) +* fix: Add missing directive definitions ([#2369](https://github.com/sourcenetwork/defradb/issues/2369)) +* fix: Add validation to JSON fields ([#2375](https://github.com/sourcenetwork/defradb/issues/2375)) +* fix: Fix compound relational filters in aggregates ([#2297](https://github.com/sourcenetwork/defradb/issues/2297)) +* fix: Load root dir before loading config ([#2266](https://github.com/sourcenetwork/defradb/issues/2266)) +* fix: Make peers sync secondary index ([#2390](https://github.com/sourcenetwork/defradb/issues/2390)) +* fix: Make returned collections respect explicit transactions ([#2385](https://github.com/sourcenetwork/defradb/issues/2385)) +* fix: Mark docs as deleted when querying in delete mut ([#2298](https://github.com/sourcenetwork/defradb/issues/2298)) +* fix: Move field id off of schema ([#2336](https://github.com/sourcenetwork/defradb/issues/2336)) +* fix: Update GetCollections behaviour ([#2378](https://github.com/sourcenetwork/defradb/issues/2378)) +### Refactoring +* refactor: Decouple net config ([#2258](https://github.com/sourcenetwork/defradb/issues/2258)) +* refactor: Generate field ids using a sequence ([#2339](https://github.com/sourcenetwork/defradb/issues/2339)) +* refactor: HTTP config ([#2278](https://github.com/sourcenetwork/defradb/issues/2278)) +* refactor: Make CollectionDescription.Name Option ([#2223](https://github.com/sourcenetwork/defradb/issues/2223)) +* refactor: Make config internal to CLI ([#2310](https://github.com/sourcenetwork/defradb/issues/2310)) +* refactor: Node config ([#2296](https://github.com/sourcenetwork/defradb/issues/2296) +* refactor: Remove unused Delete field from client.Document ([#2275](https://github.com/sourcenetwork/defradb/issues/2275)) + diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.11.0.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.11.0.md new file mode 100644 index 0000000..816e487 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.11.0.md @@ -0,0 +1,41 @@ +--- +sidebar_position: 110 +--- +# v0.11.0 + +> 2024-05-06 + +## Changelog +DefraDB v0.11 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.10.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. + +### Features +* feat: Add Access Control Policy ([#2338](https://github.com/sourcenetwork/defradb/issues/2338)) +* feat: Add Defra-Lens support for branching schema ([#2421](https://github.com/sourcenetwork/defradb/issues/2421)) +* feat: Add P Counter CRDT ([#2482](https://github.com/sourcenetwork/defradb/issues/2482)) +* feat: Add PatchCollection ([#2402](https://github.com/sourcenetwork/defradb/issues/2402)) +* feat: Allow mutation of col sources via PatchCollection ([#2424](https://github.com/sourcenetwork/defradb/issues/2424)) +* feat: Force explicit primary decl. in SDL for one-ones ([#2462](https://github.com/sourcenetwork/defradb/issues/2462)) +* feat: Lens runtime config ([#2497](https://github.com/sourcenetwork/defradb/issues/2497)) +* feat: Move relation field properties onto collection ([#2529](https://github.com/sourcenetwork/defradb/issues/2529)) +* feat: Update corelog to 0.0.7 ([#2547](https://github.com/sourcenetwork/defradb/issues/2547)) +### Fix +* fix: Add check to filter result for logical ops ([#2573](https://github.com/sourcenetwork/defradb/issues/2573)) +* fix: Allow update when updating non-indexed field ([#2511](https://github.com/sourcenetwork/defradb/issues/2511)) +* fix: Handle compound filters on related indexed fields ([#2575](https://github.com/sourcenetwork/defradb/issues/2575)) +* fix: Make all array kinds nillable ([#2534](https://github.com/sourcenetwork/defradb/issues/2534)) +* fix: Return correct results from one-many indexed filter ([#2579](https://github.com/sourcenetwork/defradb/issues/2579)) +### Documentation +* docs: Add data definition document ([#2544](https://github.com/sourcenetwork/defradb/issues/2544)) +### Refactoring +* refactor: Add NormalValue ([#2404](https://github.com/sourcenetwork/defradb/issues/2404)) +* refactor: Clean up client/request package ([#2443](https://github.com/sourcenetwork/defradb/issues/2443)) +* refactor: DB transactions context ([#2513](https://github.com/sourcenetwork/defradb/issues/2513)) +* refactor: Merge collection UpdateWith and DeleteWith ([#2531](https://github.com/sourcenetwork/defradb/issues/2531)) +* refactor: Replace logging package with corelog ([#2406](https://github.com/sourcenetwork/defradb/issues/2406)) +* refactor: Rewrite convertImmutable ([#2445](https://github.com/sourcenetwork/defradb/issues/2445)) +* refactor: Unify Field Kind and Schema properties ([#2414](https://github.com/sourcenetwork/defradb/issues/2414)) +### Testing +* test: Add flag to skip network tests ([#2495](https://github.com/sourcenetwork/defradb/issues/2495)) + diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.12.0.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.12.0.md new file mode 100644 index 0000000..bd39a45 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.12.0.md @@ -0,0 +1,60 @@ +--- +sidebar_position: 120 +--- +# v0.12.0 + +> 2024-06-28 + +## Changelog +DefraDB v0.12 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.11.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. + +### Features +* feat: Ability to generate a new identity (#2760) +* feat: Add async transaction callbacks (#2708) +* feat: Add authentication for ACP (#2649) +* feat: Allow lens runtime selection via config (#2684) +* feat: Enable sec. indexes with ACP (#2602) +* feat: Inject ACP instance into the DB instance (#2633) +* feat: Keyring (#2557) +* feat: Sec. indexes on relations (#2670) +### Fix +* fix: Add version check in basicTxn.Query (#2742) +* fix: Allow primary field declarations on one-many (#2796) +* fix: Change new identity keys to hex format (#2773) +* fix: Incorporate schema root into docID (#2701) +* fix: Keyring output (#2784) +* fix: Make node options composable (#2648) +* fix: Merge retry logic (#2719) +* fix: Race condition when testing CLI (#2713) +* fix: Remove limit for fetching secondary docs (#2594) +* fix: Remove shared mutable state between database instances (#2777) +* fix: Resolve incorrect merge conflict (#2723) +* fix: Return slice of correct length from db.AddSchema (#2765) +* fix: Use node representation for Block (#2746) +### Documentation +* docs: Add http/openapi documentation & ci workflow (#2678) +* docs: Document Event Update struct (#2598) +* docs: Remove reference to client ping from readme (#2793) +* docs: Streamline cli documentation (#2646) +### Refactoring +* refactor: Change counters to support encryption (#2698) +* refactor: Change from protobuf to cbor for IPLD (#2604) +* refactor: Change local_acp implementation to use acp_core (#2691) +* refactor: DAG sync and move merge outside of net package (#2658) +* refactor: Extract Defra specific logic from ACPLocal type (#2656) +* refactor: Extract definition stuff from collection.go (#2706) +* refactor: Move internal packages to internal dir (#2599) +* refactor: Reorganize global CLI flags (#2615) +* refactor: Replace subscription events publisher (#2686) +* refactor: Rework definition validation (#2720) +* refactor: Use events to test network logic (#2700) +### Testing +* test: Add relation substitute mechanic to tests (#2682) +* test: Allow assertion of AddSchema results (#2788) +* test: Allow test harness to execute benchmarks (#2740) +* test: Remove duplicate test (#2787) +* test: Support asserting on doc index in test results (#2786) +* test: Test node pkg constructor via integration test suite (#2641) + diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.13.0.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.13.0.md new file mode 100644 index 0000000..f73f73a --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.13.0.md @@ -0,0 +1,40 @@ +--- +sidebar_position: 130 +--- +# v0.13.0 + +> 2024-08-23 + +## Changelog + +DefraDB v0.13 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.12.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. + +### Features +* feat: Doc encryption with symmetric key (#2731) +* feat: Doc field encryption (#2817) +* feat: Enable indexing for DateTime fields (#2933) +* feat: Handle P2P with SourceHub ACP (#2848) +* feat: Implement SourceHub ACP (#2657) +* feat: Remove IsObjectArray (#2859) +### Fix +* fix: Add ns precision support to time values (#2940) +* fix: Allow querying of 9th, 19th, 29th, etc collections (#2819) +* fix: Create mutation introspection (#2881) +* fix: Enable filtering doc by fields of JSON and Blob types (#2841) +* fix: Filter with date and document with nil date value (#2946) +* fix: Handle index queries where child found without parent (#2942) +* fix: Handle multiple child index joins (#2867) +* fix: No panic if filter condition on indexed field is empty (#2929) +* fix: Panic with different composite-indexed child objects (#2947) +* fix: Support one-many self joins without primary directive (#2799) +### Refactoring +* refactor: Decouple client.DB from net (#2768) +* refactor: GQL responses (#2872) +* refactor: Network test sync logic (#2748) +### Testing +* test: Add assert on DocIndex for child documents (#2871) +* test: Fix refreshing of docs in change detector (#2832) +* test: Remove hardcoded test identities (#2822) + diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.14.0.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.14.0.md new file mode 100644 index 0000000..1395cba --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.14.0.md @@ -0,0 +1,64 @@ +--- +sidebar_position: 140 +--- +# v0.14.0 + +> 2024-10-19 + +## Changelog + +DefraDB v0.14 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.13.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.gg/w7jYQVJ/. + +### Features +* feat: JSON type filter ([#3122](https://github.com/sourcenetwork/defradb/issues/3122)) +* feat: Add replicator retry ([#3107](https://github.com/sourcenetwork/defradb/issues/3107)) +* feat: Inherit `read` permission if only `write` access ([#3108](https://github.com/sourcenetwork/defradb/issues/3108)) +* feat: JSON type coercion ([#3098](https://github.com/sourcenetwork/defradb/issues/3098)) +* feat: Ability to unrelate private documents from actors ([#3099](https://github.com/sourcenetwork/defradb/issues/3099)) +* feat: Enable Indexing of array fields ([#3092](https://github.com/sourcenetwork/defradb/issues/3092)) +* feat: Min and max numerical aggregates ([#3078](https://github.com/sourcenetwork/defradb/issues/3078)) +* feat: Ability to relate private documents to actors ([#2907](https://github.com/sourcenetwork/defradb/issues/2907)) +* feat: GraphQL upsert mutation ([#3075](https://github.com/sourcenetwork/defradb/issues/3075)) +* feat: GraphQL fragments ([#3066](https://github.com/sourcenetwork/defradb/issues/3066)) +* feat: Secure document encryption key exchange ([#2891](https://github.com/sourcenetwork/defradb/issues/2891)) +* feat: Inline array filters ([#3028](https://github.com/sourcenetwork/defradb/issues/3028)) +* feat: CLI purge command ([#2998](https://github.com/sourcenetwork/defradb/issues/2998)) +* feat: Add support for one sided relations ([#3021](https://github.com/sourcenetwork/defradb/issues/3021)) +* feat: Add materialized views ([#3000](https://github.com/sourcenetwork/defradb/issues/3000)) +* feat: Default scalar field values ([#2997](https://github.com/sourcenetwork/defradb/issues/2997)) +* feat: GQL variables and operation name ([#2993](https://github.com/sourcenetwork/defradb/issues/2993)) + +### Fixes +* fix: Make GraphQL errors spec compliant ([#3040](https://github.com/sourcenetwork/defradb/issues/3040)) +* fix: Ignore badger path if in-memory ([#2967](https://github.com/sourcenetwork/defradb/issues/2967)) +* fix: Rework relation field kinds ([#2961](https://github.com/sourcenetwork/defradb/issues/2961)) +* fix: Panic with filter on unique composite index on relation ([#3020](https://github.com/sourcenetwork/defradb/issues/3020)) +* fix: Handle missing type in an SDL ([#3023](https://github.com/sourcenetwork/defradb/issues/3023)) +* fix: GraphQL null argument parsing ([#3013](https://github.com/sourcenetwork/defradb/issues/3013)) +* fix: Prevent mutations from secondary side of relation ([#3124](https://github.com/sourcenetwork/defradb/issues/3124)) +* fix: Treat explicitly set nil values like omitted values ([#3101](https://github.com/sourcenetwork/defradb/issues/3101)) +* fix: Remove duplication of block heads on delete ([#3096](https://github.com/sourcenetwork/defradb/issues/3096)) +* fix: Log GQL endpoint correctly on node start ([#3037](https://github.com/sourcenetwork/defradb/issues/3037)) +* fix: Panic with different composite-indexed child objects ([#2947](https://github.com/sourcenetwork/defradb/issues/2947)) +* fix: Validate GraphQL schemas ([#3152](https://github.com/sourcenetwork/defradb/issues/3152)) +* fix: Queries with filter on 2 rel fields of composite index ([#3035](https://github.com/sourcenetwork/defradb/issues/3035)) + +### Documentation +* doc: Rename _key to _docID in docs ([#2989](https://github.com/sourcenetwork/defradb/issues/2989)) + +### Refactoring +* refactor: Change from protobuf to cbor for gRPC ([#3061](https://github.com/sourcenetwork/defradb/issues/3061)) +* refactor: GraphQL order input ([#3044](https://github.com/sourcenetwork/defradb/issues/3044)) +* refactor: Merge duplicate input args ([#3046](https://github.com/sourcenetwork/defradb/issues/3046)) +* refactor: Index field directive ([#2994](https://github.com/sourcenetwork/defradb/issues/2994)) +* refactor: Make SourceHub dep internal-only ([#2963](https://github.com/sourcenetwork/defradb/issues/2963)) + +### Testing +* test: Add bug bash tests for gql fragments ([#3136](https://github.com/sourcenetwork/defradb/issues/3136)) + +### Chore +* chore: Make keyring non-interactive ([#3026](https://github.com/sourcenetwork/defradb/issues/3026)) +* chore: Change from ipld traversal to direct link access ([#2931](https://github.com/sourcenetwork/defradb/issues/2931)) +* chore: Bump to GoLang v1.22 ([#2913](https://github.com/sourcenetwork/defradb/issues/2913)) \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.15.0.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.15.0.md new file mode 100644 index 0000000..c848e94 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.15.0.md @@ -0,0 +1,44 @@ +--- +sidebar_position: 150 +--- +# v0.15.0 + +> 2024-12-13 + +## Changelog +DefraDB v0.15 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.14.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.gg/w7jYQVJ/. + +### Features +* feat: Add ACP to pubsub KMS (#3206) +* feat: Add ability to add/delete relationship for all actors (#3254) +* feat: Add node identity (#3125) +* feat: Add support for branchable collection time-traveling (#3260) +* feat: Add support for branchable collections (#3216) +* feat: Add support for cid-only time travel queries (#3256) +* feat: Aggregate filter alias targeting (#3252) +* feat: Aggregate order alias targeting (#3293) +* feat: Error if purge request made with dev mode disabled (#3295) +* feat: Filter alias target (#3201) +* feat: Order alias target (#3217) +* feat: Support for descending fields CLI index creation (#3237) +### Fix +* fix: Add Authorization header to CORS allowed headers (#3178) +* fix: Add support for operationName and variables in HTTP GET (#3292) +* fix: Adjust OpenAPI index POST example request body (#3268) +* fix: Make requests with no identity work with "*" target (#3278) +* fix: Prevent over span (#3258) +* fix: Resolve CORS errors in OpenAPI tab of Playground (#3263) +### Documentation +* docs: Update discord link (#3231) +### Refactoring +* refactor: Add unified JSON interface (#3265) +* refactor: Breakup core/keys.go file (#3198) +* refactor: Consolidate node-related fields into a struct (#3232) +* refactor: Remove indirection from crdt packages (#3192) +* refactor: Rework core.Spans (#3210) +* refactor: Simplify merkle/crdt code (#3200) +### Testing +* test: Allow soft-referencing of Cids in tests (#3176) + diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.2.0.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.2.0.md new file mode 100644 index 0000000..ae66bf9 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.2.0.md @@ -0,0 +1,86 @@ +--- +sidebar_position: 20 +--- + +# v0.2.0 + +> 2022-02-07 + +DefraDB v0.2 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +This release is jam-packed with new features and a small number of breaking changes. Read the full changelog for a detailed description. Most notable features include a new Peer-to-Peer (P2P) data synchronization system, an expanded query system to support GroupBy & Aggregate operations, and lastly TimeTraveling queries allowing to query previous states of a document. + +Much more than just that has been added to ensure we're building reliable software expected of any database, such as expanded test & benchmark suites, automated bug detection, performance gains, and more. + +This release does include a Breaking Change to existing v0.1 databases regarding the internal data model, which affects the "Content Identifiers" we use to generate DocKeys and VersionIDs. If you need help migrating an existing deployment, reach out at hello@source.network or join our Discord at https://discord.source.network. + +### Features + +* Added Peer-to-Peer networking data synchronization ([#177](https://github.com/sourcenetwork/defradb/issues/177)) +* TimeTraveling (History Traversing) query engine and doc fetcher ([#59](https://github.com/sourcenetwork/defradb/issues/59)) +* Add Document Deletion with a Key ([#150](https://github.com/sourcenetwork/defradb/issues/150)) +* Add support for sum aggregate ([#121](https://github.com/sourcenetwork/defradb/issues/121)) +* Add support for lwwr scalar arrays (full replace on update) ([#115](https://github.com/sourcenetwork/defradb/issues/115)) +* Add count aggregate support ([#102](https://github.com/sourcenetwork/defradb/issues/102)) +* Add support for named relationships ([#108](https://github.com/sourcenetwork/defradb/issues/108)) +* Add multi doc key lookup support ([#76](https://github.com/sourcenetwork/defradb/issues/76)) +* Add basic group by functionality ([#43](https://github.com/sourcenetwork/defradb/issues/43)) +* Update datastore packages to allow use of context ([#48](https://github.com/sourcenetwork/defradb/issues/48)) + +### Bug fixes + +* Only add join if aggregating child object collection ([#188](https://github.com/sourcenetwork/defradb/issues/188)) +* Handle errors generated during input object thunks ([#123](https://github.com/sourcenetwork/defradb/issues/123)) +* Remove new types from in-memory cache on generate error ([#122](https://github.com/sourcenetwork/defradb/issues/122)) +* Support relationships where both fields have the same name ([#109](https://github.com/sourcenetwork/defradb/issues/109)) +* Handle errors generated in fields thunk ([#66](https://github.com/sourcenetwork/defradb/issues/66)) +* Ensure OperationDefinition case has at least one selection([#24](https://github.com/sourcenetwork/defradb/pull/24)) +* Close datastore iterator on scan close ([#56](https://github.com/sourcenetwork/defradb/pull/56)) (resulted in a panic when using limit) +* Close superseded iterators before orphaning ([#56](https://github.com/sourcenetwork/defradb/pull/56)) (fixes a panic in the join code) +* Move discard to after error check ([#88](https://github.com/sourcenetwork/defradb/pull/88)) (did result in panic if transaction creation fails) +* Check for nil iterator before closing document fetcher ([#108](https://github.com/sourcenetwork/defradb/pull/108)) + +### Tooling +* Added benchmark suite ([#160](https://github.com/sourcenetwork/defradb/issues/160)) + +### Documentation + +* Correcting comment typos ([#142](https://github.com/sourcenetwork/defradb/issues/142)) +* Correcting README typos ([#140](https://github.com/sourcenetwork/defradb/issues/140)) + +### Testing + +* Add transaction integration tests ([#175](https://github.com/sourcenetwork/defradb/issues/175)) +* Allow running of tests using badger-file as well as IM options ([#128](https://github.com/sourcenetwork/defradb/issues/128)) +* Add test datastore selection support ([#88](https://github.com/sourcenetwork/defradb/issues/88)) + +### Refactoring + +* Datatype modification protection ([#138](https://github.com/sourcenetwork/defradb/issues/138)) +* Cleanup Linter Complaints and Setup Makefile ([#63](https://github.com/sourcenetwork/defradb/issues/63)) +* Rework document rendering to avoid data duplication and mutation ([#68](https://github.com/sourcenetwork/defradb/issues/68)) +* Remove dependency on concrete datastore implementations from db package ([#51](https://github.com/sourcenetwork/defradb/issues/51)) +* Remove all `errors.Wrap` and update them with `fmt.Errorf`. ([#41](https://github.com/sourcenetwork/defradb/issues/41)) +* Restructure integration tests to provide better visibility ([#15](https://github.com/sourcenetwork/defradb/pull/15)) +* Remove schemaless code branches ([#23](https://github.com/sourcenetwork/defradb/pull/23)) + +### Performance +* Add badger multi scan support ([#85](https://github.com/sourcenetwork/defradb/pull/85)) +* Add support for range spans ([#86](https://github.com/sourcenetwork/defradb/pull/86)) + +### Continous integration + +* Use more accurate test coverage. ([#134](https://github.com/sourcenetwork/defradb/issues/134)) +* Disable Codecov's Patch Check +* Make codcov less strict for now to unblock development ([#125](https://github.com/sourcenetwork/defradb/issues/125)) +* Add codecov config file. ([#118](https://github.com/sourcenetwork/defradb/issues/118)) +* Add workflow that runs a job on AWS EC2 instance. ([#110](https://github.com/sourcenetwork/defradb/issues/110)) +* Add Code Test Coverage with CodeCov ([#116](https://github.com/sourcenetwork/defradb/issues/116)) +* Integrate GitHub Action for golangci-lint Annotations ([#106](https://github.com/sourcenetwork/defradb/issues/106)) +* Add Linter Check to CircleCi ([#92](https://github.com/sourcenetwork/defradb/issues/92)) + +### Chore + +* Remove the S1038 rule of the gosimple linter. ([#129](https://github.com/sourcenetwork/defradb/issues/129)) +* Update to badger v3, and use badger as default in memory store ([#56](https://github.com/sourcenetwork/defradb/issues/56)) +* Make Cid versions consistent ([#57](https://github.com/sourcenetwork/defradb/issues/57)) \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.2.1.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.2.1.md new file mode 100644 index 0000000..e72ea06 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.2.1.md @@ -0,0 +1,57 @@ +--- +sidebar_position: 21 +--- + +# v0.2.1 + +> 2022-03-04 + +### Features + +* Add ability to delete multiple documents using filter ([#206](https://github.com/sourcenetwork/defradb/issues/206)) +* Add ability to delete multiple documents, using multiple ids ([#196](https://github.com/sourcenetwork/defradb/issues/196)) + +### Fixes + +* Concurrency control of Document using RWMutex ([#213](https://github.com/sourcenetwork/defradb/issues/213)) +* Only log errors and above when benchmarking ([#261](https://github.com/sourcenetwork/defradb/issues/261)) +* Handle proper type conversion on sort nodes ([#228](https://github.com/sourcenetwork/defradb/issues/228)) +* Return empty array if no values found ([#223](https://github.com/sourcenetwork/defradb/issues/223)) +* Close fetcher on error ([#210](https://github.com/sourcenetwork/defradb/issues/210)) +* Installing binary using defradb name ([#190](https://github.com/sourcenetwork/defradb/issues/190)) + +### Tooling + +* Add short benchmark runner option ([#263](https://github.com/sourcenetwork/defradb/issues/263)) + +### Documentation + +* Add data format changes documentation folder ([#89](https://github.com/sourcenetwork/defradb/issues/89)) +* Correcting typos ([#143](https://github.com/sourcenetwork/defradb/issues/143)) +* Update generated CLI docs ([#208](https://github.com/sourcenetwork/defradb/issues/208)) +* Updated readme with P2P section ([#220](https://github.com/sourcenetwork/defradb/issues/220)) +* Update old or missing license headers ([#205](https://github.com/sourcenetwork/defradb/issues/205)) +* Update git-chglog config and template ([#195](https://github.com/sourcenetwork/defradb/issues/195)) + +### Refactoring + +* Introduction of logging system ([#67](https://github.com/sourcenetwork/defradb/issues/67)) +* Restructure db/txn/multistore structures ([#199](https://github.com/sourcenetwork/defradb/issues/199)) +* Initialize database in constructor ([#211](https://github.com/sourcenetwork/defradb/issues/211)) +* Purge all println and ban it ([#253](https://github.com/sourcenetwork/defradb/issues/253)) + +### Testing + +* Detect and force breaking filesystem changes to be documented ([#89](https://github.com/sourcenetwork/defradb/issues/89)) +* Boost collection test coverage ([#183](https://github.com/sourcenetwork/defradb/issues/183)) + +### Continuous integration + +* Combine the Lint and Benchmark workflows so that the benchmark job depends on the lint job in one workflow ([#209](https://github.com/sourcenetwork/defradb/issues/209)) +* Add rule to only run benchmark if other check are successful ([#194](https://github.com/sourcenetwork/defradb/issues/194)) +* Increase linter timeout ([#230](https://github.com/sourcenetwork/defradb/issues/230)) + +### Chore + +* Remove commented out code ([#238](https://github.com/sourcenetwork/defradb/issues/238)) +* Remove dead code from multi node ([#186](https://github.com/sourcenetwork/defradb/issues/186)) \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.3.0.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.3.0.md new file mode 100644 index 0000000..01002c2 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.3.0.md @@ -0,0 +1,178 @@ +--- +sidebar_position: 30 +--- + +# v0.3.0 + +> 2022-08-02 + +DefraDB v0.3 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +There are *several* new features in this release, and we invite you to review the official changelog below. Some highlights are various new features for Grouping & Aggregation for the query system, like top-level aggregation and group filtering. Moreover, a brand new Query Explain system was added to introspect the execution plans created by DefraDB. Lastly we introduced a revamped CLI configuration system. + +This release does include a Breaking Change to existing v0.2.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. + +### Features + +* Add named config overrides ([#659](https://github.com/sourcenetwork/defradb/issues/659)) +* Expose color and caller log options, add validation ([#652](https://github.com/sourcenetwork/defradb/issues/652)) +* Add ability to explain `groupNode` and it's attribute(s). ([#641](https://github.com/sourcenetwork/defradb/issues/641)) +* Add primary directive for schema definitions ([@primary](https://github.com/primary)) ([#650](https://github.com/sourcenetwork/defradb/issues/650)) +* Add support for aggregate filters on inline arrays ([#622](https://github.com/sourcenetwork/defradb/issues/622)) +* Add explainable renderLimitNode & hardLimitNode attributes. ([#614](https://github.com/sourcenetwork/defradb/issues/614)) +* Add support for top level aggregates ([#594](https://github.com/sourcenetwork/defradb/issues/594)) +* Update `countNode` explanation to be consistent. ([#600](https://github.com/sourcenetwork/defradb/issues/600)) +* Add support for stdin as input in CLI ([#608](https://github.com/sourcenetwork/defradb/issues/608)) +* Explain `cid` & `field` attributes for `dagScanNode` ([#598](https://github.com/sourcenetwork/defradb/issues/598)) +* Add ability to explain `dagScanNode` attribute(s). ([#560](https://github.com/sourcenetwork/defradb/issues/560)) +* Add the ability to send user feedback to the console even when logging to file. ([#568](https://github.com/sourcenetwork/defradb/issues/568)) +* Add ability to explain `sortNode` attribute(s). ([#558](https://github.com/sourcenetwork/defradb/issues/558)) +* Add ability to explain `sumNode` attribute(s). ([#559](https://github.com/sourcenetwork/defradb/issues/559)) +* Introduce top-level config package ([#389](https://github.com/sourcenetwork/defradb/issues/389)) +* Add ability to explain `updateNode` attributes. ([#514](https://github.com/sourcenetwork/defradb/issues/514)) +* Add `typeIndexJoin` explainable attributes. ([#499](https://github.com/sourcenetwork/defradb/issues/499)) +* Add support to explain `countNode` attributes. ([#504](https://github.com/sourcenetwork/defradb/issues/504)) +* Add CORS capability to HTTP API ([#467](https://github.com/sourcenetwork/defradb/issues/467)) +* Add explaination of spans for `scanNode`. ([#492](https://github.com/sourcenetwork/defradb/issues/492)) +* Add ability to Explain the response plan. ([#385](https://github.com/sourcenetwork/defradb/issues/385)) +* Add aggregate filter support for groups only ([#426](https://github.com/sourcenetwork/defradb/issues/426)) +* Configurable caller option in logger ([#416](https://github.com/sourcenetwork/defradb/issues/416)) +* Add Average aggregate support ([#383](https://github.com/sourcenetwork/defradb/issues/383)) +* Allow summation of aggregates ([#341](https://github.com/sourcenetwork/defradb/issues/341)) +* Add ability to check DefraDB CLI version. ([#339](https://github.com/sourcenetwork/defradb/issues/339)) + +### Fixes + +* Add a check to ensure limit is not 0 when evaluating query limit and offset ([#706](https://github.com/sourcenetwork/defradb/issues/706)) +* Support multiple `--logger` flags ([#704](https://github.com/sourcenetwork/defradb/issues/704)) +* Return without an error if relation is finalized ([#698](https://github.com/sourcenetwork/defradb/issues/698)) +* Logger not correctly applying named config ([#696](https://github.com/sourcenetwork/defradb/issues/696)) +* Add content-type media type parsing ([#678](https://github.com/sourcenetwork/defradb/issues/678)) +* Remove portSyncLock deadlock condition ([#671](https://github.com/sourcenetwork/defradb/issues/671)) +* Silence cobra default errors and usage printing ([#668](https://github.com/sourcenetwork/defradb/issues/668)) +* Add stdout validation when setting logging output path ([#666](https://github.com/sourcenetwork/defradb/issues/666)) +* Consider `--logoutput` CLI flag properly ([#645](https://github.com/sourcenetwork/defradb/issues/645)) +* Handle errors and responses in CLI `client` commands ([#579](https://github.com/sourcenetwork/defradb/issues/579)) +* Rename aggregate gql types ([#638](https://github.com/sourcenetwork/defradb/issues/638)) +* Error when attempting to insert value into relationship field ([#632](https://github.com/sourcenetwork/defradb/issues/632)) +* Allow adding of new schema to database ([#635](https://github.com/sourcenetwork/defradb/issues/635)) +* Correctly parse dockey in broadcast log event. ([#631](https://github.com/sourcenetwork/defradb/issues/631)) +* Increase system's open files limit in integration tests ([#627](https://github.com/sourcenetwork/defradb/issues/627)) +* Avoid populating `order.ordering` with empties. ([#618](https://github.com/sourcenetwork/defradb/issues/618)) +* Change to supporting of non-null inline arrays ([#609](https://github.com/sourcenetwork/defradb/issues/609)) +* Assert fields exist in collection before saving to them ([#604](https://github.com/sourcenetwork/defradb/issues/604)) +* CLI `init` command to reinitialize only config file ([#603](https://github.com/sourcenetwork/defradb/issues/603)) +* Add config and registry clearing to TestLogWritesMessagesToFeedbackLog ([#596](https://github.com/sourcenetwork/defradb/issues/596)) +* Change `$eq` to `_eq` in the failing test. ([#576](https://github.com/sourcenetwork/defradb/issues/576)) +* Resolve failing HTTP API tests via cleanup ([#557](https://github.com/sourcenetwork/defradb/issues/557)) +* Ensure Makefile compatibility with macOS ([#527](https://github.com/sourcenetwork/defradb/issues/527)) +* Separate out iotas in their own blocks. ([#464](https://github.com/sourcenetwork/defradb/issues/464)) +* Use x/cases for titling instead of strings to handle deprecation ([#457](https://github.com/sourcenetwork/defradb/issues/457)) +* Handle limit and offset in sub groups ([#440](https://github.com/sourcenetwork/defradb/issues/440)) +* Issue preventing DB from restarting with no records ([#437](https://github.com/sourcenetwork/defradb/issues/437)) +* log serving HTTP API before goroutine blocks ([#358](https://github.com/sourcenetwork/defradb/issues/358)) + +### Testing + +* Add integration testing for P2P. ([#655](https://github.com/sourcenetwork/defradb/issues/655)) +* Fix formatting of tests with no extra brackets ([#643](https://github.com/sourcenetwork/defradb/issues/643)) +* Add tests for `averageNode` explain. ([#639](https://github.com/sourcenetwork/defradb/issues/639)) +* Add schema integration tests ([#628](https://github.com/sourcenetwork/defradb/issues/628)) +* Add tests for default properties ([#611](https://github.com/sourcenetwork/defradb/issues/611)) +* Specify which collection to update in test framework ([#601](https://github.com/sourcenetwork/defradb/issues/601)) +* Add tests for grouping by undefined value ([#543](https://github.com/sourcenetwork/defradb/issues/543)) +* Add test for querying undefined field ([#544](https://github.com/sourcenetwork/defradb/issues/544)) +* Expand commit query tests ([#541](https://github.com/sourcenetwork/defradb/issues/541)) +* Add cid (time-travel) query tests ([#539](https://github.com/sourcenetwork/defradb/issues/539)) +* Restructure and expand filter tests ([#512](https://github.com/sourcenetwork/defradb/issues/512)) +* Basic unit testing of `node` package ([#503](https://github.com/sourcenetwork/defradb/issues/503)) +* Test filter in filter tests ([#473](https://github.com/sourcenetwork/defradb/issues/473)) +* Add test for deletion of records in a relationship ([#329](https://github.com/sourcenetwork/defradb/issues/329)) +* Benchmark transaction iteration ([#289](https://github.com/sourcenetwork/defradb/issues/289)) + +### Refactoring + +* Improve CLI error handling and fix small issues ([#649](https://github.com/sourcenetwork/defradb/issues/649)) +* Add top-level `version` package ([#583](https://github.com/sourcenetwork/defradb/issues/583)) +* Remove extra log levels ([#634](https://github.com/sourcenetwork/defradb/issues/634)) +* Change `sortNode` to `orderNode`. ([#591](https://github.com/sourcenetwork/defradb/issues/591)) +* Rework update and delete node to remove secondary planner ([#571](https://github.com/sourcenetwork/defradb/issues/571)) +* Trim imported connor package ([#530](https://github.com/sourcenetwork/defradb/issues/530)) +* Internal doc restructure ([#471](https://github.com/sourcenetwork/defradb/issues/471)) +* Copy-paste connor fork into repo ([#567](https://github.com/sourcenetwork/defradb/issues/567)) +* Add safety to the tests, add ability to catch stderr logs and add output path validation ([#552](https://github.com/sourcenetwork/defradb/issues/552)) +* Change handler functions implementation and response formatting ([#498](https://github.com/sourcenetwork/defradb/issues/498)) +* Improve the HTTP API implementation ([#382](https://github.com/sourcenetwork/defradb/issues/382)) +* Use new logger in net/api ([#420](https://github.com/sourcenetwork/defradb/issues/420)) +* Rename NewCidV1_SHA2_256 to mixedCaps ([#415](https://github.com/sourcenetwork/defradb/issues/415)) +* Remove utils package ([#397](https://github.com/sourcenetwork/defradb/issues/397)) +* Rework planNode Next and Value(s) function ([#374](https://github.com/sourcenetwork/defradb/issues/374)) +* Restructure aggregate query syntax ([#373](https://github.com/sourcenetwork/defradb/issues/373)) +* Remove dead code from client package and document remaining ([#356](https://github.com/sourcenetwork/defradb/issues/356)) +* Restructure datastore keys ([#316](https://github.com/sourcenetwork/defradb/issues/316)) +* Add commits lost during github outage ([#303](https://github.com/sourcenetwork/defradb/issues/303)) +* Move public members out of core and base packages ([#295](https://github.com/sourcenetwork/defradb/issues/295)) +* Make db stuff internal/private ([#291](https://github.com/sourcenetwork/defradb/issues/291)) +* Rework client.DB to ensure interface contains only public types ([#277](https://github.com/sourcenetwork/defradb/issues/277)) +* Remove GetPrimaryIndexDocKey from collection interface ([#279](https://github.com/sourcenetwork/defradb/issues/279)) +* Remove DataStoreKey from (public) dockey struct ([#278](https://github.com/sourcenetwork/defradb/issues/278)) +* Renormalize to ensure consistent file line termination. ([#226](https://github.com/sourcenetwork/defradb/issues/226)) +* Strongly typed key refactor ([#17](https://github.com/sourcenetwork/defradb/issues/17)) + +### Documentation + +* Use permanent link to BSL license document ([#692](https://github.com/sourcenetwork/defradb/issues/692)) +* README update v0.3.0 ([#646](https://github.com/sourcenetwork/defradb/issues/646)) +* Improve code documentation ([#533](https://github.com/sourcenetwork/defradb/issues/533)) +* Add CONTRIBUTING.md ([#531](https://github.com/sourcenetwork/defradb/issues/531)) +* Add package level docs for logging lib ([#338](https://github.com/sourcenetwork/defradb/issues/338)) + +### Tooling + +* Include all touched packages in code coverage ([#673](https://github.com/sourcenetwork/defradb/issues/673)) +* Use `gotestsum` over `go test` ([#619](https://github.com/sourcenetwork/defradb/issues/619)) +* Update Github pull request template ([#524](https://github.com/sourcenetwork/defradb/issues/524)) +* Fix the cross-build script ([#460](https://github.com/sourcenetwork/defradb/issues/460)) +* Add test coverage html output ([#466](https://github.com/sourcenetwork/defradb/issues/466)) +* Add linter rule for `goconst`. ([#398](https://github.com/sourcenetwork/defradb/issues/398)) +* Add github PR template. ([#394](https://github.com/sourcenetwork/defradb/issues/394)) +* Disable auto-fixing linter issues by default ([#429](https://github.com/sourcenetwork/defradb/issues/429)) +* Fix linting of empty `else` code blocks ([#402](https://github.com/sourcenetwork/defradb/issues/402)) +* Add the `gofmt` linter rule. ([#405](https://github.com/sourcenetwork/defradb/issues/405)) +* Cleanup linter config file ([#400](https://github.com/sourcenetwork/defradb/issues/400)) +* Add linter rule for copyright headers ([#360](https://github.com/sourcenetwork/defradb/issues/360)) +* Organize our config files and tooling. ([#336](https://github.com/sourcenetwork/defradb/issues/336)) +* Limit line length to 100 characters (linter check) ([#224](https://github.com/sourcenetwork/defradb/issues/224)) +* Ignore db/tests folder and the bench marks. ([#280](https://github.com/sourcenetwork/defradb/issues/280)) + +### Continuous Integration + +* Fix circleci cache permission errors. ([#371](https://github.com/sourcenetwork/defradb/issues/371)) +* Ban extra elses ([#366](https://github.com/sourcenetwork/defradb/issues/366)) +* Fix change-detection to not fail when new tests are added. ([#333](https://github.com/sourcenetwork/defradb/issues/333)) +* Update golang-ci linter and explicit go-setup to use v1.17 ([#331](https://github.com/sourcenetwork/defradb/issues/331)) +* Comment the benchmarking result comparison to the PR ([#305](https://github.com/sourcenetwork/defradb/issues/305)) +* Add benchmark performance comparisons ([#232](https://github.com/sourcenetwork/defradb/issues/232)) +* Add caching / storing of bench report on default branch ([#290](https://github.com/sourcenetwork/defradb/issues/290)) +* Ensure full-benchmarks are ran on a PR-merge. ([#282](https://github.com/sourcenetwork/defradb/issues/282)) +* Add ability to control benchmarks by PR labels. ([#267](https://github.com/sourcenetwork/defradb/issues/267)) + +### Chore + +* Update APL to refer to D2 Foundation ([#711](https://github.com/sourcenetwork/defradb/issues/711)) +* Update gitignore to include `cmd` folders ([#617](https://github.com/sourcenetwork/defradb/issues/617)) +* Enable random execution order of tests ([#554](https://github.com/sourcenetwork/defradb/issues/554)) +* Enable linters exportloopref, nolintlint, whitespace ([#535](https://github.com/sourcenetwork/defradb/issues/535)) +* Add utility for generation of man pages ([#493](https://github.com/sourcenetwork/defradb/issues/493)) +* Add Dockerfile ([#517](https://github.com/sourcenetwork/defradb/issues/517)) +* Enable errorlint linter ([#520](https://github.com/sourcenetwork/defradb/issues/520)) +* Binaries in`cmd` folder, examples in `examples` folder ([#501](https://github.com/sourcenetwork/defradb/issues/501)) +* Improve log outputs ([#506](https://github.com/sourcenetwork/defradb/issues/506)) +* Move testing to top-level `tests` folder ([#446](https://github.com/sourcenetwork/defradb/issues/446)) +* Update dependencies ([#450](https://github.com/sourcenetwork/defradb/issues/450)) +* Update go-ipfs-blockstore and ipfs-lite ([#436](https://github.com/sourcenetwork/defradb/issues/436)) +* Update libp2p dependency to v0.19 ([#424](https://github.com/sourcenetwork/defradb/issues/424)) +* Update ioutil package to io / os packages. ([#376](https://github.com/sourcenetwork/defradb/issues/376)) +* git ignore vscode ([#343](https://github.com/sourcenetwork/defradb/issues/343)) +* Updated README.md contributors section ([#292](https://github.com/sourcenetwork/defradb/issues/292)) +* Update changelog v0.2.1 ([#252](https://github.com/sourcenetwork/defradb/issues/252)) \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.3.1.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.3.1.md new file mode 100644 index 0000000..1d54ada --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.3.1.md @@ -0,0 +1,94 @@ +--- +sidebar_position: 31 +--- +# v0.3.1 + +> 2022-09-23 + +DefraDB v0.3.1 is a minor release, primarily focusing on additional/extended features and fixes of items added in the `v0.3.0` release. + +### Features + +* Add cid support for allCommits ([#857](https://github.com/sourcenetwork/defradb/issues/857)) +* Add offset support to allCommits ([#859](https://github.com/sourcenetwork/defradb/issues/859)) +* Add limit support to allCommits query ([#856](https://github.com/sourcenetwork/defradb/issues/856)) +* Add order support to allCommits ([#845](https://github.com/sourcenetwork/defradb/issues/845)) +* Display CLI usage on user error ([#819](https://github.com/sourcenetwork/defradb/issues/819)) +* Add support for dockey filters in child joins ([#806](https://github.com/sourcenetwork/defradb/issues/806)) +* Add sort support for numeric aggregates ([#786](https://github.com/sourcenetwork/defradb/issues/786)) +* Allow filtering by nil ([#789](https://github.com/sourcenetwork/defradb/issues/789)) +* Add aggregate offset support ([#778](https://github.com/sourcenetwork/defradb/issues/778)) +* Remove filter depth limit ([#777](https://github.com/sourcenetwork/defradb/issues/777)) +* Add support for and-or inline array aggregate filters ([#779](https://github.com/sourcenetwork/defradb/issues/779)) +* Add limit support for aggregates ([#771](https://github.com/sourcenetwork/defradb/issues/771)) +* Add support for inline arrays of nillable types ([#759](https://github.com/sourcenetwork/defradb/issues/759)) +* Create errors package ([#548](https://github.com/sourcenetwork/defradb/issues/548)) +* Add ability to display peer id ([#719](https://github.com/sourcenetwork/defradb/issues/719)) +* Add a config option to set the vlog max file size ([#743](https://github.com/sourcenetwork/defradb/issues/743)) +* Explain `topLevelNode` like a `MultiNode` plan ([#749](https://github.com/sourcenetwork/defradb/issues/749)) +* Make `topLevelNode` explainable ([#737](https://github.com/sourcenetwork/defradb/issues/737)) + +### Fixes + +* Order subtype without selecting the join child ([#810](https://github.com/sourcenetwork/defradb/issues/810)) +* Correctly handles nil one-one joins ([#837](https://github.com/sourcenetwork/defradb/issues/837)) +* Reset scan node for each join ([#828](https://github.com/sourcenetwork/defradb/issues/828)) +* Handle filter input field argument being nil ([#787](https://github.com/sourcenetwork/defradb/issues/787)) +* Ensure CLI outputs JSON to stdout when directed to pipe ([#804](https://github.com/sourcenetwork/defradb/issues/804)) +* Error if given the wrong side of a one-one relationship ([#795](https://github.com/sourcenetwork/defradb/issues/795)) +* Add object marker to enable return of empty docs ([#800](https://github.com/sourcenetwork/defradb/issues/800)) +* Resolve the extra `typeIndexJoin`s for `_avg` aggregate ([#774](https://github.com/sourcenetwork/defradb/issues/774)) +* Remove _like filter operator ([#797](https://github.com/sourcenetwork/defradb/issues/797)) +* Remove having gql types ([#785](https://github.com/sourcenetwork/defradb/issues/785)) +* Error if child _group selected without parent groupBy ([#781](https://github.com/sourcenetwork/defradb/issues/781)) +* Error nicely on missing field specifier ([#782](https://github.com/sourcenetwork/defradb/issues/782)) +* Handle order input field argument being nil ([#701](https://github.com/sourcenetwork/defradb/issues/701)) +* Change output to outputpath in config file template for logger ([#716](https://github.com/sourcenetwork/defradb/issues/716)) +* Delete mutations not correct persisting all keys ([#731](https://github.com/sourcenetwork/defradb/issues/731)) + +### Tooling + +* Ban the usage of `ioutil` package ([#747](https://github.com/sourcenetwork/defradb/issues/747)) +* Migrate from CircleCi to GitHub Actions ([#679](https://github.com/sourcenetwork/defradb/issues/679)) + +### Documentation + +* Clarify meaning of url param, update in-repo CLI docs ([#814](https://github.com/sourcenetwork/defradb/issues/814)) +* Disclaimer of exposed to network and not encrypted ([#793](https://github.com/sourcenetwork/defradb/issues/793)) +* Update logo to respect theme ([#728](https://github.com/sourcenetwork/defradb/issues/728)) + +### Refactoring + +* Replace all `interface{}` with `any` alias ([#805](https://github.com/sourcenetwork/defradb/issues/805)) +* Use fastjson to parse mutation data string ([#772](https://github.com/sourcenetwork/defradb/issues/772)) +* Rework limit node flow ([#767](https://github.com/sourcenetwork/defradb/issues/767)) +* Make Option immutable ([#769](https://github.com/sourcenetwork/defradb/issues/769)) +* Rework sum and count nodes to make use of generics ([#757](https://github.com/sourcenetwork/defradb/issues/757)) +* Remove some possible panics from codebase ([#732](https://github.com/sourcenetwork/defradb/issues/732)) +* Change logging calls to use feedback in CLI package ([#714](https://github.com/sourcenetwork/defradb/issues/714)) + +### Testing + +* Add tests for aggs with nil filters ([#813](https://github.com/sourcenetwork/defradb/issues/813)) +* Add not equals filter tests ([#798](https://github.com/sourcenetwork/defradb/issues/798)) +* Fix `cli/peerid_test` to not clash addresses ([#766](https://github.com/sourcenetwork/defradb/issues/766)) +* Add change detector summary to test readme ([#754](https://github.com/sourcenetwork/defradb/issues/754)) +* Add tests for inline array grouping ([#752](https://github.com/sourcenetwork/defradb/issues/752)) + +### Continuous integration + +* Reduce test resource usage and test with file db ([#791](https://github.com/sourcenetwork/defradb/issues/791)) +* Add makefile target to verify the local module cache ([#775](https://github.com/sourcenetwork/defradb/issues/775)) +* Allow PR titles to end with a number ([#745](https://github.com/sourcenetwork/defradb/issues/745)) +* Add a workflow to validate pull request titles ([#734](https://github.com/sourcenetwork/defradb/issues/734)) +* Fix the linter version to `v1.47` ([#726](https://github.com/sourcenetwork/defradb/issues/726)) + +### Chore + +* Remove file system paths from resulting executable ([#831](https://github.com/sourcenetwork/defradb/issues/831)) +* Add goimports linter for consistent imports ordering ([#816](https://github.com/sourcenetwork/defradb/issues/816)) +* Improve UX by providing more information ([#802](https://github.com/sourcenetwork/defradb/issues/802)) +* Change to defra errors and handle errors stacktrace ([#794](https://github.com/sourcenetwork/defradb/issues/794)) +* Clean up `go.mod` with pruned module graphs ([#756](https://github.com/sourcenetwork/defradb/issues/756)) +* Update to v0.20.3 of libp2p ([#740](https://github.com/sourcenetwork/defradb/issues/740)) +* Bump to GoLang `v1.18` ([#721](https://github.com/sourcenetwork/defradb/issues/721)) \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.4.0.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.4.0.md new file mode 100644 index 0000000..24ec532 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.4.0.md @@ -0,0 +1,80 @@ +--- +sidebar_position: 40 +--- + +# v0.4.0 + +> 2023-12-23 + +DefraDB v0.4 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +There are various new features in this release - some of which are breaking - and we invite you to review the official changelog below. Some highlights are persistence of replicators, DateTime scalars, TLS support, and GQL subscriptions. + +This release does include a Breaking Change to existing v0.3.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. + +### Features + +* Add basic metric functionality ([#971](https://github.com/sourcenetwork/defradb/issues/971)) +* Add thread safe transactional in-memory datastore ([#947](https://github.com/sourcenetwork/defradb/issues/947)) +* Persist p2p replicators ([#960](https://github.com/sourcenetwork/defradb/issues/960)) +* Add DateTime custom scalars ([#931](https://github.com/sourcenetwork/defradb/issues/931)) +* Add GraphQL subscriptions ([#934](https://github.com/sourcenetwork/defradb/issues/934)) +* Add support for tls ([#885](https://github.com/sourcenetwork/defradb/issues/885)) +* Add group by support for commits ([#887](https://github.com/sourcenetwork/defradb/issues/887)) +* Add depth support for commits ([#889](https://github.com/sourcenetwork/defradb/issues/889)) +* Make dockey optional for allCommits queries ([#847](https://github.com/sourcenetwork/defradb/issues/847)) +* Add WithStack to the errors package ([#870](https://github.com/sourcenetwork/defradb/issues/870)) +* Add event system ([#834](https://github.com/sourcenetwork/defradb/issues/834)) + +### Fixes + +* Correct errors.WithStack behaviour ([#984](https://github.com/sourcenetwork/defradb/issues/984)) +* Correctly handle nested one to one joins ([#964](https://github.com/sourcenetwork/defradb/issues/964)) +* Do not assume parent record exists when joining ([#963](https://github.com/sourcenetwork/defradb/issues/963)) +* Change time format for HTTP API log ([#910](https://github.com/sourcenetwork/defradb/issues/910)) +* Error if group select contains non-group-by fields ([#898](https://github.com/sourcenetwork/defradb/issues/898)) +* Add inspection of values for ENV flags ([#900](https://github.com/sourcenetwork/defradb/issues/900)) +* Remove panics from document ([#881](https://github.com/sourcenetwork/defradb/issues/881)) +* Add __typename support ([#871](https://github.com/sourcenetwork/defradb/issues/871)) +* Handle subscriber close ([#877](https://github.com/sourcenetwork/defradb/issues/877)) +* Publish update events post commit ([#866](https://github.com/sourcenetwork/defradb/issues/866)) + +### Refactoring + +* Make rootstore require Batching and TxnDatastore ([#940](https://github.com/sourcenetwork/defradb/issues/940)) +* Conceptually clarify schema vs query-language ([#924](https://github.com/sourcenetwork/defradb/issues/924)) +* Decouple db.db from gql ([#912](https://github.com/sourcenetwork/defradb/issues/912)) +* Merkle clock heads cleanup ([#918](https://github.com/sourcenetwork/defradb/issues/918)) +* Simplify dag fetcher ([#913](https://github.com/sourcenetwork/defradb/issues/913)) +* Cleanup parsing logic ([#909](https://github.com/sourcenetwork/defradb/issues/909)) +* Move planner outside the gql directory ([#907](https://github.com/sourcenetwork/defradb/issues/907)) +* Refactor commit nodes ([#892](https://github.com/sourcenetwork/defradb/issues/892)) +* Make latest commits syntax sugar ([#890](https://github.com/sourcenetwork/defradb/issues/890)) +* Remove commit query ([#841](https://github.com/sourcenetwork/defradb/issues/841)) + +### Testing + +* Add event tests ([#965](https://github.com/sourcenetwork/defradb/issues/965)) +* Add new setup for testing explain functionality ([#949](https://github.com/sourcenetwork/defradb/issues/949)) +* Add txn relation-type delete and create tests ([#875](https://github.com/sourcenetwork/defradb/issues/875)) +* Skip change detection for tests that assert panic ([#883](https://github.com/sourcenetwork/defradb/issues/883)) + +### Continuous integration + +* Bump all gh-action versions to support node16 ([#990](https://github.com/sourcenetwork/defradb/issues/990)) +* Bump ssh-agent action to v0.7.0 ([#978](https://github.com/sourcenetwork/defradb/issues/978)) +* Add error message format check ([#901](https://github.com/sourcenetwork/defradb/issues/901)) + +### Chore + +* Extract (events, merkle) errors to errors.go ([#973](https://github.com/sourcenetwork/defradb/issues/973)) +* Extract (datastore, db) errors to errors.go ([#969](https://github.com/sourcenetwork/defradb/issues/969)) +* Extract (connor, crdt, core) errors to errors.go ([#968](https://github.com/sourcenetwork/defradb/issues/968)) +* Extract inline (http and client) errors to errors.go ([#967](https://github.com/sourcenetwork/defradb/issues/967)) +* Update badger version ([#966](https://github.com/sourcenetwork/defradb/issues/966)) +* Move Option and Enumerable to immutables ([#939](https://github.com/sourcenetwork/defradb/issues/939)) +* Add configuration of external loggers ([#942](https://github.com/sourcenetwork/defradb/issues/942)) +* Strip DSKey prefixes and simplify NewDataStoreKey ([#944](https://github.com/sourcenetwork/defradb/issues/944)) +* Include version metadata in cross-building ([#930](https://github.com/sourcenetwork/defradb/issues/930)) +* Update to v0.23.2 the libP2P package ([#908](https://github.com/sourcenetwork/defradb/issues/908)) +* Remove `ipfslite` dependency ([#739](https://github.com/sourcenetwork/defradb/issues/739)) \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.5.0.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.5.0.md new file mode 100644 index 0000000..96e8499 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.5.0.md @@ -0,0 +1,144 @@ +--- +sidebar_position: 50 +--- + +# v0.5.0 + +> 2023-04-12 + +DefraDB v0.5 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +There many new features in this release, but most importantly, this is the first open source release for DefraDB. As such, this release focused on various quality of life changes and refactors, bug fixes, and overall cleanliness of the repo so it can effectively be used and tested in the public domain. + +To get a full outline of the changes, we invite you to review the official changelog below. Some highlights are the first iteration of our schema update system, allowing developers to add new fields to schemas using our JSON Patch based DDL, a new DAG based delete system which will persist "soft-delete" ops into the CRDT Merkle DAG, and a early prototype for our collection level peer-to-peer synchronization. + +This release does include a Breaking Change to existing v0.4.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.source.network/. + +### Features + +* Add document delete mechanics ([#1263](https://github.com/sourcenetwork/defradb/issues/1263)) +* Ability to explain an executed request ([#1188](https://github.com/sourcenetwork/defradb/issues/1188)) +* Add SchemaPatch CLI command ([#1250](https://github.com/sourcenetwork/defradb/issues/1250)) +* Add support for one-one mutation from sec. side ([#1247](https://github.com/sourcenetwork/defradb/issues/1247)) +* Store only key in DAG instead of dockey path ([#1245](https://github.com/sourcenetwork/defradb/issues/1245)) +* Add collectionId field to commit field ([#1235](https://github.com/sourcenetwork/defradb/issues/1235)) +* Add field kind substitution for PatchSchema ([#1223](https://github.com/sourcenetwork/defradb/issues/1223)) +* Add dockey field for commit field ([#1216](https://github.com/sourcenetwork/defradb/issues/1216)) +* Allow new fields to be added locally to schema ([#1139](https://github.com/sourcenetwork/defradb/issues/1139)) +* Add `like` sub-string filter ([#1091](https://github.com/sourcenetwork/defradb/issues/1091)) +* Add ability for P2P to wait for pushlog by peer ([#1098](https://github.com/sourcenetwork/defradb/issues/1098)) +* Add P2P collection topic subscription ([#1086](https://github.com/sourcenetwork/defradb/issues/1086)) +* Add support for schema version id in queries ([#1067](https://github.com/sourcenetwork/defradb/issues/1067)) +* Add schema version id to commit queries ([#1061](https://github.com/sourcenetwork/defradb/issues/1061)) +* Persist schema version at time of commit ([#1055](https://github.com/sourcenetwork/defradb/issues/1055)) +* Add ability to input simple explain type arg ([#1039](https://github.com/sourcenetwork/defradb/issues/1039)) + +### Fixes + +* API address parameter validation ([#1311](https://github.com/sourcenetwork/defradb/issues/1311)) +* Improve error message for NonNull GQL types ([#1333](https://github.com/sourcenetwork/defradb/issues/1333)) +* Handle panics in the rpc server ([#1330](https://github.com/sourcenetwork/defradb/issues/1330)) +* Handle returned error in select.go ([#1329](https://github.com/sourcenetwork/defradb/issues/1329)) +* Resolve handful of CLI issues ([#1318](https://github.com/sourcenetwork/defradb/issues/1318)) +* Only check for events queue on subscription request ([#1326](https://github.com/sourcenetwork/defradb/issues/1326)) +* Remove client Create/UpdateCollection ([#1309](https://github.com/sourcenetwork/defradb/issues/1309)) +* CLI to display specific command usage help ([#1314](https://github.com/sourcenetwork/defradb/issues/1314)) +* Fix P2P collection CLI commands ([#1295](https://github.com/sourcenetwork/defradb/issues/1295)) +* Dont double up badger file path ([#1299](https://github.com/sourcenetwork/defradb/issues/1299)) +* Update immutable package ([#1290](https://github.com/sourcenetwork/defradb/issues/1290)) +* Fix panic on success of Add/RemoveP2PCollections ([#1297](https://github.com/sourcenetwork/defradb/issues/1297)) +* Fix deadlock on memory-datastore Close ([#1273](https://github.com/sourcenetwork/defradb/issues/1273)) +* Determine if query is introspection query ([#1255](https://github.com/sourcenetwork/defradb/issues/1255)) +* Allow newly added fields to sync via p2p ([#1226](https://github.com/sourcenetwork/defradb/issues/1226)) +* Expose `ExplainEnum` in the GQL schema ([#1204](https://github.com/sourcenetwork/defradb/issues/1204)) +* Resolve aggregates' mapping with deep nested subtypes ([#1175](https://github.com/sourcenetwork/defradb/issues/1175)) +* Make sort stable and handle nil comparison ([#1094](https://github.com/sourcenetwork/defradb/issues/1094)) +* Change successful schema add status to 200 ([#1106](https://github.com/sourcenetwork/defradb/issues/1106)) +* Add delay in P2P test util execution ([#1093](https://github.com/sourcenetwork/defradb/issues/1093)) +* Ensure errors test don't hard expect folder name ([#1072](https://github.com/sourcenetwork/defradb/issues/1072)) +* Remove potential P2P deadlock ([#1056](https://github.com/sourcenetwork/defradb/issues/1056)) +* Rework the P2P integration tests ([#989](https://github.com/sourcenetwork/defradb/issues/989)) +* Improve DAG sync with highly concurrent updates ([#1031](https://github.com/sourcenetwork/defradb/issues/1031)) + +### Documentation + +* Update docs for the v0.5 release ([#1320](https://github.com/sourcenetwork/defradb/issues/1320)) +* Document client interfaces in client/db.go ([#1305](https://github.com/sourcenetwork/defradb/issues/1305)) +* Document client Description types ([#1307](https://github.com/sourcenetwork/defradb/issues/1307)) +* Improve security policy ([#1240](https://github.com/sourcenetwork/defradb/issues/1240)) +* Add security disclosure policy ([#1194](https://github.com/sourcenetwork/defradb/issues/1194)) +* Correct commits query example in readme ([#1172](https://github.com/sourcenetwork/defradb/issues/1172)) + +### Refactoring + +* Improve p2p collection operations on peer ([#1286](https://github.com/sourcenetwork/defradb/issues/1286)) +* Migrate gql introspection tests to new framework ([#1211](https://github.com/sourcenetwork/defradb/issues/1211)) +* Reorganise client transaction related interfaces ([#1180](https://github.com/sourcenetwork/defradb/issues/1180)) +* Config-local viper, rootdir, and logger parsing ([#1132](https://github.com/sourcenetwork/defradb/issues/1132)) +* Migrate mutation-relation tests to new framework ([#1109](https://github.com/sourcenetwork/defradb/issues/1109)) +* Rework integration test framework ([#1089](https://github.com/sourcenetwork/defradb/issues/1089)) +* Generate gql types using col. desc ([#1080](https://github.com/sourcenetwork/defradb/issues/1080)) +* Extract config errors to dedicated file ([#1107](https://github.com/sourcenetwork/defradb/issues/1107)) +* Change terminology from query to request ([#1054](https://github.com/sourcenetwork/defradb/issues/1054)) +* Allow db keys to handle multiple schema versions ([#1026](https://github.com/sourcenetwork/defradb/issues/1026)) +* Extract query schema errors to dedicated file ([#1037](https://github.com/sourcenetwork/defradb/issues/1037)) +* Extract planner errors to dedicated file ([#1034](https://github.com/sourcenetwork/defradb/issues/1034)) +* Extract query parser errors to dedicated file ([#1035](https://github.com/sourcenetwork/defradb/issues/1035)) + +### Testing + +* Remove test reference to DEFRA_ROOTDIR env var ([#1328](https://github.com/sourcenetwork/defradb/issues/1328)) +* Expand tests for Peer subscribe actions ([#1287](https://github.com/sourcenetwork/defradb/issues/1287)) +* Fix flaky TestCloseThroughContext test ([#1265](https://github.com/sourcenetwork/defradb/issues/1265)) +* Add gql introspection tests for patch schema ([#1219](https://github.com/sourcenetwork/defradb/issues/1219)) +* Explicitly state change detector split for test ([#1228](https://github.com/sourcenetwork/defradb/issues/1228)) +* Add test for successful one-one create mutation ([#1215](https://github.com/sourcenetwork/defradb/issues/1215)) +* Ensure that all databases are always closed on exit ([#1187](https://github.com/sourcenetwork/defradb/issues/1187)) +* Add P2P tests for Schema Update adding field ([#1182](https://github.com/sourcenetwork/defradb/issues/1182)) +* Migrate P2P/state tests to new framework ([#1160](https://github.com/sourcenetwork/defradb/issues/1160)) +* Remove sleep from subscription tests ([#1156](https://github.com/sourcenetwork/defradb/issues/1156)) +* Fetch documents on test execution start ([#1163](https://github.com/sourcenetwork/defradb/issues/1163)) +* Introduce basic testing for the `version` module ([#1111](https://github.com/sourcenetwork/defradb/issues/1111)) +* Boost test coverage for collection_update ([#1050](https://github.com/sourcenetwork/defradb/issues/1050)) +* Wait between P2P update retry attempts ([#1052](https://github.com/sourcenetwork/defradb/issues/1052)) +* Exclude auto-generated protobuf files from codecov ([#1048](https://github.com/sourcenetwork/defradb/issues/1048)) +* Add P2P tests for relational docs ([#1042](https://github.com/sourcenetwork/defradb/issues/1042)) + +### Continuous integration + +* Add workflow that builds DefraDB AMI upon tag push ([#1304](https://github.com/sourcenetwork/defradb/issues/1304)) +* Allow PR title to end with a capital letter ([#1291](https://github.com/sourcenetwork/defradb/issues/1291)) +* Changes for `dependabot` to be well-behaved ([#1165](https://github.com/sourcenetwork/defradb/issues/1165)) +* Skip benchmarks for dependabot ([#1144](https://github.com/sourcenetwork/defradb/issues/1144)) +* Add workflow to ensure deps build properly ([#1078](https://github.com/sourcenetwork/defradb/issues/1078)) +* Runner and Builder Containerfiles ([#951](https://github.com/sourcenetwork/defradb/issues/951)) +* Fix go-header linter rule to be any year ([#1021](https://github.com/sourcenetwork/defradb/issues/1021)) + +### Chore + +* Add Islam as contributor ([#1302](https://github.com/sourcenetwork/defradb/issues/1302)) +* Update go-libp2p to 0.26.4 ([#1257](https://github.com/sourcenetwork/defradb/issues/1257)) +* Improve the test coverage of datastore ([#1203](https://github.com/sourcenetwork/defradb/issues/1203)) +* Add issue and discussion templates ([#1193](https://github.com/sourcenetwork/defradb/issues/1193)) +* Bump libp2p/go-libp2p-kad-dht from 0.21.0 to 0.21.1 ([#1146](https://github.com/sourcenetwork/defradb/issues/1146)) +* Enable dependabot ([#1120](https://github.com/sourcenetwork/defradb/issues/1120)) +* Update `opentelemetry` dependencies ([#1114](https://github.com/sourcenetwork/defradb/issues/1114)) +* Update dependencies including go-ipfs ([#1112](https://github.com/sourcenetwork/defradb/issues/1112)) +* Bump to GoLang v1.19 ([#818](https://github.com/sourcenetwork/defradb/issues/818)) +* Remove versionedScan node ([#1049](https://github.com/sourcenetwork/defradb/issues/1049)) + +### Bot + +* Bump github.com/multiformats/go-multiaddr from 0.8.0 to 0.9.0 ([#1277](https://github.com/sourcenetwork/defradb/issues/1277)) +* Bump google.golang.org/grpc from 1.53.0 to 1.54.0 ([#1233](https://github.com/sourcenetwork/defradb/issues/1233)) +* Bump github.com/multiformats/go-multibase from 0.1.1 to 0.2.0 ([#1230](https://github.com/sourcenetwork/defradb/issues/1230)) +* Bump github.com/ipfs/go-libipfs from 0.6.2 to 0.7.0 ([#1231](https://github.com/sourcenetwork/defradb/issues/1231)) +* Bump github.com/ipfs/go-cid from 0.3.2 to 0.4.0 ([#1200](https://github.com/sourcenetwork/defradb/issues/1200)) +* Bump github.com/ipfs/go-ipfs-blockstore from 1.2.0 to 1.3.0 ([#1199](https://github.com/sourcenetwork/defradb/issues/1199)) +* Bump github.com/stretchr/testify from 1.8.1 to 1.8.2 ([#1198](https://github.com/sourcenetwork/defradb/issues/1198)) +* Bump github.com/ipfs/go-libipfs from 0.6.1 to 0.6.2 ([#1201](https://github.com/sourcenetwork/defradb/issues/1201)) +* Bump golang.org/x/crypto from 0.6.0 to 0.7.0 ([#1197](https://github.com/sourcenetwork/defradb/issues/1197)) +* Bump libp2p/go-libp2p-gostream from 0.5.0 to 0.6.0 ([#1152](https://github.com/sourcenetwork/defradb/issues/1152)) +* Bump github.com/ipfs/go-libipfs from 0.5.0 to 0.6.1 ([#1166](https://github.com/sourcenetwork/defradb/issues/1166)) +* Bump github.com/ugorji/go/codec from 1.2.9 to 1.2.11 ([#1173](https://github.com/sourcenetwork/defradb/issues/1173)) +* Bump github.com/libp2p/go-libp2p-pubsub from 0.9.0 to 0.9.3 ([#1183](https://github.com/sourcenetwork/defradb/issues/1183)) \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.5.1.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.5.1.md new file mode 100644 index 0000000..f204c56 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.5.1.md @@ -0,0 +1,91 @@ +--- +sidebar_position: 51 +--- + +# v0.5.1 + +> 2023-05-16 + +### Features + +* Add collection response information on creation ([#1499](https://github.com/sourcenetwork/defradb/issues/1499)) +* CLI client request from file ([#1503](https://github.com/sourcenetwork/defradb/issues/1503)) +* Add commits fieldName and fieldId fields ([#1451](https://github.com/sourcenetwork/defradb/issues/1451)) +* Add allowed origins config ([#1408](https://github.com/sourcenetwork/defradb/issues/1408)) +* Add descriptions to all system defined GQL stuff ([#1387](https://github.com/sourcenetwork/defradb/issues/1387)) +* Strongly type Request.Errors ([#1364](https://github.com/sourcenetwork/defradb/issues/1364)) + +### Fixes + +* Skip new test packages in change detector ([#1495](https://github.com/sourcenetwork/defradb/issues/1495)) +* Make nested joins work correctly from primary direction ([#1491](https://github.com/sourcenetwork/defradb/issues/1491)) +* Add reconnection to known peers ([#1482](https://github.com/sourcenetwork/defradb/issues/1482)) +* Rename commit field input arg to fieldId ([#1460](https://github.com/sourcenetwork/defradb/issues/1460)) +* Reference collectionID in p2p readme ([#1466](https://github.com/sourcenetwork/defradb/issues/1466)) +* Handling SIGTERM in CLI `start` command ([#1459](https://github.com/sourcenetwork/defradb/issues/1459)) +* Update QL documentation link and replicator command ([#1440](https://github.com/sourcenetwork/defradb/issues/1440)) +* Fix typo in readme ([#1419](https://github.com/sourcenetwork/defradb/issues/1419)) +* Limit the size of http request bodies that we handle ([#1405](https://github.com/sourcenetwork/defradb/issues/1405)) +* Improve P2P event handling ([#1388](https://github.com/sourcenetwork/defradb/issues/1388)) +* Serialize DB errors to json in http package ([#1401](https://github.com/sourcenetwork/defradb/issues/1401)) +* Do not commit if errors have been returned ([#1390](https://github.com/sourcenetwork/defradb/issues/1390)) +* Unlock replicator lock before returning error ([#1369](https://github.com/sourcenetwork/defradb/issues/1369)) +* Improve NonNull error message ([#1362](https://github.com/sourcenetwork/defradb/issues/1362)) +* Use ring-buffer for WaitForFoo chans ([#1359](https://github.com/sourcenetwork/defradb/issues/1359)) +* Guarantee event processing order ([#1352](https://github.com/sourcenetwork/defradb/issues/1352)) +* Explain of _group with dockeys filter to be []string ([#1348](https://github.com/sourcenetwork/defradb/issues/1348)) + +### Refactoring + +* Use `int32` for proper gql scalar Int parsing ([#1493](https://github.com/sourcenetwork/defradb/issues/1493)) +* Improve rollback on peer P2P collection error ([#1461](https://github.com/sourcenetwork/defradb/issues/1461)) +* Improve CLI with test suite and builder pattern ([#928](https://github.com/sourcenetwork/defradb/issues/928)) + +### Testing + +* Add DB/Node Restart tests ([#1504](https://github.com/sourcenetwork/defradb/issues/1504)) +* Provide tests for client introspection query ([#1492](https://github.com/sourcenetwork/defradb/issues/1492)) +* Convert explain count tests to new explain setup ([#1488](https://github.com/sourcenetwork/defradb/issues/1488)) +* Convert explain sum tests to new explain setup ([#1489](https://github.com/sourcenetwork/defradb/issues/1489)) +* Convert explain average tests to new explain setup ([#1487](https://github.com/sourcenetwork/defradb/issues/1487)) +* Convert explain top-level tests to new explain setup ([#1480](https://github.com/sourcenetwork/defradb/issues/1480)) +* Convert explain order tests to new explain setup ([#1478](https://github.com/sourcenetwork/defradb/issues/1478)) +* Convert explain join tests to new explain setup ([#1476](https://github.com/sourcenetwork/defradb/issues/1476)) +* Convert explain dagscan tests to new explain setup ([#1474](https://github.com/sourcenetwork/defradb/issues/1474)) +* Add tests to assert schema id order independence ([#1456](https://github.com/sourcenetwork/defradb/issues/1456)) +* Capitalize all integration schema types ([#1445](https://github.com/sourcenetwork/defradb/issues/1445)) +* Convert explain limit tests to new explain setup ([#1446](https://github.com/sourcenetwork/defradb/issues/1446)) +* Improve change detector performance ([#1433](https://github.com/sourcenetwork/defradb/issues/1433)) +* Convert mutation explain tests to new explain setup ([#1416](https://github.com/sourcenetwork/defradb/issues/1416)) +* Convert filter explain tests to new explain setup ([#1380](https://github.com/sourcenetwork/defradb/issues/1380)) +* Retry test doc mutation on transaction conflict ([#1366](https://github.com/sourcenetwork/defradb/issues/1366)) + +### Continuous integration + +* Remove secret ssh key stuff from change detector wf ([#1438](https://github.com/sourcenetwork/defradb/issues/1438)) +* Fix the SSH security issue from AMI scan report ([#1426](https://github.com/sourcenetwork/defradb/issues/1426)) +* Add a separate workflow to run the linter ([#1434](https://github.com/sourcenetwork/defradb/issues/1434)) +* Allow CI to work from forked repo ([#1392](https://github.com/sourcenetwork/defradb/issues/1392)) +* Bump go version within packer for AWS AMI ([#1344](https://github.com/sourcenetwork/defradb/issues/1344)) + +### Chore + +* Enshrine defra logger names ([#1410](https://github.com/sourcenetwork/defradb/issues/1410)) +* Remove some dead code ([#1470](https://github.com/sourcenetwork/defradb/issues/1470)) +* Update graphql-go ([#1422](https://github.com/sourcenetwork/defradb/issues/1422)) +* Improve logging consistency ([#1424](https://github.com/sourcenetwork/defradb/issues/1424)) +* Makefile tests with shorter timeout and common flags ([#1397](https://github.com/sourcenetwork/defradb/issues/1397)) +* Move to gofrs/uuid ([#1396](https://github.com/sourcenetwork/defradb/issues/1396)) +* Move to ipfs boxo ([#1393](https://github.com/sourcenetwork/defradb/issues/1393)) +* Document collection.txn ([#1363](https://github.com/sourcenetwork/defradb/issues/1363)) + +### Bot + +* Bump golang.org/x/crypto from 0.8.0 to 0.9.0 ([#1497](https://github.com/sourcenetwork/defradb/issues/1497)) +* Bump golang.org/x/net from 0.9.0 to 0.10.0 ([#1496](https://github.com/sourcenetwork/defradb/issues/1496)) +* Bump google.golang.org/grpc from 1.54.0 to 1.55.0 ([#1464](https://github.com/sourcenetwork/defradb/issues/1464)) +* Bump github.com/ipfs/boxo from 0.8.0 to 0.8.1 ([#1427](https://github.com/sourcenetwork/defradb/issues/1427)) +* Bump golang.org/x/crypto from 0.7.0 to 0.8.0 ([#1398](https://github.com/sourcenetwork/defradb/issues/1398)) +* Bump github.com/spf13/cobra from 1.6.1 to 1.7.0 ([#1399](https://github.com/sourcenetwork/defradb/issues/1399)) +* Bump github.com/ipfs/go-blockservice from 0.5.0 to 0.5.1 ([#1300](https://github.com/sourcenetwork/defradb/issues/1300)) +* Bump github.com/ipfs/go-cid from 0.4.0 to 0.4.1 ([#1301](https://github.com/sourcenetwork/defradb/issues/1301)) diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.6.0.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.6.0.md new file mode 100644 index 0000000..8026fec --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.6.0.md @@ -0,0 +1,85 @@ +--- +sidebar_position: 61 +--- + +# v0.6.0 + +> 2023-07-31 + +DefraDB v0.6 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +There are several new and powerful features, important bug fixes, and notable refactors in this release. Some highlight features include: The initial release of our LensVM based schema migration engine powered by WebAssembly ([#1650](https://github.com/sourcenetwork/defradb/issues/1650)), newly embedded DefraDB Playround which includes a bundled GraphQL client and schema manager, and last but not least a relation field (type_id) alias to improve the developer experience ([#1609](https://github.com/sourcenetwork/defradb/issues/1609)). + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.5.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.gg/w7jYQVJ/. + +### Features + +* Add `_not` operator ([#1631](https://github.com/sourcenetwork/defradb/issues/1631)) +* Schema list API ([#1625](https://github.com/sourcenetwork/defradb/issues/1625)) +* Add simple data import and export ([#1630](https://github.com/sourcenetwork/defradb/issues/1630)) +* Playground ([#1575](https://github.com/sourcenetwork/defradb/issues/1575)) +* Add schema migration get and set cmds to CLI ([#1650](https://github.com/sourcenetwork/defradb/issues/1650)) +* Allow relation alias on create and update ([#1609](https://github.com/sourcenetwork/defradb/issues/1609)) +* Make fetcher calculate docFetches and fieldFetches ([#1713](https://github.com/sourcenetwork/defradb/issues/1713)) +* Add lens migration engine to defra ([#1564](https://github.com/sourcenetwork/defradb/issues/1564)) +* Add `_keys` attribute to `selectNode` simple explain ([#1546](https://github.com/sourcenetwork/defradb/issues/1546)) +* CLI commands for secondary indexes ([#1595](https://github.com/sourcenetwork/defradb/issues/1595)) +* Add alias to `groupBy` related object ([#1579](https://github.com/sourcenetwork/defradb/issues/1579)) +* Non-unique secondary index (no querying) ([#1450](https://github.com/sourcenetwork/defradb/issues/1450)) +* Add ability to explain-debug all nodes ([#1563](https://github.com/sourcenetwork/defradb/issues/1563)) +* Include dockey in doc exists err ([#1558](https://github.com/sourcenetwork/defradb/issues/1558)) + +### Fixes + +* Better wait in CLI integration test ([#1415](https://github.com/sourcenetwork/defradb/issues/1415)) +* Return error when relation is not defined on both types ([#1647](https://github.com/sourcenetwork/defradb/issues/1647)) +* Change `core.DocumentMapping` to pointer ([#1528](https://github.com/sourcenetwork/defradb/issues/1528)) +* Fix invalid (badger) datastore state ([#1685](https://github.com/sourcenetwork/defradb/issues/1685)) +* Discard index and subscription implicit transactions ([#1715](https://github.com/sourcenetwork/defradb/issues/1715)) +* Remove duplicated `peers` in peerstore prefix ([#1678](https://github.com/sourcenetwork/defradb/issues/1678)) +* Return errors from typeJoinOne ([#1716](https://github.com/sourcenetwork/defradb/issues/1716)) +* Document change detector breaking change ([#1531](https://github.com/sourcenetwork/defradb/issues/1531)) +* Standardise `schema migration` CLI errors ([#1682](https://github.com/sourcenetwork/defradb/issues/1682)) +* Introspection OrderArg returns null inputFields ([#1633](https://github.com/sourcenetwork/defradb/issues/1633)) +* Avoid duplicated requestable fields ([#1621](https://github.com/sourcenetwork/defradb/issues/1621)) +* Normalize int field kind ([#1619](https://github.com/sourcenetwork/defradb/issues/1619)) +* Change the WriteSyncer to use lock when piping ([#1608](https://github.com/sourcenetwork/defradb/issues/1608)) +* Filter splitting and rendering for related types ([#1541](https://github.com/sourcenetwork/defradb/issues/1541)) + +### Documentation + +* Improve CLI command documentation ([#1505](https://github.com/sourcenetwork/defradb/issues/1505)) + +### Refactoring + +* Schema list output to include schemaVersionID ([#1706](https://github.com/sourcenetwork/defradb/issues/1706)) +* Reuse lens wasm modules ([#1641](https://github.com/sourcenetwork/defradb/issues/1641)) +* Remove redundant txn param from fetcher start ([#1635](https://github.com/sourcenetwork/defradb/issues/1635)) +* Remove first CRDT byte from field encoded values ([#1622](https://github.com/sourcenetwork/defradb/issues/1622)) +* Merge `node` into `net` and improve coverage ([#1593](https://github.com/sourcenetwork/defradb/issues/1593)) +* Fetcher filter and field optimization ([#1500](https://github.com/sourcenetwork/defradb/issues/1500)) + +### Testing + +* Rework transaction test framework capabilities ([#1603](https://github.com/sourcenetwork/defradb/issues/1603)) +* Expand backup integration tests ([#1699](https://github.com/sourcenetwork/defradb/issues/1699)) +* Disable test ([#1675](https://github.com/sourcenetwork/defradb/issues/1675)) +* Add tests for 1-1 group by id ([#1655](https://github.com/sourcenetwork/defradb/issues/1655)) +* Remove CLI tests from make test ([#1643](https://github.com/sourcenetwork/defradb/issues/1643)) +* Bundle test state into single var ([#1645](https://github.com/sourcenetwork/defradb/issues/1645)) +* Convert explain group tests to new explain setup ([#1537](https://github.com/sourcenetwork/defradb/issues/1537)) +* Add tests for foo_id field name clashes ([#1521](https://github.com/sourcenetwork/defradb/issues/1521)) +* Resume wait correctly following test node restart ([#1515](https://github.com/sourcenetwork/defradb/issues/1515)) +* Require no errors when none expected ([#1509](https://github.com/sourcenetwork/defradb/issues/1509)) + +### Continuous integration + +* Add workflows to push, pull, and validate docker images ([#1676](https://github.com/sourcenetwork/defradb/issues/1676)) +* Build mocks using make ([#1612](https://github.com/sourcenetwork/defradb/issues/1612)) +* Fix terraform plan and merge AMI build + deploy workflow ([#1514](https://github.com/sourcenetwork/defradb/issues/1514)) +* Reconfigure CodeCov action to ensure stability ([#1414](https://github.com/sourcenetwork/defradb/issues/1414)) + +### Chore + +* Bump to GoLang v1.20 ([#1689](https://github.com/sourcenetwork/defradb/issues/1689)) +* Update to ipfs boxo 0.10.0 ([#1573](https://github.com/sourcenetwork/defradb/issues/1573)) \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.7.0.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.7.0.md new file mode 100644 index 0000000..00ea8d5 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.7.0.md @@ -0,0 +1,74 @@ +--- +sidebar_position: 70 +--- +# v0.7.0 + +> 2023-09-18 + +DefraDB v0.7 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +This release has focused on robustness, testing, and schema management. Some highlight new features include notable expansions to the expressiveness of schema migrations. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.6.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.gg/w7jYQVJ/. + +### Features + +* Allow field indexing by name in PatchSchema ([#1810](https://github.com/sourcenetwork/defradb/issues/1810)) +* Auto-create relation id fields via PatchSchema ([#1807](https://github.com/sourcenetwork/defradb/issues/1807)) +* Support PatchSchema relational field kind substitution ([#1777](https://github.com/sourcenetwork/defradb/issues/1777)) +* Add support for adding of relational fields ([#1766](https://github.com/sourcenetwork/defradb/issues/1766)) +* Enable downgrading of documents via Lens inverses ([#1721](https://github.com/sourcenetwork/defradb/issues/1721)) + +### Fixes + +* Correctly handle serialisation of nil field values ([#1872](https://github.com/sourcenetwork/defradb/issues/1872)) +* Compound filter operators with relations ([#1855](https://github.com/sourcenetwork/defradb/issues/1855)) +* Only update updated fields via update requests ([#1817](https://github.com/sourcenetwork/defradb/issues/1817)) +* Error when saving a deleted document ([#1806](https://github.com/sourcenetwork/defradb/issues/1806)) +* Prevent multiple docs from being linked in one one ([#1790](https://github.com/sourcenetwork/defradb/issues/1790)) +* Handle the querying of secondary relation id fields ([#1768](https://github.com/sourcenetwork/defradb/issues/1768)) +* Improve the way migrations handle transactions ([#1737](https://github.com/sourcenetwork/defradb/issues/1737)) + +### Tooling + +* Add Akash deployment configuration ([#1736](https://github.com/sourcenetwork/defradb/issues/1736)) + +### Refactoring + +* HTTP client interface ([#1776](https://github.com/sourcenetwork/defradb/issues/1776)) +* Simplify fetcher interface ([#1746](https://github.com/sourcenetwork/defradb/issues/1746)) + +### Testing + +* Convert and move out of place explain tests ([#1878](https://github.com/sourcenetwork/defradb/issues/1878)) +* Update mutation tests to make use of mutation system ([#1853](https://github.com/sourcenetwork/defradb/issues/1853)) +* Test top level agg. with compound relational filter ([#1870](https://github.com/sourcenetwork/defradb/issues/1870)) +* Skip unsupported mutation types at test level ([#1850](https://github.com/sourcenetwork/defradb/issues/1850)) +* Extend mutation tests with col.Update and Create ([#1838](https://github.com/sourcenetwork/defradb/issues/1838)) +* Add tests for multiple one-one joins ([#1793](https://github.com/sourcenetwork/defradb/issues/1793)) + +### Chore + +* Update Badger version to v4 ([#1740](https://github.com/sourcenetwork/defradb/issues/1740)) +* Update go-libp2p to 0.29.2 ([#1780](https://github.com/sourcenetwork/defradb/issues/1780)) +* Bump golangci-lint to v1.54 ([#1881](https://github.com/sourcenetwork/defradb/issues/1881)) +* Bump go.opentelemetry.io/otel/metric from 1.17.0 to 1.18.0 ([#1890](https://github.com/sourcenetwork/defradb/issues/1890)) +* Bump [@tanstack](https://github.com/tanstack)/react-query from 4.35.0 to 4.35.3 in /playground ([#1876](https://github.com/sourcenetwork/defradb/issues/1876)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.5.0 to 6.7.0 in /playground ([#1874](https://github.com/sourcenetwork/defradb/issues/1874)) +* Bump [@typescript](https://github.com/typescript)-eslint/parser from 6.6.0 to 6.7.0 in /playground ([#1875](https://github.com/sourcenetwork/defradb/issues/1875)) +* Combined PRs 2023-09-14 ([#1873](https://github.com/sourcenetwork/defradb/issues/1873)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.4.0 to 6.5.0 in /playground ([#1827](https://github.com/sourcenetwork/defradb/issues/1827)) +* Bump go.opentelemetry.io/otel/sdk/metric from 0.39.0 to 0.40.0 ([#1829](https://github.com/sourcenetwork/defradb/issues/1829)) +* Bump github.com/ipfs/go-block-format from 0.1.2 to 0.2.0 ([#1819](https://github.com/sourcenetwork/defradb/issues/1819)) +* Combined PRs ([#1826](https://github.com/sourcenetwork/defradb/issues/1826)) +* Bump [@typescript](https://github.com/typescript)-eslint/parser from 6.4.0 to 6.4.1 in /playground ([#1804](https://github.com/sourcenetwork/defradb/issues/1804)) +* Combined PRs ([#1803](https://github.com/sourcenetwork/defradb/issues/1803)) +* Combined PRs ([#1791](https://github.com/sourcenetwork/defradb/issues/1791)) +* Combined PRs ([#1778](https://github.com/sourcenetwork/defradb/issues/1778)) +* Bump dependencies ([#1761](https://github.com/sourcenetwork/defradb/issues/1761)) +* Bump vite from 4.3.9 to 4.4.8 in /playground ([#1748](https://github.com/sourcenetwork/defradb/issues/1748)) +* Bump graphiql from 3.0.4 to 3.0.5 in /playground ([#1730](https://github.com/sourcenetwork/defradb/issues/1730)) +* Combined bumps of dependencies under /playground ([#1744](https://github.com/sourcenetwork/defradb/issues/1744)) +* Bump github.com/ipfs/boxo from 0.10.2 to 0.11.0 ([#1726](https://github.com/sourcenetwork/defradb/issues/1726)) +* Bump github.com/libp2p/go-libp2p-kad-dht from 0.24.2 to 0.24.3 ([#1724](https://github.com/sourcenetwork/defradb/issues/1724)) +* Bump google.golang.org/grpc from 1.56.2 to 1.57.0 ([#1725](https://github.com/sourcenetwork/defradb/issues/1725)) \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.8.0.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.8.0.md new file mode 100644 index 0000000..9ff4e85 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.8.0.md @@ -0,0 +1,75 @@ +--- +sidebar_position: 80 +--- +# v0.8.0 + +> 2023-11-14 + +DefraDB v0.8 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.7.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.gg/w7jYQVJ/. + +### Features + +* Add means to fetch schema ([#2006](https://github.com/sourcenetwork/defradb/issues/2006)) +* Rename Schema.SchemaID to Schema.Root ([#2005](https://github.com/sourcenetwork/defradb/issues/2005)) +* Enable playground in Docker build ([#1986](https://github.com/sourcenetwork/defradb/issues/1986)) +* Change GetCollectionBySchemaFoo funcs to return many ([#1984](https://github.com/sourcenetwork/defradb/issues/1984)) +* Add Swagger UI to playground ([#1979](https://github.com/sourcenetwork/defradb/issues/1979)) +* Add OpenAPI route ([#1960](https://github.com/sourcenetwork/defradb/issues/1960)) +* Remove CollectionDescription.Schema ([#1965](https://github.com/sourcenetwork/defradb/issues/1965)) +* Remove collection from patch schema ([#1957](https://github.com/sourcenetwork/defradb/issues/1957)) +* Make queries utilise secondary indexes ([#1925](https://github.com/sourcenetwork/defradb/issues/1925)) +* Allow setting of default schema version ([#1888](https://github.com/sourcenetwork/defradb/issues/1888)) +* Add CCIP Support ([#1896](https://github.com/sourcenetwork/defradb/issues/1896)) + +### Fixes + +* Fix test module relying on closed memory leak ([#2037](https://github.com/sourcenetwork/defradb/issues/2037)) +* Make return type for FieldKind_INT an int64 ([#1982](https://github.com/sourcenetwork/defradb/issues/1982)) +* Node private key requires data directory ([#1938](https://github.com/sourcenetwork/defradb/issues/1938)) +* Remove collection name from schema ID generation ([#1920](https://github.com/sourcenetwork/defradb/issues/1920)) +* Infinite loop when updating one-one relation ([#1915](https://github.com/sourcenetwork/defradb/issues/1915)) + +### Refactoring + +* CRDT merge direction ([#2016](https://github.com/sourcenetwork/defradb/issues/2016)) +* Reorganise collection description storage ([#1988](https://github.com/sourcenetwork/defradb/issues/1988)) +* Add peerstore to multistore ([#1980](https://github.com/sourcenetwork/defradb/issues/1980)) +* P2P client interface ([#1924](https://github.com/sourcenetwork/defradb/issues/1924)) +* Deprecate CollectionDescription.Schema ([#1939](https://github.com/sourcenetwork/defradb/issues/1939)) +* Remove net GRPC API ([#1927](https://github.com/sourcenetwork/defradb/issues/1927)) +* CLI client interface ([#1839](https://github.com/sourcenetwork/defradb/issues/1839)) + +### Continuous integration + +* Add goreleaser workflow ([#2040](https://github.com/sourcenetwork/defradb/issues/2040)) +* Add mac test runner ([#2035](https://github.com/sourcenetwork/defradb/issues/2035)) +* Parallelize change detector ([#1871](https://github.com/sourcenetwork/defradb/issues/1871)) + +### Chore + +* Update dependencies ([#2044](https://github.com/sourcenetwork/defradb/issues/2044)) + +### Bot + +* Bump [@typescript](https://github.com/typescript)-eslint/parser from 6.10.0 to 6.11.0 in /playground ([#2053](https://github.com/sourcenetwork/defradb/issues/2053)) +* Update dependencies (bulk dependabot PRs) 13-11-2023 ([#2052](https://github.com/sourcenetwork/defradb/issues/2052)) +* Bump axios from 1.5.1 to 1.6.1 in /playground ([#2041](https://github.com/sourcenetwork/defradb/issues/2041)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.9.1 to 6.10.0 in /playground ([#2042](https://github.com/sourcenetwork/defradb/issues/2042)) +* Bump [@vitejs](https://github.com/vitejs)/plugin-react-swc from 3.4.0 to 3.4.1 in /playground ([#2022](https://github.com/sourcenetwork/defradb/issues/2022)) +* Update dependencies (bulk dependabot PRs) 08-11-2023 ([#2038](https://github.com/sourcenetwork/defradb/issues/2038)) +* Update dependencies (bulk dependabot PRs) 30-10-2023 ([#2015](https://github.com/sourcenetwork/defradb/issues/2015)) +* Bump eslint-plugin and parser from 6.8.0 to 6.9.0 in /playground ([#2000](https://github.com/sourcenetwork/defradb/issues/2000)) +* Update dependencies (bulk dependabot PRs) 16-10-2023 ([#1998](https://github.com/sourcenetwork/defradb/issues/1998)) +* Update dependencies (bulk dependabot PRs) 16-10-2023 ([#1976](https://github.com/sourcenetwork/defradb/issues/1976)) +* Bump golang.org/x/net from 0.16.0 to 0.17.0 ([#1961](https://github.com/sourcenetwork/defradb/issues/1961)) +* Bump [@types](https://github.com/types)/react-dom from 18.2.11 to 18.2.12 in /playground ([#1952](https://github.com/sourcenetwork/defradb/issues/1952)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.7.4 to 6.7.5 in /playground ([#1953](https://github.com/sourcenetwork/defradb/issues/1953)) +* Bump combined dependencies 09-10-2023 ([#1951](https://github.com/sourcenetwork/defradb/issues/1951)) +* Bump [@types](https://github.com/types)/react from 18.2.24 to 18.2.25 in /playground ([#1932](https://github.com/sourcenetwork/defradb/issues/1932)) +* Bump [@typescript](https://github.com/typescript)-eslint/parser from 6.7.3 to 6.7.4 in /playground ([#1933](https://github.com/sourcenetwork/defradb/issues/1933)) +* Bump [@vitejs](https://github.com/vitejs)/plugin-react-swc from 3.3.2 to 3.4.0 in /playground ([#1904](https://github.com/sourcenetwork/defradb/issues/1904)) +* Bump combined dependencies 19-09-2023 ([#1931](https://github.com/sourcenetwork/defradb/issues/1931)) +* Bump graphql from 16.8.0 to 16.8.1 in /playground ([#1901](https://github.com/sourcenetwork/defradb/issues/1901)) +* Update combined dependabot PRs 19-09-2023 ([#1898](https://github.com/sourcenetwork/defradb/issues/1898)) \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/release notes/v0.9.0.md b/defradb_versioned_docs/version-0.19.0/release notes/v0.9.0.md new file mode 100644 index 0000000..71a6088 --- /dev/null +++ b/defradb_versioned_docs/version-0.19.0/release notes/v0.9.0.md @@ -0,0 +1,78 @@ +--- +sidebar_position: 90 +--- +# v0.9.0 + +> 2024-01-18 + +DefraDB v0.9 is a major pre-production release. Until the stable version 1.0 is reached, the SemVer minor patch number will denote notable releases, which will give the project freedom to experiment and explore potentially breaking changes. + +To get a full outline of the changes, we invite you to review the official changelog below. This release does include a Breaking Change to existing v0.8.x databases. If you need help migrating an existing deployment, reach out at [hello@source.network](mailto:hello@source.network) or join our Discord at https://discord.gg/w7jYQVJ/. + +### Features + +* Mutation typed input ([#2167](https://github.com/sourcenetwork/defradb/issues/2167)) +* Add PN Counter CRDT type ([#2119](https://github.com/sourcenetwork/defradb/issues/2119)) +* Allow users to add Views ([#2114](https://github.com/sourcenetwork/defradb/issues/2114)) +* Add unique secondary index ([#2131](https://github.com/sourcenetwork/defradb/issues/2131)) +* New cmd for docs auto generation ([#2096](https://github.com/sourcenetwork/defradb/issues/2096)) +* Add blob scalar type ([#2091](https://github.com/sourcenetwork/defradb/issues/2091)) + +### Fixes + +* Add entropy to counter CRDT type updates ([#2186](https://github.com/sourcenetwork/defradb/issues/2186)) +* Handle multiple nil values on unique indexed fields ([#2178](https://github.com/sourcenetwork/defradb/issues/2178)) +* Filtering on unique index if there is no match ([#2177](https://github.com/sourcenetwork/defradb/issues/2177)) + +### Performance + +* Switch LensVM to wasmtime runtime ([#2030](https://github.com/sourcenetwork/defradb/issues/2030)) + +### Refactoring + +* Add strong typing to document creation ([#2161](https://github.com/sourcenetwork/defradb/issues/2161)) +* Rename key,id,dockey to docID terminology ([#1749](https://github.com/sourcenetwork/defradb/issues/1749)) +* Simplify Merkle CRDT workflow ([#2111](https://github.com/sourcenetwork/defradb/issues/2111)) + +### Testing + +* Add auto-doc generation ([#2051](https://github.com/sourcenetwork/defradb/issues/2051)) + +### Continuous integration + +* Add windows test runner ([#2033](https://github.com/sourcenetwork/defradb/issues/2033)) + +### Chore + +* Update Lens to v0.5 ([#2083](https://github.com/sourcenetwork/defradb/issues/2083)) + +### Bot + +* Bump [@types](https://github.com/types)/react from 18.2.47 to 18.2.48 in /playground ([#2213](https://github.com/sourcenetwork/defradb/issues/2213)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.18.0 to 6.18.1 in /playground ([#2215](https://github.com/sourcenetwork/defradb/issues/2215)) +* Update dependencies (bulk dependabot PRs) 15-01-2024 ([#2217](https://github.com/sourcenetwork/defradb/issues/2217)) +* Bump follow-redirects from 1.15.3 to 1.15.4 in /playground ([#2181](https://github.com/sourcenetwork/defradb/issues/2181)) +* Bump github.com/getkin/kin-openapi from 0.120.0 to 0.122.0 ([#2097](https://github.com/sourcenetwork/defradb/issues/2097)) +* Update dependencies (bulk dependabot PRs) 08-01-2024 ([#2173](https://github.com/sourcenetwork/defradb/issues/2173)) +* Bump github.com/bits-and-blooms/bitset from 1.12.0 to 1.13.0 ([#2160](https://github.com/sourcenetwork/defradb/issues/2160)) +* Bump [@types](https://github.com/types)/react from 18.2.45 to 18.2.46 in /playground ([#2159](https://github.com/sourcenetwork/defradb/issues/2159)) +* Bump [@typescript](https://github.com/typescript)-eslint/parser from 6.15.0 to 6.16.0 in /playground ([#2156](https://github.com/sourcenetwork/defradb/issues/2156)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.15.0 to 6.16.0 in /playground ([#2155](https://github.com/sourcenetwork/defradb/issues/2155)) +* Update dependencies (bulk dependabot PRs) 27-12-2023 ([#2154](https://github.com/sourcenetwork/defradb/issues/2154)) +* Bump github.com/spf13/viper from 1.17.0 to 1.18.2 ([#2145](https://github.com/sourcenetwork/defradb/issues/2145)) +* Bump golang.org/x/crypto from 0.16.0 to 0.17.0 ([#2144](https://github.com/sourcenetwork/defradb/issues/2144)) +* Update dependencies (bulk dependabot PRs) 18-12-2023 ([#2142](https://github.com/sourcenetwork/defradb/issues/2142)) +* Bump [@typescript](https://github.com/typescript)-eslint/parser from 6.13.2 to 6.14.0 in /playground ([#2136](https://github.com/sourcenetwork/defradb/issues/2136)) +* Bump [@types](https://github.com/types)/react from 18.2.43 to 18.2.45 in /playground ([#2134](https://github.com/sourcenetwork/defradb/issues/2134)) +* Bump vite from 5.0.7 to 5.0.10 in /playground ([#2135](https://github.com/sourcenetwork/defradb/issues/2135)) +* Update dependencies (bulk dependabot PRs) 04-12-2023 ([#2133](https://github.com/sourcenetwork/defradb/issues/2133)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.13.1 to 6.13.2 in /playground ([#2109](https://github.com/sourcenetwork/defradb/issues/2109)) +* Bump vite from 5.0.2 to 5.0.5 in /playground ([#2112](https://github.com/sourcenetwork/defradb/issues/2112)) +* Bump [@types](https://github.com/types)/react from 18.2.41 to 18.2.42 in /playground ([#2108](https://github.com/sourcenetwork/defradb/issues/2108)) +* Update dependencies (bulk dependabot PRs) 04-12-2023 ([#2107](https://github.com/sourcenetwork/defradb/issues/2107)) +* Bump [@types](https://github.com/types)/react from 18.2.38 to 18.2.39 in /playground ([#2086](https://github.com/sourcenetwork/defradb/issues/2086)) +* Bump [@typescript](https://github.com/typescript)-eslint/parser from 6.12.0 to 6.13.0 in /playground ([#2085](https://github.com/sourcenetwork/defradb/issues/2085)) +* Update dependencies (bulk dependabot PRs) 27-11-2023 ([#2081](https://github.com/sourcenetwork/defradb/issues/2081)) +* Bump swagger-ui-react from 5.10.0 to 5.10.3 in /playground ([#2067](https://github.com/sourcenetwork/defradb/issues/2067)) +* Bump [@typescript](https://github.com/typescript)-eslint/eslint-plugin from 6.11.0 to 6.12.0 in /playground ([#2068](https://github.com/sourcenetwork/defradb/issues/2068)) +* Update dependencies (bulk dependabot PRs) 20-11-2023 ([#2066](https://github.com/sourcenetwork/defradb/issues/2066)) \ No newline at end of file diff --git a/defradb_versioned_sidebars/version-0.19.0-sidebars.json b/defradb_versioned_sidebars/version-0.19.0-sidebars.json new file mode 100644 index 0000000..f1f02dc --- /dev/null +++ b/defradb_versioned_sidebars/version-0.19.0-sidebars.json @@ -0,0 +1,31 @@ +{ + "defraSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ], + "sourcehubSidebar": [ + { + "type": "autogenerated", + "dirName": "." + }, + { + "type": "link", + "label": "API", + "href": "/sourcehub/api" + } + ], + "orbisSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ], + "lensvmSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} diff --git a/defradb_versions.json b/defradb_versions.json new file mode 100644 index 0000000..db34588 --- /dev/null +++ b/defradb_versions.json @@ -0,0 +1,3 @@ +[ + "0.19.0" +] diff --git a/docs/defradb/getting-started.md b/docs/defradb/getting-started.md index 9273bfa..9e833cd 100644 --- a/docs/defradb/getting-started.md +++ b/docs/defradb/getting-started.md @@ -1,7 +1,7 @@ --- sidebar_position: 1 title: Getting Started -slug: /defradb +slug: / --- # DefraDB Overview diff --git a/docs/lensvm/lens-vm.md b/docs/lensvm/lens-vm.md index 23bc89b..00a74f1 100644 --- a/docs/lensvm/lens-vm.md +++ b/docs/lensvm/lens-vm.md @@ -1,7 +1,7 @@ --- sidebar_position: 1 title: LensVM -slug: /lensvm +slug: / --- ## Introduction diff --git a/docs/orbis/overview.md b/docs/orbis/overview.md index 9b067ee..c2dd3a6 100644 --- a/docs/orbis/overview.md +++ b/docs/orbis/overview.md @@ -1,7 +1,7 @@ --- sidebar_position: 1 title: Overview -slug: /orbis +slug: / --- # Orbis Overview ![Orbis Overview](/img/orbis/cover.png) diff --git a/docs/sourcehub/overview.md b/docs/sourcehub/overview.md index 9fe7e05..6036023 100644 --- a/docs/sourcehub/overview.md +++ b/docs/sourcehub/overview.md @@ -1,7 +1,7 @@ --- sidebar_position: 1 title: Overview -slug: /sourcehub +slug: / --- # SourceHub Overview diff --git a/docusaurus.config.js b/docusaurus.config.js index 80c1124..418a933 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -23,21 +23,8 @@ const config = { path: "openapi.yml", routeBasePath: "/sourcehub/api", }, - docs: { - routeBasePath: "/", - sidebarPath: require.resolve("./sidebars.js"), - editUrl: - "https://github.com/sourcenetwork/docs.source.network/edit/master/", - - // Reorder changelog sidebar - async sidebarItemsGenerator({ - defaultSidebarItemsGenerator, - ...args - }) { - const sidebarItems = await defaultSidebarItemsGenerator(args); - return reverseSidebarChangelog(sidebarItems); - }, - }, + docs: false, // Disable the default docs plugin + proxy: false, // Disable the proxy plugin to avoid webpack-dev-server config errors theme: { customCss: require.resolve("./src/css/custom.scss"), }, @@ -68,6 +55,7 @@ const config = { { type: "docSidebar", position: "left", + docsPluginId: "defradb", sidebarId: "defraSidebar", label: "DefraDB", className: "header-docs-link-defra", @@ -75,6 +63,7 @@ const config = { { type: "docSidebar", position: "left", + docsPluginId: "sourcehub", sidebarId: "sourcehubSidebar", label: "SourceHub", className: "header-docs-link-sourcehub", @@ -82,6 +71,7 @@ const config = { { type: "docSidebar", position: "left", + docsPluginId: "orbis", sidebarId: "orbisSidebar", label: "Orbis", className: "header-docs-link-orbis", @@ -89,10 +79,17 @@ const config = { { type: "docSidebar", position: "left", + docsPluginId: "lensvm", sidebarId: "lensvmSidebar", label: "LensVM", className: "header-docs-link-lensvm", }, + { + type: "docsVersionDropdown", + position: "right", + dropdownItemsAfter: [], + dropdownActiveClassDisabled: true, + }, { href: "https://github.com/sourcenetwork/docs.source.network", "aria-label": "GitHub repository", @@ -173,6 +170,130 @@ const config = { }, }, ], + // DefraDB instance + [ + "@docusaurus/plugin-content-docs", + { + id: "defradb", + path: "docs/defradb", + routeBasePath: "defradb", + sidebarPath: require.resolve("./sidebars.js"), + editUrl: + "https://github.com/sourcenetwork/docs.source.network/edit/master/", + lastVersion: "0.19.0", + versions: { + "0.19.0": { + banner: "none", + }, + current: { + label: "Next", + path: "next", + banner: "unreleased", + }, + }, + // Reorder changelog sidebar + async sidebarItemsGenerator({ + defaultSidebarItemsGenerator, + ...args + }) { + const sidebarItems = await defaultSidebarItemsGenerator(args); + return reverseSidebarChangelog(sidebarItems); + }, + }, + ], + // SourceHub instance + [ + "@docusaurus/plugin-content-docs", + { + id: "sourcehub", + path: "docs/sourcehub", + routeBasePath: "sourcehub", + sidebarPath: require.resolve("./sidebars.js"), + editUrl: + "https://github.com/sourcenetwork/docs.source.network/edit/master/", + lastVersion: "0.3.2", + versions: { + "0.3.2": { + banner: "none", + }, + current: { + label: "Next", + path: "next", + banner: "unreleased", + }, + }, + // Reorder changelog sidebar + async sidebarItemsGenerator({ + defaultSidebarItemsGenerator, + ...args + }) { + const sidebarItems = await defaultSidebarItemsGenerator(args); + return reverseSidebarChangelog(sidebarItems); + }, + }, + ], + // Orbis instance + [ + "@docusaurus/plugin-content-docs", + { + id: "orbis", + path: "docs/orbis", + routeBasePath: "orbis", + sidebarPath: require.resolve("./sidebars.js"), + editUrl: + "https://github.com/sourcenetwork/docs.source.network/edit/master/", + lastVersion: "0.2.3", + versions: { + "0.2.3": { + banner: "none", + }, + current: { + label: "Next", + path: "next", + banner: "unreleased", + }, + }, + // Reorder changelog sidebar + async sidebarItemsGenerator({ + defaultSidebarItemsGenerator, + ...args + }) { + const sidebarItems = await defaultSidebarItemsGenerator(args); + return reverseSidebarChangelog(sidebarItems); + }, + }, + ], + // LensVM instance + [ + "@docusaurus/plugin-content-docs", + { + id: "lensvm", + path: "docs/lensvm", + routeBasePath: "lensvm", + sidebarPath: require.resolve("./sidebars.js"), + editUrl: + "https://github.com/sourcenetwork/docs.source.network/edit/master/", + lastVersion: "0.9.3", + versions: { + "0.9.3": { + banner: "none", + }, + current: { + label: "Next", + path: "next", + banner: "unreleased", + }, + }, + // Reorder changelog sidebar + async sidebarItemsGenerator({ + defaultSidebarItemsGenerator, + ...args + }) { + const sidebarItems = await defaultSidebarItemsGenerator(args); + return reverseSidebarChangelog(sidebarItems); + }, + }, + ], ], customFields: { docsData: {}, diff --git a/lensvm_versioned_docs/version-0.9.3/lens-vm.md b/lensvm_versioned_docs/version-0.9.3/lens-vm.md new file mode 100644 index 0000000..00a74f1 --- /dev/null +++ b/lensvm_versioned_docs/version-0.9.3/lens-vm.md @@ -0,0 +1,146 @@ +--- +sidebar_position: 1 +title: LensVM +slug: / +--- + +## Introduction + +LensVM is a bi-directional data transformation engine originally developed for DefraDB, now available as a standalone tool. It enables transforming data both forwards and in reverse directions using user-defined modules called Lenses, which are compiled to WebAssembly (WASM). Each Lens runs inside a secure, sandboxed WASM environment, enabling safe and modular pipelines, even when composed from multiple sources. + +This guide provides the foundational steps for writing and composing Lenses using the LensVM framework. It includes examples for Rust-based Lenses using the official SDK, as well as lower-level implementations without the SDK in other languages. + +## Before you begin + +Before getting started, ensure the following are installed: + +- [Golang](https://golang.google.cn/doc/install) (required to run the Lens engine) +- WASM-compatible compiler: Choose a compiler that targets the `wasm32-unknown` architecture, based on your preferred programming language. + +**Note**: The LensVM Engine executes Lenses in isolated WASM environments. It manages data flow, memory allocation, and function calls between the host application and the Lens module. + +## Writing lenses + +Lenses can be authored in any language that compiles to valid WebAssembly. To interface with the LensVM engine, each Lens must implement a specific set of exported and imported functions. + +### Required and optional functions + +Each Lens must implement the following interface: + +| Function | Type | Required | Description | +|:-----------------------|:----------|:---------|:------------| +| `alloc(unsigned64)` | Exported | Yes | Allocates a memory block of the given size. Called by the LensVM engine. | +| `next() -> unsigned8` | Imported | Yes | Called by the Lens to retrieve a pointer to the next input data item from the engine. | +| `set_param(unsigned8) -> unsigned8` | Exported | No | Accepts static configuration data at initialization. Receives a pointer to the config and returns a pointer to an OK or error response. Called once before any input is processed. | +| `transform() -> unsigned8` | Exported | Yes | Core transformation logic. Pulls zero or more inputs using `next()`, applies transformation, and returns a pointer to a single output item. Supports stateful transformations. | +| `inverse() -> unsigned8` | Exported | No | Optional reverse transformation logic, same interface as `transform()`. | + +### WASM data format + +LensVM communicates with Lenses using a binary format across the WASM boundary. The format is as follows: + +```json + +[TypeId][Length][Payload] +``` + +- **TypeId**: A signed 8-byte integer +- **Length**: An optional unsigned 32-byte integer, depending on the TypeId +- **Payload**: Raw binary or serialized data (e.g., JSON) + +#### TypeId Values + +| TypeId | Meaning | Notes | +|:-------|:--------------------|:------| +| `-1` | Error | May include an error message in the Payload. | +| `0` | Nil | No `Length` or `Payload`. | +| `1` | JSON | Payload contains a JSON-serialized object. | +| `127` | End of Stream | Signals that there are no more items to process. | + +### Developing with the Rust SDK + +To simplify development, LensVM provides a [Rust SDK](https://docs.rs/lens_sdk). It abstracts much of the boilerplate required to build Lenses, allowing you to focus on transformation logic. + +The SDK: + +- Implements the required interface automatically +- Handles safe memory and data exchange across the WASM boundary +- Provides helpful macros and utilities for Lens definition + +You can find it on [crates.io](https://crates.io/crates/lens_sdk) and in the official [GitHub repository](https://github.com/lens-vm/lens). + +### Example Lenses + +Example Lenses written in: + +- [Rust](https://www.rust-lang.org/) +- [AssemblyScript](https://www.assemblyscript.org/) + +can be found in this repository and in [DefraDB](https://github.com/sourcenetwork/defradb). + +## Basic Lens Example + +The easiest way to get started writing a Lens is by using Rust, thanks to the [`lens_sdk`](https://docs.rs/lens_sdk) crate, which provides helpful macros and utilities for Lens development. + +A minimal example is shown in the [`define!` macro documentation](https://docs.rs/lens_sdk/latest/lens_sdk/macro.define.html#examples). This example demonstrates a simple forward transformation that iterates through input documents and increments the `age` field by 1. + +## Writing a Lens using the SDK + +Writing a Lens with the Rust SDK is straightforward and well-documented. The examples provided in the [`lens_sdk` documentation](https://docs.rs/lens_sdk) build progressively: + +- **Example 1:** A minimal forward transformation using the `define!` macro. +- **Example 2:** Adds parameters and an inverse function to demonstrate bi-directional transformations. + +For more advanced examples, refer to the following repositories: + +- [Lens test modules](https://github.com/lens-vm/lens/blob/main/tests/modules) +- [DefraDB lens tests](https://github.com/sourcenetwork/defradb/tree/develop/tests/lenses) + +These cover schema-aware transformations, reversible pipelines, and other real-world use cases. + +## Writing a Lens without the SDK + +Creating a Lens without the Rust SDK is intended for advanced use cases—such as developing in non-Rust languages or needing fine-grained control over serialization and transformation behavior. + +Currently, the only working non-Rust example is written in [AssemblyScript](https://www.assemblyscript.org/introduction.html): + +- [AssemblyScript Lens Example](https://github.com/lens-vm/lens/blob/main/tests/modules/as_wasm32_simple/assembly/index.ts) + +This approach requires: + +- Manual implementation of memory allocation and serialization +- A deep understanding of the LensVM protocol +- Proficiency in AssemblyScript (or your chosen language) + +> **Recommendation:** For most users, we strongly recommend using the [Rust SDK](https://docs.rs/lens_sdk), even partially. It can significantly reduce development time and complexity. You can start with full SDK support and incrementally replace parts with custom logic as needed. + +## Composing Lenses + +Lenses can be composed into pipelines using the Go `config` sub-package: + +- [Go Config Package](https://github.com/lens-vm/lens/tree/main/host-go/config) + +Pipeline composition is handled via the `model.Lens` type: + +- [`model.Lens` Definition](https://github.com/lens-vm/lens/blob/main/host-go/config/model/lens.go) + +You can compose pipelines either by: + +- Supplying a `model.Lens` object directly +- Referencing a JSON configuration file (from local storage or a URL) that conforms to the `model.Lens` schema + +> **Note:** Composing Lenses does **not** execute them. Instead, it builds an enumerable pipeline object, which you can then iterate over to apply transformations. + +You can extend this enumerable pipeline by: + +- Adding additional Lenses through the `config` package +- Chaining in native Go-based enumerables for advanced customization + +### Composition Examples + +For practical examples of pipeline composition, explore the following: + +- [Go engine tests](https://github.com/lens-vm/lens/tree/main/host-go/engine/tests) +- [CLI integration tests](https://github.com/lens-vm/lens/tree/main/tests/integration/cli) + +These examples demonstrate how to build and extend Lens pipelines declaratively for various environments and workflows. diff --git a/lensvm_versioned_sidebars/version-0.9.3-sidebars.json b/lensvm_versioned_sidebars/version-0.9.3-sidebars.json new file mode 100644 index 0000000..f1f02dc --- /dev/null +++ b/lensvm_versioned_sidebars/version-0.9.3-sidebars.json @@ -0,0 +1,31 @@ +{ + "defraSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ], + "sourcehubSidebar": [ + { + "type": "autogenerated", + "dirName": "." + }, + { + "type": "link", + "label": "API", + "href": "/sourcehub/api" + } + ], + "orbisSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ], + "lensvmSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} diff --git a/lensvm_versions.json b/lensvm_versions.json new file mode 100644 index 0000000..225a167 --- /dev/null +++ b/lensvm_versions.json @@ -0,0 +1,3 @@ +[ + "0.9.3" +] diff --git a/orbis_versioned_docs/version-0.2.3/concepts/_category_.json b/orbis_versioned_docs/version-0.2.3/concepts/_category_.json new file mode 100644 index 0000000..8f84ff8 --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/concepts/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Concepts", + "position": 3 + +} \ No newline at end of file diff --git a/orbis_versioned_docs/version-0.2.3/concepts/dkg.md b/orbis_versioned_docs/version-0.2.3/concepts/dkg.md new file mode 100644 index 0000000..97de470 --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/concepts/dkg.md @@ -0,0 +1,33 @@ +--- +sidebar_position: 2 +--- + +# Distributed Key Generation + +Distributed Key Generation (DKG) is a cryptographic protocol that enables a group of participants to collaboratively generate a public-private keypair in a decentralized manner. Unlike traditional key generation methods, where a single entity holds the private key, DKG ensures that the private key is never known in its entirety by any single participant. Instead, each participant holds a "share" of the private key, and a minimum threshold of participants must cooperate to perform cryptographic operations. + +## Key Concepts + +1. **Decentralization**: + - **Definition**: DKG involves multiple nodes in the key generation process, preventing any single point of control or failure. Each node contributes to the creation of the keypair, and the private key is never reconstructed in its entirety by any individual node. + - **Purpose in Orbis**: Decentralization ensures that no single entity has full control over the secrets, aligning with the security and resilience goals of Orbis. + +2. **Key Shares**: + - **Definition**: Instead of holding the complete private key, each participant in the DKG protocol holds a share of the private key. These shares are generated during the DKG process and are essential for performing any cryptographic operations that require the private key. + - **Purpose in Orbis**: Key shares enable the system to distribute trust among multiple participants. A threshold number of shares must be combined to reconstruct the private key, ensuring that no single participant can unilaterally access the secret. + +3. **Threshold Scheme**: + - **Definition**: A threshold scheme is a cryptographic mechanism that allows a specified minimum number of participants (threshold) to cooperate in performing a cryptographic operation, such as signing or decrypting a message. The threshold is chosen during the DKG process and defines the minimum number of shares required to reconstruct the private key. + - **Purpose in Orbis**: The threshold scheme provides a balance between security and availability. It ensures that the system remains functional even if some participants are unavailable or compromised, while also protecting against unauthorized access. + +## DKG in Orbis + +In the Orbis system, DKG is a foundational component that underpins the decentralized custodial model. By using DKG, Orbis achieves the following: + +- **Security**: The private key is never exposed in its entirety, and no single participant can access it alone. This enhances the security of the secrets managed by Orbis. +- **Fault Tolerance**: The threshold scheme allows the system to continue functioning even if some participants are compromised or unavailable. This resilience is crucial for maintaining the availability and integrity of the secrets. +- **Trust Distribution**: By distributing key shares among multiple participants, Orbis eliminates the need for a trusted central authority, reducing the risk of centralized control and single points of failure. + +## Conclusion + +Distributed Key Generation (DKG) is a critical cryptographic technique that enables Orbis to maintain a decentralized and secure environment for secret management. By ensuring that the private key is never fully known by any single participant, DKG provides strong security guarantees and supports the system's overall goals of decentralization and fault tolerance. Through DKG, Orbis achieves a robust and resilient architecture for managing secrets in a decentralized manner. \ No newline at end of file diff --git a/orbis_versioned_docs/version-0.2.3/concepts/mpc.md b/orbis_versioned_docs/version-0.2.3/concepts/mpc.md new file mode 100644 index 0000000..4cf4821 --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/concepts/mpc.md @@ -0,0 +1,32 @@ +--- +sidebar_position: 1 +--- +# Multi-Party Computation + +Multi-Party Computation (MPC) is a cryptographic technique that allows multiple parties to jointly compute a function over their inputs while keeping those inputs private. In the context of Orbis, MPC plays a crucial role in ensuring the security and integrity of secret management without a single point of failure. + +## Key Concepts + +1. [**Distributed Key Generation (DKG)**](/orbis/concepts/dkg): + - **Definition**: A decentralized method for collaboratively generating a cryptographic keypair. All participating nodes know the public key, but no single node knows the private key. Instead, each node holds a "share" of the private key. + - **Purpose in Orbis**: DKG is used to create a shared keypair for a Secret Ring, ensuring that the private key remains unknown to any single actor. This keypair is essential for securely encrypting secrets. + +2. [**Proxy Re-Encryption (PRE)**](/orbis/concepts/pre): + - **Definition**: A cryptographic mechanism that allows encrypted data (ciphertext) to be transformed from one public key to another without revealing the underlying plaintext. + - **Purpose in Orbis**: PRE is employed to transfer encrypted secrets from the Secret Ring's public key to a requesting party's ephemeral public key. This transformation is done securely and privately, ensuring that neither the system nor the nodes involved in the process ever see the plaintext. + +3. [**Proactive Secret Sharing (PSS)**](/orbis/concepts/pss): + - **Definition**: An algorithm that periodically redistributes the shares of a private key among nodes without changing the long-term keypair. This process mitigates the risk of adversaries compromising the system over time. + - **Purpose in Orbis**: PSS ensures the long-term security of the secret management system by preventing adversaries from accumulating enough shares to reconstruct the private key. It does so by periodically refreshing the shares, making it impossible for an adversary to exploit nodes indefinitely. + +## MPC in Orbis + +In Orbis, MPC techniques are foundational to the system's decentralized custodial model. They provide the following benefits: + +- **Security**: By ensuring that no single actor can access the entire secret or private key, MPC protects against unauthorized access and single points of failure. +- **Verifiability**: The use of MPC allows for the secure verification of cryptographic operations, ensuring that only authorized parties can access secrets. +- **Byzantine Fault Tolerance**: The system can tolerate a certain number of faulty or malicious nodes without compromising the integrity of the secret management process. + +## Conclusion + +MPC enables Orbis to maintain a decentralized and secure environment for secret management. By leveraging DKG, PSS, and PRE, Orbis achieves a robust system that is resistant to various attack vectors while ensuring that secrets are only accessible to authorized parties. These cryptographic protocols underpin the core functionality of Orbis, making it a reliable and secure solution for decentralized custodial secret management. \ No newline at end of file diff --git a/orbis_versioned_docs/version-0.2.3/concepts/pre.md b/orbis_versioned_docs/version-0.2.3/concepts/pre.md new file mode 100644 index 0000000..825be1e --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/concepts/pre.md @@ -0,0 +1,37 @@ +--- +sidebar_position: 3 +--- + +# Proxy Re-Encryption + +![Proxy ReEncryption](/img/orbis/pre.png) +*image credit: https://medium.com/nucypher/unveiling-umbral-3d9d4423cd71* + +Proxy Re-Encryption (PRE) is a cryptographic technique that allows ciphertexts encrypted under one public key to be re-encrypted to another public key without revealing the underlying plaintext. This transformation is performed using a special cryptographic key called a re-encryption key (ReKey). In the context of Orbis, PRE enables secure and private transfer of encrypted secrets between different parties, ensuring that the secret is never exposed to intermediaries. + +## Key Concepts + +1. **Re-Encryption Key (ReKey)**: + - **Definition**: A special cryptographic key generated to convert ciphertext encrypted under one public key (A) to another public key (B). The ReKey is derived from the private key associated with public key A and the public key B. + - **Purpose in Orbis**: ReKeys are used to securely transfer encrypted secrets from the Secret Ring's public key to a requesting user's ephemeral public key, enabling the user to decrypt the secret without exposing it to the Secret Ring or any intermediaries. + +2. **Delegated Re-Encryption**: + - **Definition**: The process of re-encrypting ciphertext using a ReKey, which can be performed by an untrusted third party or server. The third party does not gain access to the plaintext during this process. + - **Purpose in Orbis**: Delegated re-encryption allows the Orbis system to offload the re-encryption process to nodes without risking exposure of the underlying secret. This capability is essential for maintaining the privacy and security of the user's data. + +3. **Ciphertext Transformation**: + - **Definition**: The process by which encrypted data (ciphertext) is converted from being encrypted under one public key to another, using a ReKey. This transformation ensures that the data remains encrypted throughout the process. + - **Purpose in Orbis**: Ciphertext transformation is used to manage access to secrets without decrypting them. For example, a secret encrypted under the Secret Ring's public key can be transformed to be decryptable only by the intended recipient's public key, maintaining confidentiality. + +## PRE and DKG in Orbis + +In the Orbis system, PRE and [Distributed Key Generation (DKG)](/orbis/concepts/dkg) work in tandem to provide a robust and secure framework for secret management: + +- **DKG**: DKG enables the decentralized creation of a shared public-private keypair, with the private key split into shares held by different nodes. This setup ensures that no single participant has access to the full private key, enhancing security. +- **PRE**: Utilizing the public key generated by the DKG process, PRE allows for the secure re-encryption of data. The private key shares generated during DKG are used to create ReKeys without reconstructing the full private key, thus maintaining security and privacy. This integration ensures that even though the secret's ciphertext is transformed between different public keys, the underlying plaintext remains protected from unauthorized access. + +The combination of DKG and PRE in Orbis ensures that secrets can be securely managed and transferred across different parties, all while preserving the integrity and confidentiality of the data. + +## Conclusion + +Proxy Re-Encryption (PRE) is a powerful cryptographic primitive that, in conjunction with [Distributed Key Generation (DKG)](/orbis/concepts/dkg), enables secure and private data transfer within the Orbis system. By leveraging ReKeys and delegated re-encryption, Orbis ensures that secrets are securely managed and transferred without exposing the plaintext to unauthorized parties. PRE and DKG together provide robust security and privacy guarantees, making Orbis a reliable solution for decentralized custodial secret management. \ No newline at end of file diff --git a/orbis_versioned_docs/version-0.2.3/concepts/pss.md b/orbis_versioned_docs/version-0.2.3/concepts/pss.md new file mode 100644 index 0000000..2e2d69c --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/concepts/pss.md @@ -0,0 +1,34 @@ +# Proactive Secret Sharing + +Proactive Secret Sharing (PSS) is a cryptographic protocol that enhances the security of a shared secret over time by periodically refreshing the shares held by participants. This process prevents adversaries from accumulating shares to eventually reconstruct the secret key. PSS is crucial in systems where long-term security is paramount, as it mitigates the risk of a compromise that may occur gradually over time. + +## Key Concepts +1. **Secret Shares**: + - **Definition**: In PSS, a secret (such as a private key) is divided into shares, with each participant holding one share. The secret can only be reconstructed with a sufficient number of shares, known as the threshold. + - **Purpose in Orbis**: By distributing shares among multiple nodes, Orbis ensures that no single entity has complete control over the private key, enhancing the system's security. + +2. **Share Refreshing**: + - **Definition**: The process of periodically updating the secret shares without changing the underlying secret. This process prevents adversaries from collecting enough shares over time to reconstruct the secret. + - **Purpose in Orbis**: Share refreshing ensures that even if some shares are compromised, the secret remains secure as the shares are periodically updated, nullifying the compromised shares' usefulness. + +3. **Epochs**: + - **Definition**: Time intervals at the end of which the shares are refreshed. The length of an epoch is determined based on the security requirements and threat model. + - **Purpose in Orbis**: Epochs provide a temporal boundary for when shares must be refreshed, ensuring that the system maintains its security properties over time. + +#### PSS, DKG, and PRE in Orbis + +In the Orbis system, PSS works alongside [Distributed Key Generation (DKG)](/orbis/concepts/dkg) and [Proxy Re-Encryption (PRE)](/orbis/concepts/pre) to provide a comprehensive and secure framework for secret management: + +- **DKG**: DKG is responsible for the initial generation of a shared keypair, with the private key split into shares distributed among participants. These shares are essential for performing cryptographic operations securely. +- **PSS**: While DKG establishes the initial distribution of secret shares, PSS ensures the long-term security of the system by periodically refreshing these shares. This prevents the gradual accumulation of shares by adversaries, thus protecting the secret's confidentiality. +- **PRE**: PRE utilizes the public key generated by DKG and the shares maintained and refreshed by PSS to securely transfer ciphertext between different public keys. PSS ensures that the private key shares used in creating ReKeys remain secure over time, maintaining the integrity of the re-encryption process. + +Together, DKG, PSS, and PRE form a robust security model in Orbis. DKG initiates a secure keypair, PSS maintains the security of the keypair over time, and PRE facilitates the secure and private transfer of encrypted secrets. + +## Conclusion +Proactive Secret Sharing (PSS) is a critical component in ensuring the long-term security and integrity of the Orbis system. By periodically refreshing secret shares, PSS prevents adversaries from exploiting compromised shares over time. When combined with [Distributed Key Generation (DKG)](/orbis/concepts/dkg) and [Proxy Re-Encryption (PRE)](/orbis/concepts/pre), PSS provides a resilient and secure framework for decentralized custodial secret management. This combination ensures that secrets are managed securely, remain confidential, and are accessible only to authorized parties. + + + + + diff --git a/orbis_versioned_docs/version-0.2.3/getting-started/1-install.md b/orbis_versioned_docs/version-0.2.3/getting-started/1-install.md new file mode 100644 index 0000000..ecfcaa6 --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/getting-started/1-install.md @@ -0,0 +1,35 @@ +# Installing Orbis +You can get the `orbisd` binary from the releases page of the Orbis repo: [https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.3](https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.3). +```bash +cd $HOME +wget https://github.com/sourcenetwork/orbis-go/releases/download/v0.2.3/orbisd +chmod +x orbisd +sudo mv /usr/bin +``` + +### From Source +You can download the code and compile your own binaries if you prefer. However you will need a local installation of the `go` toolchain at a minimum version of 1.21 +```bash +cd $HOME +git clone https://github.com/sourcenetwork/orbis-go +cd orbis-go +git checkout v0.2.3 +make build +cp ./build/orbisd $GOBIN/orbisd +export PATH=$PATH:$GOBIN +``` +Now you will have the `orbisd` available in your local system. + +## Docker +You can either use the pre-existing docker image hosted on our GitHub, or build your own + +`docker pull ghcr.io/sourcenetwork/orbis:0.2.3` + +### Build Docker Image from Source +```bash +cd $HOME +git clone https://github.com/sourcenetwork/orbis-go +cd orbis-go +git checkout v0.2.3 +docker build -t . +``` \ No newline at end of file diff --git a/orbis_versioned_docs/version-0.2.3/getting-started/2-create.md b/orbis_versioned_docs/version-0.2.3/getting-started/2-create.md new file mode 100644 index 0000000..caef2d6 --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/getting-started/2-create.md @@ -0,0 +1,95 @@ +# Create a Secret Ring + +***To skip ahead to using an existing Secret Ring deployment, +proceed to [Storing a Secret](./secrets).*** + +--- + +Secret Rings are a deployments of Orbis nodes with a single shared [distributed key pair](/orbis/concepts/dkg). To create a Secret Ring, you'll need a minimum of 3 Orbis nodes. + +## Docker Compose +The easiest method to get a local Secret Ring deployed is with our Docker Compose setup, which will initialize 3 orbis nodes, as well as the authorization service (Zanzi), and finally will bootstrap the peer-to-peer network. You will need **both** docker and docker-compose setup locally. + +:::warning +The following demo docker compose file uses deterministic private keys and ***IS NOT*** suitable for production deployments. Use at your own risk. +::: + +The docker compose file is hosted in the `demo/zanzi` folder on the Orbis repo, found [here](https://github.com/sourcenetwork/orbis-go/blob/develop/demo/zanzi/compose.yaml). + +To run the docker compose file +```bash +cd $HOME +git clone https://github.com/sourcenetwork/orbis-go +cd orbis-go +docker-compose -f demo/zanzi/compose.yaml up +``` + +## Ring Manifest +The Ring Manifest is the genesis file that describes the initial parameters of a Secret Ring. This includes the authentication and authorization schemes, which DKG protocol to use, etc. Importantly, it also has the addresses and `PeerIDs` of the nodes that will initialize the Ring. + +Here is the manifest for the root ring we will create for the set of nodes we have created with the docker-compose script above. To learn more about each parameter, please refer to the [Manifest Reference](/orbis/reference/manifest) doc. +```json +{ + "manifest": { + "n": 3, + "t": 2, + "dkg": "rabin", + "pss": "avpss", + "pre": "elgamal", + "bulletin": "p2p", + "transport": "p2p", + "authentication": "jws-did", + "authorization": "zanzi", + "nodes": [ + { + "id":"16Uiu2HAmLyq5HXHSFxvxmGcsnwsYPZvTDtfe3CYnWDK8jDAHhJC5", + "address":"/ip4/127.0.0.1/tcp/9000" + }, + { + "id":"16Uiu2HAmR7vXGm8Zohvs6cD3PtGSyAUFRDWypsAcmkiyMYTLhEe4", + "address":"/ip4/23.88.72.49/tcp/9000" + }, + { + "id":"16Uiu2HAmVBRogwVBbByVvsYywp2jUNBqfe1zTFNtaVMRvSyUndPX", + "address":"/ip4/138.201.36.107/tcp/9000" + }, + ], + "nonce": 0 + } +} +``` + +Save the above manifest defition to `manifest.json`. Then we can initialize the ring on each node in the ring. Each node *must* be configured independently with the `create-ring` command. + +```bash +# Run on each node +orbisd -s ring-service create-ring -f /manifest.json +``` + +This will initialze the DKG process and you node will start generating its respective DKG Share. This process can't complete unless all nodes are online and syncing. Once completed, the Secret Ring will have an initialized DKG, and is ready to start recieving Store and ReEncrypt requests! + +## Orbis Client +```bash +# Env Vars +export ORBIS_CLIENT_FROM="alice" +export ORBIS_CLIENT_SERVER_ADDR=":8081" +export ORBIS_CLIENT_AUTHZ_ADDR=":8080" +export ORBIS_CLIENT_RING_ID="zQ123" + +# Create Policy +orbisd client policy create -f policy.yaml => policy-id=0x123 +orbisd client policy describe 0x123 => policy-data=... + +# Create Secret (managed authorization) +orbisd client put "mysecret" --authz managed --policy 0x123 --resource secret --permission read +orbisd client get ABC123 + +# Create Secret (unmanaged authorization) +orbisd client policy register 0x123 secret mysecret +orbisd client put "mysecret" --authz unmanaged --permission "0x123/secret:mysecret#read" +orbisd client get ABC123 + +# Add Bob as a reader +orbisd client policy set 0x123 secret mysecret collaborator did:key:bob +orbisd client policy check 0x123 did:key:bob secret:mysecret#read => valid=true/false +``` \ No newline at end of file diff --git a/orbis_versioned_docs/version-0.2.3/getting-started/3-policy.md b/orbis_versioned_docs/version-0.2.3/getting-started/3-policy.md new file mode 100644 index 0000000..1ff779a --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/getting-started/3-policy.md @@ -0,0 +1,51 @@ +# Setup Authorization Policy +Before we can start storing secrets into the newly created Secret Ring, we must define our access policy. This access policy will determine the resources and permissions that users will need to authorize with to recover secrets. + +This section will assume you are using the `Zanzi` Authorization GRPC Service that is included in the example `docker-compose.yaml` file from the previous step. If you are using the `SourceHub ACP` module instead, you can reference the [Create a SourceHub ACP Policy](/sourcehub/getting-started/create-a-policy) doc. + +## Create a Policy + +The `Zanzi` Authorization GRPC Service is a [Zanzibar](/sourcehub/concepts/zanzibar) based global decentralized authorization system. Developers write policies using our Relation-Based Access Control (RelBAC) DSL, which allows you to define resources, relations, and permissions. + +- **Resources**: Generic container for some kind of "thing" you wish to gate access to or provide authorization for. It can be anything from a secret on [Orbis](/orbis), a document on [DefraDB](/defradb), or any other resource. + +- **Relation**: Named connections between resources. Similar to a database table that might have relations between its schema types, so does the SourceHub ACP module. This allows us to create expressive policies that go beyond traditional *Role-Based* or *Attribute-based* access control. + +- **Permissions**: Computed queries over resources, relations, and even other permissions (they're recursive!). + +### Secret Resource Policy +Here we are going to create a basic policy to govern access to our secrets in Orbis. + +Create a file named `orbis-policy.yaml` and paste the following: +```yaml +name: Orbis Secret Policy + +resources: + + secret: + relations: + owner: + types: + - actor + collaborator: + types: + - actor + + permissions: + read: + expr: owner + collaborator + edit: + expr: owner + delete: + expr: owner +``` + +Now that we have our policy defined, we can upload it to the `Zanzi` service +```shell +orbisd client policy create -f orbis-policy.yaml +``` + +Which will return back the created policy ID. We can confirm the policy has been created by using the `policy describe` command. +```bash +orbisd client policy describe +``` \ No newline at end of file diff --git a/orbis_versioned_docs/version-0.2.3/getting-started/4-secrets.md b/orbis_versioned_docs/version-0.2.3/getting-started/4-secrets.md new file mode 100644 index 0000000..ad18ccd --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/getting-started/4-secrets.md @@ -0,0 +1,77 @@ +# Store, Recover, and Share Secrets +Now that we have initialized our orbis nodes, defined our manifest, created the secret ring, and uploaded our policy we are finally ready to store secrets into our Ring! + +## Store Secrets + +To store a secret in a ring, theres a series of steps that clients must execute (thankfully our CLI Client does this all for you). The TLDR is that secrets must be +- Encrypted to the Secret Rings DKG Public Key +- Proof-of-Encryption commitment that cryptographically proves the first step is done correctly +- Client sends the encrypted secret and commitment proof, along with the authorization policy details to any of the Orbis nodes within the Secret Ring as a `store-secret` request. +- Finally the nodes broadcast the `store-secret` request amungst eachother. + +To create and store a secret, we have two methods for how the client will create the authorization policy information for the `store-secret` request. These methods are called `Managed` and `Unmanaged`. + +With `Managed` authorization, the client will automatically register the required zanzibar resource to the policy when storing the secret. + +The `Unmanaged` authorization has no automated registration functionality, so the caller is responsible for A) Ensuring the correct resources are registed in the policy B) They correctly create the Zanzibar authorization permission string, and ensure themselves have permission to access the supplied resource. + +### Managed Example +To create a `managed` secret with policy defined in the previous step: +```bash +orbisd client --ring-id put "MySuperSecretInformation" --authz managed --policy --resource secret --permission read +``` + +Here the client will get the `` aggregate public key, encrypt `MySuperSecretInformation` to the public key, create the proof, locally generate the `` (determinstic), register the `` as a new object in the `` policy with ourselves set as the `owner`, craft the full permission object `/secret:#read`, and send the full `store-secret` request with all this information to the Secret Ring. + +### Unmanaged Example +To create an `unmanaged` secret, first we manually register an object into the policy, then create the secret. +```bash +# Register an object called `MySecretName` +orbisd client policy register secret +# Create the secret using the `MySecretName` authorization object +orbisd client put "MySuperSecretInformation" --authz unmanaged --permission "/secret:#read" +``` + +You may have noticed the difference when executing the `unmanaged` request compared to the `managed` request is that we can manually define `` instead of using the deterministically generated ``. This is because we seperated the `register` command from the `put` command. Moreover, we supplied the `--permission` as the fully +qualified zanizbar tuple `/secret:#read` as a single string. + +In both examples, the finally request sent to the Secret Ring is similar, the encrypted secret is verified against the proof commitment, and finally broadcast to the network bulletin so it can be recieved by all the other nodes. + +## Recover Secrets +Now that we have stored a secret, we can send a `recover` request which will trigger a Threshold [Proxy Re-Encryption](/orbis/concepts/pre) request. This request will first be authenticated to ensure the client requesting has the correct Proof-of-Possession JWS token, then authorized by each node before re-encryption. The authorization runs a `Check` call against the `Zanzi` authorization service to determine if client has the correct permission as configured when the secret was first created. + +In the above example, this means the `Check` call will determine if the client has the `read` permission on the provided secret resource within the `` policy. + +```bash +orbisd client get +``` +> Note: You will need to replace `` with `` if you used the `unmanaged` authorization. + +This will automatically craft the proof-of-possession JWS token, intiate the proxy re-encryption request, wait for and finally decrypt the response. + + +## Share a Secret +To share a secret with another person, we can update the policy state so that our target subject has the necessary permissions to access the secret. From our [example policy](/orbis/getting-started/policy#create-a-policy) before our `secret` resource has an additional `collaborator` relation. Moreover, the `read` permission is the expression `owner + collaborator` which means either the `owner` or the `collaborator` can `read`. + +We're going to add `Bob` identified by `did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS` as a `collaborator` so he can inheir the `read` permission and therefore access our stored secret. + +:::info +Reminder, there is nothing specific about the names/labels used within our policy. Although we use the `read` permission, there is no special power or requirement to name your permission `read`, it can be any valid name. +::: + +```bash +orbisd keys add bob +export BOB=$(orbisd keys show bob --did) +orbisd client policy set secret collaborator $BOB +``` + +We can confirm that the policy relation was created by manually running a `Check` command. +```bash +orbisd client policy check secret:#read +``` +Which should return `valid: true`. + +Finally `Bob` can also recover the secret +```bash +orbisd client --from bob get +``` diff --git a/orbis_versioned_docs/version-0.2.3/getting-started/_category_.json b/orbis_versioned_docs/version-0.2.3/getting-started/_category_.json new file mode 100644 index 0000000..27e66a2 --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/getting-started/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Getting Started", + "position": 2 +} \ No newline at end of file diff --git a/orbis_versioned_docs/version-0.2.3/networks/_category_.json b/orbis_versioned_docs/version-0.2.3/networks/_category_.json new file mode 100644 index 0000000..a6f0323 --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/networks/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Networks" + } + \ No newline at end of file diff --git a/orbis_versioned_docs/version-0.2.3/networks/testnet/_category_.json b/orbis_versioned_docs/version-0.2.3/networks/testnet/_category_.json new file mode 100644 index 0000000..5ab6ca9 --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/networks/testnet/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Testnet 1" + } + \ No newline at end of file diff --git a/orbis_versioned_docs/version-0.2.3/networks/testnet/join.md b/orbis_versioned_docs/version-0.2.3/networks/testnet/join.md new file mode 100644 index 0000000..b35a03d --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/networks/testnet/join.md @@ -0,0 +1,267 @@ +--- +title: Join Root Ring +--- + +# How to Join Testnet 1 Root Ring +The following will detail the necessary steps to join Testnet 1 Orbis Root Ring as a validator. Only the existing and approved validators can operate a Orbis node in the Root Ring. + +## Hardware Requirements +Orbis doesn't have any specific requirements from a hardware perspective at the moment, however it is recommended to use a "good enough" datacenter machine. + +Orbis can be deployed along side your existing validator hardware as a co-process. Or on a seprate machine entirely. + +Minimum hardware requirements: +* 2-core amd64 CPU (or 2 virtual cores) +* 4GB RAM +* 32GB SSD Storage +* 100Mbps bi-directional internet connection. + +## Orbis Binary +You can get the `orbisd` binary from the releases page of the Orbis repo: [https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.3](https://github.com/sourcenetwork/orbis-go/releases/tag/v0.2.3). +```bash +cd $HOME +wget https://github.com/sourcenetwork/orbis-go/releases/download/v0.2.3/orbisd +chmod +x orbisd +sudo mv /usr/bin +``` + +### From Source +You can download the code and compile your own binaries if you prefer. However you will need a local installation of the `go` toolchain at a minimum version of 1.21 +```bash +cd $HOME +git clone https://github.com/sourcenetwork/orbis-go +cd orbis-go +git checkout v0.2.3 +make build +cp ./build/orbisd $GOBIN/orbisd +export PATH=$PATH:$GOBIN +``` +Now you will have the `orbisd` available in your local system. + +## Docker +You can either use the pre-existing docker image hosted on our GitHub, or build your own + +### Github Container Registry (coming soon) +`docker pull ghcr.io/sourcenetwork/orbis:0.2.3` + +### Build Docker Image from Source +```bash +cd $HOME +git clone https://github.com/sourcenetwork/orbis-go +cd orbis-go +git checkout v0.2.3 +docker build -t . +``` + +## Docker Compose +> TODO + +## Initialization +To deploy our orbis node and to join the Root Ring running on [SourceHub Testnet 1](/sourcehub/testnet/overview), generate or use an existing sourcehub keypair, and update your respective configuration. + +Orbis will also need access to a running SourceHub Testnet 1 RPC Endpoint, this can either be: +* A) The RPC endpoint of your existing validator node, if you are running both daemons on a single machine +* B) Your own hosted RPC endpoint +* C) A public RPC endpoint + * http://rpc1.testnet1.source.network:26657 + * http://rpc2.testnet1.source.network:26657 + +### Key Ring +As for the sourcehub keypair, Orbis needs access to a sourcehubd keyring instance. You already have one running on your validator node, but you can also create a keyring on any node with `sourcehubd keys add `. If you are running both `orbisd` and `sourcehubd` on the same machine, then you can share keys between your validator and orbis node. + +The `keyname` you have already, or if you create a new one, must match what you specify in the `orbis.yml` config, defined below. + +By default `sourcehubd keys add ` will use the `os` keyring backend, you may use other key backends supported by the SourceHub keyring utility, but whatever backend you use *MUST* match what is in your `orbis.yml` config. To learn more about various backends you can see the documentation available from the `sourcehubd keys --help` command. + +:::caution +If you start your node and you get an error similar to `error: bech32 decode ...` then you likely have either used the wrong `keyname` or `keyringBackend`. +::: + +### Faucet +To be able to properly run the Orbis daemon and join the Root Ring, you need to ensure your account for the key you chose has sufficent number of $OPEN tokens, since initializating the DKG requires transactions on the network that need to be paid for. + +As usual, you can go the [SourceHub Testnet 1](https://faucet.source.network/) and use the address of the new key `sourcehubd keys show --address`. + +## Configuration +You may have to configure orbis to work in your specific environment or hardware, depending on your storage and networking resources, here is a pretty standard configuration file `orbis.yml` +```yaml +grpc: + # GRPC Endpoint + grpcURL: "0.0.0.0:8080" + # Rest API Endpoint (optional) + restURL: "0.0.0.0:8090" + # GRPC Request logging (true/false) + logging: true + +logger: + # Default log level ("fatal", "error", "warn", "info", "debug") + level: "info" + +host: + # P2P Host Address (required - see below) + listenAddresses: + - /ip4/0.0.0.0/tcp/9000 + # P2P Boostrap peers (required - see below) + bootstrap_peers: + - /dns4//tcp/9000/p2p/ + +transport: + # P2P Peer exchange topic (required) + rendezvous: "orbis-transport" + +db: + # DB data store path, prefixed with $HOME/.orbis + # So "data" would result in a path $HOME/.orbis/data + path: "data" + +cosmos: + # Cosmos chain ID + chainId: sourcehub-testnet1 + # Cosmos keyring key name + accountName: + # Cosmos keyring backend ('os' is the default when running sourcehubd) + keyringBackend: os + # Cosmos address prefix ('source' is for SourceHub) + addressPrefix: source + # Transaction fees + fees: 2000uopen + # SourceHub data folder where your keyring is defined + home: ~/.sourcehub + rpcAddress: +``` + +When starting an Orbis daemon, you can specify the config file path with the `--config ` flag. + +## Configuration Requirements +:::info +required `host.listenAddress` +::: + +You *MUST* run orbis with a publicly available `host.listenAddress`. In the above example config this is the +```yaml +listenAddresses: + - /ip4/0.0.0.0/tcp/9000 +``` +You can specify your own port to listen on, but the host port and bind address must result in a publicly available listener. This is the port that all the orbis nodes communicate their P2P network traffic. + +:::info +required `host.bootstrapPeers` +::: + +You *MUST* use the `host.boostrapPeers`address provided in the [#validator-info](https://discord.com/channels/427944769851752448/1207162452337360936) channel in the Source Network discord. +```yaml + bootstrap_peers: + - /dns4//tcp/9000/p2p/ +``` + +The GRPC and Rest address/port don't necessarily have to be public, this can match whatever deployment environment you are currently using, however if you want to access these APIs from other machines, you must make the appropriate port and network rules to do so. + +### Start your node +Once you have configured your keyring and config file, you can start you node. +```bash +orbisd start --config /path/to/orbis.yml +``` +:::info +When starting your orbis daemon, your configured `cosmos.rpcAddress` endpoint **must** be live, since it tries to connect to this node immediatly upon startup. If you have any errors relating to `cosmos client` then you have either used the wrong `rpcAddress` or the RPC node isn't online. +::: + +### SystemD Service (Optional) +If you wish to use systemd to manage your daemon, you can use the following configuration. + +Create the following file: `/etc/systemd/system/orbisd.service` +```bash +[Unit] +Description=Orbis service +After=network-online.target + +[Service] +User= +ExecStart=//orbisd start --config +Restart=no +LimitNOFILE=4096 + +[Install] +WantedBy=multi-user.target +``` + +## Joining the Root Ring +The *Root Ring* is the Orbis deployment maintained by the validators of the SourceHub Testnet. The primary function of nodes maintaining the Root Ring is to create a shared keypair using a Distributed Key Generation (DKG) algorithm. + +A Orbis ring is defined by its *Manifest* which is a configuration that describes all the initial parameters of a ring, such as what DKG algorithm to use, how to authenticate and authorize requests, the threshold number of nodes required for a proxy-encryption, etc. You can think of a ring manifest similar to a network genesis file. + +***Example Manifest*** +```json +{ + "n": 3, // total number of initial nodes in the ring + "t": 2, // threshold number of nodes for a proxy-encryption operation + "dkg": "rabin", // DKG algorithm + "pss": "avpss", // Proactive Secret Sharing algorithm + "pre": "elgamal", // Proxy-Encyption algorithm + "bulletin": "sourcehub", // bulletin board implementation + "transport": "p2p", // networking transport + "authentication": "jws-did", // encryption request authentication + "authorization": "ACP", // encryption request authorization + "nodes": [ // PeerIDs and Addresses of the initial nodes + {"id":"16Uiu2HAm35sSr96x1TJHBTkWdcDH9P8twhTw92iDyq38XvyGzgZN","address":"/ip4/127.0.0.1/tcp/9001"}, + {"id":"16Uiu2HAmAVcM6V1PY8DdvzobyK5QZbwX5z3AA6wCSrCm6xUA79Xn","address":"/ip4/127.0.0.1/tcp/9002"}, + {"id":"16Uiu2HAkzjLLosHcV4LGvLY4vskda5NgMW4qmtfQ2uMbgFAoqghX","address":"/ip4/127.0.0.1/tcp/9003"} + ], + "nonce": 0 // nonce to alter the determinisic ring content identifier (CID) +} +``` + +### Creating the Root Ring Manifest +To create the Root Ring manifest we need all the initial nodes PeerIDs and P2P Addresses. In fact, the rest of the parameters of the Root Ring manifest will be the same as the example above, with the exception of +* `Number of nodes (n)` +* `Threshold number of nodes (t)` +* `Initial (nodes)` + +The root ring manifest *cannot* be created until all existing validators start their Orbis nodes, and report back with the respective PeerIDs and Addresses. + +Once you have a running node, you can get your PeerID and Address with the following command: +```bash +orbisd -s transport-service get-host --transport p2p +``` +This will respond back with something like: +```json +{ + "node":{ + "id":"16Uiu2HAm35sSr96x1TJHBTkWdcDH9P8twhTw92iDyq38XvyGzgZN", + "address":"/ip4//tcp/9001", + "publicKey":{ + "Type":"Secp256k1", + "Data":"AnHK2Co3LgeLHo8tMsyfMlp0JXGL3y9yiPOAkQVknfrp" + } + } +} +``` + +:::info +Sometimes the `address` field returns `127.0.0.1` instead of a public address, if so, please replace it with your nodes publicly accessible IP address +::: + +Please post this *full* response in the [#validator-general](https://discord.com/channels/427944769851752448/1200236096089509918) channel, this is all public information, so no security details are being leaked. + +Once all the current validators have started their nodes, and posted their host info, we can craft the Root Ring manifest. + +### Create Root Ring +:::info +We now have the assembled `manifest.json` file needed to start the root ring. You can download the root ring manifest for Testnet1 [here](https://github.com/sourcenetwork/networks/blob/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json) +::: +**ALL NODES MUST BE UPDATED TO v0.2.3 BEFORE CREATING THE RING** +To create the root ring, and start the Ditributed Key Generation (DKG) process to create the shared keypair, each node will need download the manifest file [here](https://github.com/sourcenetwork/networks/blob/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json) and then run the `create-ring` command, as shown below. + +**NOTE** You must ensure you have sufficient $OPEN balance for the SourceHub key you are using for your orbis node. You can get tokens from the faucet: https://faucet.source.network/ + + +```bash +wget https://raw.githubusercontent.com/sourcenetwork/networks/15ad45d92e6c012150e764db0c9e7f9e1e25c64f/testnet1/orbis-root-ring/manifest.json + +orbisd -s ring-service create-ring -f /manifest.json +``` + +This will initialze the DKG process and you node will start generating its respective DKG Share. This process can't complete unless *all* nodes are online and syncing. Once completed, the Root Ring will have an initialized DKG, and is ready to start recieving `Store` and `ReEncrypt` requests! + +If we have reached this step together without errors, then we will have completed the Orbis Root Ring setup! + +However, if there are errors experienced along the way, we may need to issue a software update, and restart the process. This is experimental and bleeding edge software, but we hopeful that we can collectively launch the Root Ring without any breaking or blocking issues. \ No newline at end of file diff --git a/orbis_versioned_docs/version-0.2.3/overview.md b/orbis_versioned_docs/version-0.2.3/overview.md new file mode 100644 index 0000000..c2dd3a6 --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/overview.md @@ -0,0 +1,21 @@ +--- +sidebar_position: 1 +title: Overview +slug: / +--- +# Orbis Overview +![Orbis Overview](/img/orbis/cover.png) + +Orbis is a decentralized Secrets Management engine powered by [Threshold-Proxy ReEncryption](asd) and [Multi-Party Computation](asd) to enable trustless system to manage and share application and user secrets. Application and user secrets can be anything from encryption keys, API tokens, to general small sized messages. This is comparable to other Secrets Management systems like [Hashicorp Vault](vault) but without a single centralized entity. + +## How it works +Deployments of Orbis are called *Secret Rings* which are initialized by a group of nodes, which collectively agree on some starting *Manifest*. These manifest define the initial parameters, such as which kind of authentication/authorization, Proxy Re-encryption, Distributed Key Generation (DKG) algorithms, bulletin protocol, etc are used. + +Once the manifest is created, Secret Ring nodes will start their initial DKG ceremony, which will generate a shared keypair maintained by the nodes, where each node has a share of the private key, and in aggregrate represent a single public key. When a threshold number of nodes (defined by the chosen parameters in the Manifest) collaborate, they are able to execute various kinds of cryptograhic operations. + +Once a Ring is fully configured and initialized users that want to store secrets will encrypt their secret *`S`* to the rings aggregate public key *`Pk`*, *`Se = Enc(S, Pk)`*. They then send *`Se`* to any of the Orbis nodes along with the *Authorization Context* that determines how the configured authorization system processes requests (which is dependant on the `authz` parameter of the Manifest), as a `StoreSecret` request. Finally the receiving node will broadcast the request to the Rings' bulletin protocol to sync with the rest of the nodes. + +:::info +The *Root Ring* is a special deployment Orbis Ring that is a public permissionless service provided by the same infrastructure nodes as the SourceHub publicly hosted service. This ensures there is a single public Source stack deployment that developers can use along side their DefraDB nodes. +::: + diff --git a/orbis_versioned_docs/version-0.2.3/reference/_category_.json b/orbis_versioned_docs/version-0.2.3/reference/_category_.json new file mode 100644 index 0000000..86d0ad2 --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/reference/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Reference", + "position": 4 +} \ No newline at end of file diff --git a/orbis_versioned_docs/version-0.2.3/reference/config.md b/orbis_versioned_docs/version-0.2.3/reference/config.md new file mode 100644 index 0000000..b53e15d --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/reference/config.md @@ -0,0 +1,3 @@ +# Config + +> TODO \ No newline at end of file diff --git a/orbis_versioned_docs/version-0.2.3/reference/manifest.md b/orbis_versioned_docs/version-0.2.3/reference/manifest.md new file mode 100644 index 0000000..eb47d64 --- /dev/null +++ b/orbis_versioned_docs/version-0.2.3/reference/manifest.md @@ -0,0 +1,24 @@ +# Manifest + +```json +{ + "manifest": { + "n": 3, // N: The total number of nodes in the ring + "t": 2, // T: The threshold number of nodes to run decryption request (T <= N) + "dkg": "rabin", // DKG: Distributed Key Generation algorithm (available: rabin) + "pss": "avpss", // PSS: Proactive Secret Sharing algorithm (available: avpss) + "pre": "elgamal", // PRE: Proxy Re-Encryption algorithm (available: elgamal) + "bulletin": "p2p", // Bulletin: The network broadcast bulletin (available: p2p, sourcehub) + "transport": "p2p", // Transport: The overlay network transport (available: p2p) + "authentication": "jws-did", // Authentication: The authn scheme for clients (available: jws-did) + "authorization": "zanzi", // Authorization: The authz scheme for clients (available: zanzi, sourcehub) + "nodes": [ // Nodes: Set of node objects identifying the initial nodes. + { + "id":"16Uiu2HAmLyq5HXHSFxvxmGcsnwsYPZvTDtfe3CYnWDK8jDAHhJC5", + "address":"/ip4/127.0.0.1/tcp/9000" + }, + ], + "nonce": 0 // Nonce: Random value to adjust the determinstic RingID creation + } +} +``` \ No newline at end of file diff --git a/orbis_versioned_sidebars/version-0.2.3-sidebars.json b/orbis_versioned_sidebars/version-0.2.3-sidebars.json new file mode 100644 index 0000000..f1f02dc --- /dev/null +++ b/orbis_versioned_sidebars/version-0.2.3-sidebars.json @@ -0,0 +1,31 @@ +{ + "defraSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ], + "sourcehubSidebar": [ + { + "type": "autogenerated", + "dirName": "." + }, + { + "type": "link", + "label": "API", + "href": "/sourcehub/api" + } + ], + "orbisSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ], + "lensvmSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} diff --git a/orbis_versions.json b/orbis_versions.json new file mode 100644 index 0000000..da4b6b5 --- /dev/null +++ b/orbis_versions.json @@ -0,0 +1,3 @@ +[ + "0.2.3" +] diff --git a/sidebars.js b/sidebars.js index 6384372..f13c824 100644 --- a/sidebars.js +++ b/sidebars.js @@ -13,15 +13,17 @@ /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ const sidebars = { - // By default, Docusaurus generates a sidebar from the docs folder structure - defraSidebar: [{ - type: "autogenerated", - dirName: "defradb", + // DefraDB sidebar - autogenerated from the defradb directory + defraSidebar: [{ + type: "autogenerated", + dirName: ".", }], + + // SourceHub sidebar - autogenerated from the sourcehub directory + API link sourcehubSidebar: [ - { - type: "autogenerated", - dirName: "sourcehub" + { + type: "autogenerated", + dirName: "." }, { type: 'link', @@ -29,13 +31,17 @@ const sidebars = { href: '/sourcehub/api', // The internal path }, ], - orbisSidebar: [{ - type: "autogenerated", - dirName: "orbis" + + // Orbis sidebar - autogenerated from the orbis directory + orbisSidebar: [{ + type: "autogenerated", + dirName: "." }], + + // LensVM sidebar - autogenerated from the lensvm directory lensvmSidebar: [{ type: "autogenerated", - dirName: "lensvm" + dirName: "." }] // But you can create a sidebar manually diff --git a/sourcehub_versioned_docs/version-0.3.2/concepts/_category_.json b/sourcehub_versioned_docs/version-0.3.2/concepts/_category_.json new file mode 100644 index 0000000..4d7732d --- /dev/null +++ b/sourcehub_versioned_docs/version-0.3.2/concepts/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Concepts", + "position": 4 + } \ No newline at end of file diff --git a/sourcehub_versioned_docs/version-0.3.2/concepts/zanzibar.md b/sourcehub_versioned_docs/version-0.3.2/concepts/zanzibar.md new file mode 100644 index 0000000..6be9e1b --- /dev/null +++ b/sourcehub_versioned_docs/version-0.3.2/concepts/zanzibar.md @@ -0,0 +1,248 @@ +--- +date: 2023-09-08 +title: Zanzibar Access Control +--- + +## Introduction + +[Zanzibar](https://research.google/pubs/pub48190/) is an authorization service introduced by Google to manage access control across its services. +Its primary function is to evaluate access requests by answering: + +> Can user **U** perform operation **O** on object **A**? + +This article explores Zanzibar's access control model, how it handles access requests, and a conceptual framework for understanding it. + +## Relation Based Access Control Model + +Access control determines who or what can operate on a given resource within a system. Zanzibar implements a model closely aligned with [Relation-Based Access Control (RelBAC)](https://ieeexplore.ieee.org/abstract/document/4725889). RelBAC defines permissions based on relationships between entities. Similar to relational databases and object-oriented modeling, it establishes access rules using entity relationships. + +E.g. A book is written by an author. The book and author are connected by the authored relation. This relation implies permissions—an author should have read and edit access to their book. + +Such relationships exist across various domains, often represented using specialized languages like description logic. RelBAC leverages these relationships to determine permissions dynamically. + +## Zanzibar's RelBAC + +A key concept in Zanzibar is the **Relation Tuple**, which represents relationships between system objects. + +### Relation Tuple + +``` +tuple := (object, relation, user) +object := namespace:id +user := object | (object, relation) +relation := string +namespace := string +id := string +``` + +A Relation Tuple is a **3-tuple** containing: + +1. **Object** – The entity being referenced. +2. **Relation** – A named association between entities. +3. **User** – The entity granted access, which can be: + - A direct reference to an object. + - A **userset** (an indirect group reference). + +E.g. The tuple `(article:zanzibar, publisher, corporation:google)` defines a relationship where **Google (corporation:google) is the publisher of the Zanzibar article (article:zanzibar)**. + +### Usersets + +A **userset** is a special form of `user` defined as `(object, relation)`, grouping users who share the same relation to an object. + +#### Example + +Consider the userset `(group:engineering, member)` and the tuples: + +- `(group:engineering, member, user:bob)` +- `(group:engineering, member, user:alice)`. + +The userset `(group:engineering, member)` expands to include **Bob and Alice** as members. + +### Recursive Definitions + +Usersets introduce a layer of indirection in Relation Tuples, allowing tuples to reference other usersets. This enables **recursive definitions**, where a tuple can specify a userset that, in turn, references another userset, supporting complex access hierarchies. + +## The Relation Graph + +A key insight into Zanzibar is recognizing that a set of Tuples forms a **Relation Graph**. + +### Structure of the Relation Graph + +A Relation Tuple can be rewritten as a **pair of pairs**: +- ((object, relation), (object, relation)) + +These **object-relation pairs** are called **Relation Nodes**. The first pair represents the Tuple’s **Object and Relation**, while the second represents a **userset**. If relations are allowed to be empty, this structure accommodates all cases from the original definition. + +Each **Relation Tuple** defines an **Edge** in the Relation Graph, and each **Node** corresponds to an object-relation pair. + +### Example + +Given the following tuples: + +- ("file:readme", "owner", "bob") +- ("file:readme", "reader", "group:engineering", "member") +- ("group:engineering", "member", "alice") + +The corresponding Relation Graph looks like this: + +![Relation Graph Example](/img/sourcehub/relgraph-simple.png) + +### Using the Relation Graph + +The Relation Graph provides a **system-wide view** of all objects and their relationships. It enables answering questions such as: + +> Does user **U** have relation **R** with object **O**? + +This question is resolved by starting at node `(O, R)`, traversing the graph, and checking for user **U**. + +If **R** represents a permission (e.g., `"read"`, `"write"`, `"delete"`), the Relation Graph serves as a structured way to enforce and evaluate access control. + +## Userset Rewrite Rules + +Relation Tuples provide a **generic and powerful** model for representing **relations and permissions** in a system. However, they are minimalistic, often leading to redundant tuples. + +Historically, **grouping relations** and **grouping objects** have been crucial in access control. Theoretically, these features are essential for Zanzibar to qualify as a **Relation-Based Access Control (RelBAC)** implementation. + +To address this, Zanzibar introduces **Userset Rewrite Rules**. + +### Overview of Userset Rewrite Rules + +Userset Rewrite Rules are not immediately intuitive. + +A **rule** functions as a **transformation** on a **Relation Node** `(object, relation)`, returning a set of **descendant Relation Nodes**. + +#### Example + +Let **A** be a **Relation Node** and **R** be a **Rewrite Rule**. Then: + +R(A) → \{B, C, D\} + +This means that applying **R** to **A** produces a **set of descendant Relation Nodes** `{B, C, D}`. + +Rules are associated with specific **relations** and **execute at runtime**, dynamically resolving permissions as Zanzibar traverses the Relation Graph. + +### Permissions hierarchy and computed usersets + +A permission hierarchy simplifies access control by linking stronger and weaker permissions. If a user has permission to perform a higher-level action, they automatically gain permission for related lower-level actions. For example, the ability to write typically includes the ability to read. This hierarchy reduces administrative effort and simplifies rule management in an Access Control System. + +Refer to the following Relation Graph for a visual representation. + +![Relation Graph Example](/img/sourcehub/relgraph-simple.png) + +In our system, Bob is both a *reader* and an *owner*. If ownership always implies read access, maintaining redundant permission tuples adds unnecessary overhead. Zanzibar addresses this with the **Computed Userset** rule, which dynamically links relations in the permission hierarchy. To enforce that *owner* always implies *reader*, we define a **Computed Userset("owner")** rule for the *reader* relation. This rule automatically extends permissions without requiring additional tuples. + +When checking if Bob has *reader* access to `file:readme`, Zanzibar follows these steps: + +1. Start at the node `("file:readme", "reader")` and check for associated rules. +1. Detect the **Computed Userset("owner")** rule, which creates a new relation node `("file:readme", "owner")` as a successor of `("file:readme", "reader")`. +1. Continue searching through `("file:readme", "owner")`. + +This approach ensures efficient permission management by dynamically resolving inherited access rights. + +![Computed Userset Evaluation](/img/sourcehub/cu-annotated.png) + +Using a Computed Userset we successfully added a rule to Zanzibar which automatically derives one relation from another. +This enable users to define a set of global rules for a relation as opposed to adding additional Relation Tuples for each object in the system. +This powerful mechanism greatly decreases the maintainability cost associated to Relation Tuples. + +### Object Hierarchy and Tuple to Userset + +Before exploring the **Tuple to Userset** rule, let's revisit the core idea of **RelBAC**: relationships between system objects define permissions and determine access control. We have already seen how **Relation Tuples** link objects to users and how **Usersets** establish hierarchies and group users. However, we have yet to define how Zanzibar can create **relationships between objects** and group them accordingly. This is where the **Tuple to Userset** rule comes into play. + +To illustrate this concept, let's consider a familiar **filesystem permission model**. + +A filesystem consists of: + +- **Directories**, **files**, and **users** +- Users who **own** files and directories +- Directories that **contain** files + +In this example, having **read** permission on a directory should automatically grant **read** permission for all files within that directory. The **Tuple to Userset** rule enables this by defining relationships between objects dynamically. + +The following **Relation Graph** illustrates the existing **Tuples** in the system: + +![File system example](/img/sourcehub/ttu-relgraph.png) + +We need to express two key relationships: + +1. Bob’s `readme` file is inside Alice’s `/home` directory. +1. Since the file is in her directory, Alice should have **read** access to it. + +One way to grant Alice read access is to create a **Relation Tuple** that links the file to the directory’s owners. +The tuple `(file:/home/readme, reader, (directory:/home, owner))` ensures that **directory owners automatically become file readers**. + +The updated **Relation Graph** now looks like this: + +![File System Relation Graph with Relation from File to Directory owners](/img/sourcehub/ttu-relgraph-2.png) + +While this grants the correct **permissions**, it does not establish an explicit **relationship** between the file and the directory itself. The **Relation Tuple** only states that **directory owners are also file readers**, but it does not indicate that `file:/home/readme` is actually **contained** within `directory:/home`. + +To fully represent the **structure** of the filesystem, we need a way to explicitly define object relationships. This is where the **Tuple to Userset** rule becomes essential. + +What we truly need is a way to **declare a relationship between a file and a directory** and, from that relationship, derive the **set of directory owners**. The following image illustrates this concept: + +![File System Relation Graph parent relation](/img/sourcehub/ttu-relgraph-3.png) + +From this representation, we see that the file is linked to its directory through the **`parent`** relation. This explicitly defines the **structural** relationship between objects in the system. However, to complete the access control logic, we need a way to trace a path from the `("/home/readme", "reader")` node to the `("/home", "owner")` node. + +One possible approach would be to use: + +- A **Computed Userset** rule, linking `reader` to `parent` +- An additional **Relation Tuple** between `/home` and `/home, owner` + +However, this method **mixes object relationships with access control rules**, making it difficult to separate concerns. This is exactly the problem that the **Tuple to Userset** rule solves. + +The **Tuple to Userset** rule is essentially a **Tuple query** combined with a **Computed Userset** rule. It takes two arguments: + +- **Tupleset Filter** – Specifies the relation between objects +- **Computed Userset Relation** – Defines how permissions should propagate + +1. The rule first **rewrites the current Relation Node** using the **Tupleset Filter**. +2. Using this new node, it **fetches all successor nodes**. +3. The successor set is then processed through a **Computed Userset Rewrite**, applying the supplied **Computed Userset Relation**. + +The **Tuple to Userset** rule is powerful because it allows an application to **declare relationships between objects** without embedding access control logic in the application itself. This enables **object hierarchies** to be seamlessly translated into **access control rules**. + +The key benefit of **Tuple to Userset** is that applications only need to create **Tuples expressing object relationships**—without extra tuples just for permission derivation. + +This has **profound implications**: + +- Applications no longer need to **explicitly track access control logic**. +- The rules of access control remain **entirely within Zanzibar**. +- The **application layer is unaware of access rules**, focusing solely on object relationships. + +By enabling complex object hierarchies to be **natively converted into access control rules**, the **Tuple to Userset** rule fundamentally decouples **permission management** from application logic. + +Finally, let's see the TupleToUserset rule in action. + +Let the rule `TupleToUserset(tupleset_filter: "parent", computed_userset: "reader")` be associated with the `"reader"` relation, and assume the same Relation Tuples as shown earlier. + +Evaluating the TupleToUserset rule follows these steps: + +1. Start at the Relation Node `(file:/home/readme, reader)`. +2. Evaluate the rule `TupleToUserset(tupleset_filter: "parent", computed_userset: "reader")`. +3. Build a filter using `"tupleset_filter"` -> `(file:/home/readme, parent)`. +4. Fetch all successors of the filter from step 3 -> `[(directory:/home)]`. +5. Apply a Computed Userset rewrite rule using the `"computed_userset"` relation for each fetched Relation Node -> `[(directory:/home, reader)]`. + +This process ensures that the `"reader"` permission propagates correctly through the object hierarchy. The following image further illustrates the concept: + +![Tuple to Userset Evaluation](/img/sourcehub/ttu-eval.png) + +Effectively, the Tuple to Userset added a path from the `/home/readme, reader` node to the `/home, owner` nodes. +The following image shows the edges the rule added: + +![](/img/sourcehub/ttu-relgraph-annotated.png) + +### Rewrite Rule Expression + +In Zanzibar, a relation can have multiple rewrite rules. These rules are combined to form Rewrite Rule expressions. Each rewrite rule returns a set of Relation Nodes (or usersets), which are then combined using set operations defined in the Rewrite Rule Expression. The available set operations are union, difference, and intersection. When evaluating each Rewrite Rule, the resulting sets of Nodes are processed through these set operations. The final evaluated set of Nodes represents all the successors of a parent Relation Node. + +### Conclusion + +The Relation Tuples define a graph of object relationships, which is used to resolve Access Requests. Usersets enable grouping users and applying relations to an entire set of users. The Userset Rewrite Rules allow the creation of Relation Hierarchies and support Object Hierarchies. These features are critical for keeping Access Control Logic within Zanzibar. While the Relation Graph was useful for illustration, in practice, Zanzibar dynamically constructs the graph from Relation Tuples and evaluates the Rewrite Rules. This synergy between Relation Tuples and Rewrite Rules powers Zanzibar’s Access Control Model. From this perspective, Zanzibar’s API operates on the dynamic Relation Graph. The `Check` API call corresponds to a graph reachability problem. The `Expand` API serves as a debugging tool, exposing the Goal Tree used during the recursive expansion of Rewrite Rules and successor retrieval. + +# References + +- Zanzibar: https://research.google/pubs/pub48190/ +- RelBAC: https://ieeexplore.ieee.org/abstract/document/4725889/ diff --git a/sourcehub_versioned_docs/version-0.3.2/getting-started/1-readme.md b/sourcehub_versioned_docs/version-0.3.2/getting-started/1-readme.md new file mode 100644 index 0000000..9774bc5 --- /dev/null +++ b/sourcehub_versioned_docs/version-0.3.2/getting-started/1-readme.md @@ -0,0 +1,27 @@ +# Getting Started + +To get started with SourceHub, we need to download and initialize our local client. This section will utilize the `CLI` but equivalent functionality is available using the programmatic embedded API. + +## 1. Install SourceHub +First, we will download the SourceHub binary which includes a client. +### Precompiled +You can get precompiled binaries from our Github Release page [here](https://github.com/sourcenetwork/sourcehub/releases) or using your console: +```bash +cd $HOME +wget https://github.com/sourcenetwork/sourcehub/releases/download/v0.2.0/sourcehubd +chmod +x sourcehubd +sudo mv sourcehubd /usr/bin +``` + +### From Source Code +You can download the code and compile your own binaries if you prefer. However you will need a local installation of the Go toolchain with a minimum version of 1.22. +```bash +cd $HOME +git clone https://github.com/sourcenetwork/sourcehub +cd sourcehub +git checkout v0.2.0 +make install +export PATH=$PATH:$GOBIN +``` + +Next we will setup our local client wallet account. \ No newline at end of file diff --git a/sourcehub_versioned_docs/version-0.3.2/getting-started/2-account.md b/sourcehub_versioned_docs/version-0.3.2/getting-started/2-account.md new file mode 100644 index 0000000..de6335d --- /dev/null +++ b/sourcehub_versioned_docs/version-0.3.2/getting-started/2-account.md @@ -0,0 +1,46 @@ +# Account Setup + +Now we will create a new keypair and configure our client wallet. + +## Adding a key +The following command will generate a new random private key with the name `` +```bash +sourcehubd keys add +``` +This will output the newly generated public key, address, and mnemonic (make sure to back up the mnemonic). + +![Wallet output](/img/sourcehub/key-add-output.png) + +### Importing an existing mnemonic +If you want to import a key from an existing mnemonic, you can use the `--recover` option when adding the key: +```bash +sourcehubd keys add --recover +``` + +Then input your existing mnemonic when prompted. + +:::warning +You MUST ensure that you sufficiently back up your mnemonic. Failure to do so may result in lost access to your wallet. +::: + +## Configuring client +Now we can update the `CLI` client config to use the correct RPC node and ChainID. The RPC node is how we access the network API to send transactions and queries. RPC nodes are specific to certain networks, and must match the provided ChainID. +```bash +sourcehubd config set client chain-id +sourcehubd config set client node +``` + +## Faucet +Next we can load our account with some $OPEN tokens from the network faucet. You can find the faucet for the current testnet [here](https://faucet.source.network/). + +Using the `
    ` from above when we created our wallet keypair (You can access your wallet keypair using `sourcehubd keys show --address`), we can have the faucet seed our wallet with enough tokens to send a few transactions to get started. + +![wallet faucet](/img/sourcehub/faucet.png) + +## Verify +Finally, we can verify that our account exists and that it has been loaded with the initial faucet tokens. +```bash +sourcehubd query bank balances +``` + +That's it, we now have a newly generated local wallet via the `CLI` client. Now we can interact with the network! First up, we will be creating an ACP policy, seeding it with some state, and executing authorization checks. \ No newline at end of file diff --git a/sourcehub_versioned_docs/version-0.3.2/getting-started/3-create-a-policy.md b/sourcehub_versioned_docs/version-0.3.2/getting-started/3-create-a-policy.md new file mode 100644 index 0000000..80793cb --- /dev/null +++ b/sourcehub_versioned_docs/version-0.3.2/getting-started/3-create-a-policy.md @@ -0,0 +1,63 @@ +--- +title: Create a Policy +--- +# Create an ACP Policy +Now that we have a fully configured `CLI` client, we can start executing transactions and queries against the SourceHub network. Our first task will be to create a new ACP Policy. + +The SourceHub ACP Module is a [Zanzibar](/sourcehub/concepts/zanzibar) based global decentralized authorization system. Developers write policies using our Relation-Based Access Control (RelBAC) DSL, which allows you to define resources, relations, and permissions. + +- **Resources**: Generic container for some kind of "thing" you wish to gate access to or provide authorization for. It can be anything from a document on [DefraDB](/defradb), a Secret on [Orbis](/orbis), or any other digital resource. + +- **Relation**: Named connections between resources. Similar to a database table that might have relations between its schema types, so does the SourceHub ACP module. This allows us to create expressive policies that go beyond traditional *Role-Based* or *Attribute-based* access control. + +- **Permissions**: Computed queries over resources, relations, and even other permissions (they're recursive!). + +## Example +Let's create a very basic example policy which defines a single resource named `note` with both an `owner` and `collaborator` relation which are both of type `actor`. + +Create a file named `basic-policy.yaml` and paste the following: +```yaml +name: Basic Policy + +resources: + + note: + relations: + owner: + types: + - actor + collaborator: + types: + - actor + permissions: + read: + expr: owner + collaborator + edit: + expr: owner + delete: + expr: owner +``` + +Here we are also defining 3 permissions. + +The `read` permission is expressed as `owner + collaborator` which means *if* you have either an `owner` or `collaborator` relation *then* you have the `read` permission. + +Both the `edit` and `delete` permissions are reserved solely for those with the `owner` relation. + +:::info +Traditionally we define relations as nouns and permissions as verbs. This is because we often understand authorization as some *thing* (noun) performing some *action* (verb) on some resource. +::: + +### Upload Policy +Now that we have defined our policy, we can upload it to SourceHub. +```bash +sourcehubd tx acp create-policy basic-policy.yaml --from +``` + +Then, to get the policy we can list the existing policies. + +```bash +sourcehubd q acp policy-ids +``` + +![Policy IDs](/img/sourcehub/policy-ids-1.png) \ No newline at end of file diff --git a/sourcehub_versioned_docs/version-0.3.2/getting-started/4-acp-check.md b/sourcehub_versioned_docs/version-0.3.2/getting-started/4-acp-check.md new file mode 100644 index 0000000..14c2567 --- /dev/null +++ b/sourcehub_versioned_docs/version-0.3.2/getting-started/4-acp-check.md @@ -0,0 +1,54 @@ +--- +title: Access Requests +--- +# Check a Policy + +Now that we have an existing account and created policy, we're going to seed it with some resources and evaluate some `Check` requests. + +> A [`Check`](zanzibar-concept) request is how we determine if a given action on a resource by an actor is allowed. + +We are using the policy we created for our basic note app from the last step, which has a policy id of `a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf`. + +First, we need to "Register" a resource object, which will create an entry in the ACP system that establishes who the owner of an object is. The command is `sourcehubd tx acp direct-policy-cmd register-object ` where `resource-type` is `note` (as defined in the policy resources) and `resource-name` is any name we want to assign to our resource, in this case it will be `alice-grocery-list`. + +The full command is: +```bash +sourcehubd tx acp direct-policy-cmd register-object a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf note alice-grocery-list --from +``` + +We now have created the `alice-grocery-list` and registered the `owner` as whatever wallet you used for ``. + +To verify this, we can run a request to inspect the resource owner. +```bash +sourcehubd q acp object-owner a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf note alice-grocery-list +``` + +Which will result in something like: +![Object owner](/img/sourcehub/object-owner.png) + +The interesting part here is that the `owner_id` is encoded as a [DID Key](https://w3c-ccg.github.io/did-method-key/) identifier (`did:key:zQ3sha81FK34V8PrB7rbUq9ZbUvRKQZqW5CMqyjer2YQdwFWb` which is the wallet public key we used to register the object originally). + +## Add a Collaborator +After registering an object and verifying its owner, we can add a collaborator, and see how the authorization updates. + +We are going to introduce a new actor `BOB` who has an identity `did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS`. + +To add `BOB` as a `collaborator` (which is a specific relation defined on the [policy](example-basic-policy)) we can issue a `set-relationship ` where `` is `collaborator` and `` is the BOB identity above (`did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS`). +``` +sourcehubd tx acp direct-policy-cmd set-relationship a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf note alice-grocery-list collaborator did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS --from +``` + +We can now verify that the access to Alice's grocery list resource is properly enabled. We can issue a `verify-access-request :#` query which will check if the permission can be evaluated for the given resource and subject. Here we will check for the `read` permission, which according to the policy is true for `OWNERs` and `COLLABORATORs`. +```bash +sourcehubd q acp verify-access-request a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS note:alice-grocery-list#read +``` + +Which will return `valid: true`. + +Let's check for a permission that Bob *shouldn't* have, like `edit` which is reserved for `OWNERs`. +```bash +sourcehubd q acp verify-access-request a3cc042579639c4b36357217a197e0bb17bdbb54ff322d4b52e4bba4d19548bf did:key:z6Mkmyi3eCUYJ6w2fbgpnf77STLcnMf6tuJ56RQmrFjce6XS note:alice-grocery-list#edit +``` + +Which will return `valid: false` + diff --git a/sourcehub_versioned_docs/version-0.3.2/getting-started/_category_.json b/sourcehub_versioned_docs/version-0.3.2/getting-started/_category_.json new file mode 100644 index 0000000..ed6808f --- /dev/null +++ b/sourcehub_versioned_docs/version-0.3.2/getting-started/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Getting Started", + "position": 2 + } + \ No newline at end of file diff --git a/sourcehub_versioned_docs/version-0.3.2/networks/_category_.json b/sourcehub_versioned_docs/version-0.3.2/networks/_category_.json new file mode 100644 index 0000000..db0b27b --- /dev/null +++ b/sourcehub_versioned_docs/version-0.3.2/networks/_category_.json @@ -0,0 +1,3 @@ +{ + "label": "Networks" + } \ No newline at end of file diff --git a/sourcehub_versioned_docs/version-0.3.2/networks/testnet-1/_category_.json b/sourcehub_versioned_docs/version-0.3.2/networks/testnet-1/_category_.json new file mode 100644 index 0000000..5ab6ca9 --- /dev/null +++ b/sourcehub_versioned_docs/version-0.3.2/networks/testnet-1/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Testnet 1" + } + \ No newline at end of file diff --git a/sourcehub_versioned_docs/version-0.3.2/networks/testnet-1/join.md b/sourcehub_versioned_docs/version-0.3.2/networks/testnet-1/join.md new file mode 100644 index 0000000..ff0a6c8 --- /dev/null +++ b/sourcehub_versioned_docs/version-0.3.2/networks/testnet-1/join.md @@ -0,0 +1,158 @@ +--- +title: Join +sidebar_position: 2 +--- + +# How to join Testnet 1 +The following will detail the necessary steps to join Testnet 1 as a validator. Only approved validators can join testnet 1 as we have not yet enabled permissionless public validator sets. + +## Hardware Requirements +Firstly any validator joining the network must ensure they have sufficient server hardware to ensure the network meets its current performance targets. + +* x86-64 (amd64) multi-core CPU (AMD / Intel) +* 16GB RAM +* 256GB SSD Storage +* 100Mbps bi-directional Internet connection + +## SourceHub Binary + +### Precompiled +You can get the `sourcehubd` binary from the releases page of the SourceHub repo: https://github.com/sourcenetwork/sourcehub/releases/tag/v0.2.0 +```bash +cd $HOME +wget https://github.com/sourcenetwork/sourcehub/releases/download/v0.2.0/sourcehubd +chmod +x sourcehubd +sudo mv /usr/bin +``` + + +### From Source +You can download the code and compile your own binaries if you prefer. However you will need a local installation of the `go` toolchain at a minimum version of 1.21 +```bash +cd $HOME +git clone https://github.com/sourcenetwork/sourcehub +cd sourcehub +git checkout v0.2.0 +make install +export PATH=$PATH:$GOBIN +``` +Now you will have the `sourcehubd` available in your local system. + +## Initialization +To join the network you need to initiaze your node with a keypair, download the genesis file, and update your configurations. + +```bash +# You must specify your own moniker, which is a label for your node +sourcehubd init --chain-id sourcehub-testnet1 + +# Download the Genesis +cd $HOME +wget https://raw.githubusercontent.com/sourcenetwork/networks/testnet/testnet1/genesis.json +mv genesis.json $HOME/.sourcehub/config/genesis.json + +# Update your configuration +cd $HOME/.sourcehub/config +sed -i 's/minimum-gas-prices = ""/minimum-gas-prices = "0.001uopen"/' app.toml +sed -i 's/persistent_peers = ""/persistent_peers = "2da42ce7b32cb76c3a86db2eadfab8508ee41815@54.158.208.103:26656"/' config.toml + +# Update timeouts +sed -i 's/timeout_propose = "3s"/timeout_propose = "500ms"/' config.toml +sed -i 's/timeout_commit = "5s"/timeout_commit = "1s"/' config.toml +``` + +### State Sync (Recommended) +At this point you can start your node and it will begin syncing with the rest of the network starting from height 0. However, this process can take several hours to complete. Instead nodes can use the ***much*** faster State Sync system that automatically downloads a snapshot from other nodes at a specific trusted height, and will sync from this point onwards. This process only takes a couple of minutes. + +```bash +cd $HOME/.sourcehubd/config +# Configure Trusted blocks +sed -i 's/enable = false/enable = true/' config.toml +sed -i 's/trust_height = 0/trust_height = /' config.toml +sed -i 's/trust_hash = ""/trust_hash = ""/' config.toml +sed -i 's/rpc_servers = ""/rpc_servers = "http:\/\/rpc1.testnet1.source.network:26657,http:\/\/rpc2.testnet1.source.network:26657"/' config.toml + +# Download snapshot +cd $HOME +export BLOCK_HEIGHT= +wget https://sourcehub-snapshot.s3.amazonaws.com/testnet-1/$BLOCK_HEIGHT-3.tar.gz +sourcehubd snapshots load $BLOCK_HEIGHT-3.tar.gz +sourcehubd snapshots restore $BLOCK_HEIGHT 3 +sourcehubd comet bootstrap-state +``` + +You can get the `` and `` from the `#validator-info` channel in the Validator section of the [Source Network Discord](https://discord.source.network) + +### SystemD Service (Optional) + +Create the following file: `/etc/systemd/system/sourcehubd.service` +```bash +[Unit] +Description=SourceHub service +After=network-online.target + +[Service] +User= +ExecStart=//sourcehubd start --x-crisis-skip-assert-invariants +Restart=no +LimitNOFILE=4096 + +[Install] +WantedBy=multi-user.target +``` + +You must specify/edit the `` and `` of your system in the SystemD service file. + +#### Start the service + +```bash +# Restart SystemD +systemctl daemon-reload +systemctl restart systemd-journald + +# Start the SourceHub service +systemctl enable sourcehubd.service +systemctl start sourcehubd.service +``` + +To follow the service log, run `journalctl -fu sourcehubd` + +## Register your validator +Once you have your node running and synchronized with the rest of the network you can register as a Validator. + +First, we want to create a local keypair. This keypair is independant of your validator, and can exist on any node, but we need one to submit transactions to the network, like the `create-validator` transaction. +```bash +sourcehubd keys add +``` + +Make sure to backup the newly created keypair. Then, go to the Source Network [Faucet](https://faucet.source.network/) and get some `$OPEN` tokens so you can pay for transaction gas. + +You also need to post your key address to the `#validator-general` chat on the [Source Network Discord](https://discord.source.network) so you can recieve your minimum `stake` tokens. These stake tokens are used to determine voting power in the network, and are seperate from the `$OPEN` tokens used for gas. + +Once you have recieved your `stake` tokens from the Source Network team you can create you validator wit the following commands. + +```bash +# Create Validator info json config +# Update the moniker, website, security, and details +cd $HOME +echo "{ + \"pubkey\": $(sourcehubd comet show-validator), + \"amount\": \"1stake\", + \"moniker\": \"\", + \"website\": \"validator's (optional) website\", + \"security\": \"validator's (optional) security contact email\", + \"details\": \"validator's (optional) details\", + \"commission-rate\": \"0\", + \"commission-max-rate\": \"0\", + \"commission-max-change-rate\": \"0\", + \"min-self-delegation\": \"1\" +}" > validator.json + +# Create validator transaction +sourcehubd tx staking create-validator validator.json --from= --fees 1000uopen -y +``` + +Where the `` is the same key you made from above. + +If the transaction is successful, you now have an *in-active* validator on SourceHub Testnet 1. To become active, you must post your validator address `$> sourcehubd comet show-address` in the `#validator-general` chat on the [Source Network Discord](https://discord.source.network), and we will delegate voting power to you, which will move you into the *active* validator set, and you'll node will start producing and verifying blocks. + +> The SourceHub Testnet 1 is a public but permissioned network, meaning only approved validators can join the network. This is guranteed by the fact that Source owns 100% of the staking power of the network. diff --git a/sourcehub_versioned_docs/version-0.3.2/networks/testnet-1/overview.md b/sourcehub_versioned_docs/version-0.3.2/networks/testnet-1/overview.md new file mode 100644 index 0000000..6c379fd --- /dev/null +++ b/sourcehub_versioned_docs/version-0.3.2/networks/testnet-1/overview.md @@ -0,0 +1,155 @@ +--- +title: Overview +sidebar_position: 1 +--- +# Testnet Overview + +## Introduction +Testnets are essential for developing and testing blockchain networks before they go live on the mainnet. They consist of nodes running specific blockchain protocols and modules that enhance the functionality of the DefraDB. + +The SourceHub protocol operates continuously, with decentralized and cryptographically designed API endpoints. Its purpose is to offer developers a condensed representation of the complete stack. This article explores key aspects of Source's Testnet1, its significance, deployment, and management. + +## Core Components of the Protocol +The Source Network ecosystem protocol, based on CosmosSDK and utilizing CometBFT as its consensus mechanism in the SourceHub Testnet is driven by two interconnected components: + +1. **Database**: Tailored for off-chain data querying, featuring a graph-like topple structure. + +2. **Trust Protocol**: Operating on-chain, complementing the database with specific features. + +These components form the foundational core of Source Network and comprise of four essential modules: + +1. **Access control**: A general-purpose black box for the off-chain database, using a graph-like topple. + +2. **Secret management**: Authorizing nodes through encryption and cryptography, with the Orbis secret management engine utilizing decentralized key pairs. + +3. **Anchoring**: Facilitating strict event authoring for timestamping data, essential for blockchain's time-stamping service. + +4. **Auditing**: Ensuring transparency and integrity within the protocol. + +## Core Features and Goals of Testnet1 + +SourceHub Testnet1 serves as the initial MVP, featuring fundamental components necessary for application development. It provides an early-stage interaction with the protocol, excluding aspects like Tokenomics and advanced functionalities such as Secret Management and Authoring. +  + +Key Points: + +1. **Comprehensive MVP** - Testnet1 has limitations in ACP, Orbis, and Anchoring, alongside the absence of token economics, serving as a comprehensive MVP for the complete Source Network Stack. + +2. **Permissioned Nature**: The network's permissioned nature, limited validator count, and the need for whitelisting underscore Testnet1's exclusive participation criteria. + +3. **Developer Engagement**: Active developer participation is encouraged, with an emphasis on feedback and monitoring system performance metrics. + +4. **Public Fairly Permissioned Network**: Testnet1 is positioned as a public fairly permissioned network, requiring whitelisting for SourceHub participation. + +5. **Chain Independence**: The absence of IPC chains or connections to the chain highlights Testnet1's independent operational framework. + +6. **Interoperability Focus**: The emphasis is on enhancing interoperability beyond the initial Testnet1 phase. This enables the Source ecosystem to interact and exchange information with other blockchain networks. And also provide a more connected and decentralized ecosystem. + +The ultimate goal is the seamless progression through Testnet1 and towards the Mainnet, with ongoing evolution in core components, exposed features, and adjusted node requirements. + +This progression involves considerations such as gRPCs (Mainnet) endpoints, P2P connectivity, and dependencies on the BFT-based CosmosSDK protocol. + +``` +grpc: +  grpcURL: "0.0.0.0:8081" +  restURL: "0.0.0.0:8091" +  logging: true +``` + +## Token Distribution and Developer Support +For testing purposes, developers require tokens in their local wallets, obtained through a faucet. These tokens, not actual coins, facilitate transactions within the testnet and cover gas fees. A user-friendly faucet serves as an API endpoint/tool for accessing dummy money. + +## Running a Node + +### Hardware Requirements +For effective participation in the Testnet, certain hardware specifications are essential for running a node as a validator. The key considerations encompass network capability, persistence, and connections. The specified hardware requirements include: + +* x86-64 (amd64) multi-core CPU (AMD / Intel) +* 16GB RAM +* 256GB SSD Storage +* 100Mbps bi-directional Internet connection + +### Installation +The installation is divided into two components: + +1. SourceHub Daemon (SourceHub D): This is also referred to as node software, and is interchangeable with the SourceHub Daemon. The binaries for SourceHub D are named `sourcehubd`. + +2. Orbis Daemon (Orbis): The binaries for Orbis are named `orbisd`. + +  + +There are different options for installation, they are: + +* **Build from Source Network**: To install with this method, follow these steps: + + ``` + git clone [repo] + git checkout [specific version tag] + make build [this does all compilation necessary for the chain] + run orbis d version [to test if the installation works] + ``` +  + +* **Pre-compiled Binaries**: The released binaries are available on the GitHub release pages. + +* **Docker Image**: This method of installing involves building a Docker image. + +### Configuration +Configuration for running SourceHub and Orbis includes settings for the daemon and requires matching local machine IP addresses for Node and RPC addresses. + +Specific values like address prefix and account name must be obtained from local configurations. + +  + +**Note**: +* Specific values for address prefix and account name need to be obtained from your local configuration. + +```yaml +cosmos: + # Cosmos chain ID + chainId: sourcehub-testnet1 + # Cosmos keyring key name + accountName: + # Cosmos keyring backend ('os' is the default when running sourcehubd) + keyringBackend: os + # Cosmos address prefix ('source' is for SourceHub) + addressPrefix: source + # Transaction fees + fees: 2000uopen + rpcAddress: +``` + +* Remove the crypto section (specifically host_crypto_seed) from the config file. +``` + host: + listenAddresses: + - /ip4/0.0.0.0/tcp/9001 +``` + +  + +* Update the config file accordingly. + +## Public Bootstrapping Nodes and RPC Endpoints +Public bootstrapping nodes and RPC endpoints are essential components for network initiation. For SourceHub, the hardware requirements align with those for CosmosSDK chains, making CometBFT compatible. + +## Validators + +### Validator Role and Requirements +Validators play a crucial role in the blockchain by committing new blocks through an automated voting process. If a validator becomes unavailable or sign blocks at the same height, their stake faces the risk of being slashed. + +Maintaining and monitoring validator nodes is crucial for optimal performance. Interested participants can join the waitlist to become a validator. + +### How to Become a Testnet Validator +To become a Testnet validator, follow these steps: + +* Run a Full Node - Ensure synchronization with the network. +* Fund Your Wallet - Use project tokens to delegate funds to your validator. +* Create a Validator - Execute the relevant command. +* Confirm Validator Creation - Verify the successful creation of the validator. +* Import CLI Commands - Follow the necessary CLI commands for continued participation. + +## Conclusion +Source's Testnet1 serves as a foundational MVP, offering developers a preview of core components—Access Control, Secret Management, Document Anchoring and Auditing—while acknowledging limitations and emphasizing the network's permissioned nature. + +The outlined hardware requirements and steps for becoming a validator provide a clear pathway for interested participants. \ No newline at end of file diff --git a/sourcehub_versioned_docs/version-0.3.2/overview.md b/sourcehub_versioned_docs/version-0.3.2/overview.md new file mode 100644 index 0000000..6036023 --- /dev/null +++ b/sourcehub_versioned_docs/version-0.3.2/overview.md @@ -0,0 +1,23 @@ +--- +sidebar_position: 1 +title: Overview +slug: / +--- +# SourceHub Overview + +![SourceHub Overview](/img/sourcehub-cover-copy.png) + +SourceHub is the Source Network's trust protocol, which facilitates trusted and authenticated sharing and collaboration of data across the network and beyond. It utilizes [CometBFT](https://cometbft.com/) consensus and is built on the [Cosmos SDK](link) to provide us with a solid technical foundation to enable our decentralized infrastructure and application-specific chain. + +The primary functions of SourceHub are: +- **ACP Module**: A decentralized authorization engine, inspired in part by [Google Zanzibar's](/sourcehub/concepts/zanzibar) Relational Based Access Control (RelBAC) + +- **Bulletin Module**: A trust minimized network broadcast hub. Used both for DefraDBs Document Anchoring and [Orbis's](/orbis) [Multi-Party Computation (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation) to optimize its network communication to initialize and maintain the [Distributed Key Generation (DKG)](https://en.wikipedia.org/wiki/Distributed_key_generation) + +- **Developer-Lock Tier Module** (:construction: coming soon :construction:): A SaaS inspired pricing module to streamline DevEx around tokenomics, abstract transaction gas, and simplify user wallet experience. Similar to [Account Abstraction](https://ethereum.org/en/roadmap/account-abstraction/) systems, but native to our protocol. + +--- + +Although SourceHub is an independent system with self-contained functionality - like the rest of the Source Stack - it is designed to work in conjunction with [DefraDB](/defradb) nodes to help facilitate trust in its peer-to-peer architecture. + +![SourceHub+DefraDB](/img/sourcehub/trust-protocol-defradb.png) \ No newline at end of file diff --git a/sourcehub_versioned_sidebars/version-0.3.2-sidebars.json b/sourcehub_versioned_sidebars/version-0.3.2-sidebars.json new file mode 100644 index 0000000..f1f02dc --- /dev/null +++ b/sourcehub_versioned_sidebars/version-0.3.2-sidebars.json @@ -0,0 +1,31 @@ +{ + "defraSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ], + "sourcehubSidebar": [ + { + "type": "autogenerated", + "dirName": "." + }, + { + "type": "link", + "label": "API", + "href": "/sourcehub/api" + } + ], + "orbisSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ], + "lensvmSidebar": [ + { + "type": "autogenerated", + "dirName": "." + } + ] +} diff --git a/sourcehub_versions.json b/sourcehub_versions.json new file mode 100644 index 0000000..a8fb5c8 --- /dev/null +++ b/sourcehub_versions.json @@ -0,0 +1,3 @@ +[ + "0.3.2" +] diff --git a/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.js b/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.js new file mode 100644 index 0000000..cf11f8e --- /dev/null +++ b/src/theme/NavbarItem/DocsVersionDropdownNavbarItem.js @@ -0,0 +1,53 @@ +import React from 'react'; +import DocsVersionDropdownNavbarItem from '@theme-original/NavbarItem/DocsVersionDropdownNavbarItem'; +import {useActivePlugin} from '@docusaurus/plugin-content-docs/client'; + +export default function DocsVersionDropdownNavbarItemWrapper(props) { + const activePlugin = useActivePlugin({failfast: false}); + + // Render all dropdowns stacked on top of each other + // Use opacity and pointer-events to show/hide without layout shift + const pluginIds = ['defradb', 'sourcehub', 'orbis', 'lensvm']; + + return ( +
    + {/* Invisible spacers to reserve space - all plugins rendered to find max width */} + {pluginIds.map((pluginId) => ( +
    + +
    + ))} + {/* Visible dropdowns */} + {pluginIds.map((pluginId) => { + const isActive = activePlugin?.pluginId === pluginId; + return ( +
    + +
    + ); + })} +
    + ); +} From b9e9c5d87819116aa165d8f1eb5993b2c90fe447 Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Thu, 6 Nov 2025 14:09:50 -0800 Subject: [PATCH 46/48] fix: Rename guides (#183) Renamed several guides to no longer include "Guide" which seemed redundant. Also adjusted some of the plurality of certain articles. --- .../{deployment-guide.md => deployment.md} | 35 ++----------------- ...{explain-systems.md => explain-queries.md} | 2 +- .../version-0.19.0/guides/merkle-crdt.md | 2 +- .../version-0.19.0/guides/peer-to-peer.md | 2 +- .../version-0.19.0/guides/schema-migration.md | 2 +- .../guides/schema-relationship.md | 2 +- .../version-0.19.0/guides/secondary-index.md | 2 +- .../guides/time-traveling-queries.md | 2 +- .../{deployment-guide.md => deployment.md} | 35 ++----------------- ...{explain-systems.md => explain-queries.md} | 2 +- docs/defradb/guides/merkle-crdt.md | 2 +- docs/defradb/guides/peer-to-peer.md | 2 +- docs/defradb/guides/schema-migration.md | 2 +- docs/defradb/guides/schema-relationship.md | 2 +- docs/defradb/guides/secondary-index.md | 2 +- docs/defradb/guides/time-traveling-queries.md | 2 +- 16 files changed, 20 insertions(+), 78 deletions(-) rename defradb_versioned_docs/version-0.19.0/guides/{deployment-guide.md => deployment.md} (95%) rename defradb_versioned_docs/version-0.19.0/guides/{explain-systems.md => explain-queries.md} (99%) rename docs/defradb/guides/{deployment-guide.md => deployment.md} (95%) rename docs/defradb/guides/{explain-systems.md => explain-queries.md} (99%) diff --git a/defradb_versioned_docs/version-0.19.0/guides/deployment-guide.md b/defradb_versioned_docs/version-0.19.0/guides/deployment.md similarity index 95% rename from defradb_versioned_docs/version-0.19.0/guides/deployment-guide.md rename to defradb_versioned_docs/version-0.19.0/guides/deployment.md index dfb6bba..db2d65a 100644 --- a/defradb_versioned_docs/version-0.19.0/guides/deployment-guide.md +++ b/defradb_versioned_docs/version-0.19.0/guides/deployment.md @@ -1,5 +1,5 @@ --- -sidebar_label: Deployment Guide +sidebar_label: Deployment sidebar_position: 80 --- # A Guide to DefraDB Deployment @@ -37,13 +37,10 @@ Refer to the Playground Basics Guide for detailed instructions. 3. Set the environment variable using the [NodeJS language toolchain](https://nodejs.org/en/download/current) and npm to build locally on your machine. The JavaScript and Typescript code create an output bundle for the frontend code to work. 4. Build a specific playground version of DefraDB. Use the go flags environment variable, instructing the compiler to include the playground directly embedded in all files. Execute the [go binary embed](https://pkg.go.dev/embed) command, producing a binary of approximately 4MB. - - -- ### Docker Deployments +### Docker Deployments Docker deployments are designed for containerized environments. The main prerequisite is that Docker should be installed on your machine. - The steps for Docker deployment are as follows: 1. Install Docker by referring to the [official Docker documentation](https://docs.docker.com/get-docker/). @@ -51,7 +48,6 @@ The steps for Docker deployment are as follows: 3. Run the following command: `docker build -t defra -f tools/defradb.containerfile ` - **Note**: The period at the end is important and the -f flag specifies the file location. The container file is in a subfolder called tools: `path: tools/defradb.containerfile` @@ -65,8 +61,6 @@ Docker images streamline the deployment process, requiring fewer dependencies. T DefraDB is a single statically built binary with no third-party dependencies. Similar to bare metal, it can run on any cloud or machine. Execute the following command to start DefraDB: `defradb start --store badger` - - ### AWS Environment For deploying to an AWS environment, note the following: @@ -76,22 +70,12 @@ For deploying to an AWS environment, note the following: - Refer to [AWS documentation](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html) for an easy EC2 instance launch with your specified image size. - Customize your setup using Packer and Terraform scripts in this directory: `tools/cloud/aws/packer` -  - -### Akash Deployments - -For detailed instructions on deploying DefraDB with Akash, refer to the [Akash Deployment Guide](https://nasdf-feat-akash-deploy.docs-source-network.pages.dev/guides/akash-deployment). - -  - ## Configurations - The default root directory on Unix machines is `$HOME/.defradb`. For Windows it is `%USERPROFILE%\.defradb`​. - Specifiy the DefraDB folder with this command: `defradb --rootdir start`. - The default directory for where data is specified is `/data`. -  - ## Storage Engine The storage engines currently used include: @@ -99,24 +83,16 @@ The storage engines currently used include: - Fileback persistent storage powered the [Badger](https://github.com/dgraph-io/badger%5D ) database. - [In-Memory Storage](https://github.com/sourcenetwork/defradb/blob/develop/datastore/memory/memory.go) which is B-Tree based, ideal for testing does not work with the file system. It is specified with this flag: `--store memory` -  - ## Network and Connectivity As a P2P database, DefraDB requires two ports for node communication, they include: -  - 1. **API Port**: It powers the HTTP API, handling queries  from the client to the database  and various API commands. The default port number is *9181*. 2. **P2P Port**: It facilitates communication between nodes, supporting data sharing, synchronization, and replication. The default port no is *9171*. -  - The P2P networking functionality can't be disabled entirely, but you can use the `defradb start --no-p2p`​ command through the config files and CLI to deactivate it. -  - ### Port Customization The API port can be specified using the [bind address](https://docs.libp2p.io/concepts/fundamentals/addressing/): @@ -129,13 +105,10 @@ For P2P use the P2P adder to a multi-address: Here is an [infographic](https://images.ctfassets.net/efgoat6bykjh/XQrDLqpkV06rFhT24viJc/1c2c72ddebe609c80fc848bfa9c4771e/multiaddress.png) to further understand multi-address. - ## The Peer Key Secure communication between nodes in DefraDB is established with a unique peer key for each node. Key details include: -  - - The peer key is automatically generated on startup, replacing the key file in a specific path. - There is no current method for generating a new key except for overwriting an existing one. - The peer key type uses a specific elliptic curve, called an Ed25519, which can be used to generate private keys. @@ -151,6 +124,4 @@ As DefraDB evolves, the roadmap includes expanding compatibility with diverse de - **Google Cloud Platform (GCP)**: Tailored deployment solutions for seamless integration with GCP environments. - **Kubernetes**: Optimization for Kubernetes deployments, ensuring scalability and flexibility. - **Embedded/IoT for Small Environments**: Adaptations to cater to the unique demands of embedded systems and IoT applications. -- **Web Assembly (WASM) Deployments**: Exploring deployment strategies utilizing Web Assembly for enhanced cross-platform compatibility. - -  \ No newline at end of file +- **Web Assembly (WASM) Deployments**: Exploring deployment strategies utilizing Web Assembly for enhanced cross-platform compatibility. \ No newline at end of file diff --git a/defradb_versioned_docs/version-0.19.0/guides/explain-systems.md b/defradb_versioned_docs/version-0.19.0/guides/explain-queries.md similarity index 99% rename from defradb_versioned_docs/version-0.19.0/guides/explain-systems.md rename to defradb_versioned_docs/version-0.19.0/guides/explain-queries.md index 3620e18..6ab210d 100644 --- a/defradb_versioned_docs/version-0.19.0/guides/explain-systems.md +++ b/defradb_versioned_docs/version-0.19.0/guides/explain-queries.md @@ -1,5 +1,5 @@ --- -sidebar_label: Explain Systems Guide +sidebar_label: Explain Queries sidebar_position: 20 --- # A Guide to Explain Systems in DefraDB diff --git a/defradb_versioned_docs/version-0.19.0/guides/merkle-crdt.md b/defradb_versioned_docs/version-0.19.0/guides/merkle-crdt.md index a4c20ea..a902d4b 100644 --- a/defradb_versioned_docs/version-0.19.0/guides/merkle-crdt.md +++ b/defradb_versioned_docs/version-0.19.0/guides/merkle-crdt.md @@ -1,5 +1,5 @@ --- -sidebar_label: Merkle CRDT Guide +sidebar_label: Merkle CRDTs sidebar_position: 30 --- # A Guide to Merkle CRDTs in DefraDB diff --git a/defradb_versioned_docs/version-0.19.0/guides/peer-to-peer.md b/defradb_versioned_docs/version-0.19.0/guides/peer-to-peer.md index 09de3c7..d126449 100644 --- a/defradb_versioned_docs/version-0.19.0/guides/peer-to-peer.md +++ b/defradb_versioned_docs/version-0.19.0/guides/peer-to-peer.md @@ -1,5 +1,5 @@ --- -sidebar_label: Peer-to-Peer Guide +sidebar_label: Peer-to-Peer Networking sidebar_position: 10 --- # A Guide to Peer-to-Peer Networking in DefraDB diff --git a/defradb_versioned_docs/version-0.19.0/guides/schema-migration.md b/defradb_versioned_docs/version-0.19.0/guides/schema-migration.md index 6df51f6..68cdfb7 100644 --- a/defradb_versioned_docs/version-0.19.0/guides/schema-migration.md +++ b/defradb_versioned_docs/version-0.19.0/guides/schema-migration.md @@ -1,5 +1,5 @@ --- -sidebar_label: Schema Migration Guide +sidebar_label: Schema Migration sidebar_position: 90 --- # A Guide to Schema Migration in DefraDB diff --git a/defradb_versioned_docs/version-0.19.0/guides/schema-relationship.md b/defradb_versioned_docs/version-0.19.0/guides/schema-relationship.md index 59745b6..989a76c 100644 --- a/defradb_versioned_docs/version-0.19.0/guides/schema-relationship.md +++ b/defradb_versioned_docs/version-0.19.0/guides/schema-relationship.md @@ -1,5 +1,5 @@ --- -sidebar_label: Schema Relationship Guide +sidebar_label: Schema Relationship sidebar_position: 50 --- # A Guide to Schema Relationship in DefraDB diff --git a/defradb_versioned_docs/version-0.19.0/guides/secondary-index.md b/defradb_versioned_docs/version-0.19.0/guides/secondary-index.md index 1c10478..1844ee8 100644 --- a/defradb_versioned_docs/version-0.19.0/guides/secondary-index.md +++ b/defradb_versioned_docs/version-0.19.0/guides/secondary-index.md @@ -1,5 +1,5 @@ --- -sidebar_label: Secondary index guide +sidebar_label: Secondary Index sidebar_position: 60 --- diff --git a/defradb_versioned_docs/version-0.19.0/guides/time-traveling-queries.md b/defradb_versioned_docs/version-0.19.0/guides/time-traveling-queries.md index 0d3b6d1..82fe581 100644 --- a/defradb_versioned_docs/version-0.19.0/guides/time-traveling-queries.md +++ b/defradb_versioned_docs/version-0.19.0/guides/time-traveling-queries.md @@ -1,5 +1,5 @@ --- -sidebar_label: Time Traveling Queries Guide +sidebar_label: Time Traveling Query sidebar_position: 40 --- # A Guide to Time Traveling Queries in DefraDB diff --git a/docs/defradb/guides/deployment-guide.md b/docs/defradb/guides/deployment.md similarity index 95% rename from docs/defradb/guides/deployment-guide.md rename to docs/defradb/guides/deployment.md index dfb6bba..db2d65a 100644 --- a/docs/defradb/guides/deployment-guide.md +++ b/docs/defradb/guides/deployment.md @@ -1,5 +1,5 @@ --- -sidebar_label: Deployment Guide +sidebar_label: Deployment sidebar_position: 80 --- # A Guide to DefraDB Deployment @@ -37,13 +37,10 @@ Refer to the Playground Basics Guide for detailed instructions. 3. Set the environment variable using the [NodeJS language toolchain](https://nodejs.org/en/download/current) and npm to build locally on your machine. The JavaScript and Typescript code create an output bundle for the frontend code to work. 4. Build a specific playground version of DefraDB. Use the go flags environment variable, instructing the compiler to include the playground directly embedded in all files. Execute the [go binary embed](https://pkg.go.dev/embed) command, producing a binary of approximately 4MB. - - -- ### Docker Deployments +### Docker Deployments Docker deployments are designed for containerized environments. The main prerequisite is that Docker should be installed on your machine. - The steps for Docker deployment are as follows: 1. Install Docker by referring to the [official Docker documentation](https://docs.docker.com/get-docker/). @@ -51,7 +48,6 @@ The steps for Docker deployment are as follows: 3. Run the following command: `docker build -t defra -f tools/defradb.containerfile ` - **Note**: The period at the end is important and the -f flag specifies the file location. The container file is in a subfolder called tools: `path: tools/defradb.containerfile` @@ -65,8 +61,6 @@ Docker images streamline the deployment process, requiring fewer dependencies. T DefraDB is a single statically built binary with no third-party dependencies. Similar to bare metal, it can run on any cloud or machine. Execute the following command to start DefraDB: `defradb start --store badger` - - ### AWS Environment For deploying to an AWS environment, note the following: @@ -76,22 +70,12 @@ For deploying to an AWS environment, note the following: - Refer to [AWS documentation](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html) for an easy EC2 instance launch with your specified image size. - Customize your setup using Packer and Terraform scripts in this directory: `tools/cloud/aws/packer` -  - -### Akash Deployments - -For detailed instructions on deploying DefraDB with Akash, refer to the [Akash Deployment Guide](https://nasdf-feat-akash-deploy.docs-source-network.pages.dev/guides/akash-deployment). - -  - ## Configurations - The default root directory on Unix machines is `$HOME/.defradb`. For Windows it is `%USERPROFILE%\.defradb`​. - Specifiy the DefraDB folder with this command: `defradb --rootdir start`. - The default directory for where data is specified is `/data`. -  - ## Storage Engine The storage engines currently used include: @@ -99,24 +83,16 @@ The storage engines currently used include: - Fileback persistent storage powered the [Badger](https://github.com/dgraph-io/badger%5D ) database. - [In-Memory Storage](https://github.com/sourcenetwork/defradb/blob/develop/datastore/memory/memory.go) which is B-Tree based, ideal for testing does not work with the file system. It is specified with this flag: `--store memory` -  - ## Network and Connectivity As a P2P database, DefraDB requires two ports for node communication, they include: -  - 1. **API Port**: It powers the HTTP API, handling queries  from the client to the database  and various API commands. The default port number is *9181*. 2. **P2P Port**: It facilitates communication between nodes, supporting data sharing, synchronization, and replication. The default port no is *9171*. -  - The P2P networking functionality can't be disabled entirely, but you can use the `defradb start --no-p2p`​ command through the config files and CLI to deactivate it. -  - ### Port Customization The API port can be specified using the [bind address](https://docs.libp2p.io/concepts/fundamentals/addressing/): @@ -129,13 +105,10 @@ For P2P use the P2P adder to a multi-address: Here is an [infographic](https://images.ctfassets.net/efgoat6bykjh/XQrDLqpkV06rFhT24viJc/1c2c72ddebe609c80fc848bfa9c4771e/multiaddress.png) to further understand multi-address. - ## The Peer Key Secure communication between nodes in DefraDB is established with a unique peer key for each node. Key details include: -  - - The peer key is automatically generated on startup, replacing the key file in a specific path. - There is no current method for generating a new key except for overwriting an existing one. - The peer key type uses a specific elliptic curve, called an Ed25519, which can be used to generate private keys. @@ -151,6 +124,4 @@ As DefraDB evolves, the roadmap includes expanding compatibility with diverse de - **Google Cloud Platform (GCP)**: Tailored deployment solutions for seamless integration with GCP environments. - **Kubernetes**: Optimization for Kubernetes deployments, ensuring scalability and flexibility. - **Embedded/IoT for Small Environments**: Adaptations to cater to the unique demands of embedded systems and IoT applications. -- **Web Assembly (WASM) Deployments**: Exploring deployment strategies utilizing Web Assembly for enhanced cross-platform compatibility. - -  \ No newline at end of file +- **Web Assembly (WASM) Deployments**: Exploring deployment strategies utilizing Web Assembly for enhanced cross-platform compatibility. \ No newline at end of file diff --git a/docs/defradb/guides/explain-systems.md b/docs/defradb/guides/explain-queries.md similarity index 99% rename from docs/defradb/guides/explain-systems.md rename to docs/defradb/guides/explain-queries.md index 3620e18..6ab210d 100644 --- a/docs/defradb/guides/explain-systems.md +++ b/docs/defradb/guides/explain-queries.md @@ -1,5 +1,5 @@ --- -sidebar_label: Explain Systems Guide +sidebar_label: Explain Queries sidebar_position: 20 --- # A Guide to Explain Systems in DefraDB diff --git a/docs/defradb/guides/merkle-crdt.md b/docs/defradb/guides/merkle-crdt.md index a4c20ea..a902d4b 100644 --- a/docs/defradb/guides/merkle-crdt.md +++ b/docs/defradb/guides/merkle-crdt.md @@ -1,5 +1,5 @@ --- -sidebar_label: Merkle CRDT Guide +sidebar_label: Merkle CRDTs sidebar_position: 30 --- # A Guide to Merkle CRDTs in DefraDB diff --git a/docs/defradb/guides/peer-to-peer.md b/docs/defradb/guides/peer-to-peer.md index 09de3c7..d126449 100644 --- a/docs/defradb/guides/peer-to-peer.md +++ b/docs/defradb/guides/peer-to-peer.md @@ -1,5 +1,5 @@ --- -sidebar_label: Peer-to-Peer Guide +sidebar_label: Peer-to-Peer Networking sidebar_position: 10 --- # A Guide to Peer-to-Peer Networking in DefraDB diff --git a/docs/defradb/guides/schema-migration.md b/docs/defradb/guides/schema-migration.md index 6df51f6..68cdfb7 100644 --- a/docs/defradb/guides/schema-migration.md +++ b/docs/defradb/guides/schema-migration.md @@ -1,5 +1,5 @@ --- -sidebar_label: Schema Migration Guide +sidebar_label: Schema Migration sidebar_position: 90 --- # A Guide to Schema Migration in DefraDB diff --git a/docs/defradb/guides/schema-relationship.md b/docs/defradb/guides/schema-relationship.md index 59745b6..989a76c 100644 --- a/docs/defradb/guides/schema-relationship.md +++ b/docs/defradb/guides/schema-relationship.md @@ -1,5 +1,5 @@ --- -sidebar_label: Schema Relationship Guide +sidebar_label: Schema Relationship sidebar_position: 50 --- # A Guide to Schema Relationship in DefraDB diff --git a/docs/defradb/guides/secondary-index.md b/docs/defradb/guides/secondary-index.md index 1c10478..1844ee8 100644 --- a/docs/defradb/guides/secondary-index.md +++ b/docs/defradb/guides/secondary-index.md @@ -1,5 +1,5 @@ --- -sidebar_label: Secondary index guide +sidebar_label: Secondary Index sidebar_position: 60 --- diff --git a/docs/defradb/guides/time-traveling-queries.md b/docs/defradb/guides/time-traveling-queries.md index 0d3b6d1..82fe581 100644 --- a/docs/defradb/guides/time-traveling-queries.md +++ b/docs/defradb/guides/time-traveling-queries.md @@ -1,5 +1,5 @@ --- -sidebar_label: Time Traveling Queries Guide +sidebar_label: Time Traveling Query sidebar_position: 40 --- # A Guide to Time Traveling Queries in DefraDB From 5d2469a6b90817b8b84e6ef5c5d8ec054c238905 Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Thu, 6 Nov 2025 14:38:06 -0800 Subject: [PATCH 47/48] fix: Moved some guides to concepts (#184) Moved some of the existing guides to the concepts section as they primarily gave background knowledge on the implementation, instead of concrete information external users need. Also, you can review the last commit independently. This is a makefile script created (by claude) to automatically backport changes in the `current` docs section into a specific version of a specific project. Since #182 where I added the versioning support, every change in the main docs section also needs to be backported to the latest docs version, since these are primarily fixes, and we havent released the new version, we dont need to wait till 0.20.0 comes out, we can just backport. --- Makefile | 147 ++++++++++++++++++ .../content-addressable-storage.md | 3 +- .../concepts}/content-identifier.md | 1 - .../version-0.19.0/concepts/libp2p.md | 2 +- .../{guides => concepts}/merkle-crdt.md | 3 +- .../query-specification/database-api.md | 2 +- .../content-addressable-storage.md | 3 +- .../defradb/concepts}/content-identifier.md | 1 - docs/defradb/concepts/libp2p.md | 2 +- .../{guides => concepts}/merkle-crdt.md | 3 +- .../query-specification/database-api.md | 2 +- 11 files changed, 155 insertions(+), 14 deletions(-) create mode 100644 Makefile rename defradb_versioned_docs/version-0.19.0/{guides => concepts}/content-addressable-storage.md (99%) rename {docs/defradb/guides => defradb_versioned_docs/version-0.19.0/concepts}/content-identifier.md (99%) rename defradb_versioned_docs/version-0.19.0/{guides => concepts}/merkle-crdt.md (98%) rename docs/defradb/{guides => concepts}/content-addressable-storage.md (99%) rename {defradb_versioned_docs/version-0.19.0/guides => docs/defradb/concepts}/content-identifier.md (99%) rename docs/defradb/{guides => concepts}/merkle-crdt.md (98%) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f7e2845 --- /dev/null +++ b/Makefile @@ -0,0 +1,147 @@ +.PHONY: version\:replace help + +# Color codes for output +RED := \033[0;31m +GREEN := \033[0;32m +YELLOW := \033[0;33m +BLUE := \033[0;34m +NC := \033[0m # No Color + +# Valid project names +VALID_PROJECTS := defradb sourcehub orbis lensvm + +help: + @echo "$(BLUE)Docusaurus Version Management$(NC)" + @echo "" + @echo "$(GREEN)Available commands:$(NC)" + @echo " make version:replace PROJECT= VERSION=" + @echo "" + @echo "$(GREEN)Description:$(NC)" + @echo " Regenerates and replaces Docusaurus versioned docs for a specific version" + @echo "" + @echo "$(GREEN)Arguments:$(NC)" + @echo " PROJECT - Project name (defradb, sourcehub, orbis, lensvm)" + @echo " VERSION - Version identifier (must exist in _versions.json)" + @echo "" + @echo "$(GREEN)Example:$(NC)" + @echo " make version:replace PROJECT=defradb VERSION=0.19.0" + @echo "" + +version\:replace: + @# Validate PROJECT argument + @if [ -z "$(PROJECT)" ]; then \ + echo "$(RED)Error: PROJECT argument is required$(NC)"; \ + echo "Usage: make version:replace PROJECT= VERSION="; \ + echo "Valid projects: $(VALID_PROJECTS)"; \ + exit 1; \ + fi + @# Validate PROJECT is one of the valid projects + @if ! echo "$(VALID_PROJECTS)" | grep -w "$(PROJECT)" > /dev/null; then \ + echo "$(RED)Error: Invalid PROJECT '$(PROJECT)'$(NC)"; \ + echo "Valid projects: $(VALID_PROJECTS)"; \ + exit 1; \ + fi + @# Validate VERSION argument + @if [ -z "$(VERSION)" ]; then \ + echo "$(RED)Error: VERSION argument is required$(NC)"; \ + echo "Usage: make version:replace PROJECT=$(PROJECT) VERSION="; \ + exit 1; \ + fi + @# Check if versions.json file exists + @if [ ! -f "$(PROJECT)_versions.json" ]; then \ + echo "$(RED)Error: $(PROJECT)_versions.json not found$(NC)"; \ + exit 1; \ + fi + @# Validate VERSION exists in versions.json + @if ! grep -q '"$(VERSION)"' "$(PROJECT)_versions.json"; then \ + echo "$(RED)Error: Version '$(VERSION)' not found in $(PROJECT)_versions.json$(NC)"; \ + echo "$(YELLOW)Available versions:$(NC)"; \ + cat "$(PROJECT)_versions.json"; \ + exit 1; \ + fi + @echo "$(GREEN)Starting version replacement for $(PROJECT) v$(VERSION)$(NC)" + @echo "" + @# Step 0: Clean up any existing -replace version first + @echo "$(BLUE)[0/5]$(NC) Cleaning up any existing replacement version" + @if [ -d "$(PROJECT)_versioned_docs/version-$(VERSION)-replace" ]; then \ + rm -rf "$(PROJECT)_versioned_docs/version-$(VERSION)-replace"; \ + echo "$(YELLOW) - Removed existing $(PROJECT)_versioned_docs/version-$(VERSION)-replace/$(NC)"; \ + fi + @if [ -f "$(PROJECT)_versioned_sidebars/version-$(VERSION)-replace-sidebars.json" ]; then \ + rm -f "$(PROJECT)_versioned_sidebars/version-$(VERSION)-replace-sidebars.json"; \ + echo "$(YELLOW) - Removed existing $(PROJECT)_versioned_sidebars/version-$(VERSION)-replace-sidebars.json$(NC)"; \ + fi + @if grep -q '"$(VERSION)-replace"' "$(PROJECT)_versions.json"; then \ + sed -i.bak '/"$(VERSION)-replace"/d' "$(PROJECT)_versions.json"; \ + rm -f "$(PROJECT)_versions.json.bak"; \ + echo "$(YELLOW) - Removed $(VERSION)-replace from $(PROJECT)_versions.json$(NC)"; \ + fi + @echo "$(GREEN)✓ Cleanup complete$(NC)" + @echo "" + @# Step 1: Generate replacement version + @echo "$(BLUE)[1/5]$(NC) Generating replacement version: $(VERSION)-replace" + @npm run docusaurus docs:version:$(PROJECT) $(VERSION)-replace + @if [ $$? -ne 0 ]; then \ + echo "$(RED)Error: Failed to generate replacement version$(NC)"; \ + exit 1; \ + fi + @echo "$(GREEN)✓ Replacement version generated$(NC)" + @echo "" + @# Step 2: Remove original versioned docs directory + @echo "$(BLUE)[2/5]$(NC) Removing original versioned docs directory" + @if [ -d "$(PROJECT)_versioned_docs/version-$(VERSION)" ]; then \ + rm -rf "$(PROJECT)_versioned_docs/version-$(VERSION)"; \ + echo "$(GREEN)✓ Removed $(PROJECT)_versioned_docs/version-$(VERSION)/$(NC)"; \ + else \ + echo "$(YELLOW)⚠ Directory $(PROJECT)_versioned_docs/version-$(VERSION)/ not found, skipping$(NC)"; \ + fi + @# Step 3: Remove original versioned sidebar file + @echo "$(BLUE)[3/5]$(NC) Removing original versioned sidebar" + @if [ -f "$(PROJECT)_versioned_sidebars/version-$(VERSION)-sidebars.json" ]; then \ + rm -f "$(PROJECT)_versioned_sidebars/version-$(VERSION)-sidebars.json"; \ + echo "$(GREEN)✓ Removed $(PROJECT)_versioned_sidebars/version-$(VERSION)-sidebars.json$(NC)"; \ + else \ + echo "$(YELLOW)⚠ File $(PROJECT)_versioned_sidebars/version-$(VERSION)-sidebars.json not found, skipping$(NC)"; \ + fi + @echo "" + @# Step 4: Rename replacement files to original + @echo "$(BLUE)[4/5]$(NC) Renaming replacement files to original version" + @if [ -d "$(PROJECT)_versioned_docs/version-$(VERSION)-replace" ]; then \ + mv "$(PROJECT)_versioned_docs/version-$(VERSION)-replace" "$(PROJECT)_versioned_docs/version-$(VERSION)"; \ + echo "$(GREEN)✓ Renamed versioned docs directory$(NC)"; \ + else \ + echo "$(RED)Error: $(PROJECT)_versioned_docs/version-$(VERSION)-replace not found$(NC)"; \ + exit 1; \ + fi + @if [ -f "$(PROJECT)_versioned_sidebars/version-$(VERSION)-replace-sidebars.json" ]; then \ + mv "$(PROJECT)_versioned_sidebars/version-$(VERSION)-replace-sidebars.json" "$(PROJECT)_versioned_sidebars/version-$(VERSION)-sidebars.json"; \ + echo "$(GREEN)✓ Renamed versioned sidebar file$(NC)"; \ + else \ + echo "$(RED)Error: $(PROJECT)_versioned_sidebars/version-$(VERSION)-replace-sidebars.json not found$(NC)"; \ + exit 1; \ + fi + @echo "" + @# Step 5: Update versions.json to remove -replace entry (original version is already present) + @echo "$(BLUE)[5/5]$(NC) Updating $(PROJECT)_versions.json" + @sed -i.bak '/"$(VERSION)-replace"/d' "$(PROJECT)_versions.json" + @rm -f "$(PROJECT)_versions.json.bak" + @echo "$(GREEN)✓ Updated $(PROJECT)_versions.json$(NC)" + @# Optional: Update docusaurus.config.js if version-replace config exists + @if grep -q '"$(VERSION)-replace"' docusaurus.config.js 2>/dev/null; then \ + echo "$(BLUE)[BONUS]$(NC) Updating docusaurus.config.js"; \ + sed -i.bak 's/"$(VERSION)-replace"/"$(VERSION)"/' docusaurus.config.js; \ + rm -f docusaurus.config.js.bak; \ + echo "$(GREEN)✓ Updated docusaurus.config.js$(NC)"; \ + fi + @echo "" + @echo "$(GREEN)════════════════════════════════════════$(NC)" + @echo "$(GREEN)✓ Version replacement complete!$(NC)" + @echo "$(GREEN)════════════════════════════════════════$(NC)" + @echo "$(BLUE)Project:$(NC) $(PROJECT)" + @echo "$(BLUE)Version:$(NC) $(VERSION)" + @echo "" + @echo "$(YELLOW)Next steps:$(NC)" + @echo " 1. Review the changes with: git status" + @echo " 2. Test the docs locally with: npm run start" + @echo " 3. Commit the changes when satisfied" + @echo "" diff --git a/defradb_versioned_docs/version-0.19.0/guides/content-addressable-storage.md b/defradb_versioned_docs/version-0.19.0/concepts/content-addressable-storage.md similarity index 99% rename from defradb_versioned_docs/version-0.19.0/guides/content-addressable-storage.md rename to defradb_versioned_docs/version-0.19.0/concepts/content-addressable-storage.md index 97dfa87..11658d9 100644 --- a/defradb_versioned_docs/version-0.19.0/guides/content-addressable-storage.md +++ b/defradb_versioned_docs/version-0.19.0/concepts/content-addressable-storage.md @@ -1,6 +1,5 @@ --- -sidebar_label: Content Addressable Storage -sidebar_position: 80 +sidebar_label: Content Addressable Storage (CAS) --- # Content Addressable Storage diff --git a/docs/defradb/guides/content-identifier.md b/defradb_versioned_docs/version-0.19.0/concepts/content-identifier.md similarity index 99% rename from docs/defradb/guides/content-identifier.md rename to defradb_versioned_docs/version-0.19.0/concepts/content-identifier.md index 556d176..fa7a985 100644 --- a/docs/defradb/guides/content-identifier.md +++ b/defradb_versioned_docs/version-0.19.0/concepts/content-identifier.md @@ -1,6 +1,5 @@ --- sidebar_label: Content Identifiers (CID) -sidebar_position: 90 --- # Content Identifiers (CID) diff --git a/defradb_versioned_docs/version-0.19.0/concepts/libp2p.md b/defradb_versioned_docs/version-0.19.0/concepts/libp2p.md index 108e3d7..4e02737 100644 --- a/defradb_versioned_docs/version-0.19.0/concepts/libp2p.md +++ b/defradb_versioned_docs/version-0.19.0/concepts/libp2p.md @@ -1,4 +1,4 @@ -# libp2p: A Modular Peer-to-Peer Networking Framework +# LibP2P: Modular Peer-to-Peer Networking ## Overview diff --git a/defradb_versioned_docs/version-0.19.0/guides/merkle-crdt.md b/defradb_versioned_docs/version-0.19.0/concepts/merkle-crdt.md similarity index 98% rename from defradb_versioned_docs/version-0.19.0/guides/merkle-crdt.md rename to defradb_versioned_docs/version-0.19.0/concepts/merkle-crdt.md index a902d4b..d4ce715 100644 --- a/defradb_versioned_docs/version-0.19.0/guides/merkle-crdt.md +++ b/defradb_versioned_docs/version-0.19.0/concepts/merkle-crdt.md @@ -1,8 +1,7 @@ --- sidebar_label: Merkle CRDTs -sidebar_position: 30 --- -# A Guide to Merkle CRDTs in DefraDB +# Understanding Merkle CRDTs in DefraDB ## Overview diff --git a/defradb_versioned_docs/version-0.19.0/references/query-specification/database-api.md b/defradb_versioned_docs/version-0.19.0/references/query-specification/database-api.md index 4bf9533..f48dc4e 100644 --- a/defradb_versioned_docs/version-0.19.0/references/query-specification/database-api.md +++ b/defradb_versioned_docs/version-0.19.0/references/query-specification/database-api.md @@ -8,7 +8,7 @@ So far, all the queries and mutations that have been discussed were specific to ## MerkleCRDTs -All objects in DefraDB are stored in MerkleCRDTs (see [Merkle CRDT Guide](../../guides/merkle-crdt.md)). These MerkleCRDTs are represented as a series of small updates connected in a MerkleDAG. The MerkleDAG is a Merklized version of a DAG (Directed Acyclical Graph), which means that each node in the DAG references a parent node through some kind of Content Identifier (CID). +All objects in DefraDB are stored in [Merkle CRDTs](../../concepts/merkle-crdt.md). These MerkleCRDTs are represented as a series of small updates connected in a MerkleDAG. The MerkleDAG is a Merklized version of a DAG (Directed Acyclical Graph), which means that each node in the DAG references a parent node through some kind of Content Identifier (CID). The image below shows an example structure of a MerkleDAG. diff --git a/docs/defradb/guides/content-addressable-storage.md b/docs/defradb/concepts/content-addressable-storage.md similarity index 99% rename from docs/defradb/guides/content-addressable-storage.md rename to docs/defradb/concepts/content-addressable-storage.md index 97dfa87..11658d9 100644 --- a/docs/defradb/guides/content-addressable-storage.md +++ b/docs/defradb/concepts/content-addressable-storage.md @@ -1,6 +1,5 @@ --- -sidebar_label: Content Addressable Storage -sidebar_position: 80 +sidebar_label: Content Addressable Storage (CAS) --- # Content Addressable Storage diff --git a/defradb_versioned_docs/version-0.19.0/guides/content-identifier.md b/docs/defradb/concepts/content-identifier.md similarity index 99% rename from defradb_versioned_docs/version-0.19.0/guides/content-identifier.md rename to docs/defradb/concepts/content-identifier.md index 556d176..fa7a985 100644 --- a/defradb_versioned_docs/version-0.19.0/guides/content-identifier.md +++ b/docs/defradb/concepts/content-identifier.md @@ -1,6 +1,5 @@ --- sidebar_label: Content Identifiers (CID) -sidebar_position: 90 --- # Content Identifiers (CID) diff --git a/docs/defradb/concepts/libp2p.md b/docs/defradb/concepts/libp2p.md index 108e3d7..4e02737 100644 --- a/docs/defradb/concepts/libp2p.md +++ b/docs/defradb/concepts/libp2p.md @@ -1,4 +1,4 @@ -# libp2p: A Modular Peer-to-Peer Networking Framework +# LibP2P: Modular Peer-to-Peer Networking ## Overview diff --git a/docs/defradb/guides/merkle-crdt.md b/docs/defradb/concepts/merkle-crdt.md similarity index 98% rename from docs/defradb/guides/merkle-crdt.md rename to docs/defradb/concepts/merkle-crdt.md index a902d4b..d4ce715 100644 --- a/docs/defradb/guides/merkle-crdt.md +++ b/docs/defradb/concepts/merkle-crdt.md @@ -1,8 +1,7 @@ --- sidebar_label: Merkle CRDTs -sidebar_position: 30 --- -# A Guide to Merkle CRDTs in DefraDB +# Understanding Merkle CRDTs in DefraDB ## Overview diff --git a/docs/defradb/references/query-specification/database-api.md b/docs/defradb/references/query-specification/database-api.md index 4bf9533..f48dc4e 100644 --- a/docs/defradb/references/query-specification/database-api.md +++ b/docs/defradb/references/query-specification/database-api.md @@ -8,7 +8,7 @@ So far, all the queries and mutations that have been discussed were specific to ## MerkleCRDTs -All objects in DefraDB are stored in MerkleCRDTs (see [Merkle CRDT Guide](../../guides/merkle-crdt.md)). These MerkleCRDTs are represented as a series of small updates connected in a MerkleDAG. The MerkleDAG is a Merklized version of a DAG (Directed Acyclical Graph), which means that each node in the DAG references a parent node through some kind of Content Identifier (CID). +All objects in DefraDB are stored in [Merkle CRDTs](../../concepts/merkle-crdt.md). These MerkleCRDTs are represented as a series of small updates connected in a MerkleDAG. The MerkleDAG is a Merklized version of a DAG (Directed Acyclical Graph), which means that each node in the DAG references a parent node through some kind of Content Identifier (CID). The image below shows an example structure of a MerkleDAG. From 97c0702f7277bea0463d60f5dd98ce8834a5b9c4 Mon Sep 17 00:00:00 2001 From: John-Alan Simmons Date: Thu, 6 Nov 2025 14:47:22 -0800 Subject: [PATCH 48/48] fix: Update secondary index guide (#185) Some fixups and reorganizing of the secondary index doc --- .../version-0.19.0/guides/secondary-index.md | 238 ++++++++---------- docs/defradb/guides/secondary-index.md | 238 ++++++++---------- 2 files changed, 222 insertions(+), 254 deletions(-) diff --git a/defradb_versioned_docs/version-0.19.0/guides/secondary-index.md b/defradb_versioned_docs/version-0.19.0/guides/secondary-index.md index 1844ee8..903ee5a 100644 --- a/defradb_versioned_docs/version-0.19.0/guides/secondary-index.md +++ b/defradb_versioned_docs/version-0.19.0/guides/secondary-index.md @@ -1,17 +1,100 @@ --- -sidebar_label: Secondary Index +sidebar_label: Secondary Indexes sidebar_position: 60 --- +# Seconday Indexes ## Introduction DefraDB provides a powerful and flexible secondary indexing system that enables efficient document lookups and queries. -## About +## Usage + +The `@index` directive can be used on GraphQL schema objects and field definitions to configure indexes. + +```graphql +@index(name: String, unique: Bool, direction: ORDERING, includes: [{ field: String, direction: ORDERING }]) +``` + +### `name` +Sets the index name. Defaults to concatenated field names with direction. + +### `unique` +Makes the index unique. Defaults to false. + +### `direction` +Sets the default index direction for all fields. Can be one of ASC (ascending) or DESC (descending). Defaults to ASC. + +If a field in the includes list does not specify a direction the default direction from this value will be used instead. + +### `includes` +Sets the fields the index is created on. + +When used on a field definition and the field is not in the includes list it will be implicitly added as the first entry. + +## Examples + +### Field level usage + +Creates an index on the User name field with DESC direction. + +```graphql +type User { + name: String @index(direction: DESC) +} +``` + +### Schema level usage + +Creates an index on the User name field with default direction (ASC). + +```graphql +type User @index(includes: {field: "name"}) { + name: String + age: Int +} +``` + +### Unique index + +Creates a unique index on the User name field with default direction (ASC). + +```graphql +type User { + name: String @index(unique: true) +} +``` + +### Composite index + +Creates a composite index on the User name and age fields with default direction (ASC). + +```graphql +type User @index(includes: [{field: "name"}, {field: "age"}]) { + name: String + age: Int +} +``` -The following sections provide an overview of performance considerations, indexing related objects, and JSON field indexing. +### Relationship index -### Performance considerations +Creates a unique index on the User relationship to Address. The unique index constraint ensures that no two Users can reference the same Address document. + +```graphql +type User { + name: String + age: Int + address: Address @primary @index(unique: true) +} + +type Address { + user: User + city: String + street: String +} +``` + +## Performance considerations Indexes can greatly improve query performance, but they also impact system performance during writes. Each index adds write overhead since every document update must also update the relevant indexes. Despite this, the boost in read performance for indexed queries usually makes this trade-off worthwhile. @@ -72,7 +155,7 @@ query { - Fetch address documents matching the city value directly. - Retrieve the corresponding User documents. This method is much faster because indexes enable direct lookups. -#### Enforcing relationship cardinality +### Enforcing unique relationships Indexes can also enforce one-to-one relationships. For instance, to ensure each User has exactly one unique Address: ```graphql @@ -93,23 +176,15 @@ Here, the @index(unique: true) constraint ensures no two Users can share the sam By combining relationship indexing with cardinality constraints, you can create highly efficient and logically consistent data structures. -### JSON field indexing +## JSON field indexing DefraDB offers a specialized indexing system for JSON fields, designed to handle their hierarchical structure efficiently. -#### JSON indexing overview - -JSON fields differ from other field types (e.g., Int, String, Bool) because they are structured hierarchically. DefraDB uses a path-aware system to manage these complexities, enabling traversal and indexing of all leaf nodes in a JSON document. +### Overview -#### JSON Interface +JSON fields differ from other field types (e.g., Int, String, Bool) because they are semi-structured and encoded. DefraDB uses a path-aware system to manage these complexities, enabling traversal and indexing of all leaf nodes in a JSON document. -DefraDB's JSON interface, defined in client/json.go, is essential for managing JSON fields. It allows the system to: - -Traverse all leaf nodes in a JSON document. -Represent a JSON value as either a complete document or a single node within the structure. -Each JSON value also stores its path information, which is crucial for creating accurate and efficient indexes. - -##### Example JSON Document +### Example ```json { @@ -123,16 +198,28 @@ Each JSON value also stores its path information, which is crucial for creating Here, the `iPhone` value is represented with its complete path: [`user`, `device`, `model`]. This path-aware representation ensures that the system knows not just the value, but where it resides within the document. -#### Inverted Indexes for JSON -DefraDB uses inverted indexes for JSON fields. These indexes reverse the traditional "document-to-value" relationship by starting with a value and quickly locating all documents containing that value. - -#### Key Format for JSON Indexes +Retrieve documents where the model is "iPhone": +```graphql +query { + Collection(filter: { + jsonField: { + user: { + device: { + model: {_eq: "iPhone"} + } + } + } + }) +} ``` -/(//)+/ -``` -##### How It Differs +With indexes, the system directly retrieves matching documents, avoiding the need to scan and parse the JSON during queries. + +### How it works + +#### Inverted Indexes for JSON +DefraDB uses inverted indexes for JSON fields. These indexes reverse the traditional "document-to-value" relationship by starting with a value and quickly locating all documents containing that value. - Regular fields map to a single index entry. - JSON fields generate multiple entries—one for each leaf node, incorporating both the path and the value. @@ -154,110 +241,7 @@ When indexing a document with JSON fields, the system: 1. Generates index entries for every leaf node, combining path and normalized value. 1. Stores entries efficiently, enabling direct querying. -##### Query example -Retrieve documents where the model is "iPhone": - -``` -query { - Collection(filter: { - jsonField: { - user: { - device: { - model: {_eq: "iPhone"} - } - } - } - }) -} -``` - -With indexes, the system directly retrieves matching documents, avoiding the need to scan and parse the JSON during queries. - #### Benefits of JSON field indexing - **Efficient queries**: Leverages inverted indexes for fast lookups, even in deeply nested structures. - **Precise path tracking**: Maintains path information for accurate indexing and retrieval. - **Scalable structure**: Handles complex JSON documents with minimal performance overhead. - -## Usage - -The `@index` directive can be used on GraphQL schema objects and field definitions to configure indexes. - -`@index(name: String, unique: Bool, direction: ORDERING, includes: [{ field: String, direction: ORDERING }])` - -### `name` -Sets the index name. Defaults to concatenated field names with direction. - -### `unique` -Makes the index unique. Defaults to false. - -### `direction` -Sets the default index direction for all fields. Can be one of ASC (ascending) or DESC (descending). Defaults to ASC. - -If a field in the includes list does not specify a direction the default direction from this value will be used instead. - -### `includes` -Sets the fields the index is created on. - -When used on a field definition and the field is not in the includes list it will be implicitly added as the first entry. - -## Examples - -### Field level usage - -Creates an index on the User name field with DESC direction. - -```gql -type User { - name: String @index(direction: DESC) -} -``` - -### Schema level usage - -Creates an index on the User name field with default direction (ASC). - -```gql -type User @index(includes: {field: "name"}) { - name: String - age: Int -} -``` - -### Unique index - -Creates a unique index on the User name field with default direction (ASC). - -```gql -type User { - name: String @index(unique: true) -} -``` - -### Composite index - -Creates a composite index on the User name and age fields with default direction (ASC). - -```gql -type User @index(includes: [{field: "name"}, {field: "age"}]) { - name: String - age: Int -} -``` - -### Relationship index - -Creates a unique index on the User relationship to Address. The unique index constraint ensures that no two Users can reference the same Address document. - -```gql -type User { - name: String - age: Int - address: Address @primary @index(unique: true) -} - -type Address { - user: User - city: String - street: String -} -``` diff --git a/docs/defradb/guides/secondary-index.md b/docs/defradb/guides/secondary-index.md index 1844ee8..903ee5a 100644 --- a/docs/defradb/guides/secondary-index.md +++ b/docs/defradb/guides/secondary-index.md @@ -1,17 +1,100 @@ --- -sidebar_label: Secondary Index +sidebar_label: Secondary Indexes sidebar_position: 60 --- +# Seconday Indexes ## Introduction DefraDB provides a powerful and flexible secondary indexing system that enables efficient document lookups and queries. -## About +## Usage + +The `@index` directive can be used on GraphQL schema objects and field definitions to configure indexes. + +```graphql +@index(name: String, unique: Bool, direction: ORDERING, includes: [{ field: String, direction: ORDERING }]) +``` + +### `name` +Sets the index name. Defaults to concatenated field names with direction. + +### `unique` +Makes the index unique. Defaults to false. + +### `direction` +Sets the default index direction for all fields. Can be one of ASC (ascending) or DESC (descending). Defaults to ASC. + +If a field in the includes list does not specify a direction the default direction from this value will be used instead. + +### `includes` +Sets the fields the index is created on. + +When used on a field definition and the field is not in the includes list it will be implicitly added as the first entry. + +## Examples + +### Field level usage + +Creates an index on the User name field with DESC direction. + +```graphql +type User { + name: String @index(direction: DESC) +} +``` + +### Schema level usage + +Creates an index on the User name field with default direction (ASC). + +```graphql +type User @index(includes: {field: "name"}) { + name: String + age: Int +} +``` + +### Unique index + +Creates a unique index on the User name field with default direction (ASC). + +```graphql +type User { + name: String @index(unique: true) +} +``` + +### Composite index + +Creates a composite index on the User name and age fields with default direction (ASC). + +```graphql +type User @index(includes: [{field: "name"}, {field: "age"}]) { + name: String + age: Int +} +``` -The following sections provide an overview of performance considerations, indexing related objects, and JSON field indexing. +### Relationship index -### Performance considerations +Creates a unique index on the User relationship to Address. The unique index constraint ensures that no two Users can reference the same Address document. + +```graphql +type User { + name: String + age: Int + address: Address @primary @index(unique: true) +} + +type Address { + user: User + city: String + street: String +} +``` + +## Performance considerations Indexes can greatly improve query performance, but they also impact system performance during writes. Each index adds write overhead since every document update must also update the relevant indexes. Despite this, the boost in read performance for indexed queries usually makes this trade-off worthwhile. @@ -72,7 +155,7 @@ query { - Fetch address documents matching the city value directly. - Retrieve the corresponding User documents. This method is much faster because indexes enable direct lookups. -#### Enforcing relationship cardinality +### Enforcing unique relationships Indexes can also enforce one-to-one relationships. For instance, to ensure each User has exactly one unique Address: ```graphql @@ -93,23 +176,15 @@ Here, the @index(unique: true) constraint ensures no two Users can share the sam By combining relationship indexing with cardinality constraints, you can create highly efficient and logically consistent data structures. -### JSON field indexing +## JSON field indexing DefraDB offers a specialized indexing system for JSON fields, designed to handle their hierarchical structure efficiently. -#### JSON indexing overview - -JSON fields differ from other field types (e.g., Int, String, Bool) because they are structured hierarchically. DefraDB uses a path-aware system to manage these complexities, enabling traversal and indexing of all leaf nodes in a JSON document. +### Overview -#### JSON Interface +JSON fields differ from other field types (e.g., Int, String, Bool) because they are semi-structured and encoded. DefraDB uses a path-aware system to manage these complexities, enabling traversal and indexing of all leaf nodes in a JSON document. -DefraDB's JSON interface, defined in client/json.go, is essential for managing JSON fields. It allows the system to: - -Traverse all leaf nodes in a JSON document. -Represent a JSON value as either a complete document or a single node within the structure. -Each JSON value also stores its path information, which is crucial for creating accurate and efficient indexes. - -##### Example JSON Document +### Example ```json { @@ -123,16 +198,28 @@ Each JSON value also stores its path information, which is crucial for creating Here, the `iPhone` value is represented with its complete path: [`user`, `device`, `model`]. This path-aware representation ensures that the system knows not just the value, but where it resides within the document. -#### Inverted Indexes for JSON -DefraDB uses inverted indexes for JSON fields. These indexes reverse the traditional "document-to-value" relationship by starting with a value and quickly locating all documents containing that value. - -#### Key Format for JSON Indexes +Retrieve documents where the model is "iPhone": +```graphql +query { + Collection(filter: { + jsonField: { + user: { + device: { + model: {_eq: "iPhone"} + } + } + } + }) +} ``` -/(//)+/ -``` -##### How It Differs +With indexes, the system directly retrieves matching documents, avoiding the need to scan and parse the JSON during queries. + +### How it works + +#### Inverted Indexes for JSON +DefraDB uses inverted indexes for JSON fields. These indexes reverse the traditional "document-to-value" relationship by starting with a value and quickly locating all documents containing that value. - Regular fields map to a single index entry. - JSON fields generate multiple entries—one for each leaf node, incorporating both the path and the value. @@ -154,110 +241,7 @@ When indexing a document with JSON fields, the system: 1. Generates index entries for every leaf node, combining path and normalized value. 1. Stores entries efficiently, enabling direct querying. -##### Query example -Retrieve documents where the model is "iPhone": - -``` -query { - Collection(filter: { - jsonField: { - user: { - device: { - model: {_eq: "iPhone"} - } - } - } - }) -} -``` - -With indexes, the system directly retrieves matching documents, avoiding the need to scan and parse the JSON during queries. - #### Benefits of JSON field indexing - **Efficient queries**: Leverages inverted indexes for fast lookups, even in deeply nested structures. - **Precise path tracking**: Maintains path information for accurate indexing and retrieval. - **Scalable structure**: Handles complex JSON documents with minimal performance overhead. - -## Usage - -The `@index` directive can be used on GraphQL schema objects and field definitions to configure indexes. - -`@index(name: String, unique: Bool, direction: ORDERING, includes: [{ field: String, direction: ORDERING }])` - -### `name` -Sets the index name. Defaults to concatenated field names with direction. - -### `unique` -Makes the index unique. Defaults to false. - -### `direction` -Sets the default index direction for all fields. Can be one of ASC (ascending) or DESC (descending). Defaults to ASC. - -If a field in the includes list does not specify a direction the default direction from this value will be used instead. - -### `includes` -Sets the fields the index is created on. - -When used on a field definition and the field is not in the includes list it will be implicitly added as the first entry. - -## Examples - -### Field level usage - -Creates an index on the User name field with DESC direction. - -```gql -type User { - name: String @index(direction: DESC) -} -``` - -### Schema level usage - -Creates an index on the User name field with default direction (ASC). - -```gql -type User @index(includes: {field: "name"}) { - name: String - age: Int -} -``` - -### Unique index - -Creates a unique index on the User name field with default direction (ASC). - -```gql -type User { - name: String @index(unique: true) -} -``` - -### Composite index - -Creates a composite index on the User name and age fields with default direction (ASC). - -```gql -type User @index(includes: [{field: "name"}, {field: "age"}]) { - name: String - age: Int -} -``` - -### Relationship index - -Creates a unique index on the User relationship to Address. The unique index constraint ensures that no two Users can reference the same Address document. - -```gql -type User { - name: String - age: Int - address: Address @primary @index(unique: true) -} - -type Address { - user: User - city: String - street: String -} -```
  • xCTH- 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